imports
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / io / MotorIO.java
index 25c5b3768986cb5088d32d7a755845dee3c384bc..c784f0ea9f2c9fc24cf0da228efb8f9d367420ec 100644 (file)
@@ -1,18 +1,21 @@
 package com.billkuker.rocketry.motorsim.io;\r
 \r
-import java.io.File;\r
-import java.io.FileReader;\r
-import java.io.FileWriter;\r
 import java.io.IOException;\r
+import java.io.InputStream;\r
 import java.io.ObjectInputStream;\r
 import java.io.ObjectOutputStream;\r
-import java.io.StringReader;\r
-import java.io.StringWriter;\r
+import java.io.OutputStream;\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.ConversionException;\r
 import com.thoughtworks.xstream.converters.Converter;\r
 import com.thoughtworks.xstream.converters.MarshallingContext;\r
 import com.thoughtworks.xstream.converters.UnmarshallingContext;\r
@@ -21,6 +24,56 @@ 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
+                       ctx.convertAnother(((Fuel)o).getURI());\r
+               }\r
+\r
+               @Override\r
+               public Object unmarshal(HierarchicalStreamReader r,\r
+                               UnmarshallingContext ctx) {\r
+                       Object o = ctx.currentObject();\r
+                       Object uri = null;\r
+                       Class<?> c = ctx.getRequiredType();\r
+                       try { \r
+                               uri = ctx.convertAnother(o, URI.class);\r
+                       } catch ( ConversionException e ){\r
+                               e.printStackTrace();\r
+                       }\r
+                       if ( uri != null && uri instanceof URI ){\r
+                               try {\r
+                                       return FuelResolver.getFuel((URI)uri);\r
+                               } catch (FuelNotFound e) {\r
+                                       // TODO Auto-generated catch block\r
+                                       e.printStackTrace();\r
+                               }\r
+                       }\r
+\r
+                       try {\r
+                               return FuelResolver.getFuel(new URI("motorsim:" + c.getSimpleName()));\r
+                       } catch (FuelNotFound e) {\r
+                               // TODO Auto-generated catch block\r
+                               e.printStackTrace();\r
+                       } catch (URISyntaxException e) {\r
+                               // TODO Auto-generated catch block\r
+                               e.printStackTrace();\r
+                       }\r
+                       return null;\r
+               }\r
+               \r
+       }\r
+       \r
        static class AmountConverter implements Converter{\r
                \r
                @SuppressWarnings("unchecked")\r
@@ -53,21 +106,20 @@ 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
        \r
-       public static void writeMotor(Motor m, File f) throws IOException{\r
-               FileWriter fout = new FileWriter(f);\r
-               ObjectOutputStream out = getXStream().createObjectOutputStream(fout);\r
+       public static void writeMotor(Motor m, OutputStream os) throws IOException{\r
+               ObjectOutputStream out = getXStream().createObjectOutputStream(os);\r
                out.writeObject(m);\r
                out.close();\r
-               fout.close();\r
+               os.flush();\r
        }\r
        \r
-       public static Motor readMotor(File f) throws IOException{\r
-               FileReader fin = new FileReader(f);\r
-               ObjectInputStream in = getXStream().createObjectInputStream(fin);\r
+       public static Motor readMotor(InputStream is) throws IOException{\r
+               ObjectInputStream in = getXStream().createObjectInputStream(is);\r
                Motor m;\r
                try {\r
                        m = (Motor)in.readObject();\r
@@ -77,24 +129,4 @@ public class MotorIO {
                return m;\r
        }\r
        \r
-       public static String writeMotor(Motor m) throws IOException{\r
-               StringWriter sout = new StringWriter();\r
-               ObjectOutputStream out = getXStream().createObjectOutputStream(sout);\r
-               out.writeObject(m);\r
-               out.close();\r
-               sout.close();\r
-               return sout.toString();\r
-       }\r
-       \r
-       public static Motor readMotor(String s) throws IOException{\r
-               StringReader sin = new StringReader(s);\r
-               ObjectInputStream in = getXStream().createObjectInputStream(sin);\r
-               Motor m;\r
-               try {\r
-                       m = (Motor)in.readObject();\r
-               } catch (ClassNotFoundException e) {\r
-                       throw new IOException("Class not found", e);\r
-               }\r
-               return m;\r
-       }\r
 }\r