You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/05/02 18:16:39 UTC
[isis] branch master updated: ISIS-2340: demo fixed point search
behavior (also has PPM fixes)
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/isis.git
The following commit(s) were added to refs/heads/master by this push:
new 5e6dad7 ISIS-2340: demo fixed point search behavior (also has PPM fixes)
5e6dad7 is described below
commit 5e6dad7e86a58769f2db2243e2b85acd7e723bf8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat May 2 20:16:26 2020 +0200
ISIS-2340: demo fixed point search behavior (also has PPM fixes)
---
.../core/metamodel/commons/MethodExtensions.java | 22 ++++-
.../commons/MethodInvocationPreprocessor.java | 37 ++++++--
.../isis/core/metamodel/spec/ManagedObject.java | 11 +--
...pendentArgsActionDemo_useDefaultFixedPoint.java | 99 ++++++++++++++++++++++
4 files changed, 149 insertions(+), 20 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java
index e97a1f0..c057cc3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java
@@ -19,6 +19,8 @@
package org.apache.isis.core.metamodel.commons;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Executable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
@@ -32,6 +34,21 @@ public class MethodExtensions {
}
// //////////////////////////////////////
+
+ public static <T> T invoke(final Constructor<T> con) {
+ final Object[] parameters = MethodExtensions.getNullOrDefaultArgs(con);
+ return MethodExtensions.invoke(con, parameters);
+ }
+
+ public static <T> T invoke(final Constructor<T> con, final Object[] arguments) {
+ try {
+ Object[] defaultAnyPrimitive = defaultAnyPrimitive(con.getParameterTypes(), arguments);
+ return MethodInvocationPreprocessor.invoke(con, defaultAnyPrimitive);
+ } catch (Exception e) {
+ ThrowableExtensions.handleInvocationException(e, con.getName());
+ return null;
+ }
+ }
public static Object invoke(final Method method, final Object object) {
final Object[] parameters = MethodExtensions.getNullOrDefaultArgs(method);
@@ -78,8 +95,7 @@ public class MethodExtensions {
// //////////////////////////////////////
-
- public static Object[] getNullOrDefaultArgs(final Method method) {
+ public static Object[] getNullOrDefaultArgs(final Executable method) {
final Class<?>[] paramTypes = method.getParameterTypes();
final Object[] parameters = new Object[paramTypes.length];
for (int i = 0; i < parameters.length; i++) {
@@ -89,4 +105,6 @@ public class MethodExtensions {
}
+
+
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodInvocationPreprocessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodInvocationPreprocessor.java
index 43c9f39..77ef20f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodInvocationPreprocessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodInvocationPreprocessor.java
@@ -19,6 +19,8 @@
package org.apache.isis.core.metamodel.commons;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Executable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
@@ -30,6 +32,7 @@ import org.apache.isis.core.commons.internal.base._Casts;
import org.apache.isis.core.commons.internal.base._NullSafe;
import org.apache.isis.core.commons.internal.collections._Arrays;
import org.apache.isis.core.commons.internal.collections._Collections;
+import org.apache.isis.core.commons.internal.reflection._Reflect;
import static org.apache.isis.core.commons.internal.base._NullSafe.isEmpty;
@@ -47,14 +50,35 @@ import lombok.val;
*/
public class MethodInvocationPreprocessor {
+ public static <T> T invoke(Constructor<T> constructor, Object[] executionParameters)
+ throws IllegalAccessException, InvocationTargetException, InstantiationException {
+
+ val adaptedExecutionParameters = preprocess(constructor, executionParameters);
+ try {
+ // this utility supports effective private constructors as well
+ return _Reflect.invokeConstructor(constructor, adaptedExecutionParameters);
+ } catch (IllegalArgumentException e) {
+ throw verboseArgumentException(constructor.getParameterTypes(), adaptedExecutionParameters, e);
+ }
+ }
+
public static Object invoke(Method method, Object targetPojo, Object[] executionParameters)
throws IllegalAccessException, InvocationTargetException {
+ val adaptedExecutionParameters = preprocess(method, executionParameters);
+
+ try {
+ return method.invoke(targetPojo, adaptedExecutionParameters);
+ } catch (IllegalArgumentException e) {
+ throw verboseArgumentException(method.getParameterTypes(), adaptedExecutionParameters, e);
+ }
+ }
+
+ private static Object[] preprocess(Executable executable, Object[] executionParameters) {
if (isEmpty(executionParameters)) {
- return method.invoke(targetPojo, executionParameters);
+ return executionParameters;
}
-
- val parameterTypes = method.getParameterTypes();
+ val parameterTypes = executable.getParameterTypes();
val paramCount = parameterTypes.length;
val adaptedExecutionParameters = new Object[paramCount];
@@ -62,12 +86,7 @@ public class MethodInvocationPreprocessor {
val origParam = _Arrays.get(executionParameters, i).orElse(null);
adaptedExecutionParameters[i] = adapt(origParam, parameterTypes[i]);
}
-
- try {
- return method.invoke(targetPojo, adaptedExecutionParameters);
- } catch (IllegalArgumentException e) {
- throw verboseArgumentException(parameterTypes, adaptedExecutionParameters, e);
- }
+ return adaptedExecutionParameters;
}
// -- OBJECT ADAPTER
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index 7e5853c..6d5ef00 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -47,12 +47,10 @@ import org.apache.isis.core.commons.internal.collections._Arrays;
import org.apache.isis.core.commons.internal.collections._Lists;
import org.apache.isis.core.commons.internal.collections._Sets;
import org.apache.isis.core.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.commons.internal.reflection._Reflect;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.commons.ClassExtensions;
import org.apache.isis.core.metamodel.commons.MethodExtensions;
import org.apache.isis.core.metamodel.commons.MethodUtil;
-import org.apache.isis.core.metamodel.commons.ThrowableExtensions;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
@@ -686,13 +684,8 @@ public interface ManagedObject {
final Can<ManagedObject> pendingArguments,
final List<Object> additionalArguments) {
- final Object pendingParamModel;
- try {
- pendingParamModel = _Reflect.invokeConstructor(ppmConstructor, unwrapMultipleAsArray(pendingArguments));
- } catch (Exception e) {
- return ThrowableExtensions.handleInvocationException(e, ppmConstructor.getName());
- }
- val paramPojos = _Arrays.combineWithExplicitType(Object.class, pendingParamModel, additionalArguments.toArray());
+ val ppmTuple = MethodExtensions.invoke(ppmConstructor, unwrapMultipleAsArray(pendingArguments));
+ val paramPojos = _Arrays.combineWithExplicitType(Object.class, ppmTuple, additionalArguments.toArray());
return MethodExtensions.invoke(method, unwrapSingle(adapter), paramPojos);
}
diff --git a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDefaultFixedPoint.java b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDefaultFixedPoint.java
new file mode 100644
index 0000000..405f07c
--- /dev/null
+++ b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDefaultFixedPoint.java
@@ -0,0 +1,99 @@
+/*
+ * 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 demoapp.dom.actions.depargs;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.services.message.MessageService;
+import org.apache.isis.incubator.model.applib.annotation.Model;
+
+import lombok.RequiredArgsConstructor;
+import lombok.Value;
+import lombok.experimental.Accessors;
+
+@ActionLayout(named="Default (Fixed Point Search)", promptStyle = PromptStyle.DIALOG_MODAL)
+@Action
+@RequiredArgsConstructor
+public class DependentArgsActionDemo_useDefaultFixedPoint {
+
+ @Inject MessageService messageService;
+
+ private final DependentArgsActionDemo holder;
+
+ @Value @Accessors(fluent = true) // fluent so we can replace this with Java(14+) records later
+ static class Parameters {
+ int a;
+ int b;
+ int c;
+ int d;
+ }
+
+ public DependentArgsActionDemo act(
+
+ // PARAM 0
+ @Parameter(optionality = Optionality.MANDATORY)
+ int a,
+
+ // PARAM 1
+ @Parameter(optionality = Optionality.MANDATORY)
+ int b,
+
+ // PARAM 2
+ @Parameter(optionality = Optionality.MANDATORY)
+ int c,
+
+ // PARAM 3
+ @Parameter(optionality = Optionality.MANDATORY)
+ int d
+
+ ) {
+
+ messageService.informUser("found a fixed point");
+ return holder;
+ }
+
+ // -- PARAM 0
+
+ @Model
+ public int default0Act(Parameters params) {
+ return 1;
+ }
+
+ @Model
+ public int default1Act(Parameters params) {
+ return params.a() + 1;
+ }
+
+ @Model
+ public int default2Act(Parameters params) {
+ return params.b() + 1;
+ }
+
+ @Model
+ public int default3Act(Parameters params) {
+ return params.c() + 1;
+ }
+
+}
+