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