--- /dev/null
+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
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
\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
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
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
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