X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=core%2Fsrc%2Fnet%2Fsf%2Fopenrocket%2Ffile%2Fopenrocket%2Fimportt%2FOpenRocketLoader.java;h=39845c7f3733075cc9316ab0707824ed1348a71f;hb=e0fc64df845f95b0cfd9295e6f261c4591a96c09;hp=ca0332c4749384c613d1655e12bdc457924f55a4;hpb=953ac8ca75bc3bdcb9db8a382c7b3d63c795b27a;p=debian%2Fopenrocket diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketLoader.java b/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketLoader.java index ca0332c4..39845c7f 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketLoader.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketLoader.java @@ -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 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 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 attributes, WarningSet warnings) + throws SAXException { + + return this; + } + + @Override + public void closeElement(String element, HashMap 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 customExpressions = new ArrayList(); private final List listeners = new ArrayList(); public SingleSimulationHandler(OpenRocketDocument doc, DocumentLoadingContext context) { @@ -1221,14 +1312,10 @@ class SingleSimulationHandler extends AbstractElementHandler { this.context = context; } - public void setCustomExpressions(ArrayList expressions){ - this.customExpressions = expressions; + public OpenRocketDocument getDocument(){ + return doc; } - public ArrayList getCustomExpressions(){ - return customExpressions; - } - @Override public ElementHandler openElement(String element, HashMap 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 customExpressions = new ArrayList(); - - - public CustomExpressionsHandler(SingleSimulationHandler simHandler, DocumentLoadingContext context) { - this.context = context; - this.simHandler = simHandler; - } - - @Override - public ElementHandler openElement(String element, - HashMap attributes, WarningSet warnings) - throws SAXException { - - if (element.equals("expression")){ - currentExpression = new CustomExpression(); - } - - return this; - } - - @Override - public void closeElement(String element, HashMap 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 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 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 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 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 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 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 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); } +} +