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) {