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/11/30 08:35:19 UTC

[isis] branch master updated: ISIS-2904: make ObjectActionContainer API more explicit, as to whether to include mixed-in actions

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 efc0e75  ISIS-2904: make ObjectActionContainer API more explicit, as to whether to include mixed-in actions
efc0e75 is described below

commit efc0e752f6e480869163dc0ae9f5ed43b7c6b40f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Nov 30 09:35:08 2021 +0100

    ISIS-2904: make ObjectActionContainer API more explicit, as to
    whether to include mixed-in actions
---
 .../core/metamodel/spec/feature/ObjectAction.java  |  6 +-
 .../spec/feature/ObjectActionContainer.java        | 65 ++++++++++++----------
 .../spec/feature/memento/ActionMemento.java        |  8 +--
 .../specloader/specimpl/ObjectActionDefault.java   | 12 ++--
 .../specloader/specimpl/ObjectMemberContainer.java | 12 ++--
 .../specimpl/ObjectSpecificationAbstract.java      |  6 +-
 .../specimpl/dflt/ObjectSpecificationDefault.java  | 21 +++----
 .../testspec/ObjectSpecificationStub.java          | 12 ++--
 .../sitemap/SitemapServiceDefault.java             |  4 +-
 .../domainobjects/ObjectActionReprRenderer.java    |  2 +-
 .../service/swagger/internal/Caching.java          |  2 +-
 .../service/swagger/internal/Generation.java       | 50 ++++++++---------
 .../swagger/internal/{Util.java => _Util.java}     | 36 ++++++------
 .../wicket/model/util/PageParameterUtils.java      |  9 +--
 14 files changed, 123 insertions(+), 122 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index a26b920..a45a2e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -73,7 +73,7 @@ public interface ObjectAction extends ObjectMember {
         && ObjectAction.Util.isNoParameters(this);
     }
 
-    ActionScope getType();
+    ActionScope getScope();
 
     boolean isPrototype();
 
