Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / preset / xml / MaterialDTO.java
diff --git a/core/src/net/sf/openrocket/preset/xml/MaterialDTO.java b/core/src/net/sf/openrocket/preset/xml/MaterialDTO.java
new file mode 100644 (file)
index 0000000..abcebda
--- /dev/null
@@ -0,0 +1,114 @@
+package net.sf.openrocket.preset.xml;
+
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import net.sf.openrocket.database.Databases;
+import net.sf.openrocket.material.Material;
+import net.sf.openrocket.util.Chars;
+
+/**
+ * XML handler for materials.
+ */
+@XmlRootElement(name = "Material")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class MaterialDTO {
+       
+       @XmlElement(name = "Name")
+       private String name;
+       @XmlElement(name = "Density")
+       private double density;
+       @XmlElement(name = "Type")
+       private MaterialTypeDTO type;
+       @XmlAttribute(name = "UnitsOfMeasure")
+       private String uom;
+       
+       /**
+        * Default constructor.
+        */
+       public MaterialDTO() {
+       }
+       
+       public MaterialDTO(final Material theMaterial) {
+               this(theMaterial.getName(), theMaterial.getDensity(), MaterialTypeDTO.asDTO(theMaterial.getType()),
+                               theMaterial.getType().getUnitGroup().getDefaultUnit().toString());
+       }
+       
+       public MaterialDTO(final String theName, final double theDensity, final MaterialTypeDTO theType, final String theUom) {
+               name = theName;
+               density = theDensity;
+               type = theType;
+               uom = theUom;
+       }
+       
+       public String getName() {
+               return name;
+       }
+       
+       public void setName(final String theName) {
+               name = theName;
+       }
+       
+       public double getDensity() {
+               return density;
+       }
+       
+       public void setDensity(final double theDensity) {
+               density = theDensity;
+       }
+       
+       public MaterialTypeDTO getType() {
+               return type;
+       }
+       
+       public void setType(final MaterialTypeDTO theType) {
+               type = theType;
+       }
+       
+       public String getUom() {
+               return uom;
+       }
+       
+       public void setUom(final String theUom) {
+               uom = theUom;
+       }
+       
+       Material asMaterial() {
+               return Databases.findMaterial(type.getORMaterialType(), name, density);
+       }
+       
+       
+       /**
+        * Special directive to the JAXB system.  After the object is parsed from xml,
+        * we replace the '2' with Chars.SQUARED, and '3' with Chars.CUBED.  Just the 
+        * opposite transformation as doen in beforeMarshal.
+        * @param unmarshaller
+        * @param parent
+        */
+       @SuppressWarnings("unused")
+       private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
+               if (uom != null) {
+                       uom = uom.replace('2', Chars.SQUARED);
+                       uom = uom.replace('3', Chars.CUBED);
+               }
+       }
+       
+       /**
+        * Special directive to the JAXB system.  Before the object is serialized into xml,
+        * we strip out the special unicode characters for cubed and squared so they appear
+        * as simple "3" and "2" chars.  The reverse transformation is done in afterUnmarshal.
+        * @param marshaller
+        */
+       @SuppressWarnings("unused")
+       private void beforeMarshal(Marshaller marshaller) {
+               if (uom != null) {
+                       uom = uom.replace(Chars.SQUARED, '2');
+                       uom = uom.replace(Chars.CUBED, '3');
+               }
+       }
+}