You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/11/24 13:33:09 UTC

[isis] branch master updated: ISIS-2877: fixes java<->joda ZoneId conversion

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 20e25b8  ISIS-2877: fixes java<->joda ZoneId conversion
20e25b8 is described below

commit 20e25b8e89fc6d85296d1df0613ecd51a6a0e08c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Nov 24 14:32:56 2021 +0100

    ISIS-2877: fixes java<->joda ZoneId conversion
---
 .../ui/component/EventProviderAbstract.java        |  4 +-
 valuetypes/jodatime/applib/pom.xml                 |  8 ++
 ...timeConverters.java => JodaTimeConverters.java} |  6 +-
 .../applib/value/JodaTimeConvertersTest.java       | 92 ++++++++++++++++++++++
 .../valuesemantics/JodaDateTimeValueSemantics.java |  6 +-
 .../JodaLocalDateTimeValueSemantics.java           |  6 +-
 .../JodaLocalDateValueSemantics.java               |  6 +-
 .../JodaLocalTimeValueSemantics.java               |  6 +-
 8 files changed, 117 insertions(+), 17 deletions(-)

diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/EventProviderAbstract.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/EventProviderAbstract.java
index 52909c2..e536164 100644
--- a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/EventProviderAbstract.java
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/EventProviderAbstract.java
@@ -36,7 +36,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.extensions.fullcalendar.applib.spi.CalendarableDereferencingService;
 import org.apache.isis.extensions.fullcalendar.applib.value.CalendarEvent;
-import org.apache.isis.valuetypes.jodatime.applib.value.JodatimeConverters;
+import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 
 import lombok.val;