@@ -354,8 +354,8 @@ public interface ObjectAction extends ObjectMember {
 
     public static final class Predicates {
 
-        public static Predicate<ObjectAction> ofActionType(final ActionScope type) {
-            return (final ObjectAction oa) -> oa.getType() == type;
+        public static Predicate<ObjectAction> ofActionType(final ActionScope scope) {
+            return (final ObjectAction oa) -> oa.getScope() == scope;
         }
 
         public static Predicate<ObjectAction> isPositioned(
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 9853554..f6d9f78 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
@@ -22,8 +22,6 @@ import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -34,7 +32,7 @@ public interface ObjectActionContainer {
     // -- ACTION LOOKUP (INHERITANCE CONSIDERED)
 
     /**
-     * Similar to {@link #getDeclaredAction(String, ActionScope)},
+     * Similar to {@link #getDeclaredAction(String, ImmutableEnumSet, MixedIn)},
      * but also considering any inherited object members. (mixed-in included)
      * @param id
      * @param type
@@ -43,22 +41,31 @@ public interface ObjectActionContainer {
      * and if nothing found there, search the interfaces. Special care needs to be taken, as the
      * {@link ActionScope} might be redeclared when inheriting from a super-type or interface.
      */
-    Optional<ObjectAction> getAction(String id, @Nullable ActionScope type);
+    Optional<ObjectAction> getAction(String id, ImmutableEnumSet<ActionScope> actionScopes, MixedIn mixedIn);
 
-    default ObjectAction getActionElseFail(String id, @Nullable ActionScope type) {
-        return getAction(id, type)
-                .orElseThrow(()->_Exceptions.noSuchElement("id=%s type=%s",
+    default ObjectAction getActionElseFail(
+            final String id, final ImmutableEnumSet<ActionScope> actionScopes, final MixedIn mixedIn) {
+        return getAction(id, actionScopes, mixedIn)
+                .orElseThrow(()->_Exceptions.noSuchElement("actionId=%s scope=%s mixedIn=%s",
                         id,
-                        type==null ? "any" : type.name()));
+                        actionScopes,
+                        mixedIn.name()));
     }
 
-    default Optional<ObjectAction> getAction(String id) {
-        return getAction(id, null);
-    }
+    default Optional<ObjectAction> getAction(final String id, final MixedIn mixedIn) {
+        return getAction(id, ActionScope.ANY, mixedIn); }
+    default ObjectAction getActionElseFail(final String id, final MixedIn mixedIn) {
+        return getActionElseFail(id, ActionScope.ANY, mixedIn); }
 
-    default ObjectAction getActionElseFail(String id) {
-        return getActionElseFail(id, null);
-    }
+    default Optional<ObjectAction> getAction(final String id, final ImmutableEnumSet<ActionScope> actionScopes) {
+        return getAction(id, actionScopes, MixedIn.INCLUDED); }
+    default ObjectAction getActionElseFail(final String id, final ImmutableEnumSet<ActionScope> actionScopes) {
+        return getActionElseFail(id, actionScopes, MixedIn.INCLUDED); }
+
+    default Optional<ObjectAction> getAction(final String id) {
+        return getAction(id, ActionScope.ANY, MixedIn.INCLUDED); }
+    default ObjectAction getActionElseFail(final String id) {
+        return getActionElseFail(id, ActionScope.ANY, MixedIn.INCLUDED); }
 
 
     // -- ACTION LOOKUP, DECLARED ACTIONS (NO INHERITANCE CONSIDERED)
@@ -70,18 +77,21 @@ public interface ObjectActionContainer {
      * {@link Identifier#getMemberNameAndParameterClassNamesIdentityString()} or in abbreviated form (
      * {@link Identifier#getMemberLogicalName()}).
      *
-     * @see #getDeclaredAction(String)
+     * @see #getDeclaredAction(String, MixedIn)
      */
-    Optional<ObjectAction> getDeclaredAction(String id, @Nullable ActionScope type);
+    Optional<ObjectAction> getDeclaredAction(String id, ImmutableEnumSet<ActionScope> actionScopes, MixedIn mixedIn);
 
     /**
-     * Shortcut to {@link #getDeclaredAction(String, ActionScope)} with {@code ActionType = null},
+     * Shortcut to {@link #getDeclaredAction(String, ImmutableEnumSet, MixedIn)} with {@code ActionType = null},
      * meaning where action type is <i>any</i>.
-     * @see #getDeclaredAction(String, ActionScope)
+     * @see #getDeclaredAction(String, ImmutableEnumSet, MixedIn)
      */
-    default Optional<ObjectAction> getDeclaredAction(String id) {
-        return getDeclaredAction(id, null);
-    }
+    default Optional<ObjectAction> getDeclaredAction(final String id, final MixedIn mixedIn) {
+        return getDeclaredAction(id, ActionScope.ANY, mixedIn);}
+    default Optional<ObjectAction> getDeclaredAction(final String id, final ImmutableEnumSet<ActionScope> actionScopes) {
+        return getDeclaredAction(id, actionScopes, MixedIn.INCLUDED);}
+    default Optional<ObjectAction> getDeclaredAction(final String id) {
+        return getDeclaredAction(id, ActionScope.ANY, MixedIn.INCLUDED);}
 
     // -- ACTION STREAM (WITH INHERITANCE)
 
@@ -102,8 +112,8 @@ public interface ObjectActionContainer {
      * @param mixedIn - whether to include mixed in actions
      */
     default Stream<ObjectAction> streamActions(
-            ImmutableEnumSet<ActionScope> actionTypes,
-            MixedIn mixedIn) {
+            final ImmutableEnumSet<ActionScope> actionTypes,
+            final MixedIn mixedIn) {
         return streamActions(actionTypes, mixedIn, __->{});
     }
 
@@ -112,7 +122,7 @@ public interface ObjectActionContainer {
      * @param actionType
      * @param mixedIn - whether to include mixed in actions
      */
-    default Stream<ObjectAction> streamActions(ActionScope actionType, MixedIn mixedIn) {
+    default Stream<ObjectAction> streamActions(final ActionScope actionType, final MixedIn mixedIn) {
         return streamActions(ImmutableEnumSet.of(actionType), mixedIn);
     }
 
@@ -120,7 +130,7 @@ public interface ObjectActionContainer {
      * Returns a Stream of all actions of any type, with inheritance considered.
      * @param mixedIn - whether to include mixed in actions
      */
-    default Stream<ObjectAction> streamAnyActions(MixedIn mixedIn) {
+    default Stream<ObjectAction> streamAnyActions(final MixedIn mixedIn) {
         return streamActions(ActionScope.ANY, mixedIn);
     }
 
@@ -139,13 +149,12 @@ public interface ObjectActionContainer {
      */
     Stream<ObjectAction> streamDeclaredActions(ImmutableEnumSet<ActionScope> actionTypes, MixedIn mixedIn);
 
-    default Stream<ObjectAction> streamDeclaredActions(ActionScope type, MixedIn mixedIn) {
+    default Stream<ObjectAction> streamDeclaredActions(final ActionScope type, final MixedIn mixedIn) {
         return streamDeclaredActions(ImmutableEnumSet.of(type), mixedIn);
     }
 
-    default Stream<ObjectAction> streamDeclaredActions(MixedIn mixedIn) {
+    default Stream<ObjectAction> streamDeclaredActions(final MixedIn mixedIn) {
         return streamDeclaredActions(ActionScope.ANY, mixedIn);
     }
 
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionMemento.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionMemento.java
index a220304..60a2a88 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionMemento.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionMemento.java
@@ -22,7 +22,6 @@ import java.io.Serializable;
 import java.util.function.Supplier;
 
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.core.metamodel.spec.ActionScope;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
@@ -49,15 +48,11 @@ public class ActionMemento implements Serializable {
     @EqualsAndHashCode.Include
     @Getter private final @NonNull Identifier identifier;
 
-    @EqualsAndHashCode.Exclude
-    private final @NonNull ActionScope actionType; // not strictly required, but helps with load/unmarshal
-
     // -- FACTORY
 
     public static ActionMemento forAction(final @NonNull ObjectAction action) {
         return new ActionMemento(
                 action.getFeatureIdentifier(),
-                action.getType(),
                 action);
     }
 
@@ -72,8 +67,7 @@ public class ActionMemento implements Serializable {
             action = specLoader.get()
                     .specForLogicalTypeElseFail(getIdentifier().getLogicalType())
                     .getActionElseFail(
-                            getIdentifier().getMemberNameAndParameterClassNamesIdentityString(),
-                            actionType);
+                            getIdentifier().getMemberNameAndParameterClassNamesIdentityString());
         }
         return action;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index 265ad5a..c7b89f7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -147,11 +147,11 @@ implements ObjectAction {
     // -- TYPE
 
     @Override
-    public ActionScope getType() {
-        return getType(this);
+    public ActionScope getScope() {
+        return getScope(this);
     }
 
-    private static ActionScope getType(final FacetHolder facetHolder) {
+    private static ActionScope getScope(final FacetHolder facetHolder) {
         return facetHolder.containsFacet(PrototypeFacet.class)
             ? ActionScope.PROTOTYPE
             : ActionScope.PRODUCTION;
@@ -458,7 +458,7 @@ implements ObjectAction {
 
     @Override
     public boolean isPrototype() {
-        return getType().isPrototype();
+        return getScope().isPrototype();
     }
 
     @Getter(lazy=true, onMethod_ = {@Override})
@@ -491,8 +491,8 @@ implements ObjectAction {
         final StringBuffer sb = new StringBuffer();
         sb.append("Action [");
         sb.append(super.toString());
-        sb.append(",type=");
-        sb.append(getType());
+        sb.append(",scope=");
+        sb.append(getScope());
         sb.append(",returns=");
         sb.append(getReturnType());
         sb.append(",parameters={");
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
index 0f55786..47c101a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
@@ -22,8 +22,6 @@ import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -62,14 +60,14 @@ implements
     // -- ACTIONS
 
     @Override
-    public Optional<ObjectAction> getAction(final String id, @Nullable final ActionScope type) {
+    public Optional<ObjectAction> getAction(
+            final String id, final ImmutableEnumSet<ActionScope> scopes, final MixedIn mixedIn) {
 
-        val declaredAction = getDeclaredAction(id); // no inheritance nor type considered
+        val declaredAction = getDeclaredAction(id, mixedIn); // no inheritance nor type considered
 
         if(declaredAction.isPresent()) {
             // action found but if its not the right type, stop searching
-            if(type!=null
-                    && declaredAction.get().getType() != type) {
+            if(!scopes.contains(declaredAction.get().getScope())) {
                 return Optional.empty();
             }
             return declaredAction;
@@ -77,7 +75,7 @@ implements
 
         return isTypeHierarchyRoot()
                 ? Optional.empty() // stop searching
-                : superclass().getAction(id, type);
+                : superclass().getAction(id, scopes, mixedIn);
     }
 
     @Override
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 86badb2..7f2d787 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
@@ -702,7 +702,7 @@ implements ObjectSpecification {
 
     @Override
     public Stream<ObjectAction> streamDeclaredActions(
-            final ImmutableEnumSet<ActionScope> actionTypes,
+            final ImmutableEnumSet<ActionScope> actionScopes,
             final MixedIn mixedIn) {
         introspectUpTo(IntrospectionState.FULLY_INTROSPECTED);
 
@@ -710,8 +710,8 @@ implements ObjectSpecification {
             createMixedInActions(); // only if not already
         }
 
-        return actionTypes.stream()
-                .flatMap(actionType->stream(objectActionsByType.get(actionType)))
+        return actionScopes.stream()
+                .flatMap(actionScope->stream(objectActionsByType.get(actionScope)))
                 .filter(mixedIn.isIncluded()
                         ? _Predicates.alwaysTrue()
                         : MixedIn::isNotMixedIn);
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 0ddc5cf..9b274cf 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
@@ -263,22 +263,19 @@ implements FacetHolder {
     @Override
     public Optional<ObjectAction> getDeclaredAction(
             final @Nullable String id,
-            final @Nullable ActionScope type) {
+            final ImmutableEnumSet<ActionScope> actionScopes,
+            final MixedIn mixedIn) {
 
         introspectUpTo(IntrospectionState.FULLY_INTROSPECTED);
 
         return id == null
-                ? Optional.empty()
-                : streamDeclaredActions(
-                        type==null
-                            ? ActionScope.ANY
-                            : ImmutableEnumSet.of(type),
-                        MixedIn.INCLUDED)
-                    .filter(action->
-                        id.equals(action.getFeatureIdentifier().getMemberNameAndParameterClassNamesIdentityString())
-                                || id.equals(action.getFeatureIdentifier().getMemberLogicalName())
-                    )
-                    .findFirst();
+            ? Optional.empty()
+            : streamDeclaredActions(actionScopes, mixedIn)
+                .filter(action->
+                    id.equals(action.getFeatureIdentifier().getMemberNameAndParameterClassNamesIdentityString())
+                            || id.equals(action.getFeatureIdentifier().getMemberLogicalName())
+                )
+                .findFirst();
     }
 
     @Override
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 5a25eb0..5904803 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
@@ -172,16 +172,17 @@ implements ObjectSpecification {
     }
 
     @Override
-    public Optional<ObjectAction> getDeclaredAction(final String id, final ActionScope type) {
+    public Optional<ObjectAction> getDeclaredAction(
+            final String id, final ImmutableEnumSet<ActionScope> scopes, final MixedIn mixedIn) {
         val nameParmsIdentityString = id.substring(0, id.indexOf('('));
         val action = lookupObjectAction(nameParmsIdentityString);
 
-        if(type==null) {
+        if(scopes==null) {
             return action;
         }
 
         if (action.isPresent()
-                && action.get().getType() == type) {
+                && scopes.contains(action.get().getScope())) {
             return action;
         }
         return Optional.empty();
@@ -346,9 +347,10 @@ implements ObjectSpecification {
     }
 
     @Override
-    public Optional<ObjectAction> getAction(final String id, final ActionScope type) {
+    public Optional<ObjectAction> getAction(
+            final String id, final ImmutableEnumSet<ActionScope> scopes, final MixedIn mixedIn) {
         // poorly implemented, inheritance not supported
-        return getDeclaredAction(id, type);
+        return getDeclaredAction(id, scopes, mixedIn);
     }
 
     @Override
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/sitemap/SitemapServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/sitemap/SitemapServiceDefault.java
index ff8b028..fde60df 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/sitemap/SitemapServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/sitemap/SitemapServiceDefault.java
@@ -118,7 +118,7 @@ public class SitemapServiceDefault implements SitemapService {
                     val grid = toGrid(actionElementType.getCorrespondingClass(), Style.CURRENT);
                     grid.visit(new Grid.VisitorAdapter() {
                         @Override public void visit(final ActionLayoutData actionLayoutData) {
-                            actionElementType.getAction(actionLayoutData.getId(), ActionScope.PRODUCTION)
+                            actionElementType.getAction(actionLayoutData.getId(), ActionScope.PRODUCTION_ONLY)
                             .ifPresent(action->{
                                 flushGroupStack.run();
                                 val describedAs = action.getCanonicalDescription()
@@ -177,7 +177,7 @@ public class SitemapServiceDefault implements SitemapService {
     private Optional<ObjectAction> lookupAction(final ServiceActionLayoutData actionLayout) {
         return specificationLoader
         .specForLogicalTypeName(actionLayout.getLogicalTypeName())
-        .map(typeSpec->typeSpec.getAction(actionLayout.getId(), ActionScope.PRODUCTION).orElse(null));
+        .map(typeSpec->typeSpec.getAction(actionLayout.getId(), ActionScope.PRODUCTION_ONLY).orElse(null));
     }
 
     private Grid toGrid(final Class<?> domainClass, final Style style) {
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
index c55aad6..17d2425 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
@@ -202,7 +202,7 @@ extends AbstractObjectMemberReprRenderer<ObjectAction> {
 
     @Override
     protected void putExtensionsIsisProprietary() {
-        getExtensions().mapPut("actionType", objectMember.getType().name().toLowerCase());
+        getExtensions().mapPut("actionScope", objectMember.getScope().name().toLowerCase());
 
         final SemanticsOf semantics = objectMember.getSemantics();
         getExtensions().mapPut("actionSemantics", semantics.getCamelCaseName());
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Caching.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Caching.java
index e9f7981..439f652 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Caching.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Caching.java
@@ -58,7 +58,7 @@ enum Caching {
             response
             .header("Cache-Control",
                     new IntegerProperty()
-                    ._default(86400).description(Util.roSpec("2.13")));
+                    ._default(86400).description(_Util.roSpec("2.13")));
         }
     };
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Generation.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Generation.java
index 442e6ad..610ef0b 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Generation.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Generation.java
@@ -155,7 +155,7 @@ class Generation {
                 continue;
             }
 
-            val serviceActions = Util.actionsOf(spec, visibility, classExcluder);
+            val serviceActions = _Util.actionsOf(spec, visibility, classExcluder);
             if(serviceActions.isEmpty()) {
                 continue;
             }
@@ -192,7 +192,7 @@ class Generation {
             if (mixinFacet != null) {
                 continue;
             }
-            if(visibility.isPublic() && !Util.isVisibleForPublic(objectSpec)) {
+            if(visibility.isPublic() && !_Util.isVisibleForPublic(objectSpec)) {
                 continue;
             }
             if(objectSpec.isAbstract()) {
@@ -206,9 +206,9 @@ class Generation {
                 continue;
             }
 
-            final List<OneToOneAssociation> objectProperties = Util.propertiesOf(objectSpec, visibility);
-            final List<OneToManyAssociation> objectCollections = Util.collectionsOf(objectSpec, visibility);
-            final List<ObjectAction> objectActions = Util.actionsOf(objectSpec, visibility, classExcluder);
+            final List<OneToOneAssociation> objectProperties = _Util.propertiesOf(objectSpec, visibility);
+            final List<OneToManyAssociation> objectCollections = _Util.collectionsOf(objectSpec, visibility);
+            final List<ObjectAction> objectActions = _Util.actionsOf(objectSpec, visibility, classExcluder);
 
             if(objectProperties.isEmpty() && objectCollections.isEmpty()) {
                 continue;
@@ -234,26 +234,26 @@ class Generation {
                 new Path()
                 .get(newOperation("home-page")
                         .tag(tag)
-                        .description(Util.roSpec("5.1"))
+                        .description(_Util.roSpec("5.1"))
                         .response(200,
                                 newResponse(Caching.NON_EXPIRING)
                                 .description("OK")
                                 .schema(newRefProperty("RestfulObjectsSupportingHomePageRepr"))
                                 )));
-        addDefinition("RestfulObjectsSupportingHomePageRepr", newModel(Util.roSpec("5.2")));
+        addDefinition("RestfulObjectsSupportingHomePageRepr", newModel(_Util.roSpec("5.2")));
 
         swagger.path("/user",
                 new Path()
                 .get(newOperation("user")
                         .tag(tag)
-                        .description(Util.roSpec("6.1"))
+                        .description(_Util.roSpec("6.1"))
                         .response(200,
                                 newResponse(Caching.USER_INFO)
                                 .description("OK")
                                 .schema(newRefProperty("RestfulObjectsSupportingUserRepr"))
                                 )));
         addDefinition("RestfulObjectsSupportingUserRepr",
-                newModel(Util.roSpec("6.2"))
+                newModel(_Util.roSpec("6.2"))
                 .property("userName", stringProperty())
                 .property("roles", arrayOfStrings())
                 .property("links", arrayOfLinks())
@@ -264,14 +264,14 @@ class Generation {
                 new Path()
                 .get(newOperation("services")
                         .tag(tag)
-                        .description(Util.roSpec("7.1"))
+                        .description(_Util.roSpec("7.1"))
                         .response(200,
                                 newResponse(Caching.USER_INFO)
                                 .description("OK")
                                 .schema(newRefProperty("RestfulObjectsSupportingServicesRepr"))
                                 )));
         addDefinition("RestfulObjectsSupportingServicesRepr",
-                newModel(Util.roSpec("7.2"))
+                newModel(_Util.roSpec("7.2"))
                 .property("value", arrayOfLinks())
                 .required("userName")
                 .required("roles"));
@@ -280,14 +280,14 @@ class Generation {
                 new Path()
                 .get(newOperation("RestfulObjectsSupportingServicesRepr")
                         .tag(tag)
-                        .description(Util.roSpec("8.1"))
+                        .description(_Util.roSpec("8.1"))
                         .response(200,
                                 newResponse(Caching.NON_EXPIRING)
                                 .description("OK")
                                 .schema(new ObjectProperty())
                                 )));
         swagger.addDefinition("RestfulObjectsSupportingServicesRepr",
-                newModel(Util.roSpec("8.2"))
+                newModel(_Util.roSpec("8.2"))
                 .property("specVersion", stringProperty())
                 .property("implVersion", stringProperty())
                 .property("optionalCapabilities",
@@ -341,7 +341,7 @@ class Generation {
         path.get(
                 newOperation("object")
                 .tag(tag)
-                .description(Util.roSpec("15.1"))
+                .description(_Util.roSpec("15.1"))
                 .response(200,
                         newResponse(Caching.TRANSACTIONAL)
                         .description("OK")
@@ -349,7 +349,7 @@ class Generation {
                 );
 
         final ModelImpl model =
-                newModel(Util.roSpec("15.1.2") + ": representation of " + serviceId)
+                newModel(_Util.roSpec("15.1.2") + ": representation of " + serviceId)
                 .property("title", stringProperty())
                 .property("serviceId", stringProperty()._default(serviceId))
                 .property("members", new ObjectProperty());
@@ -369,7 +369,7 @@ class Generation {
         path.get(operation);
         operation
         .tag(tag)
-        .description(Util.roSpec("14.1"))
+        .description(_Util.roSpec("14.1"))
         .parameter(
                 new PathParameter()
                 .name("objectId")
@@ -386,7 +386,7 @@ class Generation {
                     .schema(newRefProperty(restfulObjectsModelDefinition)));
 
             final ModelImpl roSpecModel =
-                    newModel(Util.roSpec("14.4") + ": representation of " + logicalTypeName)
+                    newModel(_Util.roSpec("14.4") + ": representation of " + logicalTypeName)
                     .property("title", stringProperty())
                     .property("domainType", stringProperty()._default(logicalTypeName))
                     .property("instanceId", stringProperty())
@@ -443,7 +443,7 @@ class Generation {
         final Operation invokeOperation =
                 newOperation("object", "action-result")
                 .tag(tag)
-                .description(Util.roSpec("19.1") + ": (invoke) resource of " + serviceId + "#" + actionId);
+                .description(_Util.roSpec("19.1") + ": (invoke) resource of " + serviceId + "#" + actionId);
 
         final SemanticsOf semantics = serviceAction.getSemantics();
         if(semantics.isSafeInNature()) {
@@ -457,7 +457,7 @@ class Generation {
                 .parameter(
                         new QueryParameter()
                         .name(parameter.getId())
-                        .description(Util.roSpec("2.9.1")
+                        .description(_Util.roSpec("2.9.1")
                                 + (_Strings.isNotEmpty(describedAs)
                                         ? (": " + describedAs)
                                         : ""))
@@ -468,7 +468,7 @@ class Generation {
             if(!parameters.isEmpty()) {
                 invokeOperation.parameter(new QueryParameter()
                         .name("x-isis-querystring")
-                        .description(Util.roSpec("2.10") + ": all (formal) arguments as base64 encoded string")
+                        .description(_Util.roSpec("2.10") + ": all (formal) arguments as base64 encoded string")
                         .required(false)
                         .type("string"));
             }
@@ -528,7 +528,7 @@ class Generation {
         final Operation collectionOperation =
                 newOperation("object-collection")
                 .tag(tag)
-                .description(Util.roSpec("17.1") + ": resource of " + logicalTypeName + "#" + collectionId)
+                .description(_Util.roSpec("17.1") + ": resource of " + logicalTypeName + "#" + collectionId)
                 .parameter(
                         new PathParameter()
                         .name("objectId")
@@ -558,7 +558,7 @@ class Generation {
         final Operation invokeOperation =
                 newOperation("action-result")
                 .tag(tag)
-                .description(Util.roSpec("19.1") + ": (invoke) resource of " + logicalTypeName + "#" + actionId)
+                .description(_Util.roSpec("19.1") + ": (invoke) resource of " + logicalTypeName + "#" + actionId)
                 .parameter(
                         new PathParameter()
                         .name("objectId")
@@ -576,7 +576,7 @@ class Generation {
                 .parameter(
                         new QueryParameter()
                         .name(parameter.getId())
-                        .description(Util.roSpec("2.9.1")
+                        .description(_Util.roSpec("2.9.1")
                                 + (_Strings.isNotEmpty(describedAs)
                                         ? (": " + describedAs)
                                         : ""))
@@ -587,7 +587,7 @@ class Generation {
             if(!parameters.isEmpty()) {
                 invokeOperation.parameter(new QueryParameter()
                         .name("x-isis-querystring")
-                        .description(Util.roSpec("2.10") + ": all (formal) arguments as base64 encoded string")
+                        .description(_Util.roSpec("2.10") + ": all (formal) arguments as base64 encoded string")
                         .required(false)
                         .type("string"));
             }
@@ -807,7 +807,7 @@ class Generation {
     }
 
     static Response newResponse(final Caching caching) {
-        return Util.withCachingHeaders(new Response(), caching);
+        return _Util.withCachingHeaders(new Response(), caching);
     }
 
     String tagForlogicalTypeName(final String logicalTypeName, final String fallback) {
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Util.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/_Util.java
similarity index 83%
rename from viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Util.java
rename to viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/_Util.java
index 6f53bd2..d54a310 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Util.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/_Util.java
@@ -38,21 +38,21 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.val;
+import lombok.experimental.UtilityClass;
 
 import io.swagger.models.Response;
 
-public final class Util {
+@UtilityClass
+final class _Util {
 
-    private Util(){}
-
-    static boolean isVisibleForPublic(final ObjectAction objectAction) {
+    boolean isVisibleForPublic(final ObjectAction objectAction) {
 
         final ObjectSpecification specification = objectAction.getReturnType();
         return ( isVisibleForPublic(specification) || isTypeOfVisibleForPublic(objectAction) )
                 && isVisibleForPublic(objectAction.getParameterTypes());
     }
 
-    private static boolean isTypeOfVisibleForPublic(final ObjectAction objectAction) {
+    private boolean isTypeOfVisibleForPublic(final ObjectAction objectAction) {
         final TypeOfFacet typeOfFacet = objectAction.getFacet(TypeOfFacet.class);
         if (typeOfFacet == null) {
             return false;
@@ -60,27 +60,27 @@ public final class Util {
         return isVisibleForPublic(typeOfFacet.valueSpec());
     }
 
-    private static boolean isVisibleForPublic(final Can<ObjectSpecification> parameterTypes) {
+    private boolean isVisibleForPublic(final Can<ObjectSpecification> parameterTypes) {
 
         final boolean atLeastOneParamNotVisible =
                 parameterTypes.stream()
-                    .map(Util::isNotVisibleForPublic)
+                    .map(_Util::isNotVisibleForPublic)
                     .findAny()
                     .isPresent();
 
         return !atLeastOneParamNotVisible;
     }
 
-    static boolean isVisibleForPublic(final ObjectAssociation objectAssociation) {
+    boolean isVisibleForPublic(final ObjectAssociation objectAssociation) {
         final ObjectSpecification specification = objectAssociation.getElementType();
         return isVisibleForPublic(specification);
     }
 
-    static boolean isNotVisibleForPublic(final ObjectSpecification specification) {
+    boolean isNotVisibleForPublic(final ObjectSpecification specification) {
         return ! isVisibleForPublic(specification);
     }
 
-    static boolean isVisibleForPublic(final ObjectSpecification specification) {
+    boolean isVisibleForPublic(final ObjectSpecification specification) {
         if (specification == null) {
             return true;
         }
@@ -105,7 +105,7 @@ public final class Util {
                 correspondingClass == Void.class;
     }
 
-    static Predicate<ObjectAssociation> associationsWith(final Visibility visibility) {
+    Predicate<ObjectAssociation> associationsWith(final Visibility visibility) {
         return new Predicate<ObjectAssociation>() {
             @Override
             public boolean test(final ObjectAssociation objectAssociation) {
@@ -114,19 +114,19 @@ public final class Util {
         };
     }
 
-    static List<OneToOneAssociation> propertiesOf(
+    List<OneToOneAssociation> propertiesOf(
             final ObjectSpecification objectSpecification,
             final Visibility visibility) {
         return associationsOf(objectSpecification, ObjectAssociation.Predicates.PROPERTIES, visibility);
     }
 
-    static List<OneToManyAssociation> collectionsOf(
+    List<OneToManyAssociation> collectionsOf(
             final ObjectSpecification objectSpecification,
             final Visibility visibility) {
         return associationsOf(objectSpecification, ObjectAssociation.Predicates.COLLECTIONS, visibility);
     }
 
-    private static <T extends ObjectAssociation> List<T> associationsOf(
+    private <T extends ObjectAssociation> List<T> associationsOf(
             final ObjectSpecification objectSpecification,
             final Predicate<ObjectAssociation> associationPredicate, final Visibility visibility) {
 
@@ -136,7 +136,7 @@ public final class Util {
                 .collect(Collectors.toList());
     }
 
-    static List<ObjectAction> actionsOf(
+    List<ObjectAction> actionsOf(
             final ObjectSpecification objectSpec,
             final Visibility visibility,
             final ClassExcluder classExcluder) {
@@ -150,17 +150,17 @@ public final class Util {
                 .collect(Collectors.toList());
     }
 
-    static String roSpec(final String section) {
+    String roSpec(final String section) {
         return "RO Spec v1.0, section " + section;
     }
 
-    static Response withCachingHeaders(final Response response, final Caching caching) {
+    Response withCachingHeaders(final Response response, final Caching caching) {
         caching.withHeaders(response);
 
         return response;
     }
 
-    static ImmutableEnumSet<ActionScope> actionScopesFor(final Visibility visibility) {
+    ImmutableEnumSet<ActionScope> actionScopesFor(final Visibility visibility) {
         switch (visibility) {
         case PUBLIC:
         case PRIVATE:
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/PageParameterUtils.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/PageParameterUtils.java
index f317b7a..02ca31b 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/PageParameterUtils.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/PageParameterUtils.java
@@ -36,6 +36,7 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.primitives._Ints;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
@@ -185,8 +186,8 @@ public class PageParameterUtils {
         .ifPresent(oidStr->
             PageParameterNames.OBJECT_OID.addStringTo(pageParameters, oidStr));
 
-        val actionType = objectAction.getType();
-        PageParameterNames.ACTION_TYPE.addEnumTo(pageParameters, actionType);
+        val actionScope = objectAction.getScope();
+        PageParameterNames.ACTION_TYPE.addEnumTo(pageParameters, actionScope);
 
         val actionOnTypeSpec = objectAction.getDeclaringType();
         if (actionOnTypeSpec != null) {
@@ -221,12 +222,12 @@ public class PageParameterUtils {
         val owningLogicalTypeName = PageParameterNames.ACTION_OWNING_SPEC.getStringFrom(pageParameters);
         val owningLogicalType = specLoader.lookupLogicalTypeElseFail(owningLogicalTypeName);
 
-        final ActionScope actionType = PageParameterNames.ACTION_TYPE.getEnumFrom(pageParameters, ActionScope.class);
+        final ActionScope actionScope = PageParameterNames.ACTION_TYPE.getEnumFrom(pageParameters, ActionScope.class);
         final String actionNameParms = PageParameterNames.ACTION_ID.getStringFrom(pageParameters);
 
         val action = specLoader
                 .specForLogicalTypeElseFail(owningLogicalType)
-                .getActionElseFail(actionNameParms, actionType);
+                .getActionElseFail(actionNameParms, ImmutableEnumSet.of(actionScope));
 
         return action;
     }