Added inference of Rocksim shock cords to try to be a little more predictive when...
[debian/openrocket] / core / src / net / sf / openrocket / file / rocksim / importt / BaseHandler.java
index 6302c62a3e19baa9a3ea917764c8f3ef9b37ba32..a9d0bd944f939f1647f2e5c0436c0a5aa6a28f1d 100644 (file)
@@ -18,7 +18,7 @@ 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 AbstractElementHandler {
 
@@ -51,10 +51,11 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
     /**
      * 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
      */
 
@@ -70,7 +71,7 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
                 mass = Math.max(0d, Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
             }
             if (RocksimCommonConstants.DENSITY.equals(element)) {
-                density = Math.max(0d, Double.parseDouble(content) );
+                density = Math.max(0d, Double.parseDouble(content));
             }
             if (RocksimCommonConstants.KNOWN_CG.equals(element)) {
                 cg = Math.max(0d, Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
@@ -105,13 +106,14 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
     /**
      * 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) {
@@ -119,14 +121,14 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
     }
 
     /**
-     * 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) {
@@ -139,10 +141,10 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
     /**
      * 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) {
@@ -171,7 +173,7 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
     /**
      * 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;
@@ -180,35 +182,62 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
     /**
      * 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
@@ -224,8 +253,8 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
      * 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 {
@@ -243,9 +272,9 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
     /**
      * 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
      */