De-localize Material and FlightDataType objects when persisting in ork files. Added...
[debian/openrocket] / core / src / net / sf / openrocket / file / rocksim / importt / BaseHandler.java
index 59fb05a3da739dbd1d7ec4086742d54998ef3657..b87664a881f4e47bfdb6d8da96d163b702a52adb 100644 (file)
@@ -4,7 +4,9 @@
 package net.sf.openrocket.file.rocksim.importt;
 
 import net.sf.openrocket.aerodynamics.WarningSet;
-import net.sf.openrocket.file.simplesax.ElementHandler;
+import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
+import net.sf.openrocket.file.rocksim.RocksimDensityType;
+import net.sf.openrocket.file.simplesax.AbstractElementHandler;
 import net.sf.openrocket.material.Material;
 import net.sf.openrocket.rocketcomponent.RocketComponent;
 import org.xml.sax.SAXException;
@@ -16,9 +18,9 @@ import java.util.HashMap;
 /**
  * An abstract base class that handles common parsing.  All Rocksim component handlers are subclassed from here.
  *
- * @param <C>   the specific RocketComponent subtype for which the concrete handler can create
+ * @param <C> the specific RocketComponent subtype for which the concrete handler can create
  */
-public abstract class BaseHandler<C extends RocketComponent> extends ElementHandler {
+public abstract class BaseHandler<C extends RocketComponent> extends AbstractElementHandler {
 
     /**
      * Prepend rocksim materials.
@@ -49,10 +51,11 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
     /**
      * The SAX method called when the closing element tag is reached.
      *
-     * @param element        the element name.
-     * @param attributes    attributes of the element.
-     * @param content        the textual content of the element.
-     * @param warnings        the warning set to store warnings in.
+     * @param element    the element name.
+     * @param attributes attributes of the element.
+     * @param content    the textual content of the element.
+     * @param warnings   the warning set to store warnings in.
+     *
      * @throws SAXException
      */
 
@@ -61,23 +64,23 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
             throws SAXException {
         final C component = getComponent();
         try {
-            if ("Name".equals(element)) {
+            if (RocksimCommonConstants.NAME.equals(element)) {
                 component.setName(content);
             }
-            if ("KnownMass".equals(element)) {
-                mass = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_MASS);
+            if (RocksimCommonConstants.KNOWN_MASS.equals(element)) {
+                mass = Math.max(0d, Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
             }
-            if ("Density".equals(element)) {
-                density = Math.max(0d, Double.parseDouble(content) );
+            if (RocksimCommonConstants.DENSITY.equals(element)) {
+                density = Math.max(0d, Double.parseDouble(content));
             }
-            if ("KnownCG".equals(element)) {
-                cg = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_LENGTH);
+            if (RocksimCommonConstants.KNOWN_CG.equals(element)) {
+                cg = Math.max(0d, Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
             }
-            if ("UseKnownCG".equals(element)) {  //Rocksim sets UseKnownCG to true to control the override of both cg and mass
+            if (RocksimCommonConstants.USE_KNOWN_CG.equals(element)) {  //Rocksim sets UseKnownCG to true to control the override of both cg and mass
                 boolean override = "1".equals(content);
                 setOverride(component, override, mass, cg);
             }
-            if ("DensityType".equals(element)) {
+            if (RocksimCommonConstants.DENSITY_TYPE.equals(element)) {
                 densityType = RocksimDensityType.fromCode(Integer.parseInt(content));
             }
         }
@@ -103,13 +106,14 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
     /**
      * Compute the density.  Rocksim does strange things with densities.  For some streamer material it's in cubic,
      * rather than square, units.  In those cases it needs to be converted to an appropriate SURFACE material density.
-     * Some G10 fiberglass materials are in cubic units, other G10 fiberglass is in square units.  And due to a
-     * Rocksim bug, some densities are 0 when they clearly should not be.
-     *
+     * Some G10 fiberglass materials are in cubic units, other G10 fiberglass is in square units.  And due to a Rocksim
+     * bug, some densities are 0 when they clearly should not be.
+     * <p/>
      * This may be overridden for specific component density computations.
      *
      * @param type       the rocksim density
      * @param rawDensity the density as specified in the Rocksim design file
+     *
      * @return a value in OpenRocket SURFACE density units
      */
     protected double computeDensity(RocksimDensityType type, double rawDensity) {
@@ -117,14 +121,14 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
     }
 
     /**
-     * If the Rocksim component does not override the mass, then create a Material based upon the density defined
-     * for that component.  This *should* result in a consistent representation of Cg between Rocksim and OpenRocket.
+     * If the Rocksim component does not override the mass, then create a Material based upon the density defined for
+     * that component.  This *should* result in a consistent representation of Cg between Rocksim and OpenRocket.
      *
      * @param component       the component
      * @param type            the type of the material
      * @param density         the density in g/cm^3
-     * @param definedMaterial the material that is currently defined on the component; used only to get the name
-     *                        as it appears in Rocksim
+     * @param definedMaterial the material that is currently defined on the component; used only to get the name as it
+     *                        appears in Rocksim
      */
     public static void updateComponentMaterial(RocketComponent component, String definedMaterial, Material.Type type,
                                                double density) {
@@ -137,10 +141,10 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
     /**
      * Override the mass and Cg of the component.
      *
-     * @param component  the component
-     * @param override   true if any override should happen
-     * @param mass       the override mass
-     * @param cg         the override cg
+     * @param component the component
+     * @param override  true if any override should happen
+     * @param mass      the override mass
+     * @param cg        the override cg
      */
     public static void setOverride(RocketComponent component, boolean override, double mass, double cg) {
         if (override) {
@@ -169,7 +173,7 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
     /**
      * Some CG positions in Rocksim do not correspond to the CG position reference in OpenRocket.
      *
-     * @param theCG  the CG value to really use when overriding CG on the OpenRocket component
+     * @param theCG the CG value to really use when overriding CG on the OpenRocket component
      */
     protected void setCG(double theCG) {
         cg = theCG;
@@ -178,35 +182,62 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
     /**
      * Set the material name as specified in the Rocksim design file.
      *
-     * @param content  the material name
+     * @param content the material name
      */
     protected void setMaterialName(String content) {
         materialName = content;
     }
 
+    /**
+     * Get the Rocksim enum of the component's density type.
+     *
+     * @return a Rocksim density type
+     */
+    protected RocksimDensityType getDensityType() {
+        return densityType;
+    }
+
     /**
      * Add child to parent only if the child is compatible.  Otherwise add to warning set.
-     * 
-     * @param parent  the parent component
-     * @param child   the child component
+     *
+     * @param parent   the parent component
+     * @param child    the child component
      * @param warnings the warning set
-     * 
+     *
      * @return true if the child is compatible with parent
      */
     protected static boolean isCompatible(RocketComponent parent, Class<? extends RocketComponent> child, WarningSet warnings) {
+        return isCompatible(parent, child, warnings, false);
+    }
+
+    /**
+     * Add child to parent only if the child is compatible.  Otherwise add to warning set.
+     *
+     * @param parent   the parent component
+     * @param child    the child component
+     * @param warnings the warning set
+     * @param suppressWarnings suppress warnings, just return the boolean
+     *
+     * @return true if the child is compatible with parent
+     */
+    protected static boolean isCompatible(RocketComponent parent, Class<? extends RocketComponent> child,
+                                          WarningSet warnings,
+                                          boolean suppressWarnings) {
         if (!parent.isCompatible(child)) {
-            warnings.add(child.getName() + " can not be attached to "
-                         + parent.getComponentName() + ", ignoring component.");
+            if (!suppressWarnings) {
+                warnings.add(child.getName() + " can not be attached to "
+                        + parent.getComponentName() + ", ignoring component.");
+            }
             return false;
         }
         else {
             return true;
         }
     }
-    
+
     /**
-     * Create a custom material based on the density.  The name of the material is prepended with 'RS: ' to
-     * indicate it came from a RockSim material.
+     * Create a custom material based on the density.  The name of the material is prepended with 'RS: ' to indicate it
+     * came from a RockSim material.
      *
      * @param type    the type of the material
      * @param name    the name of the component
@@ -215,15 +246,15 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
      * @return a Material instance
      */
     public static Material createCustomMaterial(Material.Type type, String name, double density) {
-        return Material.newMaterial(type, ROCKSIM_MATERIAL_PREFIX + name, density, true);
+        return Material.newUserMaterial(type, ROCKSIM_MATERIAL_PREFIX + name, density);
     }
 
     /**
      * Set the material onto an instance of RocketComponent.  This is done because only some subtypes of RocketComponent
      * have the setMaterial method.  Unfortunately the supertype cannot be used.
      *
-     * @param component  the component who's material is to be set
-     * @param material the material to be set on the component (defined by getComponent())
+     * @param component the component who's material is to be set
+     * @param material  the material to be set on the component (defined by getComponent())
      */
     private static void setMaterial(RocketComponent component, Material material) {
         try {
@@ -241,9 +272,9 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
     /**
      * Find a method by name and argument list.
      *
-     * @param component  the component who's material is to be seta
-     * @param name the method name
-     * @param args the class types of the parameters
+     * @param component the component who's material is to be set
+     * @param name      the method name
+     * @param args      the class types of the parameters
      *
      * @return the Method instance, or null
      */