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 19:44:32 UTC

[isis] branch master updated: ISIS-2492: use action streams with inheritance support where applicable

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 3038f14  ISIS-2492: use action streams with inheritance support where applicable
3038f14 is described below

commit 3038f146d02b41b99f06bb524ba1dcef1a47850b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jan 23 20:44:17 2021 +0100

    ISIS-2492: use action streams with inheritance support where applicable
---
 .../MethodPrefixBasedFacetFactoryAbstract.java     | 70 +++++++++++-----------
 ...nChoicesForCollectionParameterFacetFactory.java |  1 +
 .../annotation/HomePageFacetAnnotationFactory.java |  6 +-
 .../BookmarkPolicyFacetFallbackFactory.java        |  5 +-
 ...jectSpecIdFacetDerivedFromClassNameFactory.java |  5 +-
 .../param/DeriveFacetsPostProcessor.java           |  6 +-
 .../dflt/ProgrammingModelFacetsJava8.java          |  9 ++-
 .../ApplicationFeatureRepositoryDefault.java       |  8 +--
 .../services/grid/GridSystemServiceAbstract.java   |  2 +-
 .../grid/bootstrap3/GridSystemServiceBS3.java      |  2 +-
 .../services/metamodel/MetaModelExporter.java      |  4 +-
 .../metamodel/MetaModelServiceDefault.java         | 39 +++---------
 .../core/metamodel/spec/ObjectSpecification.java   | 10 ++--
 .../spec/feature/ObjectActionContainer.java        | 10 ++--
 .../spec/feature/ObjectAssociationContainer.java   | 14 +++--
 .../specloader/specimpl/ObjectMemberAbstract.java  |  2 -
 .../specloader/specimpl/ObjectMemberContainer.java | 46 +++++++-------
 .../specimpl/ObjectSpecificationAbstract.java      | 10 +---
 .../specimpl/dflt/ObjectSpecificationDefault.java  | 14 +++--
 .../ApplicationFeatureRepositoryDefaultTest.java   |  3 +
 .../command/CommandExecutorServiceDefault.java     |  9 +--
 .../wrapper/WrapperFactoryDefault.java             |  8 +--
 .../handlers/DomainObjectInvocationHandler.java    |  4 +-
 .../domainobjects/DomainObjectReprRenderer.java    |  2 +-
 .../domaintypes/DomainTypeReprRenderer.java        |  2 +-
 .../service/swagger/internal/Generation.java       |  4 +-
 .../rendering/service/swagger/internal/Util.java   |  8 +--
 .../resources/DomainTypeResourceServerside.java    |  4 +-
 .../collection/AssociatedWithActionsHelper.java    |  2 +-
 .../wicket/ui/components/layout/bs3/col/Col.java   |  2 +-
 30 files changed, 144 insertions(+), 167 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
