1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.utils.generation;
18
19 import java.io.IOException;
20 import java.time.ZoneOffset;
21 import java.time.ZonedDateTime;
22
23 import org.orekit.files.ccsds.definitions.TimeConverter;
24 import org.orekit.files.ccsds.ndm.NdmConstituent;
25 import org.orekit.files.ccsds.section.Header;
26 import org.orekit.files.ccsds.section.HeaderKey;
27 import org.orekit.files.ccsds.section.Segment;
28 import org.orekit.files.ccsds.section.XmlStructureKey;
29 import org.orekit.files.ccsds.utils.ContextBinding;
30 import org.orekit.files.ccsds.utils.FileFormat;
31 import org.orekit.time.AbsoluteDate;
32 import org.orekit.time.DateComponents;
33 import org.orekit.time.DateTimeComponents;
34 import org.orekit.time.TimeComponents;
35 import org.orekit.time.TimeScale;
36
37
38
39
40
41
42
43
44
45 public abstract class AbstractMessageWriter<H extends Header, S extends Segment<?, ?>, F extends NdmConstituent<H, S>>
46 implements MessageWriter<H, S, F> {
47
48
49 public static final String DEFAULT_ORIGINATOR = "OREKIT";
50
51
52 private final String root;
53
54
55 private final String formatVersionKey;
56
57
58 private final double defaultVersion;
59
60
61 private ContextBinding context;
62
63
64 private TimeConverter timeConverter;
65
66
67 private double version;
68
69
70
71
72
73
74
75
76
77
78
79
80 public AbstractMessageWriter(final String root, final String formatVersionKey,
81 final double defaultVersion, final ContextBinding context) {
82
83 this.root = root;
84 this.defaultVersion = defaultVersion;
85 this.formatVersionKey = formatVersionKey;
86 this.version = defaultVersion;
87
88 setContext(context);
89
90 }
91
92
93
94
95 public void setContext(final ContextBinding context) {
96 this.context = context;
97 this.timeConverter = context.getTimeSystem().getConverter(context);
98 }
99
100
101
102
103 public ContextBinding getContext() {
104 return context;
105 }
106
107
108
109
110 public TimeConverter getTimeConverter() {
111 return timeConverter;
112 }
113
114
115
116
117 public double getDefaultVersion() {
118 return defaultVersion;
119 }
120
121
122 @Override
123 public void writeHeader(final Generator generator, final H header) throws IOException {
124
125 final ZonedDateTime zdt = ZonedDateTime.now(ZoneOffset.UTC);
126 final TimeScale utc = context.getDataContext().getTimeScales().getUTC();
127 final AbsoluteDate date = new AbsoluteDate(zdt.getYear(), zdt.getMonthValue(), zdt.getDayOfMonth(),
128 zdt.getHour(), zdt.getMinute(), zdt.getSecond(),
129 utc);
130
131
132 if (header != null) {
133
134 if (!Double.isNaN(header.getFormatVersion())) {
135
136 version = header.getFormatVersion();
137 }
138
139 if (header.getCreationDate() == null) {
140 header.setCreationDate(date);
141 }
142
143 if (header.getOriginator() == null) {
144 header.setOriginator(DEFAULT_ORIGINATOR);
145 }
146
147 header.validate(version);
148
149 }
150
151 generator.startMessage(root, formatVersionKey, version);
152
153 if (generator.getFormat() == FileFormat.XML) {
154 generator.enterSection(XmlStructureKey.header.name());
155 }
156
157 if (header != null) {
158
159
160 generator.writeComments(header.getComments());
161
162
163 generator.writeEntry(HeaderKey.CLASSIFICATION.name(), header.getClassification(), null, false);
164
165 }
166
167
168 final DateTimeComponents creationDate = ((header == null) ? date : header.getCreationDate()).getComponents(utc);
169 final DateComponents dc = creationDate.getDate();
170 final TimeComponents tc = creationDate.getTime();
171 generator.writeEntry(HeaderKey.CREATION_DATE.name(),
172 generator.dateToString(dc.getYear(), dc.getMonth(), dc.getDay(),
173 tc.getHour(), tc.getMinute(), tc.getSecond()),
174 null, true);
175
176
177 generator.writeEntry(HeaderKey.ORIGINATOR.name(),
178 header == null ? DEFAULT_ORIGINATOR : header.getOriginator(),
179 null, true);
180
181 if (header != null) {
182 generator.writeEntry(HeaderKey.MESSAGE_ID.name(), header.getMessageId(), null, false);
183 }
184
185 if (generator.getFormat() == FileFormat.XML) {
186 generator.exitSection();
187 }
188
189
190 generator.newLine();
191
192 if (generator.getFormat() == FileFormat.XML) {
193 generator.enterSection(XmlStructureKey.body.name());
194 }
195
196 }
197
198
199 @Override
200 public void writeSegment(final Generator generator, final S segment) throws IOException {
201
202
203 segment.getMetadata().validate(version);
204 segment.getData().validate(version);
205
206 if (generator.getFormat() == FileFormat.XML) {
207 generator.enterSection(XmlStructureKey.segment.name());
208 }
209 writeSegmentContent(generator, version, segment);
210 if (generator.getFormat() == FileFormat.XML) {
211 generator.exitSection();
212 }
213
214 }
215
216
217
218
219
220
221
222 protected abstract void writeSegmentContent(Generator generator, double formatVersion, S segment) throws IOException;
223
224
225 @Override
226 public void writeFooter(final Generator generator) throws IOException {
227 if (generator.getFormat() == FileFormat.XML) {
228 generator.exitSection();
229 }
230 generator.endMessage(root);
231 }
232
233
234 @Override
235 public String getRoot() {
236 return root;
237 }
238
239
240 @Override
241 public String getFormatVersionKey() {
242 return formatVersionKey;
243 }
244
245
246 @Override
247 public double getVersion() {
248 return version;
249 }
250
251 }