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/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 6d0a6f410d CAUSEWAY-3489: on new temporal init zone data from user 
session
6d0a6f410d is described below

commit 6d0a6f410d3afd6eedf7b5a91a0697661d7c11b6
Author: Andi Huber <[email protected]>
AuthorDate: Thu Mar 14 21:48:02 2024 +0100

    CAUSEWAY-3489: on new temporal init zone data from user session
---
 .../causeway/core/metamodel/util/Facets.java       |  6 ++--
 .../ScalarPanelTextFieldWithTemporalPicker.java    | 10 +++---
 .../scalars/datepicker/TemporalDecomposition.java  | 39 +++++++++++++++++++---
 3 files changed, 43 insertions(+), 12 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
index 9d0b026768..6d81aeb757 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
@@ -446,7 +446,7 @@ public final class Facets {
     }
 
     @SuppressWarnings("unchecked")
-    public Optional<TemporalCharacteristicsProvider> 
valueTemporalAndOffsetCharacteristics(
+    public Optional<TemporalCharacteristicsProvider> 
valueTemporalCharacteristicsProvider(
             final ObjectSpecification objectSpec) {
         return objectSpec.valueFacet()
             .flatMap(valueFacet->valueFacet.getAllValueSemantics().stream()
@@ -454,9 +454,9 @@ public final class Facets {
             
.flatMap(valueSemantics->_Casts.castTo(TemporalCharacteristicsProvider.class, 
valueSemantics));
     }
 
-    public TemporalCharacteristicsProvider 
valueTemporalAndOffsetCharacteristicsElseFail(
+    public TemporalCharacteristicsProvider 
valueTemporalCharacteristicsProviderElseFail(
             final ObjectSpecification objectSpec) {
-        return valueTemporalAndOffsetCharacteristics(objectSpec)
+        return valueTemporalCharacteristicsProvider(objectSpec)
                 .orElseThrow(()->_Exceptions.illegalState("no temporal 
characteristics found for %s",
                         objectSpec));
     }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
index 0b897d795a..8cb8ee6e0d 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
@@ -93,13 +93,13 @@ extends ScalarPanelTextFieldWithValueSemantics<T>  {
         case OFFSET:
             Wkt.dropDownChoiceWithAjaxUpdateAdd(container, "timeoffset",
                     new PropertyModel<ZoneOffset>(temporalDecomposition, 
"zoneOffset"),
-                    temporalAndOffsetCharacteristics().getAvailableOffsets())
+                    temporalCharacteristicsProvider().getAvailableOffsets())
                 .setRequired(true);
             break;
         case ZONED:
             Wkt.dropDownChoiceWithAjaxUpdateAdd(container, "timezone",
                     new PropertyModel<ZoneId>(temporalDecomposition, "zoneId"),
-                    temporalAndOffsetCharacteristics().getAvailableZoneIds())
+                    temporalCharacteristicsProvider().getAvailableZoneIds())
                 .setRequired(true);
             break;
         case LOCAL:
@@ -131,12 +131,12 @@ extends ScalarPanelTextFieldWithValueSemantics<T>  {
 
     // -- HELPER
 
-    private TemporalCharacteristicsProvider temporalAndOffsetCharacteristics() 
{
-        return 
Facets.valueTemporalAndOffsetCharacteristicsElseFail(scalarModel().getElementType());
+    private TemporalCharacteristicsProvider temporalCharacteristicsProvider() {
+        return 
Facets.valueTemporalCharacteristicsProviderElseFail(scalarModel().getElementType());
     }
 
     private OffsetCharacteristic offsetCharacteristic() {
-        return temporalAndOffsetCharacteristics().getOffsetCharacteristic();
+        return temporalCharacteristicsProvider().getOffsetCharacteristic();
     }
 
     private <X> TextField<X> installUpdateNotifier(final TextField<X> 
textField) {
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/datepicker/TemporalDecomposition.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/datepicker/TemporalDecomposition.java
index f9bde9c49b..b550228a05 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/datepicker/TemporalDecomposition.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/datepicker/TemporalDecomposition.java
@@ -18,6 +18,7 @@
  */
 package org.apache.causeway.viewer.wicket.ui.components.scalars.datepicker;
 
+import java.time.Instant;
 import java.time.OffsetDateTime;
 import java.time.OffsetTime;
 import java.time.ZoneId;
@@ -29,7 +30,9 @@ import java.util.Locale;
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
 
+import org.apache.causeway.applib.services.iactnlayer.InteractionContext;
 import 
org.apache.causeway.applib.value.semantics.TemporalCharacteristicsProvider.OffsetCharacteristic;
+import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.causeway.commons.internal.assertions._Assert;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.base._Temporals;
@@ -68,7 +71,16 @@ public class TemporalDecomposition<T> implements 
IConverter<T> {
             ? stripZoneSuffixFrom(baseEditingPattern)
             : baseEditingPattern;
 
-        var tempDecomp = new TemporalDecomposition<>(type, 
offsetCharacteristic, fullConverter,
+        var userZoneId = needsDecomposition
+                ? 
scalarModel.getInteractionService().currentInteractionContext()
+                        .map(InteractionContext::getTimeZone)
+                        .orElse(ZoneOffset.UTC)
+                : ZoneOffset.UTC; // not used
+
+        var tempDecomp = new TemporalDecomposition<>(type,
+                offsetCharacteristic,
+                userZoneId,
+                fullConverter,
                 scalarModel.getViewOrEditMode(),
                 editingPattern);
 
@@ -80,14 +92,17 @@ public class TemporalDecomposition<T> implements 
IConverter<T> {
 
     private final @NonNull Class<T> type;
     private final OffsetCharacteristic offsetCharacteristic;
+    private final @NonNull ZoneId userZoneId;
     private final @NonNull ConverterBasedOnValueSemantics<T> fullConverter;
     private final @NonNull ViewOrEditMode viewOrEditMode;
 
     @Getter
     private final String editingPattern;
 
+    /**
+     * @implNote only supports zoned types as known at the time of writing
+     */
     private void initFrom(final ManagedValue proposedValue) {
-        //TODO[CAUSEWAY-3489] handle non java.time.Temporal values also
         var temporalValue = 
MmUnwrapUtils.single(proposedValue.getValue().getValue());
         if(temporalValue instanceof ZonedDateTime) {
             var zonedDateTime = (ZonedDateTime) temporalValue;
@@ -98,8 +113,23 @@ public class TemporalDecomposition<T> implements 
IConverter<T> {
         } else if(temporalValue instanceof OffsetTime) {
             var offsetTime = (OffsetTime) temporalValue;
             this.zoneOffset = offsetTime.getOffset();
+        } else if(temporalValue instanceof org.joda.time.DateTime) {
+            var jodaDateTime = (org.joda.time.DateTime) temporalValue;
+            this.zoneId = jodaDateTime.getZone().toTimeZone().toZoneId();
+        } else {
+            // either temporalValue is null or unsupported
+            switch (offsetCharacteristic) {
+            case OFFSET:
+                this.zoneOffset = 
userZoneId.getRules().getOffset(Instant.now());
+                break;
+            case ZONED:
+                this.zoneId = userZoneId;
+                break;
+            case LOCAL:
+            default:
+                break;
+            }
         }
-        //TODO[CAUSEWAY-3489] zone/offset info on new temporal value should be 
set to current user's info from session
     }
 
     // -- CONVERTER
@@ -121,7 +151,7 @@ public class TemporalDecomposition<T> implements 
IConverter<T> {
         case OFFSET:
             return " " + _Temporals.formatZoneId(zoneOffset==null
                     ? ZoneOffset.UTC
-                    : zoneOffset,
+                    : zoneId,
                 _Temporals.ISO_OFFSET_ONLY_FORMAT);
         case ZONED:
             return " " + _Temporals.formatZoneId(zoneId==null
@@ -141,6 +171,7 @@ public class TemporalDecomposition<T> implements 
IConverter<T> {
 
     /**
      * Strips 'XXX' and 'VV' from end of pattern. Does not understand other 
zone/offset formats.
+     * @see ValueSemanticsAbstract#getTemporalNoZoneRenderingFormat
      */
     private static String stripZoneSuffixFrom(final String pattern) {
         if(pattern.endsWith("XXX")) {

Reply via email to