Clean up FIXME - adding more information to the warning message.
[debian/openrocket] / core / src / net / sf / openrocket / file / openrocket / importt / OpenRocketLoader.java
index ca0332c4749384c613d1655e12bdc457924f55a4..39845c7f3733075cc9316ab0707824ed1348a71f 100644 (file)
@@ -67,7 +67,7 @@ import net.sf.openrocket.rocketcomponent.ThicknessRingComponent;
 import net.sf.openrocket.rocketcomponent.Transition;
 import net.sf.openrocket.rocketcomponent.TrapezoidFinSet;
 import net.sf.openrocket.rocketcomponent.TubeCoupler;
-import net.sf.openrocket.simulation.CustomExpression;
+import net.sf.openrocket.simulation.customexpression.CustomExpression;
 import net.sf.openrocket.simulation.FlightData;
 import net.sf.openrocket.simulation.FlightDataBranch;
 import net.sf.openrocket.simulation.FlightDataType;
@@ -649,6 +649,7 @@ class OpenRocketContentHandler extends AbstractElementHandler {
 
        private boolean rocketDefined = false;
        private boolean simulationsDefined = false;
+       private boolean datatypesDefined = false;
 
        public OpenRocketContentHandler(DocumentLoadingContext context) {
                this.context = context;
@@ -656,7 +657,6 @@ class OpenRocketContentHandler extends AbstractElementHandler {
                this.doc = new OpenRocketDocument(rocket);
        }
 
-
        public OpenRocketDocument getDocument() {
                if (!rocketDefined)
                        return null;
@@ -677,6 +677,15 @@ class OpenRocketContentHandler extends AbstractElementHandler {
                        rocketDefined = true;
                        return new ComponentParameterHandler(rocket, context);
                }
+               
+               if (element.equals("datatypes")){
+                       if (datatypesDefined) {
+                               warnings.add(Warning.fromString("Multiple datatype blocks. Ignoring later ones."));
+                               return null;
+                       }
+                       datatypesDefined = true;
+                       return new DatatypeHandler(this, context);
+               }
 
                if (element.equals("simulations")) {
                        if (simulationsDefined) {
@@ -697,6 +706,90 @@ class OpenRocketContentHandler extends AbstractElementHandler {
 
 
 
+class DatatypeHandler extends AbstractElementHandler {
+       private final DocumentLoadingContext context;
+       private final OpenRocketContentHandler contentHandler;
+       private CustomExpressionHandler customExpressionHandler = null;
+       
+       public DatatypeHandler(OpenRocketContentHandler contentHandler, DocumentLoadingContext context) {
+               this.context = context;
+               this.contentHandler = contentHandler;
+       }
+       
+       @Override
+       public ElementHandler openElement(String element,
+                       HashMap<String, String> attributes, WarningSet warnings)
+                       throws SAXException {
+               
+               if (element.equals("type") && attributes.get("source").equals("customexpression") ){
+                       customExpressionHandler = new CustomExpressionHandler(contentHandler, context);
+                       return customExpressionHandler;
+               }
+               else {
+                       warnings.add(Warning.fromString("Unknown datatype " + element + " defined, ignoring"));
+               }
+               
+               return this;
+       }
+       
+       @Override
+       public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
+               attributes.remove("source");
+               super.closeElement(element, attributes, content, warnings);
+               
+               if (customExpressionHandler != null){
+                       contentHandler.getDocument().addCustomExpression(customExpressionHandler.currentExpression);
+               }
+               
+       }
+       
+}
+
+class CustomExpressionHandler extends AbstractElementHandler{
+       private final DocumentLoadingContext context;
+       private final OpenRocketContentHandler contentHandler;
+       public CustomExpression currentExpression;
+       
+       public CustomExpressionHandler(OpenRocketContentHandler contentHandler, DocumentLoadingContext context) {
+               this.context = context;
+               this.contentHandler = contentHandler;
+               currentExpression = new CustomExpression(contentHandler.getDocument());
+
+       }
+       
+       @Override
+       public ElementHandler openElement(String element,
+                       HashMap<String, String> attributes, WarningSet warnings)
+                       throws SAXException {
+                               
+               return this;
+       }
+       
+       @Override
+       public void closeElement(String element, HashMap<String, String> attributes,
+               String content, WarningSet warnings) throws SAXException {
+                               
+               if (element.equals("type")) {
+                       contentHandler.getDocument().addCustomExpression(currentExpression);
+               }
+                       
+               if (element.equals("name")) {
+                       currentExpression.setName(content);
+               }
+                
+               if (element.equals("symbol")) {
+                       currentExpression.setSymbol(content);
+               }
+               
+               if (element.equals("unit") && attributes.get("unittype").equals("auto")) {
+                       currentExpression.setUnit(content);
+               }
+               
+               if (element.equals("expression")){
+                       currentExpression.setExpression(content);
+               }
+       }       
+}
 
 /**
  * A handler that creates components from the corresponding elements.  The control of the
@@ -1211,9 +1304,7 @@ class SingleSimulationHandler extends AbstractElementHandler {
 
        private SimulationConditionsHandler conditionHandler;
        private FlightDataHandler dataHandler;
-       private CustomExpressionsHandler customExpressionsHandler;
        
-       private ArrayList<CustomExpression> customExpressions = new ArrayList<CustomExpression>();
        private final List<String> listeners = new ArrayList<String>();
 
        public SingleSimulationHandler(OpenRocketDocument doc, DocumentLoadingContext context) {
@@ -1221,14 +1312,10 @@ class SingleSimulationHandler extends AbstractElementHandler {
                this.context = context;
        }
 
-       public void setCustomExpressions(ArrayList<CustomExpression> expressions){
-               this.customExpressions = expressions;
+       public OpenRocketDocument getDocument(){
+               return doc;
        }
        
-       public ArrayList<CustomExpression> getCustomExpressions(){
-               return customExpressions;
-       }
-
        @Override
        public ElementHandler openElement(String element, HashMap<String, String> attributes,
                        WarningSet warnings) {
@@ -1236,9 +1323,6 @@ class SingleSimulationHandler extends AbstractElementHandler {
                if (element.equals("name") || element.equals("simulator") ||
                                element.equals("calculator") || element.equals("listener")) {
                        return PlainTextHandler.INSTANCE;
-               } else if (element.equals("customexpressions")) {
-                       customExpressionsHandler = new CustomExpressionsHandler(this, context);
-                       return customExpressionsHandler;
                } else if (element.equals("conditions")) {
                        conditionHandler = new SimulationConditionsHandler(doc.getRocket(), context);
                        return conditionHandler;
@@ -1299,71 +1383,12 @@ class SingleSimulationHandler extends AbstractElementHandler {
                else
                        data = dataHandler.getFlightData();
 
-               Simulation simulation = new Simulation(doc, doc.getRocket(), status, name,
+               Simulation simulation = new Simulation(doc.getRocket(), status, name,
                                conditions, listeners, data);
-               
-               // Note : arraylist implementation in simulation different from standard one
-               for (CustomExpression exp : customExpressions){
-                       exp.setSimulation(simulation);
-                       if (exp.checkAll())
-                               simulation.addCustomExpression(exp);
-               }
                                
                doc.addSimulation(simulation);
        }
 }
-
-class CustomExpressionsHandler extends AbstractElementHandler {
-       private final DocumentLoadingContext context;
-       private final SingleSimulationHandler simHandler;
-       public CustomExpression currentExpression = new CustomExpression();
-       private final ArrayList<CustomExpression> customExpressions = new ArrayList<CustomExpression>();
-
-       
-       public CustomExpressionsHandler(SingleSimulationHandler simHandler, DocumentLoadingContext context) {
-               this.context = context;
-               this.simHandler = simHandler;
-       }
-       
-       @Override
-       public ElementHandler openElement(String element,
-                       HashMap<String, String> attributes, WarningSet warnings)
-                       throws SAXException {
-               
-               if (element.equals("expression")){
-                       currentExpression = new CustomExpression();
-               }
-               
-               return this;
-       }
-
-       @Override
-       public void closeElement(String element, HashMap<String, String> attributes,
-               String content, WarningSet warnings) {
-               
-               if (element.equals("expression"))
-                       customExpressions.add(currentExpression);
-               
-               if (element.equals("name"))
-                       currentExpression.setName(content);
-                
-               else if (element.equals("symbol"))
-                       currentExpression.setSymbol(content);
-               
-               else if (element.equals("unit"))
-                       currentExpression.setUnit(content);
-               
-               else if (element.equals("expressionstring"))
-                       currentExpression.setExpression(content);
-               
-       }
-       
-       @Override
-       public void endHandler(String element, HashMap<String, String> attributes,
-                       String content, WarningSet warnings) {
-               simHandler.setCustomExpressions(customExpressions);
-       }
-}
        
 class SimulationConditionsHandler extends AbstractElementHandler {
        private final DocumentLoadingContext context;
@@ -1697,6 +1722,17 @@ class FlightDataBranchHandler extends AbstractElementHandler {
        // not the nicest but this is always the case anyway.
        private FlightDataType findFlightDataType(String name){
                
+        // Kevins version with lookup by key. Not using right now
+               /*
+               if ( key != null ) {
+                       for (FlightDataType t : FlightDataType.ALL_TYPES){
+                               if (t.getKey().equals(key) ){
+                                       return t;
+                               }
+                       }
+               }
+               */
+        
                // Look in built in types
                for (FlightDataType t : FlightDataType.ALL_TYPES){
                        if (t.getName().equals(name) ){
@@ -1705,25 +1741,12 @@ class FlightDataBranchHandler extends AbstractElementHandler {
                }
                
                // Look in custom expressions
-               for (CustomExpression exp : simHandler.getCustomExpressions()){
+               for (CustomExpression exp : simHandler.getDocument().getCustomExpressions()){
                        if (exp.getName().equals(name) ){
                                return exp.getType();
                        }
                }
                
-               // Look in custom expressions, meanwhile set priority based on order in file
-               /*
-               int totalExpressions = simHandler.getCustomExpressions().size();
-               for (int i=0; i<totalExpressions; i++){
-                       CustomExpression exp = simHandler.getCustomExpressions().get(i);                        
-                       if (exp.getName().equals(name) ){
-                               FlightDataType t = exp.getType();
-                               t.setPriority(-1*(totalExpressions-i));
-                               return exp.getType();
-                       }
-               }
-               */
-               
                log.warn("Could not find the flight data type '"+name+"' used in the XML file. Substituted type with unknown symbol and units.");
                return FlightDataType.getType(name, "Unknown", UnitGroup.UNITS_NONE);
        }
@@ -2055,130 +2078,132 @@ class ColorSetter implements Setter {
 
 ////ComponentPresetSetter  -  sets a ComponentPreset value
 class ComponentPresetSetter implements Setter {
-       private final Reflection.Method setMethod;
-
-       public ComponentPresetSetter(Reflection.Method set) {
-               this.setMethod = set;
-       }
+private final Reflection.Method setMethod;
 
-       @Override
-       public void set(RocketComponent c, String name, HashMap<String, String> attributes,
-                       WarningSet warnings) {
-// FIXME - probably need more data in the warning messages - like what component preset...
-               String manufacturerName = attributes.get("manufacturer");
-               if ( manufacturerName == null ) {
-                       warnings.add(Warning.fromString("Invalid ComponentPreset, no manufacturer specified.  Ignored"));
-                       return;
-               }
+public ComponentPresetSetter(Reflection.Method set) {
+       this.setMethod = set;
+}
 
-               String productNo = attributes.get("partno");
-               if ( productNo == null ) {
-                       warnings.add(Warning.fromString("Invalid ComponentPreset, no partno specified.  Ignored"));
-                       return;
-               }
+@Override
+public void set(RocketComponent c, String name, HashMap<String, String> attributes,
+               WarningSet warnings) {
+       String manufacturerName = attributes.get("manufacturer");
+       if ( manufacturerName == null ) {
+               warnings.add(Warning.fromString("Invalid ComponentPreset for component " + c.getName() + ", no manufacturer specified.  Ignored"));
+               return;
+       }
 
-               String digest = attributes.get("digest");
-               if ( digest == null ) {
-                       warnings.add(Warning.fromString("Invalid ComponentPreset, no digest specified."));
-               }
+       String productNo = attributes.get("partno");
+       if ( productNo == null ) {
+               warnings.add(Warning.fromString("Invalid ComponentPreset for component " + c.getName() + ", no partno specified.  Ignored"));
+               return;
+       }
 
-               String type = attributes.get("type");
-               if ( type == null ) {
-                       warnings.add(Warning.fromString("Invalid ComponentPreset, no type specified."));
-               }
+       String digest = attributes.get("digest");
+       if ( digest == null ) {
+               warnings.add(Warning.fromString("Invalid ComponentPreset for component " + c.getName() + ", no digest specified."));
+       }
 
-               List<ComponentPreset> presets = Application.getComponentPresetDao().find( manufacturerName, productNo );
+       String type = attributes.get("type");
+       if ( type == null ) {
+               warnings.add(Warning.fromString("Invalid ComponentPreset for component " + c.getName() + ", no type specified."));
+       }
 
-               ComponentPreset matchingPreset = null;
+       List<ComponentPreset> presets = Application.getComponentPresetDao().find( manufacturerName, productNo );
 
-               for( ComponentPreset preset: presets ) {
-                       if ( digest != null && preset.getDigest().equals(digest) ) {
-                               // Found one with matching digest.  Take it.
-                               matchingPreset = preset;
-                               break;
-                       }
-                       if ( type != null && preset.getType().name().equals(type) && matchingPreset != null) {
-                               // Found the first one with matching type.
-                               matchingPreset = preset;
-                       }
-               }
+       ComponentPreset matchingPreset = null;
 
-               // Was any found?
-               if ( matchingPreset == null ) {
-                       warnings.add(Warning.fromString("No matching ComponentPreset found"));
-                       return;
+       for( ComponentPreset preset: presets ) {
+               if ( digest != null && preset.getDigest().equals(digest) ) {
+                       // Found one with matching digest.  Take it.
+                       matchingPreset = preset;
+                       break;
                }
-               
-               if ( digest != null && !matchingPreset.getDigest().equals(digest) ) {
-                       warnings.add(Warning.fromString("ComponentPreset has wrong digest"));
+               if ( type != null && preset.getType().name().equals(type) && matchingPreset != null) {
+                       // Found the first one with matching type.
+                       matchingPreset = preset;
                }
+       }
+
+       // Was any found?
+       if ( matchingPreset == null ) {
+               warnings.add(Warning.fromString("No matching ComponentPreset for component " + c.getName() + " found matching " + manufacturerName + " " + productNo));
+               return;
+       }
 
-               setMethod.invoke(c, matchingPreset);
+       if ( digest != null && !matchingPreset.getDigest().equals(digest) ) {
+               warnings.add(Warning.fromString("ComponentPreset for component " + c.getName() + " has wrong digest"));
        }
+
+       setMethod.invoke(c, matchingPreset);
+}
 }
 
 
 ////MaterialSetter  -  sets a Material value
 class MaterialSetter implements Setter {
-       private final Reflection.Method setMethod;
-       private final Material.Type type;
+private final Reflection.Method setMethod;
+private final Material.Type type;
 
-       public MaterialSetter(Reflection.Method set, Material.Type type) {
-               this.setMethod = set;
-               this.type = type;
-       }
-
-       @Override
-       public void set(RocketComponent c, String name, HashMap<String, String> attributes,
-                       WarningSet warnings) {
+public MaterialSetter(Reflection.Method set, Material.Type type) {
+       this.setMethod = set;
+       this.type = type;
+}
 
-               Material mat;
+@Override
+public void set(RocketComponent c, String name, HashMap<String, String> attributes,
+               WarningSet warnings) {
 
-               // Check name != ""
-               name = name.trim();
-               if (name.equals("")) {
-                       warnings.add(Warning.fromString("Illegal material specification, ignoring."));
-                       return;
-               }
+       Material mat;
 
-               // Parse density
-               double density;
-               String str;
-               str = attributes.remove("density");
-               if (str == null) {
-                       warnings.add(Warning.fromString("Illegal material specification, ignoring."));
-                       return;
-               }
-               try {
-                       density = Double.parseDouble(str);
-               } catch (NumberFormatException e) {
-                       warnings.add(Warning.fromString("Illegal material specification, ignoring."));
-                       return;
-               }
+       // Check name != ""
+       name = name.trim();
+       if (name.equals("")) {
+               warnings.add(Warning.fromString("Illegal material specification, ignoring."));
+               return;
+       }
 
-               // Parse thickness
-               //              double thickness = 0;
-               //              str = attributes.remove("thickness");
-               //              try {
-               //                      if (str != null)
-               //                              thickness = Double.parseDouble(str);
-               //              } catch (NumberFormatException e){
-               //                      warnings.add(Warning.fromString("Illegal material specification, ignoring."));
-               //                      return;
-               //              }
-
-               // Check type if specified
-               str = attributes.remove("type");
-               if (str != null && !type.name().toLowerCase(Locale.ENGLISH).equals(str)) {
-                       warnings.add(Warning.fromString("Illegal material type specified, ignoring."));
-                       return;
-               }
+       // Parse density
+       double density;
+       String str;
+       str = attributes.remove("density");
+       if (str == null) {
+               warnings.add(Warning.fromString("Illegal material specification, ignoring."));
+               return;
+       }
+       try {
+               density = Double.parseDouble(str);
+       } catch (NumberFormatException e) {
+               warnings.add(Warning.fromString("Illegal material specification, ignoring."));
+               return;
+       }
 
-               mat = Databases.findMaterial(type, name, density, false);
+       // Parse thickness
+       //              double thickness = 0;
+       //              str = attributes.remove("thickness");
+       //              try {
+       //                      if (str != null)
+       //                              thickness = Double.parseDouble(str);
+       //              } catch (NumberFormatException e){
+       //                      warnings.add(Warning.fromString("Illegal material specification, ignoring."));
+       //                      return;
+       //              }
 
-               setMethod.invoke(c, mat);
+       // Check type if specified
+       str = attributes.remove("type");
+       if (str != null && !type.name().toLowerCase(Locale.ENGLISH).equals(str)) {
+               warnings.add(Warning.fromString("Illegal material type specified, ignoring."));
+               return;
        }
+
+       String key = attributes.remove("key");
+
+       mat = Databases.findMaterial(type, key, name, density);
+
+       setMethod.invoke(c, mat);
 }
+}
+