DGP - cleanup
[debian/openrocket] / core / src / net / sf / openrocket / file / rocksim / export / RocksimSaver.java
1 package net.sf.openrocket.file.rocksim.export;
2
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;
14
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;
23
24 /**
25  * This class is responsible for converting an OpenRocket design to a Rocksim design.
26  */
27 public class RocksimSaver extends RocketSaver {
28
29     /** The logger. */
30     private static final LogHelper log = Application.getLogger();
31
32     /**
33      * This method marshals an OpenRocketDocument (OR design) to Rocksim-compliant XML.
34      *
35      * @param doc  the OR design
36      *
37      * @return Rocksim-compliant XML
38      */
39     public String marshalToRocksim(OpenRocketDocument doc) {
40
41         try {
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();
47
48             marshaller.marshal(toRocksimDocumentDTO(doc), sw);
49             return sw.toString();
50         } catch (Exception e) {
51             e.printStackTrace();
52         }
53
54         return null;
55     }
56
57     @Override
58     public void save(OutputStream dest, OpenRocketDocument doc, StorageOptions options) throws IOException {
59         log.info("Saving .rkt file");
60
61         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(dest, "UTF-8"));
62         writer.write(marshalToRocksim(doc));
63         writer.flush();
64         writer.close();
65     }
66
67     @Override
68     public long estimateFileSize(OpenRocketDocument doc, StorageOptions options) {
69         return marshalToRocksim(doc).length();
70     }
71
72     /**
73      * Root conversion method.  It iterates over all subcomponents.
74      *
75      * @param doc  the OR design
76      *
77      * @return a corresponding Rocksim representation
78      */
79     private RocksimDocumentDTO toRocksimDocumentDTO(OpenRocketDocument doc) {
80         RocksimDocumentDTO rsd = new RocksimDocumentDTO();
81
82         rsd.setDesign(toRocksimDesignDTO(doc.getRocket()));
83
84         return rsd;
85     }
86
87     private RocksimDesignDTO toRocksimDesignDTO(Rocket rocket) {
88         RocksimDesignDTO result = new RocksimDesignDTO();
89         result.setDesign(toRocketDesignDTO(rocket));
90         return result;
91     }
92
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);
98         if (stageCount > 0) {
99             result.setStage3(toStageDTO(rocket.getChild(0).getStage()));
100         }
101         if (stageCount > 1) {
102             result.setStage2(toStageDTO(rocket.getChild(1).getStage()));
103         }
104         if (stageCount > 2) {
105             result.setStage1(toStageDTO(rocket.getChild(2).getStage()));
106         }
107         return result;
108     }
109
110     private StageDTO toStageDTO(Stage stage) {
111         StageDTO result = new StageDTO();
112
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));
122             }
123         }
124         return result;
125     }
126
127     private NoseConeDTO toNoseConeDTO(NoseCone nc) {
128         return new NoseConeDTO(nc);
129     }
130
131     private BodyTubeDTO toBodyTubeDTO(BodyTube bt) {
132         return new BodyTubeDTO(bt);
133     }
134
135     private TransitionDTO toTransitionDTO(Transition tran) {
136         return new TransitionDTO(tran);
137     }
138 }