From a6be346c8db4141900a453d305d6155e52710228 Mon Sep 17 00:00:00 2001 From: Daniel_M_Williams Date: Thu, 27 Aug 2015 11:52:31 -0400 Subject: [PATCH] Fixed Load/Save Issues for Boosters and Pods Fixed hiearchy / naming issues, mostly mv StageSaver.java => AxialStageSaver.java populate ComponentAssemblySaver.java fixed method class refs in DocumentConfig.java --- .../pix/componenticons/pods-small.png | Bin 269 -> 269 bytes .../file/openrocket/OpenRocketSaver.java | 44 +++++++++--- .../openrocket/importt/DocumentConfig.java | 21 ++---- .../{StageSaver.java => AxialStageSaver.java} | 47 +++++-------- .../savers/ComponentAssemblySaver.java | 64 +++++++++++++++++- .../rocketcomponent/AxialStage.java | 3 - 6 files changed, 119 insertions(+), 60 deletions(-) rename core/src/net/sf/openrocket/file/openrocket/savers/{StageSaver.java => AxialStageSaver.java} (64%) diff --git a/core/resources/pix/componenticons/pods-small.png b/core/resources/pix/componenticons/pods-small.png index d1b13765da750d38716d4a42e4d6eb989086ac78..a104e75cb230378922937161fb535d29334f866d 100644 GIT binary patch delta 151 zcmV;I0BHY>0*wNYQwSRmDKUl+N9mDUFMowmK@Pwm2m}AH|3A~4j3Q*3x{bsPX(@H6 zh?pOQnpK(=6jgBvpgraPEZQ>Ay{Rv%;9b&t7mQB}F>bNr>BR6QpRN`YW{<6t*|RGg ziJ18Mz%d5!Er?vC)(B$d6RG5>J%3j%0*wNYQwSIhF(Q$K{lzB7yv zmH+9_NL9<z$r&HcRUi`#BH5F~e currentclass; + String saverclassname; + Class saverClass; + + Reflection.Method mtr = null; // method-to-return + + currentclass = component.getClass(); + while ((currentclass != null) && (currentclass != Object.class)) { + currentclassname = currentclass.getSimpleName(); + saverclassname = METHOD_PACKAGE + "." + currentclassname + METHOD_SUFFIX; + + try { + saverClass = Class.forName(saverclassname); + + // if class exists + java.lang.reflect.Method m = saverClass.getMethod("getElements", RocketComponent.class); + mtr = new Reflection.Method(m); + + return mtr; + } catch (Exception ignore) { + } + + currentclass = currentclass.getSuperclass(); + } + + // if( null == mtr ){ + throw new BugException("Unable to find saving class for component " + + METHOD_PACKAGE + "." + component.getClass().getSimpleName() + " ... " + METHOD_SUFFIX); + } @SuppressWarnings("unchecked") private void saveComponent(RocketComponent component) throws IOException { - log.debug("Saving component " + component.getComponentName()); - Reflection.Method m = Reflection.findMethod(METHOD_PACKAGE, component, METHOD_SUFFIX, - "getElements", RocketComponent.class); - if (m == null) { - throw new BugException("Unable to find saving class for component " + - component.getComponentName()); - } + Reflection.Method m = findGetElementsMethod(component); // Get the strings to save List list = (List) m.invokeStatic(component); diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java index 846753eaf..8c536424b 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java @@ -403,28 +403,17 @@ class DocumentConfig { Reflection.findMethod(Rocket.class, "setRevision", String.class))); // Stage - setters.put("Stage:separationevent", new EnumSetter( + setters.put("AxialStage:separationevent", new EnumSetter( Reflection.findMethod(AxialStage.class, "getStageSeparationConfiguration"), Reflection.findMethod(StageSeparationConfiguration.class, "setSeparationEvent", StageSeparationConfiguration.SeparationEvent.class), StageSeparationConfiguration.SeparationEvent.class)); - setters.put("Stage:separationdelay", new DoubleSetter( + setters.put("AxialStage:separationdelay", new DoubleSetter( Reflection.findMethod(AxialStage.class, "getStageSeparationConfiguration"), Reflection.findMethod(StageSeparationConfiguration.class, "setSeparationDelay", double.class))); - // // Stage - // setters.put("Stage:separationevent", new EnumSetter( - // Reflection.findMethod(AxialStage.class, "getStageSeparationConfiguration"), - // Reflection.findMethod(StageSeparationConfiguration.class, "setSeparationEvent", StageSeparationConfiguration.SeparationEvent.class), - // StageSeparationConfiguration.SeparationEvent.class)); - // setters.put("Stage:separationdelay", new DoubleSetter( - // Reflection.findMethod(AxialStage.class, "getStageSeparationConfiguration"), - // Reflection.findMethod(StageSeparationConfiguration.class, "setSeparationDelay", double.class))); - // - // setters.put("Stage:outside", new BooleanSetter(Reflection.findMethod(AxialStage.class, "setOutside", boolean.class))); - // setters.put("Stage:relativeto", new IntSetter(Reflection.findMethod(AxialStage.class, "setRelativeToStage", int.class))); - // setters.put("Stage:instancecount", new IntSetter(Reflection.findMethod(AxialStage.class, "setInstanceCount", int.class))); - // setters.put("Stage:radialoffset", new DoubleSetter(Reflection.findMethod(AxialStage.class, "setRadialOffset", double.class))); - // setters.put("Stage:angleoffset", new DoubleSetter(Reflection.findMethod(AxialStage.class, "setAngularOffset", double.class))); + setters.put("ComponentAssembly:instancecount", new IntSetter(Reflection.findMethod(AxialStage.class, "setInstanceCount", int.class))); + setters.put("ComponentAssembly:radialoffset", new DoubleSetter(Reflection.findMethod(AxialStage.class, "setRadialOffset", double.class))); + setters.put("ComponentAssembly:angleoffset", new DoubleSetter(Reflection.findMethod(AxialStage.class, "setAngularOffset", double.class))); } diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/StageSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/AxialStageSaver.java similarity index 64% rename from core/src/net/sf/openrocket/file/openrocket/savers/StageSaver.java rename to core/src/net/sf/openrocket/file/openrocket/savers/AxialStageSaver.java index 70fa79ce8..bf3d59d0a 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/StageSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/AxialStageSaver.java @@ -1,7 +1,6 @@ package net.sf.openrocket.file.openrocket.savers; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Locale; @@ -11,16 +10,28 @@ import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; -public class StageSaver extends ComponentAssemblySaver { +public class AxialStageSaver extends ComponentAssemblySaver { - private static final StageSaver instance = new StageSaver(); + private static final AxialStageSaver instance = new AxialStageSaver(); public static ArrayList getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) { ArrayList list = new ArrayList(); - list.add(""); - instance.addParams(c, list); - list.add(""); + if (c.isCenterline()) { + // yes, this test is redundant. I'm merely paranoid, and attempting to future-proof it + if (c.getClass().equals(AxialStage.class)) { + // kept as simply 'stage' for backward compatability + list.add(""); + instance.addParams(c, list); + list.add(""); + } + } else { + if (c instanceof BoosterSet) { + list.add(""); + instance.addParams(c, list); + list.add(""); + } + } return list; } @@ -30,11 +41,6 @@ public class StageSaver extends ComponentAssemblySaver { super.addParams(c, elements); AxialStage stage = (AxialStage) c; - if (stage instanceof BoosterSet) { - BoosterSet booster = (BoosterSet) stage; - elements.addAll(this.addStageReplicationParams(booster)); - } - if (stage.getStageNumber() > 0) { // NOTE: Default config must be BEFORE overridden config for proper backward compatibility later on elements.addAll(separationConfig(stage.getStageSeparationConfiguration().getDefault(), false)); @@ -62,25 +68,6 @@ public class StageSaver extends ComponentAssemblySaver { } } - private Collection addStageReplicationParams(final BoosterSet currentStage) { - List elementsToReturn = new ArrayList(); - final String instCt_tag = "instancecount"; - final String radoffs_tag = "radialoffset"; - final String startangle_tag = "angleoffset"; - - - if (null != currentStage) { - int instanceCount = currentStage.getInstanceCount(); - elementsToReturn.add("<" + instCt_tag + ">" + instanceCount + ""); - double radialOffset = currentStage.getRadialOffset(); - elementsToReturn.add("<" + radoffs_tag + ">" + radialOffset + ""); - double angularOffset = currentStage.getAngularOffset(); - elementsToReturn.add("<" + startangle_tag + ">" + angularOffset + ""); - } - - return elementsToReturn; - } - private List separationConfig(StageSeparationConfiguration config, boolean indent) { List elements = new ArrayList(2); elements.add((indent ? " " : "") + "" diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/ComponentAssemblySaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/ComponentAssemblySaver.java index 9e9d609d6..088cf2ed2 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/ComponentAssemblySaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/ComponentAssemblySaver.java @@ -1,7 +1,65 @@ package net.sf.openrocket.file.openrocket.savers; -public class ComponentAssemblySaver extends RocketComponentSaver { +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - // No-op +import net.sf.openrocket.rocketcomponent.BoosterSet; +import net.sf.openrocket.rocketcomponent.ComponentAssembly; +import net.sf.openrocket.rocketcomponent.PodSet; +import net.sf.openrocket.rocketcomponent.RocketComponent; + +public class ComponentAssemblySaver extends RocketComponentSaver { -} + + private static final ComponentAssemblySaver instance = new ComponentAssemblySaver(); + + public static ArrayList getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) { + ArrayList list = new ArrayList(); + + if (!c.isCenterline()) { + if (c instanceof PodSet) { + list.add(""); + instance.addParams(c, list); + list.add(""); + } else if (c instanceof BoosterSet) { + list.add(""); + instance.addParams(c, list); + list.add(""); + } + } + + return list; + } + + @Override + protected void addParams(RocketComponent c, List elements) { + super.addParams(c, elements); + ComponentAssembly ca = (ComponentAssembly) c; + + if (!ca.isCenterline()) { + elements.addAll(this.addAssemblyInstanceParams(ca)); + } + + } + + protected Collection addAssemblyInstanceParams(final ComponentAssembly currentStage) { + List elementsToReturn = new ArrayList(); + final String instCt_tag = "instancecount"; + final String radoffs_tag = "radialoffset"; + final String startangle_tag = "angleoffset"; + + + if (null != currentStage) { + int instanceCount = currentStage.getInstanceCount(); + elementsToReturn.add("<" + instCt_tag + ">" + instanceCount + ""); + double radialOffset = currentStage.getRadialOffset(); + elementsToReturn.add("<" + radoffs_tag + ">" + radialOffset + ""); + double angularOffset = currentStage.getAngularOffset(); + elementsToReturn.add("<" + startangle_tag + ">" + angularOffset + ""); + } + + return elementsToReturn; + } + +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java b/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java index 0821bbf66..5e2cfa644 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java +++ b/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java @@ -72,9 +72,6 @@ public class AxialStage extends ComponentAssembly implements FlightConfigurableC return true; } else if (PodSet.class.isAssignableFrom(type)) { return true; - // DEBUG ONLY. Remove this clause before production. - } else if (AxialStage.class.isAssignableFrom(type)) { - return true; } return BodyComponent.class.isAssignableFrom(type);