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/01 11:40:06 UTC

[isis] branch master updated: ISIS-2340: implement PL fixed point search

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 017c916  ISIS-2340: implement PL fixed point search
017c916 is described below

commit 017c91628abf1a65f59b32d9ca38ef181dd366e3
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 1 13:39:52 2020 +0200

    ISIS-2340: implement PL fixed point search
---
 .../ActionParameterDefaultsFacetViaMethod.java     | 10 +++-
 .../specloader/specimpl/PendingParameterModel.java | 54 +++++++++++++++++++---
 2 files changed, 57 insertions(+), 7 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
index 5c71240..13e9665 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
@@ -93,7 +93,15 @@ public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaul
                         pendingArgs.getActionTarget(), pendingArgs.getParamValues());
         }
         
-        // call no-arg defaultNAct() instead 
+        // call no-arg defaultNAct() instead
+        
+        if(ppmFactory.isPresent()) {
+            // PPM programming model
+            return ManagedObject.InvokeUtil
+                    .invokeWithPPM(ppmFactory.get(), method, 
+                            pendingArgs.getActionTarget(), pendingArgs.getEmptyValues());    
+        }
+        
         return ManagedObject.InvokeUtil.invoke(method, pendingArgs.getActionTarget());
         
 // legacy of        
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/PendingParameterModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/PendingParameterModel.java
index 7c7bb20..20fba1e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/PendingParameterModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/PendingParameterModel.java
@@ -18,9 +18,12 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.Objects;
 import java.util.function.Function;
 
 import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.internal.assertions._Assert;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -62,19 +65,44 @@ public class PendingParameterModel {
         return !paramValues.isEmpty();
     }
     
+    public Can<ManagedObject> getEmptyValues() {
+        return getAction().getParameters().stream()
+        .map(objectActionParameter->
+            ManagedObject.empty(objectActionParameter.getSpecification()))
+        .collect(Can.toCan());
+    }
 
     public PendingParameterModel defaultsFixedPointSearch() {
         
+        _Assert.assertTrue(isPopulated()); // don't start this algorithm with a populated model 
+        
+        final int maxIterations = getAction().getParameterCount();
         val paramDefaultProviders = getParameterDefaultProviders();
         
         val initialDefaults = paramDefaultProviders
         .map(paramDefaultProvider->paramDefaultProvider.getDefault(this));
         
-        //TODO do fixed point search
-
-        return PendingParameterModel.of(action, actionOwner, actionTarget, initialDefaults);
+        // fixed point search
+        
+        Can<ManagedObject> old_pl, pl = initialDefaults;
+        for(int i=0; i<maxIterations; ++i) {
+            val ppm = PendingParameterModel.of(action, actionOwner, actionTarget, pl);
+            old_pl = pl;
+            pl = paramDefaultProviders
+                    .map(paramDefaultProvider->paramDefaultProvider.getDefault(ppm));
+            
+            if(equals(old_pl, pl)) {
+                // fixed point found, return the latest iteration 
+                return PendingParameterModel.of(action, actionOwner, actionTarget, pl);
+            }
+            
+        }
+        
+        throw _Exceptions.unrecoverableFormatted("Cannot find an initial fixed point for action "
+                + "parameter defaults on action %s.", getAction());
+        
     }
-    
+
     // -- HELPER
     
     @RequiredArgsConstructor(staticName = "of")
@@ -89,7 +117,7 @@ public class PendingParameterModel {
     }
     
     private Can<ParameterDefaultProvider> getParameterDefaultProviders() {
-        return action.getParameters().stream()
+        return getAction().getParameters().stream()
         .map(objectActionParameter->{
             val paramSpec = objectActionParameter.getSpecification();
             val paramDefaultFacet = objectActionParameter.getFacet(ActionParameterDefaultsFacet.class);
@@ -100,6 +128,20 @@ public class PendingParameterModel {
         .collect(Can.toCan());
     }
     
-    
+    private boolean equals(Can<ManagedObject> left, Can<ManagedObject> right) {
+        // equal length is guaranteed as used only local to this class
+        val leftIt = left.iterator();
+        for(val r : right) {
+            val leftPojo = leftIt.next().getPojo();
+            val rightPojo = r.getPojo();
+            if(!Objects.equals(leftPojo, rightPojo)){
+                return false;        
+            }
+        }
+        return true;
+    }
+
+
+
     
 }