import java.io.FileReader;\r
import java.io.FileWriter;\r
import java.io.IOException;\r
+import java.io.InputStream;\r
import java.io.ObjectInputStream;\r
import java.io.ObjectOutputStream;\r
+import java.io.OutputStream;\r
import java.io.StringReader;\r
import java.io.StringWriter;\r
+import java.net.URI;\r
+import java.net.URISyntaxException;\r
\r
import org.jscience.physics.amount.Amount;\r
\r
+import com.billkuker.rocketry.motorsim.Fuel;\r
import com.billkuker.rocketry.motorsim.Motor;\r
+import com.billkuker.rocketry.motorsim.fuel.FuelResolver;\r
+import com.billkuker.rocketry.motorsim.fuel.FuelResolver.FuelNotFound;\r
import com.thoughtworks.xstream.XStream;\r
+import com.thoughtworks.xstream.converters.ConversionException;\r
import com.thoughtworks.xstream.converters.Converter;\r
import com.thoughtworks.xstream.converters.MarshallingContext;\r
import com.thoughtworks.xstream.converters.UnmarshallingContext;\r
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;\r
\r
public class MotorIO {\r
+ \r
+ static class FuelConverter implements Converter{\r
+\r
+ @Override\r
+ public boolean canConvert(Class c) {\r
+ return Fuel.class.isAssignableFrom(c);\r
+ }\r
+\r
+ @Override\r
+ public void marshal(Object o, HierarchicalStreamWriter w,\r
+ MarshallingContext ctx) {\r
+ /*Fuel f = (Fuel)o;\r
+ w.setValue(f.getURI().toString());*/\r
+ ctx.convertAnother(((Fuel)o).getURI());\r
+ }\r
+\r
+ @Override\r
+ public Object unmarshal(HierarchicalStreamReader r,\r
+ UnmarshallingContext ctx) {\r
+ Object o = ctx.currentObject();\r
+ Object uri = null;\r
+ Class<?> c = ctx.getRequiredType();\r
+ try { \r
+ uri = ctx.convertAnother(o, URI.class);\r
+ } catch ( ConversionException e ){\r
+ e.printStackTrace();\r
+ }\r
+ if ( uri != null && uri instanceof URI ){\r
+ try {\r
+ return FuelResolver.getFuel((URI)uri);\r
+ } catch (FuelNotFound e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ try {\r
+ return FuelResolver.getFuel(new URI("motorsim:" + c.getSimpleName()));\r
+ } catch (FuelNotFound e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ } catch (URISyntaxException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ }\r
+ \r
static class AmountConverter implements Converter{\r
\r
@SuppressWarnings("unchecked")\r
return Amount.valueOf(text);\r
}\r
\r
- @SuppressWarnings("unchecked")\r
public boolean canConvert(Class c) {\r
return c.equals(Amount.class);\r
}\r
}\r
\r
\r
+ @SuppressWarnings("deprecation")\r
private static XStream getXStream(){\r
XStream xstream = new XStream();\r
xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);\r
xstream.registerConverter(new AmountConverter());\r
+ xstream.registerConverter(new FuelConverter());\r
xstream.registerConverter(new JavaBeanConverter(xstream.getClassMapper(), "class"), -20); \r
return xstream;\r
}\r
\r
- public static void writeMotor(Motor m, File f) throws IOException{\r
- FileWriter fout = new FileWriter(f);\r
- ObjectOutputStream out = getXStream().createObjectOutputStream(fout);\r
+ public static void writeMotor(Motor m, OutputStream os) throws IOException{\r
+ ObjectOutputStream out = getXStream().createObjectOutputStream(os);\r
out.writeObject(m);\r
out.close();\r
- fout.close();\r
+ os.flush();\r
}\r
\r
- public static Motor readMotor(File f) throws IOException{\r
- FileReader fin = new FileReader(f);\r
- ObjectInputStream in = getXStream().createObjectInputStream(fin);\r
+ public static Motor readMotor(InputStream is) throws IOException{\r
+ ObjectInputStream in = getXStream().createObjectInputStream(is);\r
Motor m;\r
try {\r
m = (Motor)in.readObject();\r
return m;\r
}\r
\r
- public static String writeMotor(Motor m) throws IOException{\r
- StringWriter sout = new StringWriter();\r
- ObjectOutputStream out = getXStream().createObjectOutputStream(sout);\r
- out.writeObject(m);\r
- out.close();\r
- sout.close();\r
- return sout.toString();\r
- }\r
- \r
- public static Motor readMotor(String s) throws IOException{\r
- StringReader sin = new StringReader(s);\r
- ObjectInputStream in = getXStream().createObjectInputStream(sin);\r
- Motor m;\r
- try {\r
- m = (Motor)in.readObject();\r
- } catch (ClassNotFoundException e) {\r
- throw new IOException("Class not found", e);\r
- }\r
- return m;\r
- }\r
}\r