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/08 13:53:52 UTC

[jackrabbit-filevault] branch master updated: JCRVLT-526 improved support of legacy timezone designators "+hhmm" (#144)

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

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git


The following commit(s) were added to refs/heads/master by this push:
     new c821515  JCRVLT-526 improved support of legacy timezone designators "+hhmm" (#144)
c821515 is described below

commit c821515bfca32f957c89d4a68d1e349c4be45a1f
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Tue Jun 8 15:53:45 2021 +0200

    JCRVLT-526 improved support of legacy timezone designators "+hhmm" (#144)
---
 .../packaging/impl/PackagePropertiesImpl.java      | 32 ++++++++++------------
 .../packaging/impl/JcrPackageDefinitionImplIT.java |  7 +++--
 .../packaging/impl/PackagePropertiesImplTest.java  |  8 ++----
 3 files changed, 22 insertions(+), 25 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..af24eb6 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,8 +49,10 @@ 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)?");
+    /** supports parsing dates given out via {@code SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")} */
+    private static final DateTimeFormatter DATE_TIME_FORMATTER_LEGACY = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
+    /** supports parsing dates given out via {@code SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")}" */
+    private static final DateTimeFormatter DATE_TIME_FORMATTER_ISO_8601 = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
 
     private PackageId id;
 
@@ -224,21 +227,16 @@ 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 {
+                    zonedDateTime = ZonedDateTime.parse(p, DATE_TIME_FORMATTER_ISO_8601);
+                } catch (DateTimeParseException e) {
+                    // support dates in legacy format (used in package-maven-plugin till version 1.0.3, compare with https://issues.apache.org/jira/browse/JCRVLT-276)
+                    zonedDateTime = ZonedDateTime.parse(p, DATE_TIME_FORMATTER_LEGACY);
                 }
+                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/JcrPackageDefinitionImplIT.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageDefinitionImplIT.java
index aa84b84..32019ae 100644
--- a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageDefinitionImplIT.java
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageDefinitionImplIT.java
@@ -54,11 +54,12 @@ public class JcrPackageDefinitionImplIT extends IntegrationTestBase {
     }
 
     void assertPackagePropertiesEquals(PackageProperties expectedProperties, PackageProperties actualProperties) {
-        Assert.assertEquals("lastModified is different", expectedProperties.getLastModified(), actualProperties.getLastModified());
+        // only compare dates, as JCR disregards time zone information from Calendar
+        Assert.assertEquals("lastModified is different", expectedProperties.getLastModified().getTime(), actualProperties.getLastModified().getTime());
         Assert.assertEquals("lastModifiedBy is different", expectedProperties.getLastModifiedBy(), actualProperties.getLastModifiedBy());
-        Assert.assertEquals("created is different", expectedProperties.getCreated(), actualProperties.getCreated());
+        Assert.assertEquals("created is different", expectedProperties.getCreated().getTime(), actualProperties.getCreated().getTime());
         Assert.assertEquals("createdBy is different", expectedProperties.getCreatedBy(), actualProperties.getCreatedBy());
-        Assert.assertEquals("lastWrapped is different", expectedProperties.getLastWrapped(), actualProperties.getLastWrapped());
+        Assert.assertEquals("lastWrapped is different", expectedProperties.getLastWrapped().getTime(), actualProperties.getLastWrapped().getTime());
         Assert.assertEquals("lastWrappedBy is different", expectedProperties.getLastWrappedBy(), actualProperties.getLastWrappedBy());
         Assert.assertEquals("description is different", expectedProperties.getDescription(), actualProperties.getDescription());
         Assert.assertEquals("acHandling is different", expectedProperties.getACHandling(), actualProperties.getACHandling());
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());
         }