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

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


The following commit(s) were added to refs/heads/main by this push:
     new 822d8b81721 CAUSEWAY-3859: Java record refactoring (part 18)
822d8b81721 is described below

commit 822d8b817214f2fa9f92de96235d232408fa6870
Author: Andi Huber <[email protected]>
AuthorDate: Wed Feb 19 10:31:48 2025 +0100

    CAUSEWAY-3859: Java record refactoring (part 18)
---
 .../facets/object/value/CompositeValueUpdater.java | 94 ++++++++++++++++------
 .../value/CompositeValueUpdaterForParameter.java   | 62 --------------
 .../value/CompositeValueUpdaterForProperty.java    | 60 --------------
 .../facets/object/value/ValueFacetAbstract.java    | 10 +--
 .../object/value/ValueSerializerDefault.java       | 53 +++++-------
 .../object/value/ValueSerializerFallback.java      | 48 ++++-------
 .../ValueSemanticsProviderAbstractTestCase.java    |  6 +-
 7 files changed, 116 insertions(+), 217 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
index eefdceee8c3..0705248f1a1 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
@@ -17,43 +17,91 @@
  *  under the License.
  */
 package org.apache.causeway.core.metamodel.facets.object.value;
-
-import org.apache.causeway.applib.Identifier;
 import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.delegate._Delegate;
 import org.apache.causeway.core.metamodel.commons.CanonicalInvoker;
 import org.apache.causeway.core.metamodel.commons.ParameterConverters;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facets.HasFacetedMethod;
