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