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 2022/01/31 13:51:51 UTC

[isis] branch master updated: ISIS-2952: use Offset- instead of LocalDateTime with @InteractAs(frozenDateTime=...)

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 b7414b5  ISIS-2952: use Offset- instead of LocalDateTime with @InteractAs(frozenDateTime=...)
b7414b5 is described below

commit b7414b52c34e5911971733f939911189eedd6739
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jan 31 14:51:40 2022 +0100

    ISIS-2952: use Offset- instead of LocalDateTime with
    @InteractAs(frozenDateTime=...)
---
 .../apache/isis/core/config/IsisConfiguration.java |  2 +-
 .../progmodel/ProgrammingModelConstants.java       | 39 ++++++++----
 .../progmodel/ProgrammingModelConstantsTest.java   | 73 ++++++++++++++++++++++
 .../testdomain/interact/CustomContextTest.java     |  6 +-
 .../applib/IsisInteractionHandler.java             |  2 +-
 .../applib/annotation/InteractAs.java              | 10 ++-
 6 files changed, 113 insertions(+), 19 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index 0ba5929..14ba96a 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -56,9 +56,9 @@ import org.apache.isis.applib.IsisModuleApplib;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PromptStyle;
-import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
 import org.apache.isis.applib.services.i18n.Mode;
 import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
diff --git a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
index cb8b7d4..3a23e72 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
@@ -24,9 +24,11 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
 import java.util.Collection;
