You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2021/06/07 15:40:13 UTC

[jackrabbit-filevault] 01/01: JCRVLT-526 improved support of legacy timezone designators "+hhmm"

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch bugfix/JCRVLT-526-improve-deprecated-timezone-designator-support
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git

commit 606330da2e1ac5935cdbb5388b14fa906ae06ad6
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Mon Jun 7 17:39:57 2021 +0200

    JCRVLT-526 improved support of legacy timezone designators "+hhmm"
    
    Based on a suggestion by Julian Sedding
---
 .../packaging/impl/PackagePropertiesImpl.java      | 30 +++++++++-------------
 .../packaging/impl/PackagePropertiesImplTest.java  |  8 +++---
 2 files changed, 15 insertions(+), 23 deletions(-)

diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImpl.java
index 8a56e98..112cc91 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImpl.java
@@ -19,16 +19,17 @@ package org.apache.jackrabbit.vault.packaging.impl;
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.Calendar;
 import java.util.Collections;
 import java.util.Enumeration;
+import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
-import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
 import org.apache.jackrabbit.vault.packaging.Dependency;
 import org.apache.jackrabbit.vault.packaging.PackageId;
@@ -48,9 +49,6 @@ public abstract class PackagePropertiesImpl implements PackageProperties {
 
     private static final Logger log = LoggerFactory.getLogger(PackagePropertiesImpl.class);
 
-    /** Matches dates with timezone like +02 or +0200 so that these can be transformed to +02:00 in {@link #getDateProperty(String)}. */
-    private static final Pattern TIMEZONE_FIX_PATTERN = Pattern.compile("(?<dateUptoTzHours>.*[+-]\\d\\d)(?<tzMinutes>\\d\\d)?");
-
     private PackageId id;
 
     @Override
@@ -224,21 +222,17 @@ public abstract class PackagePropertiesImpl implements PackageProperties {
     public Calendar getDateProperty(String name) {
         Calendar result = null;
         try {
-            // TODO: add timezone if not there?
             String p = getProperty(name);
             if (p != null) {
-                result = ISO8601.parse(p);
-                if (result == null) {
-                    // Perhaps this is due to unusual timezone format +02 or +0200 that aren't supported by ISO8601.parse
-                    // but sometimes produced by maven plugins, compare https://issues.apache.org/jira/browse/JCRVLT-276
-                    Matcher splittedDate = TIMEZONE_FIX_PATTERN.matcher(p);
-                    if (splittedDate.matches()) {
-                        String tzminutes = splittedDate.group("tzMinutes");
-                        tzminutes = tzminutes != null ? tzminutes : "00";
-                        String reformattedDate = splittedDate.group("dateUptoTzHours") + ":" + tzminutes;
-                        result = ISO8601.parse(reformattedDate);
-                    }
+                ZonedDateTime zonedDateTime;
+                try {
+                    // supports date in format new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
+                    zonedDateTime = ZonedDateTime.parse(p, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+                } catch (DateTimeParseException e) {
+                    // support dates given out via new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); as well (used in package-maven-plugin till version 1.0.3, compare with https://issues.apache.org/jira/browse/JCRVLT-276)
+                    zonedDateTime = ZonedDateTime.parse(p, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));
                 }
+                result = GregorianCalendar.from(zonedDateTime);
             }
         } catch (Exception e) {
             log.error("Error while converting date property", e);
diff --git a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImplTest.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImplTest.java
index 43a40eb..7586235 100644
--- a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImplTest.java
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImplTest.java
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.vault.packaging.impl;
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.time.ZoneOffset;
 import java.util.Calendar;
 import java.util.Collections;
 import java.util.HashMap;
@@ -93,9 +94,6 @@ public class PackagePropertiesImplTest {
         checkDateParsing("2021-05-26T15:12:21.673+0200","2021-05-26T13:12:21.673Z");
         checkDateParsing("2021-05-26T15:12:21.673-0230","2021-05-26T17:42:21.673Z");
 
-        // missing timezone is treated as UTC. TODO is that right?
-        checkDateParsing("2021-05-26T15:12:21.673","2021-05-26T15:12:21.673Z");
-
         // check that some edge cases don't break
         checkDateParsing("nonsense",null);
         checkDateParsing("",null);
@@ -106,8 +104,8 @@ public class PackagePropertiesImplTest {
         PackageProperties packageProperties = new SimplePackageProperties(Collections.singletonMap(PackageProperties.NAME_CREATED, original));
         Calendar created = packageProperties.getCreated();
         if (expected != null) {
-            MatcherAssert.assertThat("Date was not be parsed: " + original, created, Matchers.notNullValue());
-            MatcherAssert.assertThat(created.toInstant().toString(), Matchers.equalTo(expected));
+            MatcherAssert.assertThat("Date could not be parsed: " + original, created, Matchers.notNullValue());
+            MatcherAssert.assertThat(created.toInstant().atOffset(ZoneOffset.UTC).toString(), Matchers.equalTo(expected));
         } else {
             MatcherAssert.assertThat("Invalid date must return null when parsing: " + original, created, Matchers.nullValue());
         }