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
158 if (header != null) {
159 generator.writeComments(header.getComments());
160 }
161
162
163 final DateTimeComponents creationDate = ((header == null) ? date : header.getCreationDate()).getComponents(utc);
164 final DateComponents dc = creationDate.getDate();
165 final TimeComponents tc = creationDate.getTime();
166 generator.writeEntry(HeaderKey.CREATION_DATE.name(),
167 generator.dateToString(dc.getYear(), dc.getMonth(), dc.getDay(),
168 tc.getHour(), tc.getMinute(), tc.getSecond()),
169 null, true);
170
171
172 generator.writeEntry(HeaderKey.ORIGINATOR.name(),
173 header == null ? DEFAULT_ORIGINATOR : header.getOriginator(),
174 null, true);
175
176 if (header != null) {
177 generator.writeEntry(HeaderKey.MESSAGE_ID.name(), header.getMessageId(), null, false);
178 }
179
180 if (generator.getFormat() == FileFormat.XML) {
181 generator.exitSection();
182 }
183
184
185 generator.newLine();
186
187 if (generator.getFormat() == FileFormat.XML) {
188 generator.enterSection(XmlStructureKey.body.name());
189 }
190
191 }
192
193
194 @Override
195 public void writeSegment(final Generator generator, final S segment) throws IOException {
196
197
198 segment.getMetadata().validate(version);
199 segment.getData().validate(version);
200
201 if (generator.getFormat() == FileFormat.XML) {
202 generator.enterSection(XmlStructureKey.segment.name());
203 }
204 writeSegmentContent(generator, version, segment);
205 if (generator.getFormat() == FileFormat.XML) {
206 generator.exitSection();
207 }
208
209 }
210
211
212
213
214
215
216
217 public abstract void writeSegmentContent(Generator generator, double formatVersion, S segment) throws IOException;
218
219
220 @Override
221 public void writeFooter(final Generator generator) throws IOException {
222 if (generator.getFormat() == FileFormat.XML) {
223 generator.exitSection();
224 }
225 generator.endMessage(root);
226 }
227
228 }