From 0f8b7d440afb7ffbf9a007af40518680b6bfd3c1 Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Fri, 5 Nov 2010 13:17:51 +0000 Subject: [PATCH] Identify fuels by URIs, resolve on load --- .../visual/workbench/MotorWorkbench.java | 5 +-- src/com/billkuker/rocketry/motorsim/Fuel.java | 4 ++ .../rocketry/motorsim/fuel/FuelResolver.java | 41 +++++++++++++++++++ .../motorsim/fuel/SaintRobertFuel.java | 11 +++++ .../rocketry/motorsim/io/MotorIO.java | 37 +++++++++++++++++ 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java index 9a20233..0abe084 100644 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java +++ b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java @@ -141,9 +141,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { @Override public void actionPerformed(ActionEvent arg0) { - Motor m = MotorEditor.defaultMotor(); - addFuel(m.getFuel()); - addMotor(m, null); + addMotor(MotorEditor.defaultMotor(), null); } }); @@ -168,7 +166,6 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { try { Motor m = MotorIO .readMotor(file); - addFuel(m.getFuel()); addMotor(m, file); } catch (Exception e) { diff --git a/src/com/billkuker/rocketry/motorsim/Fuel.java b/src/com/billkuker/rocketry/motorsim/Fuel.java index 0642cb3..a6c30d2 100644 --- a/src/com/billkuker/rocketry/motorsim/Fuel.java +++ b/src/com/billkuker/rocketry/motorsim/Fuel.java @@ -1,5 +1,7 @@ package com.billkuker.rocketry.motorsim; +import java.net.URI; + import javax.measure.quantity.Pressure; import javax.measure.quantity.Temperature; import javax.measure.quantity.Velocity; @@ -12,6 +14,8 @@ import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight; public interface Fuel { public String getName(); + + public URI getURI(); public Amount getIdealDensity(); diff --git a/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java b/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java new file mode 100644 index 0000000..7152b91 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java @@ -0,0 +1,41 @@ +package com.billkuker.rocketry.motorsim.fuel; + +import java.net.URI; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import com.billkuker.rocketry.motorsim.Fuel; + +public class FuelResolver { + public static class FuelNotFound extends Exception { + private static final long serialVersionUID = 1L; + } + + private static Map fuels = new HashMap(); + + static { + add(new KNSB()); + add(new KNDX()); + add(new KNSU()); + add(new KNER()); + } + + public Map getFuelMap(){ + return Collections.unmodifiableMap(fuels); + } + + public static Fuel getFuel(URI u) throws FuelNotFound { + if (fuels.containsKey(u)) + return fuels.get(u); + return tryResolve(u); + } + + private static Fuel tryResolve(URI u) throws FuelNotFound { + throw new FuelNotFound(); + } + + private static void add(Fuel f) { + fuels.put(f.getURI(), f); + } +} diff --git a/src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java b/src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java index 93c440c..09516ec 100644 --- a/src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java +++ b/src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java @@ -1,5 +1,8 @@ package com.billkuker.rocketry.motorsim.fuel; +import java.net.URI; +import java.net.URISyntaxException; + import javax.measure.quantity.Pressure; import javax.measure.quantity.Velocity; import javax.measure.quantity.VolumetricDensity; @@ -67,6 +70,14 @@ public abstract class SaintRobertFuel implements Fuel { public abstract Amount getIdealDensity(); + public URI getURI(){ + try { + return new URI("motorsim:" + this.getClass().getSimpleName()); + } catch (URISyntaxException e) { + throw new Error("Shouldn't happen", e); + } + } + public String getName(){ return this.getClass().getSimpleName(); } diff --git a/src/com/billkuker/rocketry/motorsim/io/MotorIO.java b/src/com/billkuker/rocketry/motorsim/io/MotorIO.java index 25c5b37..c4b4ea5 100644 --- a/src/com/billkuker/rocketry/motorsim/io/MotorIO.java +++ b/src/com/billkuker/rocketry/motorsim/io/MotorIO.java @@ -8,10 +8,15 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.StringReader; import java.io.StringWriter; +import java.net.URI; +import java.net.URISyntaxException; import org.jscience.physics.amount.Amount; +import com.billkuker.rocketry.motorsim.Fuel; import com.billkuker.rocketry.motorsim.Motor; +import com.billkuker.rocketry.motorsim.fuel.FuelResolver; +import com.billkuker.rocketry.motorsim.fuel.FuelResolver.FuelNotFound; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; @@ -21,6 +26,37 @@ import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class MotorIO { + + static class FuelConverter implements Converter{ + + @Override + public boolean canConvert(Class c) { + return Fuel.class.isAssignableFrom(c); + } + + @Override + public void marshal(Object o, HierarchicalStreamWriter w, + MarshallingContext ctx) { + Fuel f = (Fuel)o; + w.setValue(f.getURI().toString()); + } + + @Override + public Object unmarshal(HierarchicalStreamReader r, + UnmarshallingContext ctx) { + String text = r.getValue(); + try { + URI u = new URI(text); + return FuelResolver.getFuel(u); + } catch (URISyntaxException e) { + throw new Error("Bad Fuel URI: " + text, e); + } catch (FuelNotFound e) { + throw new Error("Can't find fuel: " + text, e); + } + } + + } + static class AmountConverter implements Converter{ @SuppressWarnings("unchecked") @@ -53,6 +89,7 @@ public class MotorIO { XStream xstream = new XStream(); xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES); xstream.registerConverter(new AmountConverter()); + xstream.registerConverter(new FuelConverter()); xstream.registerConverter(new JavaBeanConverter(xstream.getClassMapper(), "class"), -20); return xstream; } -- 2.47.2