Added XStream and MotorIO
[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.IOError;\r
7 import java.io.IOException;\r
8 import java.io.ObjectInputStream;\r
9 import java.io.ObjectOutputStream;\r
10 import java.io.StringWriter;\r
11 \r
12 import org.jscience.physics.amount.Amount;\r
13 \r
14 import com.billkuker.rocketry.motorsim.Motor;\r
15 import com.billkuker.rocketry.motorsim.MotorPart;\r
16 import com.thoughtworks.xstream.XStream;\r
17 import com.thoughtworks.xstream.converters.Converter;\r
18 import com.thoughtworks.xstream.converters.MarshallingContext;\r
19 import com.thoughtworks.xstream.converters.UnmarshallingContext;\r
20 import com.thoughtworks.xstream.io.HierarchicalStreamReader;\r
21 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;\r
22 \r
23 public class MotorIO {\r
24         static class AmountConverter implements Converter{\r
25                 \r
26                 public void marshal(Object o, HierarchicalStreamWriter w, MarshallingContext c) {\r
27                         Amount a = (Amount)o;\r
28                         String text;\r
29                         //Leave off the fractional part if it is not relevant so we get exact values back\r
30                         if (a.isExact())\r
31                                 text = a.getExactValue() + " " + a.getUnit();\r
32                         else\r
33                                 text = a.doubleValue(a.getUnit()) + " " + a.getUnit();\r
34                         w.setValue(text);\r
35                 }\r
36 \r
37                 public Object unmarshal(HierarchicalStreamReader r, UnmarshallingContext c) {\r
38                         String text = r.getValue();\r
39                         return Amount.valueOf(text);\r
40                 }\r
41 \r
42                 public boolean canConvert(Class c) {\r
43                         return c.equals(Amount.class);\r
44                 }\r
45                 \r
46         \r
47         }\r
48         \r
49         private static XStream getXStream(){\r
50                 XStream xstream = new XStream();\r
51                 xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);\r
52                 xstream.omitField(MotorPart.class, "pcs");\r
53                 xstream.omitField(MotorPart.class, "vcs");\r
54                 xstream.registerConverter(new AmountConverter());\r
55                 return xstream;\r
56         }\r
57         \r
58         public static void writeMotor(Motor m, File f) throws IOException{\r
59                 FileWriter fout = new FileWriter(f);\r
60                 ObjectOutputStream out = getXStream().createObjectOutputStream(fout);\r
61                 out.writeObject(m);\r
62                 out.close();\r
63                 fout.close();\r
64         }\r
65         \r
66         public static Motor readMotor(File f) throws IOException{\r
67                 ObjectInputStream in = getXStream().createObjectInputStream(new FileReader(f));\r
68                 Motor m;\r
69                 try {\r
70                         m = (Motor)in.readObject();\r
71                 } catch (ClassNotFoundException e) {\r
72                         throw new IOException("Can not read motor: Class not found.", e);\r
73                 }\r
74                 return m;\r
75         }\r
76         \r
77 }\r