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 2021/01/23 08:59:02 UTC

[isis] branch master updated: ISIS-2492: simplify ObjectActionContainer (2)

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 c866e86  ISIS-2492: simplify ObjectActionContainer (2)
c866e86 is described below

commit c866e86489b74ed77643bd7c4b7a0be675f27fbd
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jan 23 09:58:45 2021 +0100

    ISIS-2492: simplify ObjectActionContainer (2)
---
 .../isis/commons/collections/ImmutableEnumSet.java |  6 ++--
 .../isis/core/metamodel/spec/ActionType.java       |  2 +-
 .../spec/feature/ObjectActionContainer.java        | 32 ++++++++++------------
 .../specimpl/ObjectSpecificationAbstract.java      | 22 +++++++++------
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  4 +--
 .../testspec/ObjectSpecificationStub.java          |  9 +++---
 .../common/model/mementos/ActionMemento.java       |  2 +-
 7 files changed, 41 insertions(+), 36 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/collections/ImmutableEnumSet.java b/commons/src/main/java/org/apache/isis/commons/collections/ImmutableEnumSet.java
index 2f45e1a..211a2f2 100644
--- a/commons/src/main/java/org/apache/isis/commons/collections/ImmutableEnumSet.java
+++ b/commons/src/main/java/org/apache/isis/commons/collections/ImmutableEnumSet.java
@@ -20,6 +20,7 @@ package org.apache.isis.commons.collections;
 
 import java.util.EnumSet;
 import java.util.Iterator;
+import java.util.stream.Stream;
 
 /**
  * Immutable variant of {@link EnumSet}
@@ -82,7 +83,8 @@ implements Iterable<E>, java.io.Serializable {
         return delegate.iterator();
     }
 
-
-
+    public Stream<E> stream() {
+        return delegate.stream();
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java
index 377585f..afbc238 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java
@@ -39,5 +39,5 @@ public enum ActionType {
 
     public static final ImmutableEnumSet<ActionType> USER_ONLY = ImmutableEnumSet.of(ActionType.USER);
     public static final ImmutableEnumSet<ActionType> USER_AND_PROTOTYPE = ImmutableEnumSet.of(ActionType.USER, ActionType.PROTOTYPE);
-    public static final ImmutableEnumSet<ActionType> ALL = ImmutableEnumSet.allOf(ActionType.class);
+    public static final ImmutableEnumSet<ActionType> ANY = ImmutableEnumSet.allOf(ActionType.class);
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
index 7f1be9b..7304092 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
@@ -27,13 +27,12 @@ import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.spec.ActionType;
 
-import static org.apache.isis.commons.internal.base._NullSafe.stream;
-
 public interface ObjectActionContainer {
 
+    // -- ACTION LOOKUP
+    
     /**
      * Get the action object represented by the specified identity string.
-     *
      * <p>
      * The identity string can be either fully specified with parameters (as per
      * {@link Identifier#toNameParmsIdentityString()} or in abbreviated form (
@@ -41,18 +40,16 @@ public interface ObjectActionContainer {
      *
      * @see #getObjectAction(String)
      */
-    Optional<ObjectAction> getObjectAction(ActionType type, String id);
+    Optional<ObjectAction> getObjectAction(String id, ActionType type);
     
