moving to core/
[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  */
26 public class RocksimSaver extends RocketSaver {
27
28     private static final LogHelper log = Application.getLogger();
29
30     public String marshalToRocksim(OpenRocketDocument doc) {
31
32         try {
33             JAXBContext binder = JAXBContext.newInstance(RocksimDocumentDTO.class);
34             Marshaller marshaller = binder.createMarshaller();
35             marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
36             marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
37             StringWriter sw = new StringWriter();
38
39             marshaller.marshal(toRocksimDocumentDTO(doc), sw);
40             return sw.toString();
41         } catch (Exception e) {
42             e.printStackTrace();
43         }
44
45         return null;
46     }
47
48     @Override
49     public void save(OutputStream dest, OpenRocketDocument doc, StorageOptions options) throws IOException {
50         log.info("Saving .rkt file");
51
52         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(dest, "UTF-8"));
53         writer.write(marshalToRocksim(doc));
54         writer.flush();
55         writer.close();
56     }
57
58     @Override
59     public long estimateFileSize(OpenRocketDocument doc, StorageOptions options) {
60         return marshalToRocksim(doc).length();
61     }
62
63     private RocksimDocumentDTO toRocksimDocumentDTO(OpenRocketDocument doc) {
64         RocksimDocumentDTO rsd = new RocksimDocumentDTO();
65
66         rsd.setDesign(toRocksimDesignDTO(doc.getRocket()));
67
68         return rsd;
69     }
70
71     private RocksimDesignDTO toRocksimDesignDTO(Rocket rocket) {
72         RocksimDesignDTO result = new RocksimDesignDTO();
73         result.setDesign(toRocketDesignDTO(rocket));
74         return result;
75     }
76
77     private RocketDesignDTO toRocketDesignDTO(Rocket rocket) {
78         RocketDesignDTO result = new RocketDesignDTO();
79         result.setName(rocket.getName());
80         int stageCount = rocket.getStageCount();
81         result.setStageCount(stageCount);
82         if (stageCount > 0) {
83             result.setStage3(toStageDTO(rocket.getChild(0).getStage()));
84         }
85         if (stageCount > 1) {
86             result.setStage2(toStageDTO(rocket.getChild(1).getStage()));
87         }
88         if (stageCount > 2) {
89             result.setStage1(toStageDTO(rocket.getChild(2).getStage()));
90         }
91         return result;
92     }
93
94     private StageDTO toStageDTO(Stage stage) {
95         StageDTO result = new StageDTO();
96
97         List<RocketComponent> children = stage.getChildren();
98         for (int i = 0; i < children.size(); i++) {
99             RocketComponent rocketComponents = children.get(i);
100             if (rocketComponents instanceof NoseCone) {
101                 result.addExternalPart(toNoseConeDTO((NoseCone) rocketComponents));
102             } else if (rocketComponents instanceof BodyTube) {
103                 result.addExternalPart(toBodyTubeDTO((BodyTube) rocketComponents));
104             } else if (rocketComponents instanceof Transition) {
105                 result.addExternalPart(toTransitionDTO((Transition) rocketComponents));
106             }
107         }
108         return result;
109     }
110
111     private NoseConeDTO toNoseConeDTO(NoseCone nc) {
112         return new NoseConeDTO(nc);
113     }
114
115     private BodyTubeDTO toBodyTubeDTO(BodyTube bt) {
116         return new BodyTubeDTO(bt);
117     }
118
119     private TransitionDTO toTransitionDTO(Transition tran) {
120         return new TransitionDTO(tran);
121     }
122 }