1 package com.billkuker.rocketry.motorsim.io;
\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
12 import org.jscience.physics.amount.Amount;
\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
23 public class MotorIO {
\r
24 static class AmountConverter implements Converter{
\r
26 public void marshal(Object o, HierarchicalStreamWriter w, MarshallingContext c) {
\r
27 Amount a = (Amount)o;
\r
29 //Leave off the fractional part if it is not relevant so we get exact values back
\r
31 text = a.getExactValue() + " " + a.getUnit();
\r
33 text = a.doubleValue(a.getUnit()) + " " + a.getUnit();
\r
37 public Object unmarshal(HierarchicalStreamReader r, UnmarshallingContext c) {
\r
38 String text = r.getValue();
\r
39 return Amount.valueOf(text);
\r
42 public boolean canConvert(Class c) {
\r
43 return c.equals(Amount.class);
\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
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
66 public static Motor readMotor(File f) throws IOException{
\r
67 ObjectInputStream in = getXStream().createObjectInputStream(new FileReader(f));
\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