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