+import java.util.Locale;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.function.IntFunction;
@@ -129,24 +131,37 @@ public final class ProgrammingModelConstants {
     @RequiredArgsConstructor
     public enum DateTimeFormat {
         /**
-         * Format: "yyyy-MM-dd HH:mm:ss"
-         * eg. {@literal "2010-01-01 13:02:04"}
+         * Parser-format: {@literal "yyyy-MM-dd HH:mm:ss[.SSS][' '][XXX][x]"}<br>
+         * Render-format: {@literal "yyyy-MM-dd HH:mm:ss.SSS XXX"}<br>
+         * Examples:<br>
+         * <ul>
+         * <li>"2022-01-31 14:04:33.017 -03:30" (full form)</li>
+         * <li>"2022-01-31 14:04:33 -03" (no millis, no offset minutes)</li>
+         * <li>"2022-01-31 14:04:33 Z -03:30" (no millis, no offset = UTC)</li>
+         * </ul>
+         * <p>
+         * Used eg. with {@code InteractAs(frozenDateTime=...)} annotation.
          */
-        CANONICAL(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-
-        // while this enum only has a single value, we just provide a (quasi) static method here
-        public LocalDateTime parseDateTime(final String dateTimeLiteral) {
-            return LocalDateTime.parse(dateTimeLiteral, dtf);
+        CANONICAL(
+                new DateTimeFormatterBuilder()
+                        .appendPattern("yyyy-MM-dd HH:mm:ss[.SSS][' '][XXX][x]")
+                        .parseLenient()
+                        .parseCaseInsensitive()
+                        .toFormatter(Locale.ROOT),
+                DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS XXX", Locale.ROOT));
+
+        public OffsetDateTime parseDateTime(final String dateTimeLiteral) {
+            return OffsetDateTime.parse(dateTimeLiteral, parser);
         }
 
-        // while this enum only has a single value, we just provide a (quasi) static method here
-        public String formatDateTime(final LocalDateTime dateTime) {
-            return dtf.format(dateTime);
+        public String formatDateTime(final OffsetDateTime dateTime) {
+            return formatter.format(dateTime);
         }
 
         // -- HELPER
 
-        private final DateTimeFormatter dtf;
+        private final DateTimeFormatter parser;
+        private final DateTimeFormatter formatter;
 
     }
 
diff --git a/core/config/src/test/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstantsTest.java b/core/config/src/test/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstantsTest.java
new file mode 100644
index 0000000..5f3845a
--- /dev/null
+++ b/core/config/src/test/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstantsTest.java
@@ -0,0 +1,73 @@
+/*
+ *  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.core.config.progmodel;
+
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.util.stream.Stream;
+
+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 org.apache.isis.core.config.progmodel.ProgrammingModelConstants.DateTimeFormat;
+
+class ProgrammingModelConstantsTest {
+
+    @ParameterizedTest(name = "{index} {0}")
+    @MethodSource("provideTimeCandidates")
+    void canonincalDateTimeFormatRoundTrip(
+            final String displayName,
+            final OffsetDateTime dateTime,
+            final String representation,
+            final String parsable) {
+
+        assertEquals(
+                representation,
+                DateTimeFormat.CANONICAL.formatDateTime(dateTime));
+
+        assertEquals(
+                dateTime.toInstant(),
+                DateTimeFormat.CANONICAL.parseDateTime(parsable).toInstant());
+    }
+
+    private static Stream<Arguments> provideTimeCandidates() {
+
+        return Stream.of(
+          Arguments.of(
+                  "full form",
+                  OffsetDateTime.of(2022, 1, 31, 14, 04, 33, 17_000_000, ZoneOffset.ofHoursMinutes(-3, -30)),
+                  "2022-01-31 14:04:33.017 -03:30",
+                  "2022-01-31 14:04:33.017 -03:30"),
+          Arguments.of(
+                  "no millis, no offset minutes",
+                  OffsetDateTime.of(2022, 1, 31, 14, 04, 33, 0, ZoneOffset.ofHours(-3)),
+                  "2022-01-31 14:04:33.000 -03:00",
+                  "2022-01-31 14:04:33 -03"),
+          Arguments.of(
+                  "no millis, no offset",
+                  OffsetDateTime.of(2022, 1, 31, 14, 04, 33, 0, ZoneOffset.UTC),
+                  "2022-01-31 14:04:33.000 Z",
+                  "2022-01-31 14:04:33 Z")
+        );
+    }
+
+}
diff --git a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CustomContextTest.java b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CustomContextTest.java
index 2771e1e..a7f2129 100644
--- a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CustomContextTest.java
+++ b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CustomContextTest.java
@@ -76,7 +76,7 @@ class CustomContextTest extends IsisIntegrationTestAbstract {
     @InteractAs(
             userName = "sven",
             localeName = "fr",
-            frozenDateTime = "2010-01-01 13:02:04")
+            frozenDateTime = "2022-07-13 13:02:04 Z")
     void shouldRunWithCustomContext() {
 
         val iaCtx = interactionService.currentInteractionContextElseFail();
@@ -84,8 +84,8 @@ class CustomContextTest extends IsisIntegrationTestAbstract {
         assertEquals("sven", iaCtx.getUser().getName());
         assertEquals(Locale.FRANCE.getLanguage(), iaCtx.getLocale().getLanguageLocale().getLanguage());
         assertEquals(
-                DateTimeFormat.CANONICAL.parseDateTime("2010-01-01 13:02:04"),
-                iaCtx.getClock().nowAsLocalDateTime());
+                DateTimeFormat.CANONICAL.parseDateTime("2022-07-13 13:02:04 Z").toInstant(),
+                iaCtx.getClock().nowAsInstant());
     }
 
 }
diff --git a/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/IsisInteractionHandler.java b/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/IsisInteractionHandler.java
index 899bb36..bf3bf7a 100644
--- a/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/IsisInteractionHandler.java
+++ b/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/IsisInteractionHandler.java
@@ -36,7 +36,7 @@ public class IsisInteractionHandler implements BeforeEachCallback, AfterEachCall
             _Helper
                 .getCustomInteractionContext(extensionContext)
                 .ifPresentOrElse(
-                        customInteractionContext->interactionService.openInteraction(customInteractionContext),
+                        interactionService::openInteraction,
                         interactionService::openInteraction));
     }
 
diff --git a/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/annotation/InteractAs.java b/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/annotation/InteractAs.java
index bfc40e8..8364795 100644
--- a/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/annotation/InteractAs.java
+++ b/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/annotation/InteractAs.java
@@ -65,8 +65,14 @@ public @interface InteractAs {
 
     /**
      * If empty, defaults to current system time.
-     * Format: "yyyy-MM-dd HH:mm:ss"
-     * eg. {@literal "2010-01-01 13:02:04"}
+     * <p>
+     * Format: {@literal "yyyy-MM-dd HH:mm:ss[.SSS][' '][XXX][x]"}<br>
+     * Examples:<br>
+     * <ul>
+     * <li>"2022-01-31 14:04:33.017 -03:30" (full form)</li>
+     * <li>"2022-01-31 14:04:33 -03" (no millis, no offset minutes)</li>
+     * <li>"2022-01-31 14:04:33 Z -03:30" (no millis, no offset = UTC)</li>
+     * </ul>
      */
     String frozenDateTime()
         default ""; // unspecified