From aa78a345ffc23b0e90812d28682f216f70dfa052 Mon Sep 17 00:00:00 2001 From: Ray Lee Date: Sun, 23 May 2021 00:52:58 -0400 Subject: [PATCH] DRYD-939: Ignore enclosing braces when parsing structured dates. --- .../antlr/ANTLRStructuredDateEvaluator.java | 22 +++++++++++++++++-- .../src/test/resources/test-dates.yaml | 21 ++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/antlr/ANTLRStructuredDateEvaluator.java b/services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/antlr/ANTLRStructuredDateEvaluator.java index 036343212..6328de05e 100644 --- a/services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/antlr/ANTLRStructuredDateEvaluator.java +++ b/services/structureddate/structureddate/src/main/java/org/collectionspace/services/structureddate/antlr/ANTLRStructuredDateEvaluator.java @@ -118,6 +118,24 @@ public class ANTLRStructuredDateEvaluator extends StructuredDateBaseListener imp } + /** + * Normalizes a display date for evaluation. + * - Remove leading and trailing whitespace + * - Remove leading and trailing braces + * - Convert to lowercase + * + * @param displayDate + * @return The normalized display date + */ + protected String normalizeDisplayDate(String displayDate) { + String normalDisplayDate = + displayDate + .replaceAll("^[\\[\\(\\{\\s]+|[\\]\\)\\}\\s]+$", "") + .toLowerCase(); + + return normalDisplayDate; + } + @Override public StructuredDateInternal evaluate(String displayDate) throws StructuredDateFormatException { stack = new Stack(); @@ -125,8 +143,8 @@ public class ANTLRStructuredDateEvaluator extends StructuredDateBaseListener imp result = new StructuredDateInternal(); result.setDisplayDate(displayDate); - // Instantiate a parser from the lowercased display date, so that parsing will be case insensitive - ANTLRInputStream inputStream = new ANTLRInputStream(displayDate.toLowerCase()); + // Instantiate a parser from the normalized display date. + ANTLRInputStream inputStream = new ANTLRInputStream(normalizeDisplayDate(displayDate)); StructuredDateLexer lexer = new StructuredDateLexer(inputStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); StructuredDateParser parser = new StructuredDateParser(tokenStream); diff --git a/services/structureddate/structureddate/src/test/resources/test-dates.yaml b/services/structureddate/structureddate/src/test/resources/test-dates.yaml index 6e34784d6..6b58ea560 100644 --- a/services/structureddate/structureddate/src/test/resources/test-dates.yaml +++ b/services/structureddate/structureddate/src/test/resources/test-dates.yaml @@ -1277,6 +1277,27 @@ earliestSingleDate: [1995, 4, 13, CE] latestDate: [2019, 4, 18, CE] + '(1997)': # enclosing parens + earliestSingleDate: [1997, 1, 1, CE] + latestDate: [1997, 12, 31, CE] + + '( 1997 )': # enclosing parens + earliestSingleDate: [1997, 1, 1, CE] + latestDate: [1997, 12, 31, CE] + + '[1997]': # enclosing square brackets + earliestSingleDate: [1997, 1, 1, CE] + latestDate: [1997, 12, 31, CE] + + '{1997}': # enclosing curly brackets + earliestSingleDate: [1997, 1, 1, CE] + latestDate: [1997, 12, 31, CE] + + ' ([1997 }]] )': # enclosing mixed brackets + earliestSingleDate: [1997, 1, 1, CE] + latestDate: [1997, 12, 31, CE] + + # ------------------------------------------------------------------------------------------------------- # Invalid dates # ------------------------------------------------------------------------------------------------------- -- 2.47.3