-    default ObjectAction getObjectActionElseFail(ActionType type, String id) {
-        return getObjectAction(type, id)
-                .orElseThrow(()->_Exceptions.noSuchElement("type=%s id=%s", type, id));  
+    default ObjectAction getObjectActionElseFail(String id, ActionType type) {
+        return getObjectAction(id, type)
+                .orElseThrow(()->_Exceptions.noSuchElement("id=%s type=%s", id, type));  
     }
-    
 
     /**
      * Get the action object represented by the specified identity string,
      * irrespective of {@link ActionType}.
-     *
      * <p>
      * The identity string can be either fully specified with parameters (as per
      * {@link Identifier#toNameParmsIdentityString()} or in abbreviated form (
@@ -67,20 +64,19 @@ public interface ObjectActionContainer {
                 .orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));  
     }
 
-    default Stream<ObjectAction> streamObjectActions(MixedIn contributed) {
-        return streamObjectActions(ActionType.ALL, contributed);
-    }
+    // -- ACTION STREAM
 
     /**
      * Returns an array of actions of the specified type, including or excluding
      * contributed actions as required.
      */
-    Stream<ObjectAction> streamObjectActions(ActionType type, MixedIn contributed);
+    Stream<ObjectAction> streamObjectActions(ImmutableEnumSet<ActionType> types, MixedIn contributed);
 
-    default Stream<ObjectAction> streamObjectActions(ImmutableEnumSet<ActionType> types, MixedIn contributed) {
-        return stream(types)
-                .flatMap(type->streamObjectActions(type, contributed));
+    default Stream<ObjectAction> streamObjectActions(ActionType type, MixedIn contributed) {
+        return streamObjectActions(ImmutableEnumSet.of(type), contributed);
+    }
+    
+    default Stream<ObjectAction> streamObjectActions(MixedIn contributed) {
+        return streamObjectActions(ActionType.ANY, contributed);
     }
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index fd4707c..0767296 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -34,6 +34,7 @@ import javax.enterprise.inject.Vetoed;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.metamodel.BeanSort;
+import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.base._Strings;
@@ -43,6 +44,7 @@ import org.apache.isis.commons.internal.collections._Multimaps.ListMultimap;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.collections._Streams;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.core.config.beans.IsisBeanTypeRegistry;
 import org.apache.isis.core.metamodel.commons.ClassExtensions;
 import org.apache.isis.core.metamodel.consent.Consent;
@@ -733,16 +735,20 @@ implements ObjectSpecification {
     }
 
     @Override
-    public Stream<ObjectAction> streamObjectActions(final ActionType type, final MixedIn contributed) {
+    public Stream<ObjectAction> streamObjectActions(
+            final ImmutableEnumSet<ActionType> types, 
+            final MixedIn contributed) {
         introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
 
-        if(contributed.isIncluded()) {
+        if(contributed.isIncluded()) { // conditional not strictly required, could instead always go this code path 
             createMixedInActions(); // only if not already
-            return stream(objectActionsByType.get(type));
         }
-
-        return stream(objectActionsByType.get(type))
-                .filter(MixedIn::isNotMixedIn);
+        
+        return types.stream()
+                .flatMap(type->stream(objectActionsByType.get(type)))
+                .filter(contributed.isIncluded()
+                        ? _Predicates.alwaysTrue() 
+                        : MixedIn::isNotMixedIn);
     }
 
     // -- mixin associations (properties and collections)
@@ -780,7 +786,7 @@ implements ObjectSpecification {
         val mixinMethodName = mixinFacet.value();
 
         final Stream<ObjectAction> mixinActions = specification
-                .streamObjectActions(ActionType.ALL, MixedIn.INCLUDED);
+                .streamObjectActions(ActionType.ANY, MixedIn.INCLUDED);
 
         mixinActions
         .filter(Predicates::isMixedInAssociation)
@@ -835,7 +841,7 @@ implements ObjectSpecification {
         val mixinMethodName = mixinFacet.value();
 
         final Stream<ObjectAction> mixinsActions = mixinSpec
-                .streamObjectActions(ActionType.ALL, MixedIn.INCLUDED);
+                .streamObjectActions(ActionType.ANY, MixedIn.INCLUDED);
 
         mixinsActions
         .filter(Predicates::isMixedInAction)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index c816a85..38d7b43 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -268,7 +268,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
     // -- getObjectAction
 
     @Override
-    public Optional<ObjectAction> getObjectAction(final ActionType type, final String id) {
+    public Optional<ObjectAction> getObjectAction(final String id, final ActionType type) {
         introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
 
         final Stream<ObjectAction> actions =
@@ -281,7 +281,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
         introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
 
         final Stream<ObjectAction> actions =
-                streamObjectActions(ActionType.ALL, MixedIn.INCLUDED);
+                streamObjectActions(ActionType.ANY, MixedIn.INCLUDED);
         return firstAction(actions, id);
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index 7529639..e493979 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -29,6 +29,7 @@ import java.util.stream.Stream;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -167,7 +168,7 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     }
 
     @Override
-    public Optional<ObjectAction> getObjectAction(final ActionType type, final String id) {
+    public Optional<ObjectAction> getObjectAction(final String id, final ActionType type) {
         final int openBracket = id.indexOf('(');
         return getObjectAction(type, id.substring(0, openBracket), null);
     }
@@ -175,7 +176,7 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     @Override
     public Optional<ObjectAction> getObjectAction(final String nameParmsIdentityString) {
         for (final ActionType type : ActionType.values()) {
-            val action = getObjectAction(type, nameParmsIdentityString);
+            val action = getObjectAction(nameParmsIdentityString, type);
             if (action.isPresent()) {
                 return action;
             }
@@ -308,10 +309,10 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     }
 
     @Override
-    public Stream<ObjectAction> streamObjectActions(final ActionType type, final MixedIn contributed) {
+    public Stream<ObjectAction> streamObjectActions(ImmutableEnumSet<ActionType> types, MixedIn contributed) {
         return null;
     }
-
+    
     // /////////////////////////////////////////////////////////
     // view models and wizards
     // /////////////////////////////////////////////////////////
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/mementos/ActionMemento.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/mementos/ActionMemento.java
index d5d564b..3d72977 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/mementos/ActionMemento.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/mementos/ActionMemento.java
@@ -91,7 +91,7 @@ public class ActionMemento implements Serializable {
             SpecificationLoader specificationLoader) {
         
         val objectSpec = specificationLoader.lookupBySpecIdElseLoad(owningType);
-        return objectSpec.getObjectActionElseFail(actionType, nameParmsId);
+        return objectSpec.getObjectActionElseFail(nameParmsId, actionType);
     }
 
 }