Changed motorIO from files to streams
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / io / MotorIO.java
1 package com.billkuker.rocketry.motorsim.io;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileReader;\r
5 import java.io.FileWriter;\r
6 import java.io.IOException;\r
7 import java.io.InputStream;\r
8 import java.io.ObjectInputStream;\r
9 import java.io.ObjectOutputStream;\r
10 import java.io.OutputStream;\r
11 import java.io.StringReader;\r
12 import java.io.StringWriter;\r
13 import java.net.URI;\r
14 import java.net.URISyntaxException;\r
15 \r
16 import org.jscience.physics.amount.Amount;\r
17 \r
18 import com.billkuker.rocketry.motorsim.Fuel;\r
19 import com.billkuker.rocketry.motorsim.Motor;\r
20 import com.billkuker.rocketry.motorsim.fuel.FuelResolver;\r
21 import com.billkuker.rocketry.motorsim.fuel.FuelResolver.FuelNotFound;\r
22 import com.thoughtworks.xstream.XStream;\r
23 import com.thoughtworks.xstream.converters.ConversionException;\r
24 import com.thoughtworks.xstream.converters.Converter;\r
25 import com.thoughtworks.xstream.converters.MarshallingContext;\r
26 import com.thoughtworks.xstream.converters.UnmarshallingContext;\r
27 import com.thoughtworks.xstream.converters.javabean.JavaBeanConverter;\r
28 import com.thoughtworks.xstream.io.HierarchicalStreamReader;\r
29 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;\r
30 \r
31 public class MotorIO {\r
32         \r
33         static class FuelConverter implements Converter{\r
34 \r
35                 @Override\r
36                 public boolean canConvert(Class c) {\r
37                         return Fuel.class.isAssignableFrom(c);\r
38                 }\r
39 \r
40                 @Override\r
41                 public void marshal(Object o, HierarchicalStreamWriter w,\r
42                                 MarshallingContext ctx) {\r
43                         /*Fuel f = (Fuel)o;\r
44                         w.setValue(f.getURI().toString());*/\r
45                         ctx.convertAnother(((Fuel)o).getURI());\r
46                 }\r
47 \r
48                 @Override\r
49                 public Object unmarshal(HierarchicalStreamReader r,\r
50                                 UnmarshallingContext ctx) {\r
51                         Object o = ctx.currentObject();\r
52                         Object uri = null;\r
53                         Class<?> c = ctx.getRequiredType();\r
54                         try { \r
55                                 uri = ctx.convertAnother(o, URI.class);\r
56                         } catch ( ConversionException e ){\r
57                                 e.printStackTrace();\r
58                         }\r
59                         if ( uri != null && uri instanceof URI ){\r
60                                 try {\r
61                                         return FuelResolver.getFuel((URI)uri);\r
62                                 } catch (FuelNotFound e) {\r
63                                         // TODO Auto-generated catch block\r
64                                         e.printStackTrace();\r
65                                 }\r
66                         }\r
67 \r
68                         try {\r
69                                 return FuelResolver.getFuel(new URI("motorsim:" + c.getSimpleName()));\r
70                         } catch (FuelNotFound e) {\r
71                                 // TODO Auto-generated catch block\r
72                                 e.printStackTrace();\r
73                         } catch (URISyntaxException e) {\r
74                                 // TODO Auto-generated catch block\r
75                                 e.printStackTrace();\r
76                         }\r
77                         return null;\r
78                 }\r
79                 \r
80         }\r
81         \r
82         static class AmountConverter implements Converter{\r
83                 \r
84                 @SuppressWarnings("unchecked")\r
85                 public void marshal(Object o, HierarchicalStreamWriter w, MarshallingContext c) {\r
86                         Amount a = (Amount)o;\r
87                         String text;\r
88                         //Leave off the fractional part if it is not relevant so we get exact values back\r
89                         if (a.isExact())\r
90                                 text = a.getExactValue() + " " + a.getUnit();\r
91                         else\r
92                                 text = a.doubleValue(a.getUnit()) + " " + a.getUnit();\r
93                         w.setValue(text);\r
94                 }\r
95 \r
96                 public Object unmarshal(HierarchicalStreamReader r, UnmarshallingContext c) {\r
97                         String text = r.getValue();\r
98                         return Amount.valueOf(text);\r
99                 }\r
100 \r
101                 public boolean canConvert(Class c) {\r
102                         return c.equals(Amount.class);\r
103                 }\r
104                 \r
105         \r
106         }\r
107 \r
108         \r
109         @SuppressWarnings("deprecation")\r
110         private static XStream getXStream(){\r
111                 XStream xstream = new XStream();\r
112                 xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);\r
113                 xstream.registerConverter(new AmountConverter());\r
114                 xstream.registerConverter(new FuelConverter());\r
115                 xstream.registerConverter(new JavaBeanConverter(xstream.getClassMapper(), "class"), -20); \r
116                 return xstream;\r
117         }\r
118         \r
119         public static void writeMotor(Motor m, OutputStream os) throws IOException{\r
120                 ObjectOutputStream out = getXStream().createObjectOutputStream(os);\r
121                 out.writeObject(m);\r
122                 out.close();\r
123                 os.flush();\r
124         }\r
125         \r
126         public static Motor readMotor(InputStream is) throws IOException{\r
127                 ObjectInputStream in = getXStream().createObjectInputStream(is);\r
128                 Motor m;\r
129                 try {\r
130                         m = (Motor)in.readObject();\r
131                 } catch (ClassNotFoundException e) {\r
132                         throw new IOException("Class not found", e);\r
133                 }\r
134                 return m;\r
135         }\r
136         \r
137 }\r