1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.tdm;
18
19 import java.util.ArrayList;
20 import java.util.List;
21 import java.util.function.Function;
22
23 import org.orekit.data.DataContext;
24 import org.orekit.files.ccsds.definitions.CcsdsFrameMapper;
25 import org.orekit.files.ccsds.ndm.ParsedUnitsBehavior;
26 import org.orekit.files.ccsds.section.HeaderProcessingState;
27 import org.orekit.files.ccsds.section.KvnStructureProcessingState;
28 import org.orekit.files.ccsds.section.MetadataKey;
29 import org.orekit.files.ccsds.section.Segment;
30 import org.orekit.files.ccsds.section.XmlStructureProcessingState;
31 import org.orekit.files.ccsds.utils.ContextBinding;
32 import org.orekit.files.ccsds.utils.FileFormat;
33 import org.orekit.files.ccsds.utils.lexical.ParseToken;
34 import org.orekit.files.ccsds.utils.parsing.AbstractConstituentParser;
35 import org.orekit.files.ccsds.utils.parsing.ProcessingState;
36 import org.orekit.frames.Frame;
37 import org.orekit.utils.IERSConventions;
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 public class TdmParser extends AbstractConstituentParser<TdmHeader, Tdm, TdmParser> {
62
63
64 private final RangeUnitsConverter converter;
65
66
67 private TdmMetadata metadata;
68
69
70 private ContextBinding context;
71
72
73 private ObservationsBlock observationsBlock;
74
75
76 private TdmHeader header;
77
78
79 private List<Segment<TdmMetadata, ObservationsBlock>> segments;
80
81
82 private ProcessingState structureProcessor;
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 public TdmParser(final IERSConventions conventions, final boolean simpleEOP, final DataContext dataContext,
101 final ParsedUnitsBehavior parsedUnitsBehavior, final RangeUnitsConverter converter,
102 final Function<ParseToken, List<ParseToken>>[] filters,
103 final CcsdsFrameMapper frameMapper) {
104 super(Tdm.ROOT, Tdm.FORMAT_VERSION_KEY, conventions, simpleEOP,
105 dataContext, parsedUnitsBehavior, filters, frameMapper);
106 this.converter = converter;
107 }
108
109
110 @Override
111 public TdmHeader getHeader() {
112 return header;
113 }
114
115
116 @Override
117 public void reset(final FileFormat fileFormat) {
118 header = new TdmHeader();
119 segments = new ArrayList<>();
120 metadata = null;
121 context = null;
122 observationsBlock = null;
123 if (fileFormat == FileFormat.XML) {
124 structureProcessor = new XmlStructureProcessingState(Tdm.ROOT, this);
125 reset(fileFormat, structureProcessor);
126 } else {
127 structureProcessor = new KvnStructureProcessingState(this);
128 reset(fileFormat, new HeaderProcessingState(this));
129 }
130 }
131
132
133 @Override
134 public Tdm build() {
135 return new Tdm(header, segments, getConventions(), getDataContext());
136 }
137
138
139 @Override
140 public boolean prepareHeader() {
141 anticipateNext(new HeaderProcessingState(this));
142 return true;
143 }
144
145
146 @Override
147 public boolean inHeader() {
148 anticipateNext(structureProcessor);
149 return true;
150 }
151
152
153 @Override
154 public boolean finalizeHeader() {
155 header.validate(header.getFormatVersion());
156 return true;
157 }
158
159
160 @Override
161 public boolean prepareMetadata() {
162 if (metadata != null) {
163 return false;
164 }
165 metadata = new TdmMetadata(getFrameMapper());
166 context = new ContextBinding(
167 this::getConventions, this::isSimpleEOP,
168 this::getDataContext, this::getParsedUnitsBehavior,
169 () -> null, metadata::getTimeSystem, () -> 0.0, () -> 1.0);
170 anticipateNext(this::processMetadataToken);
171 return true;
172 }
173
174
175 @Override
176 public boolean inMetadata() {
177 anticipateNext(structureProcessor);
178 return true;
179 }
180
181
182 @Override
183 public boolean finalizeMetadata() {
184 metadata.validate(header.getFormatVersion());
185 return true;
186 }
187
188
189 @Override
190 public boolean prepareData() {
191 observationsBlock = new ObservationsBlock();
192 anticipateNext(this::processDataToken);
193 return true;
194 }
195
196
197 @Override
198 public boolean inData() {
199 anticipateNext(structureProcessor);
200 return true;
201 }
202
203
204 @Override
205 public boolean finalizeData() {
206 segments.add(new Segment<>(metadata, observationsBlock));
207 metadata = null;
208 context = null;
209 observationsBlock = null;
210 return true;
211 }
212
213
214
215
216
217 private boolean processMetadataToken(final ParseToken token) {
218 inMetadata();
219 try {
220 return token.getName() != null &&
221 MetadataKey.valueOf(token.getName()).process(token, context, metadata);
222 } catch (IllegalArgumentException iaeM) {
223 try {
224 return TdmMetadataKey.valueOf(token.getName()).process(token, context, metadata);
225 } catch (IllegalArgumentException iaeT) {
226
227 return false;
228 }
229 }
230 }
231
232
233
234
235
236 private boolean processDataToken(final ParseToken token) {
237 try {
238 inData();
239 try {
240
241 return token.getName() != null &&
242 TdmDataKey.valueOf(token.getName()).process(token, context, observationsBlock);
243 } catch (IllegalArgumentException iae) {
244
245 return ObservationType.valueOf(token.getName()).process(token, context, converter, metadata, observationsBlock);
246 }
247 } catch (IllegalArgumentException iae) {
248
249 return false;
250 }
251 }
252
253 }