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