1 package com.billkuker.rocketry.motorsim.io;
\r
3 import java.io.IOException;
\r
4 import java.io.InputStream;
\r
5 import java.io.ObjectInputStream;
\r
6 import java.io.ObjectOutputStream;
\r
7 import java.io.OutputStream;
\r
9 import java.net.URISyntaxException;
\r
11 import org.jscience.physics.amount.Amount;
\r
13 import com.billkuker.rocketry.motorsim.Fuel;
\r
14 import com.billkuker.rocketry.motorsim.Motor;
\r
15 import com.billkuker.rocketry.motorsim.fuel.FuelResolver;
\r
16 import com.billkuker.rocketry.motorsim.fuel.FuelResolver.FuelNotFound;
\r
17 import com.thoughtworks.xstream.XStream;
\r
18 import com.thoughtworks.xstream.converters.ConversionException;
\r
19 import com.thoughtworks.xstream.converters.Converter;
\r
20 import com.thoughtworks.xstream.converters.MarshallingContext;
\r
21 import com.thoughtworks.xstream.converters.UnmarshallingContext;
\r
22 import com.thoughtworks.xstream.converters.javabean.JavaBeanConverter;
\r
23 import com.thoughtworks.xstream.io.HierarchicalStreamReader;
\r
24 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
\r
26 public class MotorIO {
\r
28 static class FuelConverter implements Converter{
\r
31 public boolean canConvert(Class c) {
\r
32 return Fuel.class.isAssignableFrom(c);
\r
36 public void marshal(Object o, HierarchicalStreamWriter w,
\r
37 MarshallingContext ctx) {
\r
39 w.setValue(f.getURI().toString());*/
\r
41 URI uri = FuelResolver.getURI(f);
\r
42 ctx.convertAnother(uri);
\r
46 public Object unmarshal(HierarchicalStreamReader r,
\r
47 UnmarshallingContext ctx) {
\r
48 Object o = ctx.currentObject();
\r
50 Class<?> c = ctx.getRequiredType();
\r
52 uri = ctx.convertAnother(o, URI.class);
\r
53 } catch ( ConversionException e ){
\r
54 e.printStackTrace();
\r
56 if ( uri != null && uri instanceof URI ){
\r
58 return FuelResolver.getFuel((URI)uri);
\r
59 } catch (FuelNotFound e) {
\r
60 // TODO Auto-generated catch block
\r
61 e.printStackTrace();
\r
66 return FuelResolver.getFuel(new URI("motorsim:" + c.getSimpleName()));
\r
67 } catch (FuelNotFound e) {
\r
68 // TODO Auto-generated catch block
\r
69 e.printStackTrace();
\r
70 } catch (URISyntaxException e) {
\r
71 // TODO Auto-generated catch block
\r
72 e.printStackTrace();
\r
79 static class AmountConverter implements Converter{
\r
81 @SuppressWarnings("unchecked")
\r
82 public void marshal(Object o, HierarchicalStreamWriter w, MarshallingContext c) {
\r
83 Amount a = (Amount)o;
\r
85 //Leave off the fractional part if it is not relevant so we get exact values back
\r
87 text = a.getExactValue() + " " + a.getUnit();
\r
89 text = a.doubleValue(a.getUnit()) + " " + a.getUnit();
\r
90 w.setValue(fix(text));
\r
93 public Object unmarshal(HierarchicalStreamReader r, UnmarshallingContext c) {
\r
94 String text = r.getValue();
\r
95 return Amount.valueOf(unfix(text));
\r
98 private String fix(String s){
\r
99 return s.replace("\u00B3", "^3");
\r
102 private String unfix(String s){
\r
103 return s.replace("^3", "\u00B3");
\r
106 public boolean canConvert(Class c) {
\r
107 return c.equals(Amount.class);
\r
113 @SuppressWarnings("deprecation")
\r
114 private static XStream getXStream(){
\r
115 XStream xstream = new XStream();
\r
116 xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);
\r
117 xstream.registerConverter(new AmountConverter());
\r
118 xstream.registerConverter(new FuelConverter());
\r
119 xstream.registerConverter(new JavaBeanConverter(xstream.getClassMapper(), "class"), -20);
\r
123 @SuppressWarnings("deprecation")
\r
124 private static XStream getFuelXStream(){
\r
125 XStream xstream = new XStream();
\r
126 xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);
\r
127 xstream.registerConverter(new AmountConverter());
\r
128 xstream.registerConverter(new JavaBeanConverter(xstream.getClassMapper(), "class"), -20);
\r
132 public static void writeFuel(Fuel f, OutputStream os) throws IOException{
\r
133 ObjectOutputStream out = getFuelXStream().createObjectOutputStream(os);
\r
134 out.writeObject(f);
\r
139 public static Fuel readFuel(InputStream is) throws IOException{
\r
140 ObjectInputStream in = getFuelXStream().createObjectInputStream(is);
\r
143 f = (Fuel)in.readObject();
\r
144 } catch (ClassNotFoundException e) {
\r
145 throw new IOException("Class not found", e);
\r
150 public static void writeMotor(Motor m, OutputStream os) throws IOException{
\r
151 ObjectOutputStream out = getXStream().createObjectOutputStream(os);
\r
152 out.writeObject(m);
\r
157 public static Motor readMotor(InputStream is) throws IOException{
\r
158 ObjectInputStream in = getXStream().createObjectInputStream(is);
\r
161 m = (Motor)in.readObject();
\r
162 } catch (ClassNotFoundException e) {
\r
163 throw new IOException("Class not found", e);
\r