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