]> git.gag.com Git - debian/openrocket/commitdiff
unmarshal XML (*.orc) to ComponentPresets.
authorrodinia814 <rodinia814@180e2498-e6e9-4542-8430-84ac67f01cd8>
Wed, 25 Apr 2012 02:26:13 +0000 (02:26 +0000)
committerrodinia814 <rodinia814@180e2498-e6e9-4542-8430-84ac67f01cd8>
Wed, 25 Apr 2012 02:26:13 +0000 (02:26 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@610 180e2498-e6e9-4542-8430-84ac67f01cd8

15 files changed:
core/src/net/sf/openrocket/preset/ComponentPreset.java
core/src/net/sf/openrocket/preset/loader/RocksimComponentFileLoader.java
core/src/net/sf/openrocket/preset/xml/BaseComponentDTO.java
core/src/net/sf/openrocket/preset/xml/BodyTubeDTO.java
core/src/net/sf/openrocket/preset/xml/BulkHeadDTO.java
core/src/net/sf/openrocket/preset/xml/CenteringRingDTO.java
core/src/net/sf/openrocket/preset/xml/EngineBlockDTO.java
core/src/net/sf/openrocket/preset/xml/MaterialDTO.java
core/src/net/sf/openrocket/preset/xml/MaterialTypeDTO.java
core/src/net/sf/openrocket/preset/xml/NoseConeDTO.java
core/src/net/sf/openrocket/preset/xml/OpenRocketComponentDTO.java
core/src/net/sf/openrocket/preset/xml/OpenRocketComponentSaver.java
core/src/net/sf/openrocket/preset/xml/ShapeDTO.java
core/src/net/sf/openrocket/preset/xml/TransitionDTO.java
core/src/net/sf/openrocket/preset/xml/TubeCouplerDTO.java

index 13ace71655548f4b628bab8133d1ed6b3cc91e00..4af709c78a9b58a99db0a8686b990aa069041c62 100644 (file)
@@ -280,7 +280,30 @@ public class ComponentPreset implements Comparable<ComponentPreset> {
                return get(MANUFACTURER).toString() + "|" + get(PARTNO);
        }
 
-       /**
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        ComponentPreset that = (ComponentPreset) o;
+
+        if (digest != null ? !digest.equals(that.digest) : that.digest != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return digest != null ? digest.hashCode() : 0;
+    }
+
+    /**
         * Package scope so the factory can call it.
         */
        void computeDigest() {
index b1e15649067b1013ddd848e72b087c04c49d4f72..4bf2952df1fa5f194e13ab33dd12ea64ee253c2d 100644 (file)
@@ -24,6 +24,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.StringReader;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -612,6 +613,12 @@ public class RocksimComponentFileLoader {
 
         String xml = new OpenRocketComponentSaver().marshalToOpenRocketComponent(new ArrayList<Material>(materialMap.values()), allPresets);
         System.err.println(xml);
+        try {
+            List<ComponentPreset> presets = new OpenRocketComponentSaver().unmarshalFromOpenRocketComponent(new StringReader(xml));
+        }
+        catch (InvalidComponentPresetException e) {
+            e.printStackTrace();
+        }
     }
 }
 
index c437ed4c38e3f79b6030a5eaf0272754c57c9f2a..2c07d890d66286f4783b7518000fad5a6ca79251 100644 (file)
@@ -1,11 +1,19 @@
 
 package net.sf.openrocket.preset.xml;
 
+import net.sf.openrocket.database.Databases;
+import net.sf.openrocket.material.Material;
+import net.sf.openrocket.motor.Manufacturer;
 import net.sf.openrocket.preset.ComponentPreset;
+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.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlValue;
+import java.util.List;
 
 /**
  * Base class for the external representation of all component presets.
@@ -20,7 +28,7 @@ public abstract class BaseComponentDTO {
     @XmlElement(name = "Description")
     private String description;
     @XmlElement(name = "Material")
-    private String material;
+    private AnnotatedMaterialDTO material;
     @XmlElement(name = "Mass")
     private double mass;
 
@@ -41,7 +49,7 @@ public abstract class BaseComponentDTO {
         setManufacturer(preset.getManufacturer().getSimpleName());
         setPartNo(preset.getPartNo());
         setDescription(preset.get(ComponentPreset.DESCRIPTION));
-        setMaterial(preset.get(ComponentPreset.MATERIAL).getName());
+        setMaterial(new AnnotatedMaterialDTO(preset.get(ComponentPreset.MATERIAL)));
         if (preset.has(ComponentPreset.MASS)) {
             setMass(preset.get(ComponentPreset.MASS));
         }
@@ -71,11 +79,11 @@ public abstract class BaseComponentDTO {
         description = theDescription;
     }
 
-    public String getMaterial() {
+    public AnnotatedMaterialDTO getMaterial() {
         return material;
     }
 
-    public void setMaterial(final String theMaterial) {
+    public void setMaterial(final AnnotatedMaterialDTO theMaterial) {
         material = theMaterial;
     }
 
@@ -86,4 +94,39 @@ public abstract class BaseComponentDTO {
     public void setMass(final double theMass) {
         mass = theMass;
     }
+
+    public abstract ComponentPreset asComponentPreset(List<MaterialDTO> materials) throws InvalidComponentPresetException;
+
+    void addProps(TypedPropertyMap props, List<MaterialDTO> materialList) {
+        props.put(ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer(manufacturer));
+        props.put(ComponentPreset.PARTNO, partNo);
+        props.put(ComponentPreset.DESCRIPTION, description);
+        props.put(ComponentPreset.MATERIAL, find(materialList, material));
+        props.put(ComponentPreset.MASS, mass);
+    }
+
+    private Material find(List<MaterialDTO> materialList, AnnotatedMaterialDTO dto) {
+        for (int i = 0; i < materialList.size(); i++) {
+            MaterialDTO materialDTO =  materialList.get(i);
+            if (materialDTO.getType().name().equals(dto.type) && materialDTO.getName().equals(dto.material)) {
+                return materialDTO.asMaterial();
+            }
+        }
+        //Otherwise fallback and look at factory default materials.
+        return Databases.findMaterial(Material.Type.valueOf(material.type), material.material);
+    }
+
+    static class AnnotatedMaterialDTO {
+        @XmlAttribute(name = "Type")
+        private String type;
+        @XmlValue
+        private String material;
+
+        AnnotatedMaterialDTO() {}
+
+        AnnotatedMaterialDTO(Material theMaterial) {
+            type = theMaterial.getType().name();
+            material = theMaterial.getName();
+        }
+    }
 }
index 5fb899271617ba87806356287fcadf2fdebf47ec..c751c041ed264a5cb10056e1fec1798be0055607 100644 (file)
@@ -2,11 +2,15 @@
 package net.sf.openrocket.preset.xml;
 
 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;
 
 /**
  * Body tube preset XML handler.
@@ -65,4 +69,19 @@ public class BodyTubeDTO extends BaseComponentDTO {
     public void setLength(final double theLength) {
         length = theLength;
     }
+
+    public ComponentPreset asComponentPreset(java.util.List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        return asComponentPreset(ComponentPreset.Type.BODY_TUBE, materials);
+    }
+
+    public ComponentPreset asComponentPreset(ComponentPreset.Type type, List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        TypedPropertyMap props = new TypedPropertyMap();
+        addProps(props, materials);
+        props.put(ComponentPreset.INNER_DIAMETER, this.getInsideDiameter());
+        props.put(ComponentPreset.OUTER_DIAMETER, this.getOutsideDiameter());
+        props.put(ComponentPreset.LENGTH, this.getLength());
+        props.put(ComponentPreset.TYPE, type);
+
+        return ComponentPresetFactory.create(props);
+    }
 }
index a378c741d0f1da026868ba07d3fce806601d0db2..57d3fc409dc0a56f133ea44fd45d6bb9fa7ab626 100644 (file)
@@ -2,11 +2,15 @@
 package net.sf.openrocket.preset.xml;
 
 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;
 
 /**
  * Bulkhead preset XML handler.
@@ -51,4 +55,15 @@ public class BulkHeadDTO extends BaseComponentDTO {
     public void setLength(final double theLength) {
         length = theLength;
     }
+
+    public ComponentPreset asComponentPreset(List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        TypedPropertyMap props = new TypedPropertyMap();
+        addProps(props, materials);
+        props.put(ComponentPreset.OUTER_DIAMETER, this.getOutsideDiameter());
+        props.put(ComponentPreset.LENGTH, this.getLength());
+        props.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD);
+
+        return ComponentPresetFactory.create(props);
+    }
+
 }
index 3f217b5da927f0f870ed69feda43cb6e9624aefd..1312b19661c232438ceb0db585eb4340f73530eb 100644 (file)
@@ -2,11 +2,15 @@
 package net.sf.openrocket.preset.xml;
 
 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;
 
 /**
  * Centering ring preset XML handler.
@@ -65,4 +69,19 @@ public class CenteringRingDTO extends BaseComponentDTO {
     public void setLength(final double theLength) {
         length = theLength;
     }
+
+    public ComponentPreset asComponentPreset(List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        return asComponentPreset(ComponentPreset.Type.CENTERING_RING, materials);
+    }
+
+    public ComponentPreset asComponentPreset(ComponentPreset.Type type, List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        TypedPropertyMap props = new TypedPropertyMap();
+        addProps(props, materials);
+        props.put(ComponentPreset.INNER_DIAMETER, this.getInsideDiameter());
+        props.put(ComponentPreset.OUTER_DIAMETER, this.getOutsideDiameter());
+        props.put(ComponentPreset.LENGTH, this.getLength());
+        props.put(ComponentPreset.TYPE, type);
+
+        return ComponentPresetFactory.create(props);
+    }
 }
index 4736d31c80c358584411e5657c27fdaa6ace6081..71d0e66806f1347f034ff11a5a372479919c1731 100644 (file)
@@ -2,10 +2,12 @@
 package net.sf.openrocket.preset.xml;
 
 import net.sf.openrocket.preset.ComponentPreset;
+import net.sf.openrocket.preset.InvalidComponentPresetException;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
 
 /**
  * Engine block preset XML handler.
@@ -31,4 +33,8 @@ public class EngineBlockDTO extends CenteringRingDTO {
         super(thePreset);
     }
 
+    @Override
+    public ComponentPreset asComponentPreset(List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        return super.asComponentPreset(ComponentPreset.Type.ENGINE_BLOCK, materials);
+    }
 }
index 9fe1781ec0f3687f8adfee066f277b964c51c81f..929d84954032a0fac04be54d3296cd385b596291 100644 (file)
@@ -1,6 +1,7 @@
 
 package net.sf.openrocket.preset.xml;
 
+import net.sf.openrocket.database.Databases;
 import net.sf.openrocket.material.Material;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -74,4 +75,8 @@ public class MaterialDTO {
     public void setUom(final String theUom) {
         uom = theUom;
     }
+
+    Material asMaterial() {
+        return Databases.findMaterial(type.getORMaterialType(), name, density, false);
+    }
 }
index a75092bbeda58cd48ce9e16bc7ec5ecb2f83a523..93a83b35f05357813d446781f2ac9af3efa9442d 100644 (file)
@@ -29,4 +29,7 @@ public enum MaterialTypeDTO {
         return BULK; //default
     }
 
+    public Material.Type getORMaterialType() {
+        return corollary;
+    }
 }
index ab35222b8dcf62053630381950787a4f2730d3a8..dcab26f24e5a1ad5af21931828f88ceb41dba1af 100644 (file)
@@ -1,11 +1,15 @@
 package net.sf.openrocket.preset.xml;
 
 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;
 
 /**
  * A NoseCone preset XML handler.
@@ -75,4 +79,17 @@ public class NoseConeDTO extends BaseComponentDTO {
     public void setLength(final double theLength) {
         length = theLength;
     }
+
+    public ComponentPreset asComponentPreset(List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        TypedPropertyMap props = new TypedPropertyMap();
+        addProps(props, materials);
+        props.put(ComponentPreset.SHAPE, shape.getORShape());
+        props.put(ComponentPreset.AFT_OUTER_DIAMETER, this.getShoulderDiameter());
+        props.put(ComponentPreset.AFT_SHOULDER_DIAMETER, this.getOutsideDiameter());
+        props.put(ComponentPreset.LENGTH, this.getLength());
+        props.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE);
+
+        return ComponentPresetFactory.create(props);
+    }
+
 }
index 6f097c59902eb847d9eba4c1dc1f3c9e1f92877c..51c868539844d90b41c5a6971d7227b63b4f1fb8 100644 (file)
@@ -1,5 +1,8 @@
 package net.sf.openrocket.preset.xml;
 
+import net.sf.openrocket.preset.ComponentPreset;
+import net.sf.openrocket.preset.InvalidComponentPresetException;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
@@ -21,7 +24,7 @@ public class OpenRocketComponentDTO {
     private final String version = "0.1";
 
     @XmlElementWrapper(name = "Materials")
-            @XmlElement(name = "Material")
+    @XmlElement(name = "Material")
     List<MaterialDTO> materials = new ArrayList<MaterialDTO>();
 
     @XmlElementWrapper(name = "Components")
@@ -66,4 +69,12 @@ public class OpenRocketComponentDTO {
     public void setComponents(final List<BaseComponentDTO> theComponents) {
         components = theComponents;
     }
+
+    public List<ComponentPreset> asComponentPresets() throws InvalidComponentPresetException {
+        List<ComponentPreset> result = new ArrayList<ComponentPreset>();
+        for (int i = 0; i < components.size(); i++) {
+            result.add(components.get(i).asComponentPreset(materials));
+        }
+        return result;
+    }
 }
index e0f03142bfc67e39ee248bbf1365cca0c36e7e2b..33b1a4163454dfd7bdce873ed89baa7f98a35569 100644 (file)
@@ -3,14 +3,18 @@ package net.sf.openrocket.preset.xml;
 import net.sf.openrocket.logging.LogHelper;
 import net.sf.openrocket.material.Material;
 import net.sf.openrocket.preset.ComponentPreset;
+import net.sf.openrocket.preset.InvalidComponentPresetException;
 import net.sf.openrocket.startup.Application;
 
 import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
 import java.io.BufferedWriter;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.io.Reader;
 import java.io.StringWriter;
 import java.util.List;
 
@@ -44,12 +48,29 @@ public class OpenRocketComponentSaver {
             return sw.toString();
         }
         catch (Exception e) {
-            log.error("Could not marshall a preset list. " + e.getMessage());
+            log.error("Could not marshal a preset list. " + e.getMessage());
         }
 
         return null;
     }
 
+    public List<ComponentPreset> unmarshalFromOpenRocketComponent(Reader is) throws InvalidComponentPresetException {
+        return fromOpenRocketComponent(is).asComponentPresets();
+    }
+
+    private OpenRocketComponentDTO fromOpenRocketComponent(Reader is) {
+        try {
+            JAXBContext bind = JAXBContext.newInstance(OpenRocketComponentDTO.class);
+            Unmarshaller unmarshaller = bind.createUnmarshaller();
+            return (OpenRocketComponentDTO)unmarshaller.unmarshal(is);
+        }
+        catch (JAXBException e) {
+            e.printStackTrace();
+            log.error("Could not unmarshal the .orc file. " + e.getMessage());
+        }
+        return null;
+    }
+
     /**
      * Write an XML representation of a list of presets.
      *
@@ -90,6 +111,10 @@ public class OpenRocketComponentSaver {
         return rsd;
     }
 
+    public List<ComponentPreset> fromOpenRocketComponentDTO(OpenRocketComponentDTO dto) {
+        return null;
+    }
+
     /**
      * Factory method that maps a preset to the corresponding DTO handler.
      *
index 7cdb1e3f0c642712b8226fd41f53a4d870fd4bb0..d85fbcb0f0a5e0d8d5b3fb6062a5b38ffdadf670 100644 (file)
@@ -34,4 +34,8 @@ public enum ShapeDTO {
         }
         return ELLIPSOID; //default
     }
+
+    public Transition.Shape getORShape() {
+        return corollary;
+    }
 }
index 91c62ed19dd34ad88f00266df827f7a544456460..463eceb602fcd29a00771f78c1938699b17b7e13 100644 (file)
@@ -2,11 +2,15 @@
 package net.sf.openrocket.preset.xml;
 
 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;
 
 /**
  * Transition preset XML handler.
@@ -124,4 +128,20 @@ public class TransitionDTO extends BaseComponentDTO {
     public void setLength(final double theLength) {
         length = theLength;
     }
+
+    public ComponentPreset asComponentPreset(List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        TypedPropertyMap props = new TypedPropertyMap();
+        addProps(props, materials);
+        props.put(ComponentPreset.SHAPE, shape.getORShape());
+        props.put(ComponentPreset.FORE_OUTER_DIAMETER, this.getForeOutsideDiameter());
+        props.put(ComponentPreset.FORE_SHOULDER_DIAMETER, this.getForeShoulderDiameter());
+        props.put(ComponentPreset.FORE_SHOULDER_LENGTH, this.getForeShoulderLength());
+        props.put(ComponentPreset.AFT_OUTER_DIAMETER, this.getAftOutsideDiameter());
+        props.put(ComponentPreset.AFT_SHOULDER_DIAMETER, this.getAftShoulderDiameter());
+        props.put(ComponentPreset.AFT_SHOULDER_LENGTH, this.getAftShoulderLength());
+        props.put(ComponentPreset.LENGTH, this.getLength());
+        props.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION);
+
+        return ComponentPresetFactory.create(props);
+    }
 }
index 1e87dc1fb03ff00b9dac6b704838c2393774a3a8..3cc09658936c61857a8a8d5b116aa6e3c48dd77e 100644 (file)
@@ -2,10 +2,12 @@
 package net.sf.openrocket.preset.xml;
 
 import net.sf.openrocket.preset.ComponentPreset;
+import net.sf.openrocket.preset.InvalidComponentPresetException;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
 
 /**
  * Tube coupler preset XML handler.
@@ -30,4 +32,9 @@ public class TubeCouplerDTO extends BodyTubeDTO {
     public TubeCouplerDTO(ComponentPreset thePreset) {
         super(thePreset);
     }
+
+    @Override
+    public ComponentPreset asComponentPreset(List<MaterialDTO> materials) throws InvalidComponentPresetException {
+        return super.asComponentPreset(ComponentPreset.Type.TUBE_COUPLER, materials);
+    }
 }