1 package net.sf.openrocket.file.rocksim.export;
3 import net.sf.openrocket.document.OpenRocketDocument;
4 import net.sf.openrocket.document.StorageOptions;
5 import net.sf.openrocket.file.RocketSaver;
6 import net.sf.openrocket.logging.LogHelper;
7 import net.sf.openrocket.rocketcomponent.BodyTube;
8 import net.sf.openrocket.rocketcomponent.NoseCone;
9 import net.sf.openrocket.rocketcomponent.Rocket;
10 import net.sf.openrocket.rocketcomponent.RocketComponent;
11 import net.sf.openrocket.rocketcomponent.Stage;
12 import net.sf.openrocket.rocketcomponent.Transition;
13 import net.sf.openrocket.startup.Application;
15 import javax.xml.bind.JAXBContext;
16 import javax.xml.bind.Marshaller;
17 import java.io.BufferedWriter;
18 import java.io.IOException;
19 import java.io.OutputStream;
20 import java.io.OutputStreamWriter;
21 import java.io.StringWriter;
22 import java.util.List;
25 * This class is responsible for converting an OpenRocket design to a Rocksim design.
27 public class RocksimSaver extends RocketSaver {
30 private static final LogHelper log = Application.getLogger();
33 * This method marshals an OpenRocketDocument (OR design) to Rocksim-compliant XML.
35 * @param doc the OR design
37 * @return Rocksim-compliant XML
39 public String marshalToRocksim(OpenRocketDocument doc) {
42 JAXBContext binder = JAXBContext.newInstance(RocksimDocumentDTO.class);
43 Marshaller marshaller = binder.createMarshaller();
44 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
45 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
46 StringWriter sw = new StringWriter();
48 marshaller.marshal(toRocksimDocumentDTO(doc), sw);
50 } catch (Exception e) {
58 public void save(OutputStream dest, OpenRocketDocument doc, StorageOptions options) throws IOException {
59 log.info("Saving .rkt file");
61 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(dest, "UTF-8"));
62 writer.write(marshalToRocksim(doc));
68 public long estimateFileSize(OpenRocketDocument doc, StorageOptions options) {
69 return marshalToRocksim(doc).length();
73 * Root conversion method. It iterates over all subcomponents.
75 * @param doc the OR design
77 * @return a corresponding Rocksim representation
79 private RocksimDocumentDTO toRocksimDocumentDTO(OpenRocketDocument doc) {
80 RocksimDocumentDTO rsd = new RocksimDocumentDTO();
82 rsd.setDesign(toRocksimDesignDTO(doc.getRocket()));
87 private RocksimDesignDTO toRocksimDesignDTO(Rocket rocket) {
88 RocksimDesignDTO result = new RocksimDesignDTO();
89 result.setDesign(toRocketDesignDTO(rocket));
93 private RocketDesignDTO toRocketDesignDTO(Rocket rocket) {
94 RocketDesignDTO result = new RocketDesignDTO();
95 result.setName(rocket.getName());
96 int stageCount = rocket.getStageCount();
97 result.setStageCount(stageCount);
99 result.setStage3(toStageDTO(rocket.getChild(0).getStage()));
101 if (stageCount > 1) {
102 result.setStage2(toStageDTO(rocket.getChild(1).getStage()));
104 if (stageCount > 2) {
105 result.setStage1(toStageDTO(rocket.getChild(2).getStage()));
110 private StageDTO toStageDTO(Stage stage) {
111 StageDTO result = new StageDTO();
113 List<RocketComponent> children = stage.getChildren();
114 for (int i = 0; i < children.size(); i++) {
115 RocketComponent rocketComponents = children.get(i);
116 if (rocketComponents instanceof NoseCone) {
117 result.addExternalPart(toNoseConeDTO((NoseCone) rocketComponents));
118 } else if (rocketComponents instanceof BodyTube) {
119 result.addExternalPart(toBodyTubeDTO((BodyTube) rocketComponents));
120 } else if (rocketComponents instanceof Transition) {
121 result.addExternalPart(toTransitionDTO((Transition) rocketComponents));
127 private NoseConeDTO toNoseConeDTO(NoseCone nc) {
128 return new NoseConeDTO(nc);
131 private BodyTubeDTO toBodyTubeDTO(BodyTube bt) {
132 return new BodyTubeDTO(bt);
135 private TransitionDTO toTransitionDTO(Transition tran) {
136 return new TransitionDTO(tran);