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;
+    }
+
+}
+