1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.cdm;
18
19 import java.util.regex.Matcher;
20 import java.util.regex.Pattern;
21
22 import org.orekit.files.ccsds.definitions.YesNoUnknown;
23 import org.orekit.files.ccsds.ndm.odm.ocm.ObjectType;
24 import org.orekit.files.ccsds.utils.ContextBinding;
25 import org.orekit.files.ccsds.utils.lexical.ParseToken;
26 import org.orekit.files.ccsds.utils.lexical.TokenType;
27
28
29
30
31
32 public enum CdmMetadataKey {
33
34
35 OBJECT((token, context, container) -> token.processAsNormalizedString(container::setObject)),
36
37
38 OBJECT_DESIGNATOR((token, context, container) -> token.processAsNormalizedString(container::setObjectDesignator)),
39
40
41 CATALOG_NAME((token, context, container) -> token.processAsNormalizedString(container::setCatalogName)),
42
43
44 OBJECT_NAME((token, context, container) -> token.processAsNormalizedString(container::setObjectName)),
45
46
47 INTERNATIONAL_DESIGNATOR((token, context, container) -> token.processAsNormalizedString(container::setInternationalDes)),
48
49
50 OBJECT_TYPE((token, context, container) -> token.processAsEnum(ObjectType.class, container::setObjectType)),
51
52
53 OPERATOR_CONTACT_POSITION((token, context, container) -> token.processAsNormalizedString(container::setOperatorContactPosition)),
54
55
56 OPERATOR_ORGANIZATION((token, context, container) -> token.processAsNormalizedString(container::setOperatorOrganization)),
57
58
59 OPERATOR_PHONE((token, context, container) -> token.processAsNormalizedString(container::setOperatorPhone)),
60
61
62 OPERATOR_EMAIL((token, context, container) -> token.processAsNormalizedString(container::setOperatorEmail)),
63
64
65 ODM_MSG_LINK((token, context, container) -> token.processAsFreeTextString(container::setOdmMsgLink)),
66
67
68 ADM_MSG_LINK((token, context, container) -> token.processAsFreeTextString(container::setAdmMsgLink)),
69
70
71 EPHEMERIS_NAME((token, context, container) -> token.processAsNormalizedString(container::setEphemName)),
72
73
74
75 OBS_BEFORE_NEXT_MESSAGE((token, context, container) -> token.processAsEnum(YesNoUnknown.class, container::setObsBeforeNextMessage)),
76
77
78 COVARIANCE_METHOD((token, context, container) -> token.processAsEnum(CovarianceMethod.class, container::setCovarianceMethod)),
79
80
81 COVARIANCE_SOURCE((token, context, container) -> token.processAsNormalizedString(container::setCovarianceSource)),
82
83
84 MANEUVERABLE((token, context, container) -> token.processAsManeuvrableEnum(container::setManeuverable)),
85
86
87 ORBIT_CENTER((token, context, container) -> token.processAsCenter(container::setOrbitCenter,
88 context.getDataContext().getCelestialBodies())),
89
90
91 REF_FRAME((token, context, container) -> token.processAsFrame(container::setRefFrame, context, true, true, true)),
92
93
94 ALT_COV_TYPE((token, context, container) -> token.processAsEnum(AltCovarianceType.class, container::setAltCovType)),
95
96
97 ALT_COV_REF_FRAME((token, context, container) -> token.processAsFrame(container::setAltCovRefFrame, context, true, false, false)),
98
99
100 GRAVITY_MODEL(new GravityProcessor()),
101
102
103 ATMOSPHERIC_MODEL((token, context, container) -> token.processAsNormalizedString(container::setAtmosphericModel)),
104
105
106 N_BODY_PERTURBATIONS((token, context, container) -> token.processAsCenterList(container::setNBodyPerturbations,
107 context.getDataContext().getCelestialBodies())),
108
109
110 SOLAR_RAD_PRESSURE((token, context, container) -> token.processAsEnum(YesNoUnknown.class, container::setSolarRadiationPressure)),
111
112
113 EARTH_TIDES((token, context, container) -> token.processAsEnum(YesNoUnknown.class, container::setEarthTides)),
114
115
116 INTRACK_THRUST((token, context, container) -> token.processAsEnum(YesNoUnknown.class, container::setIntrackThrust));
117
118
119 private final transient TokenProcessor processor;
120
121
122
123
124 CdmMetadataKey(final TokenProcessor processor) {
125 this.processor = processor;
126 }
127
128
129
130
131
132
133
134 public boolean process(final ParseToken token, final ContextBinding context, final CdmMetadata container) {
135 return processor.process(token, context, container);
136 }
137
138
139 interface TokenProcessor {
140
141
142
143
144
145
146 boolean process(ParseToken token, ContextBinding context, CdmMetadata container);
147 }
148
149
150 private static class GravityProcessor implements TokenProcessor {
151
152
153 private static final Pattern GRAVITY_PATTERN =
154 Pattern.compile("^\\p{Blank}*([-_A-Za-z0-9]+)\\p{Blank}*:" +
155 "\\p{Blank}*([0-9]+)D" +
156 "\\p{Blank}*([0-9]+)O" +
157 "\\p{Blank}*$");
158
159
160 @Override
161 public boolean process(final ParseToken token, final ContextBinding context, final CdmMetadata container) {
162 if (token.getType() == TokenType.ENTRY) {
163 final Matcher matcher = GRAVITY_PATTERN.matcher(token.getContentAsNormalizedString());
164 if (!matcher.matches()) {
165 throw token.generateException(null);
166 }
167 container.setGravityModel(matcher.group(1),
168 Integer.parseInt(matcher.group(2)),
169 Integer.parseInt(matcher.group(3)));
170 }
171 return true;
172 }
173 }
174
175 }