From cd772d23f23db08b53cb0746a2dcf81ec9136ad7 Mon Sep 17 00:00:00 2001 From: Patrick Tasse Date: Mon, 9 Feb 2015 14:15:50 -0500 Subject: [PATCH] tmf: Bug 459493: TmfTimestampFormat doesn't parse extra spaces correctly Change-Id: I632348edd64ac31fdafaa5ae7bd2e84ea3abb2bb Signed-off-by: Patrick Tasse Reviewed-on: https://git.eclipse.org/r/41945 Reviewed-by: Hudson CI Reviewed-by: Marc-Andre Laperle Tested-by: Marc-Andre Laperle --- .../tests/event/TmfTimestampFormatTest.java | 12 +++++++-- .../core/timestamp/TmfTimestampFormat.java | 26 ++++++++++++++----- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/event/TmfTimestampFormatTest.java b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/event/TmfTimestampFormatTest.java index a4f22ac510..65e0358885 100644 --- a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/event/TmfTimestampFormatTest.java +++ b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/event/TmfTimestampFormatTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013, 2014 Ericsson + * Copyright (c) 2013, 2015 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -206,7 +206,6 @@ public class TmfTimestampFormatTest { */ @Test public void testParseDateTime() throws ParseException { -// long ref = tsf.parseValue("2014-11-22 12:34:56.123456789"); // Saturday long time; time = new TmfTimestampFormat("yyyy", GMT, CA).parseValue("2014"); @@ -316,6 +315,15 @@ public class TmfTimestampFormatTest { time = new TmfTimestampFormat("yyyy\"MM\"dd\"HH\"mm\"ss\"SSS\"SSS\"SSS", GMT, CA).parseValue("2014\"11\"22\"12\"34\"56\"123\"456\"789"); assertEquals("2014-11-22 12:34:56.123456789", tsf.format(time)); + + time = new TmfTimestampFormat("yyyy MM dd HH mm ss SSS SSS SSS", GMT, CA).parseValue("2014 11 22 12 34 56 123 456 789"); + assertEquals("2014-11-22 12:34:56.123456789", tsf.format(time)); + + time = new TmfTimestampFormat("yyyy MM dd HH mm ss SSS SSS SSS", GMT, CA).parseValue("2014 1 2 3 4 5 123 456 789"); + assertEquals("2014-01-02 03:04:05.123456789", tsf.format(time)); + + time = new TmfTimestampFormat("yyyy MM dd HH mm ss SSS SSS SSS", GMT, CA).parseValue("2014 \t 1 \t 2 \t 3 \t 4 \t 5 \t 123 456 789"); + assertEquals("2014-01-02 03:04:05.123456789", tsf.format(time)); } /** diff --git a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/timestamp/TmfTimestampFormat.java b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/timestamp/TmfTimestampFormat.java index c0fda805ca..30ff9d171c 100644 --- a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/timestamp/TmfTimestampFormat.java +++ b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/timestamp/TmfTimestampFormat.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2014 Ericsson + * Copyright (c) 2012, 2015 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -614,13 +614,27 @@ public class TmfTimestampFormat extends SimpleDateFormat { * Returns the source string length if decimal separator is not found. */ private int indexOfSourceDecimalSeparator(String source) { - String pattern = fPattern.substring(0, fPatternDecimalSeparatorIndex); String separator = fDecimalSeparator == '\'' ? "''" : String.valueOf(fDecimalSeparator); //$NON-NLS-1$ - int sourcePos = source.indexOf(fDecimalSeparator); - int patternPos = pattern.indexOf(separator); - while (patternPos != -1 && sourcePos != -1) { + int patternPos = fPattern.indexOf(separator); + int sourcePos = -1; + while (patternPos != -1 && patternPos <= fPatternDecimalSeparatorIndex) { sourcePos = source.indexOf(fDecimalSeparator, sourcePos + 1); - patternPos = pattern.indexOf(separator, patternPos + separator.length()); + if (sourcePos == -1) { + break; + } + // skip optional spaces and tabs before a pattern letter + char p = patternPos < fPattern.length() - 1 ? fPattern.charAt(patternPos + 1) : '\0'; + if ((p >= 'a' && p <= 'z') || (p >= 'A' && p <= 'Z')) { + while (sourcePos < source.length() - 1) { + char s = source.charAt(sourcePos + 1); + if (s == ' ' || s == '\t') { + sourcePos++; + } else { + break; + } + } + } + patternPos = fPattern.indexOf(separator, patternPos + separator.length()); } if (sourcePos == -1) { sourcePos = source.length(); -- 2.34.1