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