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