De-localize Material and FlightDataType objects when persisting in ork files. Added...
[debian/openrocket] / core / src / net / sf / openrocket / preset / xml / BaseComponentDTO.java
index 6be6ebd9618dd8dedb32c4bd46b265037a1804a5..b39bc23ec4245a2cb3cb07e3e1d9be36d58a903e 100644 (file)
@@ -76,6 +76,9 @@ public abstract class BaseComponentDTO {
                if ( preset.has(ComponentPreset.FILLED) ) {
                        setFilled( preset.get(ComponentPreset.FILLED));
                }
+        if (preset.has(ComponentPreset.IMAGE) ) {
+            setImageData(preset.get(ComponentPreset.IMAGE));
+        }
        }
 
        public String getManufacturer() {
@@ -171,17 +174,30 @@ public abstract class BaseComponentDTO {
                if ( filled != null ) {
                        props.put(ComponentPreset.FILLED, getFilled());
                }
+        if (image != null) {
+            props.put(ComponentPreset.IMAGE, image);
+        }
        }
 
-       private Material find(List<MaterialDTO> materialList, AnnotatedMaterialDTO dto) {
+       protected Material find(List<MaterialDTO> materialList, AnnotatedMaterialDTO dto) {
+               if ( dto == null ) {
+                       return null;
+               }
                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);
+
+               // Don't have one, first check OR's database
+        Material m = Databases.findMaterial(dto.getORMaterialType(), dto.material);
+        if ( m != null ) {
+               return m;
+        }
+
+        return Material.newUserMaterial(dto.getORMaterialType(), dto.material, 0.0);
+
        }
 
        static class AnnotatedMaterialDTO {
@@ -196,6 +212,17 @@ public abstract class BaseComponentDTO {
                        type = theMaterial.getType().name();
                        material = theMaterial.getName();
                }
+               
+               public Material.Type getORMaterialType() {
+                       if ( "BULK".equals(type) ) {
+                               return Material.Type.BULK;
+                       } else if ( "SURFACE".equals(type) ) {
+                               return Material.Type.SURFACE;
+                       } else if ( "LINE".equals(type) ) {
+                               return Material.Type.LINE;
+                       }
+                       throw new IllegalArgumentException( "Inavlid material type " + type +" specified for Component" );
+               }
        }
 
        static class AnnotatedLengthDTO {
@@ -233,6 +260,7 @@ public abstract class BaseComponentDTO {
        }
 
     static class Base64Adapter extends XmlAdapter<String, byte[]> {
+       @Override
         public byte[] unmarshal(String s) {
             if (s == null) {
                 return null;
@@ -240,6 +268,7 @@ public abstract class BaseComponentDTO {
             return DatatypeConverter.parseBase64Binary(s);
         }
 
+       @Override
         public String marshal(byte[] bytes) {
             if (bytes == null) {
                 return null;