@@ -99,7 +99,7 @@ public abstract class EventProviderAbstract implements EventProvider {
                     .map(InteractionContext::getTimeZone)
                     .orElse(ZoneId.systemDefault());
 
-            val start = JodatimeConverters.toJoda(calendarEvent.asDateTime(timeZone));
+            val start = JodaTimeConverters.toJoda(calendarEvent.asDateTime(timeZone));
             val end = start;
 
             final Event event = new Event();
diff --git a/valuetypes/jodatime/applib/pom.xml b/valuetypes/jodatime/applib/pom.xml
index 1941555..89ce264 100644
--- a/valuetypes/jodatime/applib/pom.xml
+++ b/valuetypes/jodatime/applib/pom.xml
@@ -44,6 +44,14 @@
 			<artifactId>joda-time</artifactId>
 		</dependency>
 
+		<!-- TESTING -->
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-internaltestsupport</artifactId>
+			<scope>test</scope>
+		</dependency>
+
 	</dependencies>
 
 </project>
diff --git a/valuetypes/jodatime/applib/src/main/java/org/apache/isis/valuetypes/jodatime/applib/value/JodatimeConverters.java b/valuetypes/jodatime/applib/src/main/java/org/apache/isis/valuetypes/jodatime/applib/value/JodaTimeConverters.java
similarity index 96%
rename from valuetypes/jodatime/applib/src/main/java/org/apache/isis/valuetypes/jodatime/applib/value/JodatimeConverters.java
rename to valuetypes/jodatime/applib/src/main/java/org/apache/isis/valuetypes/jodatime/applib/value/JodaTimeConverters.java
index df24c32..3aa32cb 100644
--- a/valuetypes/jodatime/applib/src/main/java/org/apache/isis/valuetypes/jodatime/applib/value/JodatimeConverters.java
+++ b/valuetypes/jodatime/applib/src/main/java/org/apache/isis/valuetypes/jodatime/applib/value/JodaTimeConverters.java
@@ -31,7 +31,7 @@ import lombok.experimental.UtilityClass;
  * @since 2.0 {@index}
  */
 @UtilityClass
-public final class JodatimeConverters {
+public final class JodaTimeConverters {
 
     // -- INSTANT
 
@@ -106,11 +106,11 @@ public final class JodatimeConverters {
     // -- TIME ZONE
 
     public DateTimeZone toJoda(final java.time.ZoneId input) {
-        return DateTimeZone.forID(input.getId());
+        return DateTimeZone.forTimeZone(java.util.TimeZone.getTimeZone(input));
     }
 
     public java.time.ZoneId fromJoda(final DateTimeZone input) {
-        return java.time.ZoneId.of(input.getID());
+        return input.toTimeZone().toZoneId();
     }
 
     // -- HELPER
diff --git a/valuetypes/jodatime/applib/src/test/java/org/apache/isis/valuetypes/jodatime/applib/value/JodaTimeConvertersTest.java b/valuetypes/jodatime/applib/src/test/java/org/apache/isis/valuetypes/jodatime/applib/value/JodaTimeConvertersTest.java
new file mode 100644
index 0000000..c2d8d47
--- /dev/null
+++ b/valuetypes/jodatime/applib/src/test/java/org/apache/isis/valuetypes/jodatime/applib/value/JodaTimeConvertersTest.java
@@ -0,0 +1,92 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.valuetypes.jodatime.applib.value;
+
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.stream.Stream;
+
+import org.joda.time.DateTimeZone;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+class JodaTimeConvertersTest {
+
+    @ParameterizedTest(name = "{index} {0}")
+    @MethodSource("provideAllZoneIds")
+    void timeZone_Roundtrip(final String zoneIdName, final ZoneId zoneId) {
+
+        final DateTimeZone jodaValue;
+
+        try {
+            jodaValue = JodaTimeConverters.toJoda(zoneId);
+        } catch (Exception e) {
+            fail(String.format("conversion failed for %s", zoneIdName), e);
+            return;
+        }
+
+        final ZoneId recoveredValue = JodaTimeConverters.fromJoda(jodaValue);
+        assertEquals(zoneId.getRules(), recoveredValue.getRules(), ()->String.format("rountrip failed for %s", zoneIdName));
+    }
+
+    @ParameterizedTest(name = "{index} {0}")
+    @MethodSource("provideAllZoneIds")
+    void zonedDateFormat_roundtrip(final String zoneIdName, final ZoneId zoneId) {
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss x");
+        ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 11, 24, 11, 13, 41, 0, zoneId);
+
+        org.joda.time.DateTime jodaValue = JodaTimeConverters.toJoda(zonedDateTime);
+        ZonedDateTime recoveredValue = JodaTimeConverters.fromJoda(jodaValue);
+
+        assertEquals(zonedDateTime.format(formatter), recoveredValue.format(formatter));
+    }
+
+    @Test
+    void zonedDateFormat_zeroOffset() {
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss x");
+        ZonedDateTime zonedDateTime = formatter.parse("2021-11-24 11:13:41 +00", ZonedDateTime::from);
+
+        org.joda.time.DateTime jodaValue = JodaTimeConverters.toJoda(zonedDateTime);
+        ZonedDateTime recoveredValue = JodaTimeConverters.fromJoda(jodaValue);
+
+        assertEquals(zonedDateTime.format(formatter), recoveredValue.format(formatter));
+    }
+
+    // -- TEST PARAMS
+
+    static Stream<Arguments> provideAllZoneIds() {
+        return ZoneId.getAvailableZoneIds().stream()
+                .filter(zoneIdName->!zoneIdName.startsWith("SystemV/"))
+                .filter(zoneIdName->!zoneIdName.equals("Pacific/Enderbury"))
+                .map(ZoneId::of)
+                .map(zoneId->Arguments.of(
+                        zoneId.getId(), zoneId));
+    }
+
+
+
+}
diff --git a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
index 274d70d..63e1052 100644
--- a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
+++ b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.ZonedDateTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.isis.schema.common.v2.ValueType;
-import org.apache.isis.valuetypes.jodatime.applib.value.JodatimeConverters;
+import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
 
 @Component
 @Named("isis.val.JodaDateTimeValueSemantics")
@@ -56,12 +56,12 @@ extends TemporalSemanticsAdapter<org.joda.time.DateTime, ZonedDateTime>  {
 
     @Override
     public DateTime fromDelegateValue(final ZonedDateTime delegateValue) {
-        return JodatimeConverters.toJoda(delegateValue);
+        return JodaTimeConverters.toJoda(delegateValue);
     }
 
     @Override
     public ZonedDateTime toDelegateValue(final DateTime value) {
-        return JodatimeConverters.fromJoda(value);
+        return JodaTimeConverters.fromJoda(value);
     }
 
 }
diff --git a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
index 543d0b5..39d76fe 100644
--- a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
+++ b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.isis.schema.common.v2.ValueType;
-import org.apache.isis.valuetypes.jodatime.applib.value.JodatimeConverters;
+import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
 
 @Component
 @Named("isis.val.JodaLocalDateTimeValueSemantics")
@@ -53,12 +53,12 @@ extends TemporalSemanticsAdapter<org.joda.time.LocalDateTime, java.time.LocalDat
 
     @Override
     public org.joda.time.LocalDateTime fromDelegateValue(final java.time.LocalDateTime delegateValue) {
-        return JodatimeConverters.toJoda(delegateValue);
+        return JodaTimeConverters.toJoda(delegateValue);
     }
 
     @Override
     public java.time.LocalDateTime toDelegateValue(final org.joda.time.LocalDateTime value) {
-        return JodatimeConverters.fromJoda(value);
+        return JodaTimeConverters.fromJoda(value);
     }
 
 }
diff --git a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
index 5281048..444d104 100644
--- a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
+++ b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalDateValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.isis.schema.common.v2.ValueType;
-import org.apache.isis.valuetypes.jodatime.applib.value.JodatimeConverters;
+import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
 
 @Component
 @Named("isis.val.JodaLocalDateValueSemantics")
@@ -53,12 +53,12 @@ extends TemporalSemanticsAdapter<org.joda.time.LocalDate, java.time.LocalDate>
 
     @Override
     public org.joda.time.LocalDate fromDelegateValue(final java.time.LocalDate delegateValue) {
-        return JodatimeConverters.toJoda(delegateValue);
+        return JodaTimeConverters.toJoda(delegateValue);
     }
 
     @Override
     public java.time.LocalDate toDelegateValue(final org.joda.time.LocalDate value) {
-        return JodatimeConverters.fromJoda(value);
+        return JodaTimeConverters.fromJoda(value);
     }
 
 
diff --git a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
index 1815a4e..7d5a6a4 100644
--- a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
+++ b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.isis.schema.common.v2.ValueType;
-import org.apache.isis.valuetypes.jodatime.applib.value.JodatimeConverters;
+import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
 
 @Component
 @Named("isis.val.JodaLocalTimeValueSemantics")
@@ -53,12 +53,12 @@ extends TemporalSemanticsAdapter<org.joda.time.LocalTime, java.time.LocalTime>
 
     @Override
     public org.joda.time.LocalTime fromDelegateValue(final java.time.LocalTime delegateValue) {
-        return JodatimeConverters.toJoda(delegateValue);
+        return JodaTimeConverters.toJoda(delegateValue);
     }
 
     @Override
     public java.time.LocalTime toDelegateValue(final org.joda.time.LocalTime value) {
-        return JodatimeConverters.fromJoda(value);
+        return JodaTimeConverters.fromJoda(value);
     }
 
 }