+import 
org.apache.causeway.core.metamodel.facets.object.value.CompositeValueUpdater.CompositeValueUpdaterForParameter;
+import 
org.apache.causeway.core.metamodel.facets.object.value.CompositeValueUpdater.CompositeValueUpdaterForProperty;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
+import org.apache.causeway.core.metamodel.interactions.managed.ManagedProperty;
+import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedInAction;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+
+sealed interface CompositeValueUpdater
+permits CompositeValueUpdaterForProperty, CompositeValueUpdaterForParameter {
+
+    MixedInAction mixedInAction();
+    ObjectSpecification returnType();
+    ManagedObject map(final ManagedObject valueType);
+
+    default ManagedObject execute(
+            final InteractionHead head, final Can<ManagedObject> parameters,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return map(simpleExecute(head, parameters));
+    }
 
-import lombok.AccessLevel;
-import lombok.RequiredArgsConstructor;
+    // -- IMPLEMENTATIONS
 
-@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-abstract class CompositeValueUpdater {
+    record CompositeValueUpdaterForParameter(
+        ParameterNegotiationModel parameterNegotiationModel,
+        int paramIndex,
+        MixedInAction mixedInAction) implements CompositeValueUpdater {
 
-    private final MixedInAction mixedInAction;
+        @Override
+        public ObjectSpecification returnType() {
+            return 
parameterNegotiationModel.getParamMetamodel(paramIndex).getElementType();
+        }
 
-    public abstract ObjectSpecification getReturnType();
-    protected abstract ManagedObject map(final ManagedObject valueType);
+        @Override
+        public ManagedObject map(final ManagedObject newParamValue) {
+            parameterNegotiationModel.setParamValue(paramIndex, newParamValue);
+            return newParamValue;
+        }
 
-    public Identifier getFeatureIdentifier() {
-        var id = mixedInAction.getFeatureIdentifier();
-        return Identifier
-                .actionIdentifier(
-                        id.logicalType(),
-                        id.memberLogicalName(),
-                        id.memberParameterClassNames());
     }
 
-    public ManagedObject execute(
-            final InteractionHead head, final Can<ManagedObject> parameters,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return map(simpleExecute(head, parameters));
+    record CompositeValueUpdaterForProperty(
+        ManagedProperty managedProperty,
+        MixedInAction mixedInAction
+        ) implements CompositeValueUpdater {
+
+        @Override
+        public ObjectSpecification returnType() {
+            return managedProperty.getElementType();
+        }
+
+        @Override
+        public ManagedObject map(final ManagedObject valueType) {
+            var propNeg = managedProperty.startNegotiation();
+            propNeg.getValue().setValue(valueType);
+            propNeg.submit();
+            return managedProperty.getOwner();
+        }
+
+    }
+
+    // -- FACTORIES
+
+    static ObjectAction createProxyForParameter(
+        final ParameterNegotiationModel parameterNegotiationModel,
+        final int paramIndex,
+        final MixedInAction mixedInAction) {
+        return _Delegate.createProxy(ObjectAction.class,
+                new 
CompositeValueUpdaterForParameter(parameterNegotiationModel, paramIndex, 
mixedInAction));
+    }
+
+    static ObjectAction createProxyForProperty(
+        final ManagedProperty managedProperty,
+        final MixedInAction mixedInAction) {
+        return _Delegate.createProxy(ObjectAction.class,
+                new CompositeValueUpdaterForProperty(managedProperty, 
mixedInAction));
     }
 
     // -- HELPER
@@ -61,10 +109,10 @@ public ManagedObject execute(
     private ManagedObject simpleExecute(
             final InteractionHead head, final Can<ManagedObject> parameters) {
 
-        var methodFacade = mixedInAction instanceof HasFacetedMethod 
facetedMethodHolder
+        var methodFacade = mixedInAction() instanceof HasFacetedMethod 
facetedMethodHolder
             ? facetedMethodHolder.getFacetedMethod().methodFacade()
             : null;
-        if(methodFacade==null) return 
ManagedObject.empty(mixedInAction.getReturnType()); // unsupported MixedInAction
+        if(methodFacade==null) return 
ManagedObject.empty(mixedInAction().getReturnType()); // unsupported 
MixedInAction
 
         var method = methodFacade.asMethodForIntrospection();
         final Object[] executionParameters = 
MmUnwrapUtils.multipleAsArray(parameters);
@@ -73,7 +121,7 @@ private ManagedObject simpleExecute(
                 .invokeWithConvertedArgs(method.method(), targetPojo,
                         methodFacade.getArguments(executionParameters, 
ParameterConverters.DEFAULT));
 
-        return ManagedObject.value(mixedInAction.getReturnType(), resultPojo);
+        return ManagedObject.value(mixedInAction().getReturnType(), 
resultPojo);
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdaterForParameter.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdaterForParameter.java
deleted file mode 100644
index ee8d27329a2..00000000000
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdaterForParameter.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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.causeway.core.metamodel.facets.object.value;
-
-import org.apache.causeway.commons.internal.delegate._Delegate;
-import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-import org.apache.causeway.core.metamodel.spec.feature.MixedInAction;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-
-class CompositeValueUpdaterForParameter
-extends CompositeValueUpdater {
-
-    public static ObjectAction createProxy(
-            final ParameterNegotiationModel parameterNegotiationModel,
-            final int paramIndex,
-            final MixedInAction mixedInAction) {
-        return _Delegate.createProxy(ObjectAction.class,
-                new 
CompositeValueUpdaterForParameter(parameterNegotiationModel, paramIndex, 
mixedInAction));
-    }
-
-    private final ParameterNegotiationModel parameterNegotiationModel;
-    private final int paramIndex;
-
-    protected CompositeValueUpdaterForParameter(
-            final ParameterNegotiationModel parameterNegotiationModel,
-            final int paramIndex,
-            final MixedInAction mixedInAction) {
-        super(mixedInAction);
-        this.parameterNegotiationModel = parameterNegotiationModel;
-        this.paramIndex = paramIndex;
-    }
-
-    @Override
-    public ObjectSpecification getReturnType() {
-        return 
parameterNegotiationModel.getParamMetamodel(paramIndex).getElementType();
-    }
-
-    @Override
-    protected ManagedObject map(final ManagedObject newParamValue) {
-        parameterNegotiationModel.setParamValue(paramIndex, newParamValue);
-        return newParamValue;
-    }
-
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdaterForProperty.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdaterForProperty.java
deleted file mode 100644
index 295858a2c99..00000000000
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdaterForProperty.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  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.causeway.core.metamodel.facets.object.value;
-
-import org.apache.causeway.commons.internal.delegate._Delegate;
-import org.apache.causeway.core.metamodel.interactions.managed.ManagedProperty;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-import org.apache.causeway.core.metamodel.spec.feature.MixedInAction;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-
-class CompositeValueUpdaterForProperty
-extends CompositeValueUpdater {
-
-    public static ObjectAction createProxy(
-            final ManagedProperty managedProperty,
-            final MixedInAction mixedInAction) {
-        return _Delegate.createProxy(ObjectAction.class,
-                new CompositeValueUpdaterForProperty(managedProperty, 
mixedInAction));
-    }
-
-    private final ManagedProperty managedProperty;
-
-    protected CompositeValueUpdaterForProperty(
-            final ManagedProperty managedProperty,
-            final MixedInAction mixedInAction) {
-        super(mixedInAction);
-        this.managedProperty = managedProperty;
-    }
-
-    @Override
-    public ObjectSpecification getReturnType() {
-        return managedProperty.getElementType();
-    }
-
-    @Override
-    protected ManagedObject map(final ManagedObject valueType) {
-        var propNeg = managedProperty.startNegotiation();
-        propNeg.getValue().setValue(valueType);
-        propNeg.submit();
-        return managedProperty.getOwner();
-    }
-
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueFacetAbstract.java
index 2d4ad2ac32b..1699e59a33e 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -81,8 +81,8 @@ protected ValueFacetAbstract(
         this.valueClass = valueClass;
         this.allValueSemantics = allValueSemantics;
         this.valueSerializer = selectDefaultSemantics()
-                .<ValueSerializer<T>>map(ValueSerializerDefault::forSemantics)
-                
.orElseGet(()->ValueSerializerFallback.forValueType(valueClass));
+                .<ValueSerializer<T>>map(ValueSerializerDefault::new)
+                .orElseGet(()->new ValueSerializerFallback<>(valueClass));
     }
 
     protected boolean hasSemanticsProvider() {
@@ -257,8 +257,8 @@ public Optional<ObjectAction> 
selectCompositeValueMixinForParameter(
 
         //feed the action's invocation result back into the parameter 
negotiation model of the parent edit dialog
         return 
resolveCompositeValueMixinForFeature(parameterNegotiationModel.getParamMetamodel(paramIndex))
-                .map(m->CompositeValueUpdaterForParameter
-                        .createProxy(parameterNegotiationModel, paramIndex, 
(MixedInAction)m));
+                .map(m->CompositeValueUpdater
+                        .createProxyForParameter(parameterNegotiationModel, 
paramIndex, (MixedInAction)m));
     }
 
     @Override
@@ -267,7 +267,7 @@ public Optional<ObjectAction> 
selectCompositeValueMixinForProperty(final Managed
 
         //feed the action's invocation result back into the attributeModel's 
proposed value, then submit
         return 
resolveCompositeValueMixinForFeature(managedProperty.getProperty())
-                
.map(m->CompositeValueUpdaterForProperty.createProxy(managedProperty, 
(MixedInAction)m));
+                
.map(m->CompositeValueUpdater.createProxyForProperty(managedProperty, 
(MixedInAction)m));
     }
 
     // -- UTILITY
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueSerializerDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueSerializerDefault.java
index dae1cd13ada..608829cb31a 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueSerializerDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueSerializerDefault.java
@@ -18,54 +18,43 @@
  */
 package org.apache.causeway.core.metamodel.facets.object.value;
 
+import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.applib.value.semantics.ValueDecomposition;
 import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.commons.internal.exceptions._Exceptions;
-
-import org.jspecify.annotations.NonNull;
-import lombok.RequiredArgsConstructor;
 
-@RequiredArgsConstructor(staticName = "forSemantics")
-public class ValueSerializerDefault<T>
-implements ValueSerializer<T> {
+public record ValueSerializerDefault<T>(
+        @NonNull ValueSemanticsProvider<T> semantics
+        ) implements ValueSerializer<T> {
 
     public static final String ENCODED_NULL = "NULL";
 
-    private final @NonNull ValueSemanticsProvider<T> semantics;
-
     @Override
     public T destring(final @NonNull Format format, final @NonNull String 
encodedData) {
-        if (ENCODED_NULL.equals(encodedData)) {
-            return null;
-        }
-        switch(format) {
-        case JSON:
-            return semantics.compose(
-                    
ValueDecomposition.fromJson(semantics.getSchemaValueType(), encodedData));
-        case URL_SAFE:
-            //TODO could use IdStringifiers instead
-            return destring(Format.JSON, 
_Strings.base64UrlDecode(encodedData));
-        }
-        throw _Exceptions.unmatchedCase(format);
+        return ENCODED_NULL.equals(encodedData)
+            ? null
+            : switch(format) {
+                case JSON-> semantics.compose(
+                            
ValueDecomposition.fromJson(semantics.getSchemaValueType(), encodedData));
+                case URL_SAFE->
+                    //TODO could use IdStringifiers instead
+                    destring(Format.JSON, 
_Strings.base64UrlDecode(encodedData));
+            };
     }
 
     @Override
     public String enstring(final @NonNull Format format, final @Nullable T 
value) {
-        if(value == null) {
-            return ENCODED_NULL;
-        }
-        switch(format) {
-        case JSON:
-            return semantics.decompose(_Casts.uncheckedCast(value)).toJson();
-        case URL_SAFE:
-            //TODO could use IdStringifiers instead
-            return _Strings.base64UrlEncode(enstring(Format.JSON, value));
-        }
-        throw _Exceptions.unmatchedCase(format);
+        return value == null
+            ? ENCODED_NULL
+            : switch(format) {
+                case JSON-> 
semantics.decompose(_Casts.uncheckedCast(value)).toJson();
+                case URL_SAFE->
+                    //TODO could use IdStringifiers instead
+                    _Strings.base64UrlEncode(enstring(Format.JSON, value));
+            };
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueSerializerFallback.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueSerializerFallback.java
index 983b758f781..ae98246f9bf 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueSerializerFallback.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueSerializerFallback.java
@@ -18,48 +18,34 @@
  */
 package org.apache.causeway.core.metamodel.facets.object.value;
 
+import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.commons.io.JsonUtils;
 
-import org.jspecify.annotations.NonNull;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor(staticName = "forValueType")
-public class ValueSerializerFallback<T>
-implements ValueSerializer<T> {
-
-    private final @NonNull Class<T> type;
+record ValueSerializerFallback<T>(
+    @NonNull Class<T> valueType
+    ) implements ValueSerializer<T> {
 
     @Override
     public T destring(final @NonNull Format format, final @NonNull String 
encodedData) {
-        if (ValueSerializerDefault.ENCODED_NULL.equals(encodedData)) {
-            return null;
-        }
-        switch(format) {
-        case JSON:
-            return JsonUtils.tryRead(type, encodedData)
-                    .valueAsNonNullElseFail();
-        case URL_SAFE:
-            return destring(Format.JSON, 
_Strings.base64UrlDecode(encodedData));
-        }
-        throw _Exceptions.unmatchedCase(format);
+        return ValueSerializerDefault.ENCODED_NULL.equals(encodedData)
+            ? null
+            : switch(format) {
+                case JSON-> JsonUtils.tryRead(valueType, encodedData)
+                            .valueAsNonNullElseFail();
+                case URL_SAFE -> destring(Format.JSON, 
_Strings.base64UrlDecode(encodedData));
+            };
     }
 
     @Override
     public String enstring(final @NonNull Format format, final @Nullable T 
value) {
-        if(value == null) {
-            return ValueSerializerDefault.ENCODED_NULL;
-        }
-        switch(format) {
-        case JSON:
-            return JsonUtils.toStringUtf8(value);
-        case URL_SAFE:
-            return _Strings.base64UrlEncode(enstring(Format.JSON, value));
-        }
-        throw _Exceptions.unmatchedCase(format);
+        return value == null
+            ? ValueSerializerDefault.ENCODED_NULL
+            : switch(format) {
+                case JSON -> JsonUtils.toStringUtf8(value);
+                case URL_SAFE -> 
_Strings.base64UrlEncode(enstring(Format.JSON, value));
+            };
     }
-
 }
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index 8b28ae88a8f..86ab269661c 100644
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -21,8 +21,6 @@
 import java.util.Locale;
 import java.util.Optional;
 
-import org.apache.causeway.core.config.CausewayConfiguration;
-
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -43,6 +41,7 @@
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.causeway.commons.internal.base._Strings;
+import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facets.object.value.ValueSerializer;
@@ -86,8 +85,7 @@ protected void allowMockAdapterToReturn(final Object pojo) {
     protected void setSemantics(final ValueSemanticsAbstract<T> 
valueSemantics) {
         this.semantics = valueSemantics;
 
-        this.valueSerializer = ValueSerializerDefault
-                .forSemantics(valueSemantics);
+        this.valueSerializer = new ValueSerializerDefault<>(valueSemantics);
     }
 
     protected ManagedObject createAdapter(final Object object) {

Reply via email to