diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 5c973b7bdfe43be0e5f7619e3586f1f562955e29..d16c099280a2ebba6e07b0fb71cc2813b2c02a98 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -21,6 +21,9 @@
+
+ Fixed rejection of irregular TDM PATH field.
+
Added ephemeris based estimation.
diff --git a/src/main/java/org/orekit/files/ccsds/utils/lexical/ParseToken.java b/src/main/java/org/orekit/files/ccsds/utils/lexical/ParseToken.java
index 75cafd7b1ad3079c397fdf21f441373cb09efac6..30eedcc060cdc23a70e15e31072e689d8f23190f 100644
--- a/src/main/java/org/orekit/files/ccsds/utils/lexical/ParseToken.java
+++ b/src/main/java/org/orekit/files/ccsds/utils/lexical/ParseToken.java
@@ -66,6 +66,9 @@ public class ParseToken {
/** Pattern for splitting comma-separated lists. */
private static final Pattern SPLIT_AT_COMMAS = Pattern.compile("\\p{Space}*,\\p{Space}*");
+ /** Pattern for splitting comma-separated lists with no space in between. */
+ private static final Pattern SPLIT_AT_COMMAS_NO_SPACE = Pattern.compile(",");
+
/** Pattern for true boolean value. */
private static final Pattern BOOLEAN_TRUE = Pattern.compile("(?:yes)|(?:true)",
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
@@ -392,14 +395,14 @@ public class ParseToken {
return true;
}
- /** Process the content as an array of integers.
+ /** Process the content as an array of integers. No spaces between commas are allowed.
* @param consumer consumer of the array
* @return always returns {@code true}
*/
public boolean processAsIntegerArray(final IntegerArrayConsumer consumer) {
try {
if (type == TokenType.ENTRY) {
- final String[] fields = SPLIT_AT_COMMAS.split(getRawContent());
+ final String[] fields = SPLIT_AT_COMMAS_NO_SPACE.split(getRawContent());
final int[] integers = new int[fields.length];
for (int i = 0; i < fields.length; ++i) {
integers[i] = Integer.parseInt(fields[i]);
diff --git a/src/test/java/org/orekit/files/ccsds/ndm/tdm/TdmParserTest.java b/src/test/java/org/orekit/files/ccsds/ndm/tdm/TdmParserTest.java
index f14339617588da0c57ac329057dae9ef0552de8c..2d82290a8fc204d8442f8457285673c8ba973e1e 100644
--- a/src/test/java/org/orekit/files/ccsds/ndm/tdm/TdmParserTest.java
+++ b/src/test/java/org/orekit/files/ccsds/ndm/tdm/TdmParserTest.java
@@ -243,6 +243,21 @@ public class TdmParserTest {
validateTDMExample15(file);
}
+ @Test
+ public void testIssue963() {
+
+ // Check that a TDM with spaces in between participants in PATH is rejected
+ final String name = "/ccsds/tdm/kvn/TDM-issue963.txt";
+ final DataSource source = new DataSource(name, () -> TdmParserTest.class.getResourceAsStream(name));
+ try {
+ // Number format exception in metadata part
+ new ParserBuilder().buildTdmParser().parseMessage(source);
+ Assertions.fail("An exception should have been thrown");
+ } catch (OrekitException oe) {
+ Assertions.assertEquals(OrekitMessages.UNABLE_TO_PARSE_ELEMENT_IN_FILE, oe.getSpecifier());
+ }
+ }
+
@Test
public void testParseTdmXmlExampleAllKeywordsSequential() {
diff --git a/src/test/resources/ccsds/tdm/kvn/TDM-issue963.txt b/src/test/resources/ccsds/tdm/kvn/TDM-issue963.txt
new file mode 100644
index 0000000000000000000000000000000000000000..834451ebbe743f50c3f261313acc25511da08ed3
--- /dev/null
+++ b/src/test/resources/ccsds/tdm/kvn/TDM-issue963.txt
@@ -0,0 +1,29 @@
+CCSDS_TDM_VERS = 1.0
+COMMENT TDM example created by yyyyy-nnnA Nav Team (NASA/JPL)
+COMMENT StarTrek 1-way data, Ka band down
+CREATION_DATE = 2005-160T20:15:00
+ORIGINATOR = NASA/JPL
+META_START
+TIME_SYSTEM = UTC
+START_TIME = 2005-159T17:41:00
+STOP_TIME = 2005-159T17:41:40
+PARTICIPANT_1 = DSS-25
+PARTICIPANT_2 = yyyy-nnnA
+MODE = SEQUENTIAL
+PATH = 2, 1
+INTEGRATION_INTERVAL = 1.0
+INTEGRATION_REF = MIDDLE
+FREQ_OFFSET = 32021035200.0
+TRANSMIT_DELAY_1 = 0.000077
+RECEIVE_DELAY_1 = 0.000077
+DATA_QUALITY = RAW
+META_STOP
+DATA_START
+TRANSMIT_FREQ_2 = 2005-159T17:41:00 32023442781.733
+RECEIVE_FREQ_1 = 2005-159T17:41:00 -409.2735
+RECEIVE_FREQ_1 = 2005-159T17:41:01 -371.1568
+RECEIVE_FREQ_1 = 2005-159T17:41:02 -333.0551 this-should-not-be-here
+RECEIVE_FREQ_1 = 2005-159T17:41:03 -294.9673
+RECEIVE_FREQ_1 = 2005-159T17:41:04 -256.9054
+RECEIVE_FREQ_1 = 2005-159T17:41:05 -218.7951
+DATA_STOP
\ No newline at end of file