index 4c18093..00d83dd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
@@ -108,42 +108,44 @@ implements MethodPrefixBasedFacetFactory {
             @Override
             public boolean visit(ObjectSpecification objectSpec, MetaModelValidator metaModelValidator) {
 
+                // as an optimization only checking declared members (skipping inherited ones)  
+                
                 // ensure accepted actions do not have any of the reserved prefixes
                 objectSpec.streamDeclaredActions(MixedIn.EXCLUDED)
-                        .forEach(objectAction -> {
-
-                            val actionId = objectAction.getId();
-
-                            for (val prefix : prefixes) {
-
-                                if (isPrefixed(actionId, prefix)) {
-
-                                    val explanation =
-                                            objectAction.getParameterCount() > 0
-                                                    && noParamsOnly
-                                                    && (MethodLiteralConstants.HIDE_PREFIX.equals(prefix)
-                                                    || MethodLiteralConstants.DISABLE_PREFIX.equals(prefix))
-                                                    ? " (such methods must have no parameters, '"
-                                                    + "isis.core.meta-model.validator.no-params-only"
-                                                    + "' config property)"
-                                                    : "";
-
-                                    val message = "%s#%s: has prefix %s, is probably intended as a supporting method "
-                                            + "for a property, collection or action%s.  If the method is intended to "
-                                            + "be an action, then rename and use @ActionLayout(named=\"...\") or ignore "
-                                            + "completely using @Programmatic";
-
-                                    metaModelValidator.onFailure(
-                                            objectSpec,
-                                            objectSpec.getIdentifier(),
-                                            message,
-                                            objectSpec.getIdentifier().getClassName(),
-                                            actionId,
-                                            prefix,
-                                            explanation);
-                                }
-                            }
-                        });
+                .forEach(objectAction -> {
+
+                    val actionId = objectAction.getId();
+
+                    for (val prefix : prefixes) {
+
+                        if (isPrefixed(actionId, prefix)) {
+
+                            val explanation =
+                                    objectAction.getParameterCount() > 0
+                                            && noParamsOnly
+                                            && (MethodLiteralConstants.HIDE_PREFIX.equals(prefix)
+                                            || MethodLiteralConstants.DISABLE_PREFIX.equals(prefix))
+                                            ? " (such methods must have no parameters, '"
+                                            + "isis.core.meta-model.validator.no-params-only"
+                                            + "' config property)"
+                                            : "";
+
+                            val message = "%s#%s: has prefix %s, is probably intended as a supporting method "
+                                    + "for a property, collection or action%s.  If the method is intended to "
+                                    + "be an action, then rename and use @ActionLayout(named=\"...\") or ignore "
+                                    + "completely using @Programmatic";
+
+                            metaModelValidator.onFailure(
+                                    objectSpec,
+                                    objectSpec.getIdentifier(),
+                                    message,
+                                    objectSpec.getIdentifier().getClassName(),
+                                    actionId,
+                                    prefix,
+                                    explanation);
+                        }
+                    }
+                });
 
                 return true;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
index a261af1..7c19673 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
@@ -78,6 +78,7 @@ implements MetaModelRefiner {
                     final ObjectSpecification objectSpec,
                     final MetaModelValidator validator) {
                 
+                // as an optimization only checking declared members (skipping inherited ones)  
                 objectSpec.streamDeclaredActions(MixedIn.INCLUDED)
                 .forEach(objectAction->{
                     if(objectAction instanceof ObjectActionMixedIn) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
index 84a9ba2..e2c830f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
@@ -80,10 +80,8 @@ implements MetaModelRefiner {
             @Override
             public boolean visit(ObjectSpecification objectSpec, MetaModelValidator validator) {
                 
-                val objectActions = 
-                        objectSpec.streamDeclaredActions(MixedIn.EXCLUDED);
-
-                objectActions
+                // as an optimization only checking declared members (skipping inherited ones)                 
+                objectSpec.streamDeclaredActions(MixedIn.EXCLUDED)
                 .filter(objectAction->objectAction.containsFacet(HomePageFacet.class))
                 .forEach(objectAction->{
                     
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
index 0842570..8232480 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
@@ -57,9 +57,8 @@ implements MetaModelRefiner {
         
         programmingModel.addValidator((objectSpec, validator) -> {
 
-            final Stream<ObjectAction> objectActions = objectSpec.streamDeclaredActions(MixedIn.EXCLUDED);
-
-            objectActions
+            // as an optimization only checking declared members (skipping inherited ones)
+            objectSpec.streamDeclaredActions(MixedIn.EXCLUDED)
             .filter(objectAction->{
                 final BookmarkPolicyFacet bookmarkFacet = objectAction.getFacet(BookmarkPolicyFacet.class);
                 if(bookmarkFacet == null || bookmarkFacet.isFallback() || 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
index 17a38ee..63c5d97 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
@@ -187,10 +187,9 @@ implements MetaModelRefiner, ObjectSpecIdFacetFactory {
             if(!DomainServiceFacet.getNatureOfService(objectSpec).isPresent()) {
                 return false; //skip validation
             }
-
+            
             // don't check if domain service has only programmatic methods
-            final Stream<ObjectAction> objectActions = objectSpec.streamDeclaredActions(MixedIn.INCLUDED);
-            return objectActions.anyMatch(__->true); // return true if not empty
+            return objectSpec.streamActions(MixedIn.INCLUDED).count()>0L;
 
         }
         return false; //skip validation
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
index c93185d..15def82 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
@@ -122,9 +122,11 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
     @Override
     public void postProcess(final ObjectSpecification objectSpecification) {
 
+        //XXX in principle it would be sufficient to just process declared members; can optimize if worth the effort
+        
         // all the actions of this type
         val actionTypes = inferActionTypes();
-        final Stream<ObjectAction> objectActions = objectSpecification.streamDeclaredActions(actionTypes, MixedIn.INCLUDED);
+        final Stream<ObjectAction> objectActions = objectSpecification.streamActions(actionTypes, MixedIn.INCLUDED);
 
         // and all the collections of this type
         final Stream<OneToManyAssociation> collections = objectSpecification.streamCollections(MixedIn.INCLUDED);
@@ -185,7 +187,7 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
             final ObjectActionParameter.Predicates.ScalarParameter whetherScalarParamOfType =
                     new ObjectActionParameter.Predicates.ScalarParameter(specification);
 
-            objectSpecification.streamDeclaredActions(actionTypes, MixedIn.INCLUDED)
+            objectSpecification.streamActions(actionTypes, MixedIn.INCLUDED)
             .filter(ObjectAction.Predicates.associatedWith(collection))
             .forEach(action->{
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
index c521488..82ffe7c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
@@ -360,10 +360,13 @@ public final class ProgrammingModelFacetsJava8 extends ProgrammingModelAbstract
         addValidator(new TitlesAndTranslationsValidator());
 
         addValidator((objectSpec, validator) -> {
-            final long numActions = objectSpec.streamDeclaredActions(MixedIn.INCLUDED).count();
-            if (numActions > 0L) {
+            
+            val actions = objectSpec.streamActions(MixedIn.INCLUDED).collect(Collectors.toList());
+            
+            final int numActions = actions.size();
+            if (numActions > 0) {
 
-                val actionIds = objectSpec.streamDeclaredActions(MixedIn.INCLUDED)
+                val actionIds = actions.stream()
                 .map(ObjectAction::getIdentifier)
                 .map(Identifier::toString)
                 .collect(Collectors.joining(", "));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index 35f703e..765b5fa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -137,13 +137,11 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
             return;
         }
 
-        final List<ObjectAssociation> properties = spec.streamDeclaredAssociations(MixedIn.INCLUDED)
-                .filter(ObjectAssociation.Predicates.PROPERTIES)
+        final List<ObjectAssociation> properties = spec.streamProperties(MixedIn.INCLUDED)
                 .collect(Collectors.toList());
-        final List<ObjectAssociation> collections = spec.streamDeclaredAssociations(MixedIn.INCLUDED)
-                .filter(ObjectAssociation.Predicates.COLLECTIONS)
+        final List<ObjectAssociation> collections = spec.streamCollections(MixedIn.INCLUDED)
                 .collect(Collectors.toList());
-        final List<ObjectAction> actions = spec.streamDeclaredActions(MixedIn.INCLUDED)
+        final List<ObjectAction> actions = spec.streamActions(MixedIn.INCLUDED)
                 .collect(Collectors.toList());
 
         if (properties.isEmpty() && collections.isEmpty() && actions.isEmpty()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
index 9b4f3cd..da4eda7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -181,7 +181,7 @@ implements GridSystemService<G> {
 
         val oneToOneAssociationById = ObjectMember.mapById(getOneToOneAssociations(objectSpec));
         val oneToManyAssociationById = ObjectMember.mapById(getOneToManyAssociations(objectSpec));
-        val objectActionById = ObjectMember.mapById(objectSpec.streamDeclaredActions(MixedIn.INCLUDED));
+        val objectActionById = ObjectMember.mapById(objectSpec.streamActions(MixedIn.INCLUDED));
 
         final AtomicInteger propertySequence = new AtomicInteger(0);
         fcGrid.visit(new Grid.VisitorAdapter() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
index 57781c6..9122257 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
@@ -178,7 +178,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
 
         val oneToOneAssociationById = ObjectMember.mapById(getOneToOneAssociations(objectSpec));
         val oneToManyAssociationById = ObjectMember.mapById(getOneToManyAssociations(objectSpec));
-        val objectActionById = ObjectMember.mapById( objectSpec.streamDeclaredActions(MixedIn.INCLUDED));
+        val objectActionById = ObjectMember.mapById(objectSpec.streamActions(MixedIn.INCLUDED));
 
         val propertyLayoutDataById = bs3Grid.getAllPropertiesById();
         val collectionLayoutDataById = bs3Grid.getAllCollectionsById();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
index 0a5ce77..a072b4f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
@@ -267,8 +267,8 @@ class MetaModelExporter {
         }
 
         final List<Action> actions = domainClass.getActions().getAct();
-        specification.streamDeclaredActions(MixedIn.INCLUDED)
-        .map(action ->asXsdType(action, domainClassByObjectSpec, config))
+        specification.streamActions(MixedIn.INCLUDED)
+        .map(action->asXsdType(action, domainClassByObjectSpec, config))
         .forEach(actions::add);
 
         sortMembers(actions);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index d608d75..d3a0983 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.metamodel.services.metamodel;
 
 import java.util.Collections;
 import java.util.List;
-import java.util.stream.Stream;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
@@ -48,7 +47,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -117,36 +115,17 @@ public class MetaModelServiceDefault implements MetaModelService {
                 continue;
             }
 
-            {
-                final Stream<ObjectAssociation> properties = 
-                        spec.streamDeclaredAssociations(MixedIn.EXCLUDED)
-                        .filter(ObjectAssociation.Predicates.PROPERTIES);
+            spec.streamProperties(MixedIn.INCLUDED)
+            .filter(otoa->!exclude(otoa))
+            .forEach(otoa->rows.add(new DomainMemberDefault(spec, otoa)));
 
-                properties
-                .map(property->(OneToOneAssociation) property)
-                .filter(otoa->!exclude(otoa))
-                .forEach(otoa->rows.add(new DomainMemberDefault(spec, otoa)));
-            }
-
-            {
-                final Stream<ObjectAssociation> associations = 
-                        spec.streamDeclaredAssociations(MixedIn.EXCLUDED)
-                        .filter(ObjectAssociation.Predicates.COLLECTIONS);
-
-                associations
-                .map(collection->(OneToManyAssociation) collection)
-                .filter(otma->!exclude(otma))
-                .forEach(otma->rows.add(new DomainMemberDefault(spec, otma)));
-            }
-
-            {
-                final Stream<ObjectAction> actions = 
-                        spec.streamDeclaredActions(MixedIn.INCLUDED);
+            spec.streamCollections(MixedIn.INCLUDED)
+            .filter(otma->!exclude(otma))
+            .forEach(otma->rows.add(new DomainMemberDefault(spec, otma)));
 
-                actions
-                .filter(action->!exclude(action))
-                .forEach(action->rows.add(new DomainMemberDefault(spec, action)));
-            }
+            spec.streamActions(MixedIn.INCLUDED)
+            .filter(action->!exclude(action))
+            .forEach(action->rows.add(new DomainMemberDefault(spec, action)));
         }
 
         Collections.sort(rows);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 0b7958a..059958a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -133,7 +133,7 @@ extends
      * @since 2.0
      */
     public default Optional<MixedInMember> getMixedInMember(ObjectSpecification onType) {
-        return streamDeclaredActions(MixedIn.INCLUDED)
+        return streamActions(MixedIn.INCLUDED)
                 .filter(MixedInMember.class::isInstance)
                 .map(MixedInMember.class::cast)
                 .filter(member->member.getMixinType() == onType)
@@ -447,17 +447,17 @@ extends
     }
 
     /**
-     * Streams all FacetHolders associated with this spec. 
+     * Streams all FacetHolders associated with this spec. (including inherited)
      * @since 2.0
      */
     default Stream<FacetHolder> streamFacetHolders(){
         
         val self = Stream.of(this);
-        val actions = streamDeclaredActions(MixedIn.EXCLUDED);
-        val actionParameters = streamDeclaredActions(MixedIn.EXCLUDED)
+        val actions = streamActions(MixedIn.EXCLUDED);
+        val actionParameters = streamActions(MixedIn.EXCLUDED)
                 .flatMap(action->action.getParameterCount()>0
                         ? action.getParameters().stream()
-                                : Stream.empty());
+                        : Stream.empty());
         val properties = streamProperties(MixedIn.EXCLUDED);
         val collections = streamCollections(MixedIn.EXCLUDED);
 
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 e74fa90..5f3d0c8 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
@@ -30,17 +30,18 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.spec.ActionType;
 
 public interface ObjectActionContainer {
-
+    
     // -- ACTION LOOKUP (INHERITANCE CONSIDERED)
     
     /**
-     * Same as {@link #getDeclaredAction(String, ActionType)}, but also considering any inherited object members.
+     * Similar to {@link #getDeclaredAction(String, ActionType)}, 
+     * but also considering any inherited object members. (mixed-in included)
      * @param id
      * @param type
      * 
      * @implSpec If not found on the current 'type' search for the 'nearest' match in super-types, 
      * and if nothing found there, search the interfaces. Special care needs to be taken, as the
-     * {@link ActionType} might be redeclared when inheriting from a super-type or interface.  
+     * {@link ActionType} might be redeclared when inheriting from a super-type or interface.
      */
     Optional<ObjectAction> getAction(String id, @Nullable ActionType type);
     
@@ -51,7 +52,6 @@ public interface ObjectActionContainer {
                         type==null ? "any" : type.name()));
     }
 
-
     default Optional<ObjectAction> getAction(String id) {
         return getAction(id, null);
     }
@@ -64,7 +64,7 @@ public interface ObjectActionContainer {
     // -- ACTION LOOKUP, DECLARED ACTIONS (NO INHERITANCE CONSIDERED)
     
     /**
-     * Get the action object represented by the specified identity string.
+     * Get the action object represented by the specified identity string. (mixed-in included)
      * <p>
      * The identity string can be either fully specified with parameters (as per
      * {@link Identifier#toNameParmsIdentityString()} or in abbreviated form (
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
index b573310..a6c8112 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
@@ -35,9 +35,11 @@ public interface ObjectAssociationContainer {
      * 
      * @implSpec If not found on the current 'type' search for the 'nearest' match in super-types, 
      * and if nothing found there, search the interfaces.  
+     * TODO make sure callers don't instead want the non recursive variant
      */
     Optional<ObjectAssociation> getAssociation(String id);
     
+    // TODO make sure callers don't instead want the non recursive variant
     default ObjectAssociation getAssociationElseFail(String id) {
         return getAssociation(id)
                 .orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
@@ -51,6 +53,7 @@ public interface ObjectAssociationContainer {
      *
      * Throw a {@link ObjectSpecificationException} if no such association
      * exists.
+     * TODO make sure callers don't instead want the recursive variant
      */
     Optional<ObjectAssociation> getDeclaredAssociation(String id);
     
@@ -62,6 +65,9 @@ public interface ObjectAssociationContainer {
      * 
      * @implSpec Walk through the type hierarchy nearest to farthest and add any ObjectAssociation to the stream, 
      * except don't add ObjectAssociations that already have been added (due to inheritance).
+     * 
+     * TODO make sure callers don't instead want the non-recursive variant
+     * 
      */
     Stream<ObjectAssociation> streamAssociations(MixedIn contributed);
     
@@ -69,7 +75,7 @@ public interface ObjectAssociationContainer {
     /**
      * All {@link ObjectAssociation association}s that represent
      * {@link OneToOneAssociation properties}.
-     * 
+     * TODO make sure callers don't instead want the non recursive variant
      */
     default Stream<OneToOneAssociation> streamProperties(MixedIn contributed) {
         return streamAssociations(contributed)
@@ -80,9 +86,7 @@ public interface ObjectAssociationContainer {
     /**
      * All {@link ObjectAssociation association}s that represents
      * {@link OneToManyAssociation collections}.
-     *
-     * @return
-     * 
+     * TODO make sure callers don't instead want the non recursive variant
      */
     default Stream<OneToManyAssociation> streamCollections(MixedIn contributed){
         return streamAssociations(contributed)
@@ -99,7 +103,7 @@ public interface ObjectAssociationContainer {
      * To get the statically visible fields (where any invisible and
      * unauthorized fields have been removed) use
      * <tt>ObjectAssociationFilters#staticallyVisible(...)</tt>
-     *
+     * TODO make sure callers don't instead want the recursive variant
      */
     Stream<ObjectAssociation> streamDeclaredAssociations(MixedIn contributed);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index d9a2e0f..fc96481 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -292,8 +292,6 @@ implements ObjectMember, HasMetaModelContext, HasFacetHolder {
         return indexOfUnderscore != -1 && indexOfUnderscore != singularName.length() - 1;
     }
 
-
-
     // -- toString
 
     @Override
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 ac66936..1ee67b5 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
@@ -38,6 +38,10 @@ import lombok.val;
 /**
  * Responsibility: member lookup and streaming with support for inheritance, 
  * based on access to declared members, super-classes and interfaces.
+ * <p>
+ * TODO future extensions should also search the interfaces, 
+ * but avoid doing redundant work when walking the type-hierarchy;
+ * (current elegant recursive solution will then need some tweaks to be efficient)
  */
 public abstract class ObjectMemberContainer
 extends FacetHolderImpl 
@@ -66,24 +70,22 @@ implements
             return declaredAction; 
         }
         
-        if(superclass()==null) {
-            // guard against unexpected reach of type hierarchy root
-            return Optional.empty();
-        }
-        
         return superclass().getAction(id, type);
-        
-        //XXX future extensions should also search the interfaces, 
-        // but avoid doing redundant work when walking the type-hierarchy;
-        // (this elegant recursive solution will then need some tweaks to be efficient)
     }
     
     @Override
     public Stream<ObjectAction> streamActions(
             final ImmutableEnumSet<ActionType> types, 
             final MixedIn contributed) {
-        //FIXME poorly implemented, inheritance not supported
-        return streamDeclaredActions(contributed);
+        
+        if(isTypeHierarchyRoot()) {
+            return Stream.empty(); // stop as we reached the Object class, which does not contribute actions 
+        }
+
+        return Stream.concat(
+                streamDeclaredActions(contributed), 
+                superclass().streamActions(contributed))
+                .distinct(); //FIXME equality by java object instance does not work here (will collect duplicates)
     }
     
     // -- ASSOCIATIONS
@@ -92,7 +94,7 @@ implements
     public Optional<ObjectAssociation> getAssociation(String id) {
 
         if(isTypeHierarchyRoot()) {
-            return Optional.empty(); // stop search as we reached the Object class, which does not contribute actions 
+            return Optional.empty(); // stop search as we reached the Object class, which does not contribute associations 
         }
         
         val declaredAssociation = getDeclaredAssociation(id); // no inheritance considered
@@ -101,22 +103,20 @@ implements
             return declaredAssociation; 
         }
         
-        if(superclass()==null) {
-            // guard against unexpected reach of type hierarchy root
-            return Optional.empty();
-        }
-        
         return superclass().getAssociation(id);
-        
-        //XXX future extensions should also search the interfaces, 
-        // but avoid doing redundant work when walking the type-hierarchy;
-        // (this elegant recursive solution will then need some tweaks to be efficient)
     }
     
     @Override
     public Stream<ObjectAssociation> streamAssociations(MixedIn contributed) {
-        //FIXME poorly implemented, inheritance not supported
-        return streamDeclaredAssociations(contributed);
+        
+        if(isTypeHierarchyRoot()) {
+            return Stream.empty(); // stop as we reached the Object class, which does not contribute associations 
+        }
+
+        return Stream.concat(
+                streamDeclaredAssociations(contributed), 
+                superclass().streamAssociations(contributed))
+                .distinct(); //FIXME equality by java object instance does not work here (will collect duplicates)
     }
     
 }
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 0dec42d..fc1490d 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
@@ -776,10 +776,7 @@ implements ObjectSpecification {
         }
         val mixinMethodName = mixinFacet.value();
 
-        final Stream<ObjectAction> mixinActions = specification
-                .streamDeclaredActions(ActionType.ANY, MixedIn.INCLUDED);
-
-        mixinActions
+        specification.streamActions(ActionType.ANY, MixedIn.INCLUDED)
         .filter(Predicates::isMixedInAssociation)
         .map(ObjectActionDefault.class::cast)
         .map(Factories.mixedInAssociation(this, mixinType, mixinMethodName))
@@ -831,10 +828,7 @@ implements ObjectSpecification {
         }
         val mixinMethodName = mixinFacet.value();
 
-        final Stream<ObjectAction> mixinsActions = mixinSpec
-                .streamDeclaredActions(ActionType.ANY, MixedIn.INCLUDED);
-
-        mixinsActions
+        mixinSpec.streamActions(ActionType.ANY, MixedIn.INCLUDED)
         .filter(Predicates::isMixedInAction)
         .map(ObjectActionDefault.class::cast)
         .map(Factories.mixedInAction(this, mixinType, mixinMethodName))
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 68034f2..fe02cab 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
@@ -326,9 +326,10 @@ implements FacetHolder {
     private void cataloguePropertiesAndCollections(BiConsumer<Method, ObjectMember> onMember) {
         streamDeclaredAssociations(MixedIn.EXCLUDED)
         .forEach(field->{
-            final Stream<Facet> facets = field.streamFacets().filter(ImperativeFacet.PREDICATE);
-            facets.forEach(facet->{
-                final ImperativeFacet imperativeFacet = ImperativeFacet.Util.getImperativeFacet(facet);
+            field.streamFacets()
+            .filter(ImperativeFacet.PREDICATE)
+            .forEach(facet->{
+                val imperativeFacet = ImperativeFacet.Util.getImperativeFacet(facet);
                 for (final Method imperativeFacetMethod : imperativeFacet.getMethods()) {
                     onMember.accept(imperativeFacetMethod, field);
                 }
@@ -339,9 +340,10 @@ implements FacetHolder {
     private void catalogueActions(BiConsumer<Method, ObjectMember> onMember) {
         streamDeclaredActions(MixedIn.INCLUDED)
         .forEach(userAction->{
-            final Stream<Facet> facets = userAction.streamFacets().filter(ImperativeFacet.PREDICATE);
-            facets.forEach(facet->{
-                final ImperativeFacet imperativeFacet = ImperativeFacet.Util.getImperativeFacet(facet);
+            userAction.streamFacets()
+            .filter(ImperativeFacet.PREDICATE)
+            .forEach(facet->{
+                val imperativeFacet = ImperativeFacet.Util.getImperativeFacet(facet);
                 for (final Method imperativeFacetMethod : imperativeFacet.getMethods()) {
                     onMember.accept(imperativeFacetMethod, userAction);
                 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
index 738dc62..744164d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
@@ -129,6 +129,9 @@ public class ApplicationFeatureRepositoryDefaultTest {
 
                 allowing(mockSpec).streamDeclaredActions(with(MixedIn.INCLUDED));
                 will(returnValue(actions.stream()));
+                
+                allowing(mockSpec).streamActions(with(MixedIn.INCLUDED));
+                will(returnValue(actions.stream()));
 
                 allowing(mockProp).getId();
                 will(returnValue("someProperty"));
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
index fc0198a..16ebd95 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
@@ -346,13 +346,8 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
     private static ObjectAction findActionElseNull(
             final ObjectSpecification specification,
             final String localActionId) {
-        final Stream<ObjectAction> objectActions = specification.streamDeclaredActions(MixedIn.INCLUDED);
-
-        return objectActions
-                .filter(objectAction->
-                        Objects.equals(objectAction.getId(), localActionId))
-                .findAny()
-                .orElse(null);
+        
+        return specification.getAction(localActionId).orElse(null);
     }
 
     private static OneToOneAssociation findOneToOneAssociationElseNull(
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
index 939bcb3..711e7e5 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
@@ -18,9 +18,6 @@
  */
 package org.apache.isis.core.runtimeservices.wrapper;
 
-import static org.apache.isis.applib.services.metamodel.MetaModelService.Mode.RELAXED;
-import static org.apache.isis.applib.services.wrapper.control.SyncControl.control;
-
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -104,6 +101,9 @@ import org.apache.isis.core.runtimeservices.wrapper.proxy.ProxyCreator;
 import org.apache.isis.core.security.authentication.Authentication;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 
+import static org.apache.isis.applib.services.metamodel.MetaModelService.Mode.RELAXED;
+import static org.apache.isis.applib.services.wrapper.control.SyncControl.control;
+
 import lombok.Data;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
@@ -408,7 +408,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
 
         // don't care about anything other than actions
         // (contributed properties and collections are read-only).
-        Optional<ObjectActionMixedIn> targetActionIfAny = mixedInSpec.streamDeclaredActions(MixedIn.INCLUDED)
+        Optional<ObjectActionMixedIn> targetActionIfAny = mixedInSpec.streamActions(MixedIn.INCLUDED)
                 .filter(ObjectActionMixedIn.class::isInstance)
                 .map(ObjectActionMixedIn.class::cast)
                 .filter(x -> x.hasMixinAction((ObjectAction) mixinMember))
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index 3a10ace..c904635 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -263,8 +263,8 @@ extends DelegatingInvocationHandlerDefault<T> {
             return null;
         }
         val specification = domainObjectAdapter.getSpecification();
-        val objectActions = specification.streamDeclaredActions(MixedIn.INCLUDED);
-        val objectAssociations = specification.streamDeclaredAssociations(MixedIn.INCLUDED);
+        val objectActions = specification.streamActions(MixedIn.INCLUDED);
+        val objectAssociations = specification.streamAssociations(MixedIn.INCLUDED);
 
         final Stream<ObjectMember> objectMembers = Stream.concat(objectActions, objectAssociations);
         return objectMembers
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
index 923b09a..f071cd7 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
@@ -302,7 +302,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
 
             if (mode.isRegular()) {
                 final Stream<ObjectAction> actions = objectAdapter.getSpecification()
-                        .streamDeclaredActions(MixedIn.INCLUDED);
+                        .streamActions(MixedIn.INCLUDED);
 
                 addActions(objectAdapter, actions, appendTo);
             }
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
index f51e6ea..051dd14 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
@@ -111,7 +111,7 @@ public class DomainTypeReprRenderer extends ReprRendererAbstract<DomainTypeReprR
             }
         });
 
-        final Stream<ObjectAction> actions = objectSpecification.streamDeclaredActions(MixedIn.INCLUDED);
+        final Stream<ObjectAction> actions = objectSpecification.streamActions(MixedIn.INCLUDED);
 
         actions.forEach(action->{
             final LinkBuilder linkBuilder = ActionDescriptionReprRenderer
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 d354f7b..3486866 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
@@ -171,9 +171,9 @@ class Generation {
     @SuppressWarnings("unused")
     private void debugTraverseAllSpecs(final Collection<ObjectSpecification> allSpecs) {
         for (final ObjectSpecification objectSpec :  allSpecs) {
-            objectSpec.streamDeclaredAssociations(MixedIn.INCLUDED)
+            objectSpec.streamAssociations(MixedIn.INCLUDED)
             .collect(Collectors.toList());
-            objectSpec.streamDeclaredActions(MixedIn.INCLUDED)
+            objectSpec.streamActions(MixedIn.INCLUDED)
             .collect(Collectors.toList());
         }
     }
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
index 86ea312..45ab194 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
@@ -144,11 +144,11 @@ public final class Util {
             final ClassExcluder classExcluder) {
         val actionTypes = actionTypesFor(visibility);
 
-        return objectSpec.streamDeclaredActions(actionTypes, MixedIn.INCLUDED)
+        return objectSpec.streamActions(actionTypes, MixedIn.INCLUDED)
                 .filter(objectAction->
-                !classExcluder.exclude(objectAction) &&
-                !visibility.isPublic() || isVisibleForPublic(objectAction)
-                        )
+                    !classExcluder.exclude(objectAction) 
+                        && !visibility.isPublic() 
+                        || isVisibleForPublic(objectAction) )
                 .collect(Collectors.toList());
     }
 
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java
index f86c6b4..b8569a6 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java
@@ -221,7 +221,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
             throw RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND);
         }
 
-        val action = parentSpec.getDeclaredAction(actionId)
+        val action = parentSpec.getAction(actionId)
                 .orElseThrow(()->RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND));
         
         final ActionDescriptionReprRenderer renderer = new ActionDescriptionReprRenderer(resourceContext, null, JsonRepresentation.newMap());
@@ -244,7 +244,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
             throw RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND);
         }
 
-        val parentAction = parentSpec.getDeclaredAction(actionId)
+        val parentAction = parentSpec.getAction(actionId)
                 .orElseThrow(()->RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND));
         
         final ObjectActionParameter actionParam = parentAction.getParameterByName(paramName);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
index bd048c1..d582f1c 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
@@ -59,7 +59,7 @@ public class AssociatedWithActionsHelper implements Serializable {
         final ObjectSpecification objectSpec = getObjectSpecification();
 
         val actionTypes = inferActionTypes(collectionModel.getCommonContext());
-        final Stream<ObjectAction> objectActions = objectSpec.streamDeclaredActions(actionTypes, MixedIn.INCLUDED);
+        final Stream<ObjectAction> objectActions = objectSpec.streamActions(actionTypes, MixedIn.INCLUDED);
 
         return objectActions
                 .filter(ObjectAction.Predicates.associatedWithAndWithCollectionParameterFor(collection))
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
index 8a996bf..5facc87 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
@@ -124,7 +124,7 @@ public class Col extends PanelAbstract<EntityModel> implements HasDynamicallyVis
                 .filter(actionLayoutData -> actionLayoutData.getMetadataError() == null)
                 .filter(_NullSafe::isPresent)
                 .map(actionLayoutData -> 
-                    getModel().getTypeOfSpecification().getDeclaredAction(actionLayoutData.getId()).orElse(null)
+                    getModel().getTypeOfSpecification().getAction(actionLayoutData.getId()).orElse(null)
                 )
                 .filter(_NullSafe::isPresent)
                 .collect(Collectors.toList());