1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm;
18
19 import java.util.ArrayList;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.function.Function;
23 import java.util.function.Supplier;
24
25 import org.orekit.errors.OrekitException;
26 import org.orekit.errors.OrekitMessages;
27 import org.orekit.files.ccsds.section.CommentsContainer;
28 import org.orekit.files.ccsds.utils.FileFormat;
29 import org.orekit.files.ccsds.utils.lexical.ParseToken;
30 import org.orekit.files.ccsds.utils.lexical.XmlTokenBuilder;
31 import org.orekit.files.ccsds.utils.parsing.AbstractMessageParser;
32
33
34
35
36
37 public class NdmParser extends AbstractMessageParser<Ndm> {
38
39
40 private final ParserBuilder builder;
41
42
43 private AbstractMessageParser<? extends NdmConstituent<?, ?>> constituentParser;
44
45
46 private CommentsContainer comments;
47
48
49 private List<NdmConstituent<?, ?>> constituents;
50
51
52
53
54
55
56
57
58
59
60
61 public NdmParser(final ParserBuilder builder,
62 final Function<ParseToken, List<ParseToken>>[] filters) {
63 super(NdmStructureKey.ndm.name(), null, filters);
64 this.builder = builder;
65 }
66
67
68 @Override
69 public Map<String, XmlTokenBuilder> getSpecialXmlElementsBuilders() {
70 final Map<String, XmlTokenBuilder> builders = super.getSpecialXmlElementsBuilders();
71
72
73 builders.putAll(builder.buildTdmParser().getSpecialXmlElementsBuilders());
74 builders.putAll(builder.buildOpmParser().getSpecialXmlElementsBuilders());
75 builders.putAll(builder.buildOmmParser().getSpecialXmlElementsBuilders());
76 builders.putAll(builder.buildOemParser().getSpecialXmlElementsBuilders());
77 builders.putAll(builder.buildOcmParser().getSpecialXmlElementsBuilders());
78 builders.putAll(builder.buildApmParser().getSpecialXmlElementsBuilders());
79 builders.putAll(builder.buildAemParser().getSpecialXmlElementsBuilders());
80 builders.putAll(builder.buildAcmParser().getSpecialXmlElementsBuilders());
81 builders.putAll(builder.buildCdmParser().getSpecialXmlElementsBuilders());
82
83 return builders;
84
85 }
86
87
88 @Override
89 public void reset(final FileFormat fileFormat) {
90 reset(fileFormat, this::processToken);
91 constituentParser = null;
92 comments = new CommentsContainer();
93 constituents = new ArrayList<>();
94 }
95
96
97 @Override
98 public Ndm build() {
99
100 return new Ndm(comments.getComments(), constituents);
101 }
102
103
104
105
106
107
108
109
110
111
112 public boolean addComment(final String comment) {
113 return comments.addComment(comment);
114 }
115
116
117
118
119 boolean manageTdmConstituent() {
120 return manageConstituent(builder::buildTdmParser);
121 }
122
123
124
125
126 boolean manageOpmConstituent() {
127 return manageConstituent(builder::buildOpmParser);
128 }
129
130
131
132
133 boolean manageOmmConstituent() {
134 return manageConstituent(builder::buildOmmParser);
135 }
136
137
138
139
140 boolean manageOemConstituent() {
141 return manageConstituent(builder::buildOemParser);
142 }
143
144
145
146
147 boolean manageOcmConstituent() {
148 return manageConstituent(builder::buildOcmParser);
149 }
150
151
152
153
154 boolean manageApmConstituent() {
155 return manageConstituent(builder::buildApmParser);
156 }
157
158
159
160
161 boolean manageAemConstituent() {
162 return manageConstituent(builder::buildAemParser);
163 }
164
165
166
167
168
169 boolean manageAcmConstituent() {
170 return manageConstituent(builder::buildAcmParser);
171 }
172
173
174
175
176 boolean manageCdmConstituent() {
177 return manageConstituent(builder::buildCdmParser);
178 }
179
180
181
182
183
184 boolean manageConstituent(final Supplier<AbstractMessageParser<? extends NdmConstituent<?, ?>>> parserSupplier) {
185
186
187 comments.refuseFurtherComments();
188
189
190 constituentParser = parserSupplier.get();
191 constituentParser.reset(getFileFormat());
192
193 return true;
194
195 }
196
197
198
199
200
201 private boolean processToken(final ParseToken token) {
202
203 if (getFileFormat() == FileFormat.KVN) {
204
205 throw new OrekitException(OrekitMessages.UNSUPPORTED_FILE_FORMAT, token.getFileName());
206 }
207
208 if (constituentParser == null) {
209
210 try {
211 return NdmStructureKey.valueOf(token.getName()).process(token, this);
212 } catch (IllegalArgumentException iae) {
213
214 return false;
215 }
216 } else {
217
218 constituentParser.process(token);
219 if (constituentParser.wasEndTagSeen()) {
220
221 constituents.add(constituentParser.build());
222 constituentParser = null;
223 }
224 return true;
225 }
226
227 }
228
229 }