package net.sf.openrocket.preset.xml; import net.sf.openrocket.material.Material; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPresetFactory; import net.sf.openrocket.preset.InvalidComponentPresetException; import net.sf.openrocket.preset.TypedPropertyMap; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; /** * Streamer preset XML handler. */ @XmlRootElement(name = "Parachute") @XmlAccessorType(XmlAccessType.FIELD) public class ParachuteDTO extends BaseComponentDTO { @XmlElement(name = "Diameter") private AnnotatedLengthDTO diameter; @XmlElement(name = "Sides") private Integer sides; @XmlElement(name = "LineCount") private Integer lineCount; @XmlElement(name = "LineLength") private AnnotatedLengthDTO lineLength; @XmlElement(name = "LineMaterial") private AnnotatedMaterialDTO lineMaterial; /** * Default constructor. */ public ParachuteDTO() { } public double getDiameter() { return diameter.getValue(); } public void setDiameter(AnnotatedLengthDTO diameter) { this.diameter = diameter; } public void setDiameter(double diameter) { this.diameter = new AnnotatedLengthDTO(diameter); } public Integer getSides() { return sides; } public void setSides(Integer sides) { this.sides = sides; } public Integer getLineCount() { return lineCount; } public void setLineCount(Integer lineCount) { this.lineCount = lineCount; } public double getLineLength() { return lineLength.getValue(); } public void setLineLength(AnnotatedLengthDTO lineLength) { this.lineLength = lineLength; } public void setLineLength(double lineLength) { this.lineLength = new AnnotatedLengthDTO(lineLength); } public AnnotatedMaterialDTO getLineMaterial() { return lineMaterial; } public void setLineMaterial(AnnotatedMaterialDTO lineMaterial) { this.lineMaterial = lineMaterial; } /** * Most-useful constructor that maps a BodyTube preset to a BodyTubeDTO. * * @param preset the preset * * @throws net.sf.openrocket.util.BugException thrown if the expected body tube keys are not in the preset */ public ParachuteDTO(final ComponentPreset preset) { super(preset); setDiameter(preset.get(ComponentPreset.DIAMETER)); setLineCount(preset.get(ComponentPreset.LINE_COUNT)); if ( preset.has(ComponentPreset.LINE_LENGTH)) { setLineLength(preset.get(ComponentPreset.LINE_LENGTH)); } if ( preset.has(ComponentPreset.SIDES)) { setSides(preset.get(ComponentPreset.SIDES)); } if ( preset.has(ComponentPreset.LINE_MATERIAL)) { setLineMaterial(new AnnotatedMaterialDTO(preset.get(ComponentPreset.LINE_MATERIAL))); } } @Override public ComponentPreset asComponentPreset(java.util.List<MaterialDTO> materials) throws InvalidComponentPresetException { return asComponentPreset(ComponentPreset.Type.PARACHUTE, materials); } public ComponentPreset asComponentPreset(ComponentPreset.Type type, List<MaterialDTO> materials) throws InvalidComponentPresetException { TypedPropertyMap props = new TypedPropertyMap(); addProps(props, materials); // TODO - seems some vendors use a bulk material for the sheet along with a Thickness. // need to fix the MATERIAL packed into the componentpreset. props.put(ComponentPreset.TYPE, type); props.put(ComponentPreset.DIAMETER, this.getDiameter()); props.put(ComponentPreset.LINE_COUNT, this.getLineCount()); if ( this.lineLength != null ) { props.put(ComponentPreset.LINE_LENGTH, this.getLineLength()); } if ( this.sides != null ) { props.put(ComponentPreset.SIDES, this.getSides()); } if ( this.lineMaterial != null ) { Material m = find(materials, this.lineMaterial); if ( m != null ) { props.put(ComponentPreset.LINE_MATERIAL, m); } } return ComponentPresetFactory.create(props); } }