Identify fuels by URIs, resolve on load
authorBill Kuker <bkuker@billkuker.com>
Fri, 5 Nov 2010 13:17:51 +0000 (13:17 +0000)
committerBill Kuker <bkuker@billkuker.com>
Fri, 5 Nov 2010 13:17:51 +0000 (13:17 +0000)
gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java
src/com/billkuker/rocketry/motorsim/Fuel.java
src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java [new file with mode: 0644]
src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java
src/com/billkuker/rocketry/motorsim/io/MotorIO.java

index 9a20233d31cd4d5ebb88c3cc36e2837cb806d2b7..0abe084682f8639a8cbfbb9a649c59270cb29ee9 100644 (file)
@@ -141,9 +141,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
 \r
                                                                        @Override\r
                                                                        public void actionPerformed(ActionEvent arg0) {\r
-                                                                               Motor m = MotorEditor.defaultMotor();\r
-                                                                               addFuel(m.getFuel());\r
-                                                                               addMotor(m, null);\r
+                                                                               addMotor(MotorEditor.defaultMotor(), null);\r
                                                                        }\r
                                                                });\r
 \r
@@ -168,7 +166,6 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
                                                                                        try {\r
                                                                                                Motor m = MotorIO\r
                                                                                                                .readMotor(file);\r
-                                                                                               addFuel(m.getFuel());\r
                                                                                                addMotor(m, file);\r
                                                                                                \r
                                                                                        } catch (Exception e) {\r
index 0642cb34db0df4ce4a421a745245ef407fe169ab..a6c30d229039d8c43288fded1c9fcc7297ec75ad 100644 (file)
@@ -1,5 +1,7 @@
 package com.billkuker.rocketry.motorsim;\r
 \r
+import java.net.URI;\r
+\r
 import javax.measure.quantity.Pressure;\r
 import javax.measure.quantity.Temperature;\r
 import javax.measure.quantity.Velocity;\r
@@ -12,6 +14,8 @@ import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight;
 public interface Fuel {\r
        \r
        public String getName();\r
+       \r
+       public URI getURI();\r
 \r
        public Amount<VolumetricDensity> getIdealDensity();\r
 \r
diff --git a/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java b/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java
new file mode 100644 (file)
index 0000000..7152b91
--- /dev/null
@@ -0,0 +1,41 @@
+package com.billkuker.rocketry.motorsim.fuel;\r
+\r
+import java.net.URI;\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import com.billkuker.rocketry.motorsim.Fuel;\r
+\r
+public class FuelResolver {\r
+       public static class FuelNotFound extends Exception {\r
+               private static final long serialVersionUID = 1L;\r
+       }\r
+\r
+       private static Map<URI, Fuel> fuels = new HashMap<URI, Fuel>();\r
+\r
+       static {\r
+               add(new KNSB());\r
+               add(new KNDX());\r
+               add(new KNSU());\r
+               add(new KNER());\r
+       }\r
+       \r
+       public Map<URI, Fuel> getFuelMap(){\r
+               return Collections.unmodifiableMap(fuels);\r
+       }\r
+\r
+       public static Fuel getFuel(URI u) throws FuelNotFound {\r
+               if (fuels.containsKey(u))\r
+                       return fuels.get(u);\r
+               return tryResolve(u);\r
+       }\r
+\r
+       private static Fuel tryResolve(URI u) throws FuelNotFound {\r
+               throw new FuelNotFound();\r
+       }\r
+\r
+       private static void add(Fuel f) {\r
+               fuels.put(f.getURI(), f);\r
+       }\r
+}\r
index 93c440c178ccd4b64b398f3fec4a831616338460..09516ecb6821d5fee8a4a198d35be8aa5cf29a80 100644 (file)
@@ -1,5 +1,8 @@
 package com.billkuker.rocketry.motorsim.fuel;\r
 \r
+import java.net.URI;\r
+import java.net.URISyntaxException;\r
+\r
 import javax.measure.quantity.Pressure;\r
 import javax.measure.quantity.Velocity;\r
 import javax.measure.quantity.VolumetricDensity;\r
@@ -67,6 +70,14 @@ public abstract class SaintRobertFuel implements Fuel {
 \r
        public abstract Amount<VolumetricDensity> getIdealDensity();\r
 \r
+       public URI getURI(){\r
+               try {\r
+                       return new URI("motorsim:" + this.getClass().getSimpleName());\r
+               } catch (URISyntaxException e) {\r
+                       throw new Error("Shouldn't happen", e);\r
+               }\r
+       }\r
+       \r
        public String getName(){\r
                return this.getClass().getSimpleName();\r
        }\r
index 25c5b3768986cb5088d32d7a755845dee3c384bc..c4b4ea5e512edee13e07a24f39789728977b77ca 100644 (file)
@@ -8,10 +8,15 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;\r
 import java.io.StringReader;\r
 import java.io.StringWriter;\r
+import java.net.URI;\r
+import java.net.URISyntaxException;\r
 \r
 import org.jscience.physics.amount.Amount;\r
 \r
+import com.billkuker.rocketry.motorsim.Fuel;\r
 import com.billkuker.rocketry.motorsim.Motor;\r
+import com.billkuker.rocketry.motorsim.fuel.FuelResolver;\r
+import com.billkuker.rocketry.motorsim.fuel.FuelResolver.FuelNotFound;\r
 import com.thoughtworks.xstream.XStream;\r
 import com.thoughtworks.xstream.converters.Converter;\r
 import com.thoughtworks.xstream.converters.MarshallingContext;\r
@@ -21,6 +26,37 @@ import com.thoughtworks.xstream.io.HierarchicalStreamReader;
 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;\r
 \r
 public class MotorIO {\r
+       \r
+       static class FuelConverter implements Converter{\r
+\r
+               @Override\r
+               public boolean canConvert(Class c) {\r
+                       return Fuel.class.isAssignableFrom(c);\r
+               }\r
+\r
+               @Override\r
+               public void marshal(Object o, HierarchicalStreamWriter w,\r
+                               MarshallingContext ctx) {\r
+                       Fuel f = (Fuel)o;\r
+                       w.setValue(f.getURI().toString());\r
+               }\r
+\r
+               @Override\r
+               public Object unmarshal(HierarchicalStreamReader r,\r
+                               UnmarshallingContext ctx) {\r
+                       String text = r.getValue();\r
+                       try {\r
+                               URI u = new URI(text);\r
+                               return FuelResolver.getFuel(u);\r
+                       } catch (URISyntaxException e) {\r
+                               throw new Error("Bad Fuel URI: " + text, e);\r
+                       } catch (FuelNotFound e) {\r
+                               throw new Error("Can't find fuel: " + text, e);\r
+                       }\r
+               }\r
+               \r
+       }\r
+       \r
        static class AmountConverter implements Converter{\r
                \r
                @SuppressWarnings("unchecked")\r
@@ -53,6 +89,7 @@ public class MotorIO {
                XStream xstream = new XStream();\r
                xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);\r
                xstream.registerConverter(new AmountConverter());\r
+               xstream.registerConverter(new FuelConverter());\r
                xstream.registerConverter(new JavaBeanConverter(xstream.getClassMapper(), "class"), -20); \r
                return xstream;\r
        }\r