You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/10/10 09:37:20 UTC

[causeway] branch master updated: CAUSEWAY-3628: fixes CanonicalInvoker, not handling the action invocation case when using PaT programming model

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 e263902df8 CAUSEWAY-3628: fixes CanonicalInvoker, not handling the action invocation case when using PaT programming model
e263902df8 is described below

commit e263902df81ff46ff34c526f5b3d3b4ea5c64bc5
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Oct 10 11:37:13 2023 +0200

    CAUSEWAY-3628: fixes CanonicalInvoker, not handling the action
    invocation case when using PaT programming model
---
 .../core/metamodel/commons/CanonicalInvoker.java   | 91 +++++-----------------
 1 file changed, 18 insertions(+), 73 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/CanonicalInvoker.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/CanonicalInvoker.java
index 3da6cdc999..64d34e70d8 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/CanonicalInvoker.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/CanonicalInvoker.java
@@ -31,7 +31,6 @@ import org.apache.causeway.commons.internal.collections._Arrays;
 import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
 import org.apache.causeway.commons.internal.reflection._Reflect;
 
-import lombok.Builder;
 import lombok.NonNull;
 import lombok.val;
 import lombok.experimental.UtilityClass;
@@ -48,99 +47,45 @@ import lombok.experimental.UtilityClass;
 @UtilityClass
 public class CanonicalInvoker {
 
-    @lombok.Value @Builder
-    public static class ObjectConstructionRequest {
-        final @NonNull Constructor<?> constructor;
-        final @Nullable Object[] params;
-        final @NonNull @Builder.Default ParameterAdapter parameterAdapter = ParameterAdapter.DEFAULT;
-        public Object[] getAdaptedParameters() {
-            return getParameterAdapter().adaptAll(getConstructor(), getParams());
-        }
-    }
-
-    @lombok.Value @Builder
-    public static class MethodInvocationRequest {
-        final @NonNull Method method;
-        final @NonNull Object targetPojo;
-        final @Nullable Object[] params;
-        final @NonNull @Builder.Default ParameterAdapter parameterAdapter = ParameterAdapter.DEFAULT;
-        public Object[] getAdaptedParameters() {
-            return getParameterAdapter().adaptAll(getMethod(), getParams());
-        }
-    }
-
     // -- CONSTRUCT
 
-    public <T> T construct(final Constructor<T> constructor, final @Nullable Object[] executionParameters) {
-        return _Casts.uncheckedCast(construct(ObjectConstructionRequest.builder()
-                .constructor(constructor)
-                .params(executionParameters)
-                .build()));
-    }
-
-    public Object construct(final ObjectConstructionRequest constructionRequest) {
-        val adaptedExecutionParameters = constructionRequest.getAdaptedParameters();
-
-        // supports effective private constructors as well
-        return _Reflect.invokeConstructor(constructionRequest.getConstructor(), adaptedExecutionParameters)
-        .mapFailure(ex->toVerboseException(constructionRequest.getConstructor(), adaptedExecutionParameters, ex))
-        .getValue().orElseThrow();
+    public <T> T construct(final Constructor<T> constructor, final @Nullable Object... executionParameters) {
+        val adaptedExecutionParameters = ParameterAdapter.DEFAULT.adaptAll(constructor, executionParameters);
+        val t = _Reflect.invokeConstructor(constructor, adaptedExecutionParameters)
+                .mapFailure(ex->toVerboseException(ex, constructor, adaptedExecutionParameters))
+                .valueAsNonNullElseFail();
+        return _Casts.uncheckedCast(t);
     }
 
     // -- INVOKE
 
-    public static Object invoke(final MethodFacade methodFacade, final Object targetPojo, final Object[] executionParameters) {
-        return CanonicalInvoker.invoke(
-                (Method)methodFacade.asExecutable(), targetPojo, methodFacade.getArguments(executionParameters));
+    public Object invoke(final MethodFacade methodFacade, final Object targetPojo, final Object[] executionParameters) {
+        return invoke(
+                methodFacade.asMethodForIntrospection().method(), targetPojo, methodFacade.getArguments(executionParameters));
     }
 
     public void invokeAll(final Iterable<Method> methods, final Object object) {
         methods.forEach(method->invoke(method, object));
     }
 
-    public Object invoke(
-            final Method method,
-            final Object targetPojo) {
-        return invoke(MethodInvocationRequest.builder()
-                .method(method)
-                .targetPojo(targetPojo)
-                .build());
-    }
-
     public Object invoke(
             final Method method,
             final Object targetPojo,
-            final @Nullable Object[] executionParameters) {
-        return invoke(MethodInvocationRequest.builder()
-                .method(method)
-                .targetPojo(targetPojo)
-                .params(executionParameters)
-                .build());
-    }
-
-    public Object invoke(final MethodInvocationRequest invocationRequest) {
-
-        val adaptedExecutionParameters = invocationRequest.getAdaptedParameters();
-
-        // supports effective private methods as well
-        return _Reflect.invokeMethodOn(
-                invocationRequest.getMethod(),
-                invocationRequest.getTargetPojo(),
-                adaptedExecutionParameters)
-        .mapFailure(ex->toVerboseException(
-                invocationRequest.getMethod(),
-                adaptedExecutionParameters,
-                ex))
-        .ifFailureFail()
-        .getValue().orElse(null);
+            final @Nullable Object ... executionParameters) {
+        val adaptedExecutionParameters = ParameterAdapter.DEFAULT.adaptAll(method, executionParameters);
+        return _Reflect.invokeMethodOn(method, targetPojo, adaptedExecutionParameters)
+            .mapFailure(ex->toVerboseException(ex,
+                    method,
+                    adaptedExecutionParameters))
+            .valueAsNullableElseFail();
     }
 
     // -- HELPER
 
     private Throwable toVerboseException(
+            final Throwable e,
             final Executable executable,
-            final Object[] adaptedExecutionParameters,
-            final Throwable e) {
+            final Object[] adaptedExecutionParameters) {
 
         final Class<?>[] parameterTypes = executable.getParameterTypes();
         final int expectedParamCount = _NullSafe.size(parameterTypes);