1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.sinex;
18
19 import org.hipparchus.util.FastMath;
20 import org.orekit.time.AbsoluteDate;
21 import org.orekit.time.DateComponents;
22 import org.orekit.time.TimeScale;
23 import org.orekit.time.TimeScales;
24 import org.orekit.utils.Constants;
25 import org.orekit.utils.units.Unit;
26
27 import java.util.regex.Pattern;
28
29
30
31
32
33
34 public abstract class ParseInfo<T extends AbstractSinex> {
35
36
37 private static final String DEFAULT_EPOCH_TWO_DIGITS = "00:000:00000";
38
39
40 private static final String DEFAULT_EPOCH_FOUR_DIGITS = "0000:000:00000";
41
42
43 private static final Pattern SEPARATOR = Pattern.compile(":");
44
45
46 private final TimeScales timeScales;
47
48
49 private String name;
50
51
52 private String line;
53
54
55 private int lineNumber;
56
57
58 private AbsoluteDate creationDate;
59
60
61 private String creationDateString;
62
63
64 private AbsoluteDate startDate;
65
66
67 private String startDateString;
68
69
70 private AbsoluteDate endDate;
71
72
73 private String endDateString;
74
75
76 private TimeScale timeScale;
77
78
79
80
81 protected ParseInfo(final TimeScales timeScales) {
82 this.timeScales = timeScales;
83 }
84
85
86
87
88 void newSource(final String newName) {
89
90 this.name = newName;
91 this.line = null;
92 this.lineNumber = 0;
93 }
94
95
96
97
98 protected String getName() {
99 return name;
100 }
101
102
103
104
105 void setLine(final String line)
106 {
107 this.line = line;
108 }
109
110
111
112
113 String getLine() {
114 return line;
115 }
116
117
118
119 void incrementLineNumber() {
120 ++lineNumber;
121 }
122
123
124
125
126 int getLineNumber() {
127 return lineNumber;
128 }
129
130
131
132
133 protected void setCreationDate(final String dateString) {
134 this.creationDateString = dateString;
135 this.creationDate = stringEpochToAbsoluteDate(creationDateString, false);
136 }
137
138
139
140
141 protected AbsoluteDate getCreationDate() {
142 return creationDate;
143 }
144
145
146
147
148 protected void setStartDateIfEarlier(final String candidateStartDateString) {
149 final AbsoluteDate candidateStart = stringEpochToAbsoluteDate(candidateStartDateString, true);
150 if (startDate == null || candidateStart.isBefore(startDate)) {
151
152
153 this.startDateString = candidateStartDateString;
154 this.startDate = candidateStart;
155 }
156 }
157
158
159
160
161 protected AbsoluteDate getStartDate() {
162 return startDate;
163 }
164
165
166
167
168 protected void setEndDateIfLater(final String candidateEndDateString) {
169 final AbsoluteDate candidateEnd = stringEpochToAbsoluteDate(candidateEndDateString, true);
170 if (endDate == null || candidateEnd.isAfter(endDate)) {
171
172
173 this.endDateString = candidateEndDateString;
174 this.endDate = candidateEnd;
175 }
176 }
177
178
179
180
181 protected AbsoluteDate getEndDate() {
182 return endDate;
183 }
184
185
186
187
188 protected void setTimeScale(final TimeScale timeScale) {
189
190 this.timeScale = timeScale;
191
192
193
194 if (startDateString != null) {
195 startDate = stringEpochToAbsoluteDate(startDateString, true);
196 }
197 if (endDateString != null) {
198 endDate = stringEpochToAbsoluteDate(endDateString, false);
199 }
200 if (creationDateString != null) {
201 creationDate = stringEpochToAbsoluteDate(creationDateString, false);
202 }
203
204 }
205
206
207
208
209 TimeScales getTimeScales() {
210 return timeScales;
211 }
212
213
214
215
216 protected abstract T build();
217
218
219
220
221
222
223 protected String parseString(final int start, final int length) {
224 return line.substring(start, FastMath.min(line.length(), start + length)).trim();
225 }
226
227
228
229
230
231
232 protected double parseDouble(final int start, final int length) {
233 return Double.parseDouble(parseString(start, length));
234 }
235
236
237
238
239
240
241 protected int parseInt(final int start, final int length) {
242 return Integer.parseInt(parseString(start, length));
243 }
244
245
246
247
248
249
250
251
252 protected double parseDoubleWithUnit(final int startUnit, final int lengthUnit,
253 final int startDouble, final int lengthDouble) {
254 final Unit unit = Unit.parse(parseString(startUnit, lengthUnit));
255 return unit.toSI(parseDouble(startDouble, lengthDouble));
256 }
257
258
259
260
261
262
263 protected AbsoluteDate stringEpochToAbsoluteDate(final String stringDate, final boolean isStart) {
264
265
266 if (DEFAULT_EPOCH_TWO_DIGITS.equals(stringDate) || DEFAULT_EPOCH_FOUR_DIGITS.equals(stringDate)) {
267
268
269 return isStart ? startDate : AbsoluteDate.FUTURE_INFINITY;
270 }
271
272
273 final String[] fields = SEPARATOR.split(stringDate);
274
275
276 final int digitsYear = Integer.parseInt(fields[0]);
277 final int day = Integer.parseInt(fields[1]);
278 final int secInDay = Integer.parseInt(fields[2]);
279
280
281 final int year;
282 if (digitsYear > 50 && digitsYear < 100) {
283 year = 1900 + digitsYear;
284 } else if (digitsYear < 100) {
285 year = 2000 + digitsYear;
286 } else {
287 year = digitsYear;
288 }
289
290
291
292
293 return new AbsoluteDate(new DateComponents(year, 1, 1), timeScale).
294 shiftedBy(Constants.JULIAN_DAY * (day - 1)).
295 shiftedBy(secInDay);
296
297 }
298
299 }