1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.data;
18
19 import java.io.BufferedReader;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.InputStreamReader;
23 import java.nio.charset.StandardCharsets;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.regex.Matcher;
27 import java.util.regex.Pattern;
28
29 import org.hipparchus.exception.DummyLocalizable;
30 import org.orekit.errors.OrekitException;
31 import org.orekit.errors.OrekitMessages;
32 import org.orekit.time.TimeStamped;
33
34
35
36
37
38
39
40 public class SimpleTimeStampedTableParser<T extends TimeStamped> {
41
42
43
44
45 public interface RowConverter<S extends TimeStamped> {
46
47
48
49
50
51 S convert(double[] rawFields);
52 }
53
54
55 private static final String REAL_TYPE_PATTERN =
56 "[-+]?(?:(?:\\p{Digit}+(?:\\.\\p{Digit}*)?)|(?:\\.\\p{Digit}+))(?:[eE][-+]?\\p{Digit}+)?";
57
58
59 private final int columns;
60
61
62 private final RowConverter<T> converter;
63
64
65
66
67
68 public SimpleTimeStampedTableParser(final int columns, final RowConverter<T> converter) {
69 this.columns = columns;
70 this.converter = converter;
71 }
72
73
74
75
76
77
78 public List<T> parse(final InputStream stream, final String name) {
79
80 if (stream == null) {
81 throw new OrekitException(OrekitMessages.UNABLE_TO_FIND_FILE, name);
82 }
83
84
85 final StringBuilder builder = new StringBuilder("^\\p{Space}*");
86 for (int i = 0; i < columns; ++i) {
87 builder.append("(");
88 builder.append(REAL_TYPE_PATTERN);
89 builder.append(")");
90 builder.append((i < columns - 1) ? "\\p{Space}+" : "\\p{Space}*$");
91 }
92 final Pattern regularLinePattern = Pattern.compile(builder.toString());
93
94
95 try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) {
96
97 final List<T> table = new ArrayList<T>();
98
99 for (String line = reader.readLine(); line != null; line = reader.readLine()) {
100
101
102
103 line = line.replace('\u2212', '-');
104
105 final Matcher regularMatcher = regularLinePattern.matcher(line);
106 if (regularMatcher.matches()) {
107
108
109 final double[] rawFields = new double[columns];
110 for (int i = 0; i < columns; ++i) {
111 rawFields[i] = Double.parseDouble(regularMatcher.group(i + 1));
112 }
113
114 table.add(converter.convert(rawFields));
115
116 }
117
118 }
119
120 if (table.isEmpty()) {
121 throw new OrekitException(OrekitMessages.NOT_A_SUPPORTED_IERS_DATA_FILE, name);
122 }
123
124 return table;
125
126 } catch (IOException ioe) {
127 throw new OrekitException(ioe, new DummyLocalizable(ioe.getMessage()));
128 }
129
130 }
131
132 }