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