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 public abstract class AbstractMessageWriter<H extends Header, S extends Segment<?, ?>, F extends NdmConstituent<H, S>>
45 implements MessageWriter<H, S, F> {
46
47
48 public static final String DEFAULT_ORIGINATOR = "OREKIT";
49
50
51 private final String root;
52
53
54 private final String formatVersionKey;
55
56
57 private final double defaultVersion;
58
59
60 private ContextBinding context;
61
62
63 private TimeConverter timeConverter;
64
65
66 private double version;
67
68
69
70
71
72
73
74
75
76
77
78
79 public AbstractMessageWriter(final String root, final String formatVersionKey,
80 final double defaultVersion, final ContextBinding context) {
81
82 this.root = root;
83 this.defaultVersion = defaultVersion;
84 this.formatVersionKey = formatVersionKey;
85 this.version = defaultVersion;
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 H 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(HeaderKey.MESSAGE_ID.name(), header.getMessageId(), null, false);
177 }
178
179 if (generator.getFormat() == FileFormat.XML) {
180 generator.exitSection();
181 }
182
183
184 generator.newLine();
185
186 if (generator.getFormat() == FileFormat.XML) {
187 generator.enterSection(XmlStructureKey.body.name());
188 }
189
190 }
191
192
193 @Override
194 public void writeSegment(final Generator generator, final S segment) throws IOException {
195
196
197 segment.getMetadata().validate(version);
198 segment.getData().validate(version);
199
200 if (generator.getFormat() == FileFormat.XML) {
201 generator.enterSection(XmlStructureKey.segment.name());
202 }
203 writeSegmentContent(generator, version, segment);
204 if (generator.getFormat() == FileFormat.XML) {
205 generator.exitSection();
206 }
207
208 }
209
210
211
212
213
214
215
216 public abstract void writeSegmentContent(Generator generator, double formatVersion, S segment) throws IOException;
217
218
219 @Override
220 public void writeFooter(final Generator generator) throws IOException {
221 if (generator.getFormat() == FileFormat.XML) {
222 generator.exitSection();
223 }
224 generator.endMessage(root);
225 }
226
227 }