You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/09/04 03:04:45 UTC

[1/2] git commit: ISIS-503: refactoring ObjectSpecificationDefault for actions and associations

Updated Branches:
  refs/heads/master db82c67eb -> 242739ad6


ISIS-503: refactoring ObjectSpecificationDefault for actions and associations

- simplifying the overloading
- deprecated ObjectActionFilters, converted to ObjectAction.Filters
- deprecated ObjectAssociationFilters, converted to ObjectAssociation.Filters


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/02340bfa
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/02340bfa
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/02340bfa

Branch: refs/heads/master
Commit: 02340bfa08d7e65363a039142c8b85cea4256ae7
Parents: db82c67
Author: Dan Haywood <da...@apache.org>
Authored: Tue Sep 3 21:06:58 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Sep 3 21:06:58 2013 +0100

----------------------------------------------------------------------
 .../viewer/dnd/view/action/OptionFactory.java   |   4 +-
 .../scimpi/dispatcher/util/MethodsUtils.java    |   2 +-
 .../scimpi/dispatcher/view/action/Methods.java  |   7 +-
 .../scimpi/dispatcher/view/debug/Debug.java     |   9 +-
 .../scimpi/dispatcher/view/debug/Members.java   |   4 +-
 .../view/simple/AbstractConditionalBlock.java   |   3 +-
 .../cssmenu/AppActionsCssMenuFactory.java       |   4 +-
 .../CollectionContentsAsAjaxTablePanel.java     |   2 +-
 .../entity/header/EntityHeaderPanel.java        |   2 +-
 .../entitylink/EntityLinkSelect2Panel.java      |  15 --
 .../json/LayoutMetadataReaderFromJson.java      |  12 +-
 .../isis/core/metamodel/spec/ActionType.java    |   2 +-
 .../metamodel/spec/feature/ObjectAction.java    |  67 ++++++++
 .../spec/feature/ObjectActionContainer.java     |  20 +--
 .../spec/feature/ObjectActionFilters.java       |  70 ++------
 .../metamodel/spec/feature/ObjectActions.java   |   4 -
 .../spec/feature/ObjectAssociation.java         | 134 +++++++++++++++
 .../spec/feature/ObjectAssociationFilters.java  | 122 +++----------
 .../specloader/ObjectReflectorDefault.java      |   9 +-
 .../specloader/specimpl/ContributeeMember.java  |  47 +++++-
 .../specimpl/ObjectSpecificationAbstract.java   | 169 ++++++++-----------
 .../dflt/ObjectSpecificationDefault.java        |  45 +++--
 .../ObjectSpecificationForFreeStandingList.java |   8 -
 .../apache/isis/core/metamodel/util/Dump.java   |  29 +---
 .../testspec/ObjectSpecificationStub.java       |  19 +--
 25 files changed, 421 insertions(+), 388 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java
index b69fdec..19b45b8 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java
@@ -38,7 +38,7 @@ public class OptionFactory {
     public static void addCreateOptions(final ObjectSpecification specification, final UserActionSet options) {
         // TODO do the same as addObjectMenuOptions and collect together all the
         // actions for all the types
-        final List<ObjectAction> actions = specification.getServiceActionsReturning(Arrays.asList(ActionType.USER, ActionType.EXPLORATION, ActionType.PROTOTYPE, ActionType.DEBUG));
+        final List<ObjectAction> actions = specification.getServiceActionsReturning(ActionType.ALL);
         menuOptions(actions, null, options);
     }
 
@@ -48,7 +48,7 @@ public class OptionFactory {
         }
 
         final ObjectSpecification noSpec = adapter.getSpecification();
-        menuOptions(noSpec.getObjectActions(Arrays.asList(ActionType.USER, ActionType.EXPLORATION, ActionType.PROTOTYPE, ActionType.DEBUG), Contributed.INCLUDED), adapter, options);
+        menuOptions(noSpec.getObjectActions(Contributed.INCLUDED), adapter, options);
 
         // TODO: this looks like a bit of a hack; can we improve it by looking
         // at the facets?

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
index 0cacf59..a6ae574 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/util/MethodsUtils.java
@@ -72,7 +72,7 @@ public class MethodsUtils {
             throw new ScimpiException("Object not specified when looking for " + methodName);
         }
 
-        final List<ObjectAction> actions = object.getSpecification().getObjectActions(Arrays.asList(ActionType.USER, ActionType.EXPLORATION, ActionType.PROTOTYPE, ActionType.DEBUG), Contributed.INCLUDED);
+        final List<ObjectAction> actions = object.getSpecification().getObjectActions(Contributed.INCLUDED);
         final ObjectAction action = findAction(actions, methodName);
         /*
          * if (action == null) { actions =

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
index f51ed1c..21cff4e 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/action/Methods.java
@@ -22,6 +22,7 @@ package org.apache.isis.viewer.scimpi.dispatcher.view.action;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -76,16 +77,16 @@ public class Methods extends AbstractElementProcessor {
             final InclusionList inclusionList,
             final String view,
             final String cancelTo) {
-        List<ObjectAction> actions = adapter.getSpecification().getObjectActions(ActionType.USER, Contributed.INCLUDED);
+        List<ObjectAction> actions = adapter.getSpecification().getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
         writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
         // TODO determine if system is set up to display exploration methods
         if (true) {
-            actions = adapter.getSpecification().getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED);
+            actions = adapter.getSpecification().getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, Filters.<ObjectAction>any());
             writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
         }
         // TODO determine if system is set up to display debug methods
         if (true) {
-            actions = adapter.getSpecification().getObjectActions(ActionType.DEBUG, Contributed.INCLUDED);
+            actions = adapter.getSpecification().getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, Filters.<ObjectAction>any());
             writeMethods(request, adapter, actions, objectId, showForms, inclusionList, view, cancelTo);
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
index 790cf25..c1a01b4 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Debug.java
@@ -25,6 +25,7 @@ import java.util.Comparator;
 import java.util.List;
 
 import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.debug.DebugHtmlString;
 import org.apache.isis.core.commons.debug.DebugString;
@@ -354,11 +355,11 @@ public class Debug extends AbstractElementProcessor {
 
         final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED);
         specificationMembers(view, "Fields", fields);
-        final List<ObjectAction> userActions = spec.getObjectActions(ActionType.USER, Contributed.INCLUDED);
+        final List<ObjectAction> userActions = spec.getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
         specificationMembers(view, "User Actions", userActions);
-        specificationMembers(view, "Exploration Actions", spec.getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED));
-        specificationMembers(view, "Prototype Actions", spec.getObjectActions(ActionType.PROTOTYPE, Contributed.INCLUDED));
-        specificationMembers(view, "Debug Actions", spec.getObjectActions(ActionType.DEBUG, Contributed.INCLUDED));
+        specificationMembers(view, "Exploration Actions", spec.getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, Filters.<ObjectAction>any()));
+        specificationMembers(view, "Prototype Actions", spec.getObjectActions(ActionType.PROTOTYPE, Contributed.INCLUDED, Filters.<ObjectAction>any()));
+        specificationMembers(view, "Debug Actions", spec.getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, Filters.<ObjectAction>any()));
         view.endSection();
 
         view.startSection("Fields");

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
index baeb58c..54ff196 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/Members.java
@@ -22,6 +22,7 @@ package org.apache.isis.viewer.scimpi.dispatcher.view.debug;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -80,7 +81,8 @@ public class Members extends AbstractElementProcessor {
                 }
             }
             request.appendHtml("   --------------\n");
-            final List<ObjectAction> actions = specification.getObjectActions(ActionType.USER, Contributed.INCLUDED);
+            final List<ObjectAction> actions = specification.getObjectActions(
+                    ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
             ;
             for (final ObjectAction action : actions) {
                 request.appendHtml("   " + action.getId() + " (");

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
index 2b4f22c..42ff3f6 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
@@ -408,7 +409,7 @@ class TestMethodExists extends Test {
     @Override
     boolean test(final Request request, final String attributeName, final String targetId) {
         final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
-        final List<? extends ObjectAction> objectActions = object.getSpecification().getObjectActions(ActionType.USER, Contributed.INCLUDED);
+        final List<? extends ObjectAction> objectActions = object.getSpecification().getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
         boolean methodExists = false;
         for (final ObjectAction objectAssociation : objectActions) {
             if (objectAssociation.getId().equals(attributeName)) {

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java
index 3626b86..e4cd4df 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java
@@ -29,6 +29,7 @@ import com.google.common.collect.Maps;
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
+import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.facets.named.NamedFacet;
@@ -143,7 +144,8 @@ public class AppActionsCssMenuFactory extends ComponentFactoryAbstract {
      */
     private static void collateServiceActions(final ObjectAdapter serviceAdapter, ActionType actionType, List<LogicalServiceAction> serviceActions) {
         final ObjectSpecification serviceSpec = serviceAdapter.getSpecification();
-        for (final ObjectAction objectAction : serviceSpec.getObjectActions(actionType, Contributed.INCLUDED)) {
+        for (final ObjectAction objectAction : serviceSpec.getObjectActions(
+                actionType, Contributed.INCLUDED, Filters.<ObjectAction>any())) {
             // skip if annotated to not be included in repository menu
             if (objectAction.getFacet(NotInServiceMenuFacet.class) != null) {
                 continue;

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index fa16d42..d808f00 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -160,7 +160,7 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
             objectActions.addAll(debugActions);
         }
 
-        List<ObjectAction> flattenedActions = ObjectActions.flattenedActions(objectActions);
+        List<ObjectAction> flattenedActions = objectActions;
         
         return Lists.newArrayList(Iterables.filter(flattenedActions, BULK));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
index f5da812..5cb0729 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
@@ -136,7 +136,7 @@ public class EntityHeaderPanel extends PanelAbstract<EntityModel> implements Act
         @SuppressWarnings("unchecked")
         final List<ObjectAction> userActions = adapterSpec.getObjectActions(actionType, Contributed.INCLUDED, 
                 Filters.and(memberOrderNameNotCollection(adapterSpec), dynamicallyVisibleFor(adapter)));
-        topLevelActions.addAll(ObjectActions.flattenedActions(userActions));
+        topLevelActions.addAll(userActions);
     }
     
     private Filter<ObjectAction> memberOrderNameNotCollection(final ObjectSpecification adapterSpec) {

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
index 7969a43..c5dd2cf 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
@@ -319,21 +319,6 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
     }
 
 
-    @SuppressWarnings("unused")
-    private static List<ObjectAction> findServiceActionsFor(final ObjectSpecification scalarTypeSpec) {
-        final List<ObjectAction> actionList = Lists.newArrayList();
-        addServiceActionsFor(scalarTypeSpec, ActionType.USER, actionList);
-        if (IsisContext.getDeploymentType() == DeploymentType.EXPLORATION) {
-            addServiceActionsFor(scalarTypeSpec, ActionType.EXPLORATION, actionList);
-        }
-        return actionList;
-    }
-
-    private static void addServiceActionsFor(final ObjectSpecification noSpec, final ActionType actionType, final List<ObjectAction> actionList) {
-        final List<ObjectAction> serviceActionsFor = noSpec.getServiceActionsReturning(actionType);
-        actionList.addAll(serviceActionsFor);
-    }
-
     @Override
     public void onClick(final ActionModel actionModel) {
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
index f6c5fab..642fa8a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
@@ -308,20 +308,24 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
     
     @SuppressWarnings("unchecked")
     private static List<ObjectAssociation> propertiesOf(final ObjectSpecification objSpec) {
-        return objSpec.getAssociations(Contributed.EXCLUDED, Filters.and(ObjectAssociationFilters.PROPERTIES,  ObjectAssociationFilters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE));
+        return objSpec.getAssociations(Contributed.EXCLUDED, 
+                Filters.and(ObjectAssociation.Filters.PROPERTIES, 
+                            ObjectAssociation.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE));
     }
     @SuppressWarnings("unchecked")
     private static List<ObjectAssociation> collectionsOf(final ObjectSpecification objSpec) {
-        return objSpec.getAssociations(Contributed.EXCLUDED, Filters.and(ObjectAssociationFilters.COLLECTIONS, ObjectAssociationFilters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE));
+        return objSpec.getAssociations(Contributed.EXCLUDED, 
+                Filters.and(ObjectAssociation.Filters.COLLECTIONS, 
+                            ObjectAssociation.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE));
     }
     private static List<ObjectAction> actionsOf(final ObjectSpecification objSpec, final Set<String> excludedActionIds) {
-        return objSpec.getObjectActions(ActionType.ALL_EXCEPT_SET, Contributed.INCLUDED, staticallyVisibleExcluding(excludedActionIds));
+        return objSpec.getObjectActions(ActionType.ALL, Contributed.INCLUDED, staticallyVisibleExcluding(excludedActionIds));
     }
 
     @SuppressWarnings("unchecked")
     private static Filter<ObjectAction> staticallyVisibleExcluding(final Set<String> excludedActionIds) {
         return Filters.and(
-                ObjectActionFilters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE, 
+                ObjectAction.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE, 
                 new Filter<ObjectAction>(){
                     @Override
                     public boolean accept(ObjectAction t) {

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java
index ea5eed9..d8a4016 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ActionType.java
@@ -51,5 +51,5 @@ public enum ActionType {
         return this == USER;
     }
 
-    public static final List<ActionType> ALL_EXCEPT_SET = Arrays.asList(values());
+    public static final List<ActionType> ALL = Arrays.asList(values());
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
----------------------------------------------------------------------
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 b8899e3..f3e2a6b 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
@@ -22,15 +22,20 @@ package org.apache.isis.core.metamodel.spec.feature;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetFilters;
 import org.apache.isis.core.metamodel.interactions.AccessContext;
 import org.apache.isis.core.metamodel.interactions.ActionInvocationContext;
+import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.progmodel.facets.actions.bulk.BulkFacet;
 
 public interface ObjectAction extends ObjectMember {
 
@@ -166,4 +171,66 @@ public interface ObjectAction extends ObjectMember {
     ObjectAdapter[][] getChoices(ObjectAdapter target);
 
 
+    // //////////////////////////////////////////////////////
+    // Filters
+    // //////////////////////////////////////////////////////
+
+    public static class Filters {
+        
+        private Filters(){}
+        
+        public static final Filter<ObjectAction> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = new Filter<ObjectAction>() {
+            @Override
+            public boolean accept(final ObjectAction action) {
+                return !action.isAlwaysHidden();
+            }
+        };
+
+        public static Filter<ObjectAction> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
+            return new Filter<ObjectAction>() {
+                @Override
+                public boolean accept(final ObjectAction objectAction) {
+                    final Consent visible = objectAction.isVisible(session, target, where);
+                    return visible.isAllowed();
+                }
+            };
+        }
+
+        public static Filter<ObjectAction> withId(final String actionId) {
+            return new Filter<ObjectAction>(){
+                @Override
+                public boolean accept(ObjectAction objectAction) {
+                    return objectAction.getId().equals(actionId);
+                }
+            };
+        }
+
+        public static Filter<ObjectAction> withNoValidationRules() {
+            return new Filter<ObjectAction>(){
+                @Override
+                public boolean accept(final ObjectAction objectAction) {
+                    final List<Facet> validatingFacets = objectAction.getFacets(FacetFilters.isA(ValidatingInteractionAdvisor.class));
+                    return validatingFacets.isEmpty();
+                }};
+        }
+
+        public static Filter<ObjectAction> ofType(final ActionType type) {
+            return new Filter<ObjectAction>(){
+                @Override
+                public boolean accept(ObjectAction oa) {
+                    return oa.getType() == type;
+                }
+            };
+        }
+
+        public static Filter<ObjectAction> bulk() {
+            return new Filter<ObjectAction>(){
+
+                @Override
+                public boolean accept(ObjectAction oa) {
+                    return oa.containsDoOpFacet(BulkFacet.class);
+                }};
+        }
+        
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
----------------------------------------------------------------------
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 378a816..1c6b00e 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
@@ -62,25 +62,11 @@ public interface ObjectActionContainer {
      * Returns an array of actions of the specified type, including or excluding
      * contributed actions as required.
      */
-    List<ObjectAction> getObjectActions(ActionType type, Contributed contributed);
+    List<ObjectAction> getObjectActions(ActionType type, Contributed contributee, Filter<ObjectAction> filter);
 
-    List<ObjectAction> getObjectActions(ActionType type, Contributed contributed, Filter<ObjectAction> filter);
+    List<ObjectAction> getObjectActions(List<ActionType> types, Contributed contributee, Filter<ObjectAction> filter);
 
-    /**
-     * Returns an array of actions of the specified types, including or
-     * excluding contributed actions as required.
-     */
-    List<ObjectAction> getObjectActions(List<ActionType> types, Contributed contributed);
-
-    List<ObjectAction> getObjectActions(List<ActionType> requestedTypes, Contributed contributed, Filter<ObjectAction> filter);
-
-    /**
-     * Returns a list of all object actions, including or excluding contributed
-     * actions as required.
-     */
-    List<ObjectAction> getObjectActions(Contributed contributed);
-
-    List<ObjectAction> getServiceActionsReturning(ActionType type);
+    List<ObjectAction> getObjectActions(Contributed contributee);
 
     List<ObjectAction> getServiceActionsReturning(List<ActionType> type);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java
index 1114bd6..37036c0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java
@@ -18,83 +18,41 @@
  */
 package org.apache.isis.core.metamodel.spec.feature;
 
-import java.util.List;
-
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetFilters;
-import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
 import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.progmodel.facets.actions.bulk.BulkFacet;
 
 public class ObjectActionFilters {
+    
+    private ObjectActionFilters(){}
 
-    public static final Filter<ObjectAction> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = new Filter<ObjectAction>() {
-        @Override
-        public boolean accept(final ObjectAction action) {
-            return !action.isAlwaysHidden();
-        }
-    };
+    @Deprecated
+    public static final Filter<ObjectAction> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = ObjectAction.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE;
 
+    @Deprecated
     public static Filter<ObjectAction> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
-        return new Filter<ObjectAction>() {
-            @Override
-            public boolean accept(final ObjectAction objectAction) {
-                final Consent visible = objectAction.isVisible(session, target, where);
-                return visible.isAllowed();
-            }
-        };
+        return ObjectAction.Filters.dynamicallyVisible(session, target, where);
     }
 
+    @Deprecated
     public static Filter<ObjectAction> withId(final String actionId) {
-        return new Filter<ObjectAction>(){
-            @Override
-            public boolean accept(ObjectAction objectAction) {
-                return objectAction.getId().equals(actionId);
-            }
-        };
+        return ObjectAction.Filters.withId(actionId);
     }
 
+    @Deprecated
     public static Filter<ObjectAction> withNoValidationRules() {
-        return new Filter<ObjectAction>(){
-            @Override
-            public boolean accept(final ObjectAction objectAction) {
-                final List<Facet> validatingFacets = objectAction.getFacets(FacetFilters.isA(ValidatingInteractionAdvisor.class));
-                return validatingFacets.isEmpty();
-            }};
+        return ObjectAction.Filters.withNoValidationRules();
     }
 
-//    public static Filter<ObjectAction> contributedAnd1ParamAndVoid() {
-//        return new Filter<ObjectAction>(){
-//            @Override
-//            public boolean accept(final ObjectAction objectAction) {
-//                boolean contributed = objectAction.isContributed();
-//                boolean has1Param = objectAction.getParameterCount() == 1;
-//                boolean hasReturn = objectAction.hasReturn();
-//                return contributed && has1Param && !hasReturn;
-//            }
-//        };
-//    }
-
+    @Deprecated
     public static Filter<ObjectAction> filterOfType(final ActionType type) {
-        return new Filter<ObjectAction>(){
-            @Override
-            public boolean accept(ObjectAction oa) {
-                return oa.getType() == type;
-            }
-        };
+        return ObjectAction.Filters.ofType(type);
     }
 
+    @Deprecated
     public static Filter<ObjectAction> bulk() {
-        return new Filter<ObjectAction>(){
-
-            @Override
-            public boolean accept(ObjectAction oa) {
-                return oa.containsDoOpFacet(BulkFacet.class);
-            }};
+        return ObjectAction.Filters.bulk();
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java
index 3dd3221..2889e57 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java
@@ -45,10 +45,6 @@ public final class ObjectActions {
         return "(no name)";
     }
 
-    public static List<ObjectAction> flattenedActions(final List<ObjectAction> objectActions) {
-        return objectActions;
-    }
-
     public static Filter<ObjectAction> memberOrderOf(ObjectAssociation association) {
         final String assocName = association.getName();
         final String assocId = association.getId();

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
index e19897f..284b1b9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
@@ -19,7 +19,14 @@
 
 package org.apache.isis.core.metamodel.spec.feature;
 
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 
 /**
  * Provides reflective access to a field on a domain object.
@@ -85,4 +92,131 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
     boolean isMandatory();
 
 
+    
+    // //////////////////////////////////////////////////////
+    // Filters
+    // //////////////////////////////////////////////////////
+
+    
+    public static class Filters {
+
+        private Filters() {
+        }
+
+        /**
+         * Filters only fields that are for properties (ie 1:1 associations)
+         */
+        public final static Filter<ObjectAssociation> PROPERTIES = new Filter<ObjectAssociation>() {
+            @Override
+            public boolean accept(final ObjectAssociation association) {
+                return association.isOneToOneAssociation();
+            }
+        };
+
+        /**
+         * Filters only fields that are for reference properties (ie 1:1 associations)
+         */
+        public final static Filter<ObjectAssociation> REFERENCE_PROPERTIES = new Filter<ObjectAssociation>() {
+            @Override
+            public boolean accept(final ObjectAssociation association) {
+                return association.isOneToOneAssociation() && 
+                       !association.getSpecification().containsDoOpFacet(ValueFacet.class);
+            }
+        };
+        
+        /**
+         * Filters only fields that are for properties (ie 1:1 associations)
+         */
+        public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_COLLECTION_TABLE = new Filter<ObjectAssociation>() {
+            @Override
+            public boolean accept(final ObjectAssociation association) {
+                final HiddenFacet hiddenFacet = association.getFacet(HiddenFacet.class);
+                return hiddenFacet == null || !hiddenFacet.where().inParentedTable();
+            }
+        };
+
+        /**
+         * Filters only fields that are for properties (ie 1:1 associations)
+         */
+        public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_STANDALONE_TABLE = new Filter<ObjectAssociation>() {
+            @Override
+            public boolean accept(final ObjectAssociation association) {
+                final HiddenFacet hiddenFacet = association.getFacet(HiddenFacet.class);
+                return hiddenFacet == null || !hiddenFacet.where().inStandaloneTable();
+            }
+        };
+
+        /**
+         * Returns all fields (that is, filters out nothing).
+         */
+        public final static Filter<ObjectAssociation> ALL = new Filter<ObjectAssociation>() {
+            @Override
+            public boolean accept(final ObjectAssociation property) {
+                return true;
+            }
+        };
+
+        /**
+         * Filters only fields that are for collections (ie 1:m associations)
+         */
+        public final static Filter<ObjectAssociation> COLLECTIONS = new Filter<ObjectAssociation>() {
+            @Override
+            public boolean accept(final ObjectAssociation property) {
+                return property.isOneToManyAssociation();
+            }
+        };
+
+        /**
+         * Filters only properties that are visible statically, ie have not been
+         * unconditionally hidden at compile time.
+         * 
+         * <p>
+         * Note this list will include
+         * properties marked as hidden once persisted and until persisted, but not
+         * those marked hidden always.
+         */
+        public static final Filter<ObjectAssociation> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = new Filter<ObjectAssociation>() {
+            @Override
+            public boolean accept(final ObjectAssociation property) {
+                return !property.isAlwaysHidden();
+            }
+        };
+
+        public static final Filter<ObjectAssociation> staticallyVisible(final Where context) {
+            return new Filter<ObjectAssociation>() {
+                @Override
+                public boolean accept(final ObjectAssociation association) {
+                    final HiddenFacet facet = association.getFacet(HiddenFacet.class);
+                    if(facet == null) {
+                        return true;
+                    }
+                    return !(facet.where().includes(context) && facet.when() == When.ALWAYS);
+                }
+            };
+        }
+
+        
+        public static Filter<ObjectAssociation> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
+            return new Filter<ObjectAssociation>() {
+                @Override
+                public boolean accept(final ObjectAssociation objectAssociation) {
+                    final Consent visible = objectAssociation.isVisible(session, target, where);
+                    return visible.isAllowed();
+                }
+            };
+        }
+
+
+        public static Filter<ObjectAssociation> enabled(final AuthenticationSession session, final ObjectAdapter adapter, final Where where) {
+            return new Filter<ObjectAssociation>() {
+                @Override
+                public boolean accept(final ObjectAssociation objectAssociation) {
+                    final Consent usable = objectAssociation.isUsable(session, adapter, where);
+                    return usable.isAllowed();
+                }
+            };
+        }
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
index 59da48d..376fa63 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
@@ -20,132 +20,50 @@
 package org.apache.isis.core.metamodel.spec.feature;
 
 
-import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 
 public class ObjectAssociationFilters {
 
     private ObjectAssociationFilters() {
     }
 
-    /**
-     * Filters only fields that are for properties (ie 1:1 associations)
-     */
-    public final static Filter<ObjectAssociation> PROPERTIES = new Filter<ObjectAssociation>() {
-        @Override
-        public boolean accept(final ObjectAssociation association) {
-            return association.isOneToOneAssociation();
-        }
-    };
+    @Deprecated
+    public final static Filter<ObjectAssociation> PROPERTIES = ObjectAssociation.Filters.PROPERTIES;
 
-    /**
-     * Filters only fields that are for reference properties (ie 1:1 associations)
-     */
-    public final static Filter<ObjectAssociation> REFERENCE_PROPERTIES = new Filter<ObjectAssociation>() {
-        @Override
-        public boolean accept(final ObjectAssociation association) {
-            return association.isOneToOneAssociation() && 
-                   !association.getSpecification().containsDoOpFacet(ValueFacet.class);
-        }
-    };
+    @Deprecated
+    public final static Filter<ObjectAssociation> REFERENCE_PROPERTIES = ObjectAssociation.Filters.REFERENCE_PROPERTIES;
     
-    /**
-     * Filters only fields that are for properties (ie 1:1 associations)
-     */
-    public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_COLLECTION_TABLE = new Filter<ObjectAssociation>() {
-        @Override
-        public boolean accept(final ObjectAssociation association) {
-            final HiddenFacet hiddenFacet = association.getFacet(HiddenFacet.class);
-            return hiddenFacet == null || !hiddenFacet.where().inParentedTable();
-        }
-    };
+    @Deprecated
+    public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_COLLECTION_TABLE = ObjectAssociation.Filters.WHERE_VISIBLE_IN_COLLECTION_TABLE;
 
-    /**
-     * Filters only fields that are for properties (ie 1:1 associations)
-     */
-    public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_STANDALONE_TABLE = new Filter<ObjectAssociation>() {
-        @Override
-        public boolean accept(final ObjectAssociation association) {
-            final HiddenFacet hiddenFacet = association.getFacet(HiddenFacet.class);
-            return hiddenFacet == null || !hiddenFacet.where().inStandaloneTable();
-        }
-    };
+    @Deprecated
+    public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_STANDALONE_TABLE = ObjectAssociation.Filters.WHERE_VISIBLE_IN_STANDALONE_TABLE;
 
-    /**
-     * Returns all fields (that is, filters out nothing).
-     */
-    public final static Filter<ObjectAssociation> ALL = new Filter<ObjectAssociation>() {
-        @Override
-        public boolean accept(final ObjectAssociation property) {
-            return true;
-        }
-    };
+    @Deprecated
+    public final static Filter<ObjectAssociation> ALL = ObjectAssociation.Filters.ALL;
 
-    /**
-     * Filters only fields that are for collections (ie 1:m associations)
-     */
-    public final static Filter<ObjectAssociation> COLLECTIONS = new Filter<ObjectAssociation>() {
-        @Override
-        public boolean accept(final ObjectAssociation property) {
-            return property.isOneToManyAssociation();
-        }
-    };
+    @Deprecated
+    public final static Filter<ObjectAssociation> COLLECTIONS = ObjectAssociation.Filters.COLLECTIONS;
 
-    /**
-     * Filters only properties that are visible statically, ie have not been
-     * unconditionally hidden at compile time.
-     * 
-     * <p>
-     * Note this list will include
-     * properties marked as hidden once persisted and until persisted, but not
-     * those marked hidden always.
-     */
-    public static final Filter<ObjectAssociation> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = new Filter<ObjectAssociation>() {
-        @Override
-        public boolean accept(final ObjectAssociation property) {
-            return !property.isAlwaysHidden();
-        }
-    };
+    @Deprecated
+    public static final Filter<ObjectAssociation> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = ObjectAssociation.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE;
 
+    @Deprecated
     public static final Filter<ObjectAssociation> staticallyVisible(final Where context) {
-        return new Filter<ObjectAssociation>() {
-            @Override
-            public boolean accept(final ObjectAssociation association) {
-                final HiddenFacet facet = association.getFacet(HiddenFacet.class);
-                if(facet == null) {
-                    return true;
-                }
-                return !(facet.where().includes(context) && facet.when() == When.ALWAYS);
-            }
-        };
+        return ObjectAssociation.Filters.staticallyVisible(context);
     }
 
-    
+    @Deprecated
     public static Filter<ObjectAssociation> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
-        return new Filter<ObjectAssociation>() {
-            @Override
-            public boolean accept(final ObjectAssociation objectAssociation) {
-                final Consent visible = objectAssociation.isVisible(session, target, where);
-                return visible.isAllowed();
-            }
-        };
+        return ObjectAssociation.Filters.dynamicallyVisible(session, target, where);
     }
 
-
+    @Deprecated
     public static Filter<ObjectAssociation> enabled(final AuthenticationSession session, final ObjectAdapter adapter, final Where where) {
-        return new Filter<ObjectAssociation>() {
-            @Override
-            public boolean accept(final ObjectAssociation objectAssociation) {
-                final Consent usable = objectAssociation.isUsable(session, adapter, where);
-                return usable.isAllowed();
-            }
-        };
+        return ObjectAssociation.Filters.enabled(session, adapter, where);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index c48bfc8..a8da35e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -51,6 +51,7 @@ import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.JavaClassUtils;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ServicesProvider;
+import org.apache.isis.core.metamodel.adapter.ServicesProviderAbstract;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.util.InvokeUtils;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -527,7 +528,13 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
 
         final AuthenticationSessionProvider authenticationSessionProvider = getRuntimeContext().getAuthenticationSessionProvider();
         final SpecificationLoader specificationLookup = getRuntimeContext().getSpecificationLoader();
-        final ServicesProvider servicesProvider = getRuntimeContext().getServicesProvider();
+        final ServicesProvider servicesProvider = getRuntimeContext().getServicesProvider();/* new ServicesProviderAbstract(){
+
+            @Override
+            public List<ObjectAdapter> getServices() {
+                return ObjectReflectorDefault.this.services;
+            }
+        };*/
         final ObjectInstantiator objectInstantiator = getRuntimeContext().getObjectInstantiator();
 
         // create contexts as inputs ...

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java
index 34f2ce8..7f5d04a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java
@@ -16,15 +16,48 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.notpersisted.NotPersistedFacet;
-import org.apache.isis.core.metamodel.facets.notpersisted.NotPersistedFacetAbstract;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext;
+import com.google.common.base.Predicate;
+
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+
 
 /**
  * Marker interface indicating an a contributed association or action.
  */
-public interface ContributeeMember { 
+public interface ContributeeMember {
+    
+    public static class Predicates {
+        
+        private Predicates(){}
+        
+        /**
+         * Evaluates the supplied {@link ObjectMember} and includes either if it is not a {@link ContributeeMember}
+         * (ie is a regular member) or is a {@link ContributeeMember} and contributed are to be
+         * {@link Contributed#isIncluded() included}.  
+         */
+        public static <T extends ObjectMember> Predicate<T> regularElse(final Contributed contributed) {
+            return com.google.common.base.Predicates.or(regular(), is(contributed));
+        }
+        
+        public static <T extends ObjectMember> Predicate<T> regular() {
+            return new Predicate<T>() {
+                @Override
+                public boolean apply(ObjectMember input) {
+                    return !(input instanceof ContributeeMember);
+                }
+            };
+        }
+
+        public static <T extends ObjectMember> Predicate<T> is(final Contributed contributed) {
+            return new Predicate<T>() {
+                @Override
+                public boolean apply(ObjectMember input) {
+                    return input instanceof ContributeeMember && contributed.isIncluded();
+                }
+            };
+        }
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
----------------------------------------------------------------------
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 5cd2583..ce2608c 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
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.google.common.base.Function;
+import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -89,6 +90,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -132,15 +134,12 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     private final List<ObjectSpecification> interfaces = Lists.newArrayList();
     private final SubclassList subclasses = new SubclassList();
 
-    /**
-     * Lazily initialized in {@link #getContributedAssociations()}.
-     */
-    private List<ObjectAssociation> contributedAssociations;
+    private List<ObjectAssociation> contributeeAssociations;
 
     /**
-     * Lazily populated in {@link #getContributedActions(ActionType)}.
+     * Lazily populated in {@link #getContributeeActions(ActionType)}.
      */
-    private final Map<ActionType, List<ObjectAction>> contributedActionSetsByType = Maps.newLinkedHashMap();
+    private final Map<ActionType, List<ObjectAction>> contributeeActionsByType = Maps.newLinkedHashMap();
 
     private final Class<?> correspondingClass;
     private final String fullName;
@@ -653,15 +652,17 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     // //////////////////////////////////////////////////////////////////////
 
     @Override
-    public List<ObjectAssociation> getAssociations(final Contributed contributed) {
+    public List<ObjectAssociation> getAssociations(final Contributed contributee) {
         List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
-        if(contributed.isIncluded()) {
-            associations.addAll(getContributedAssociations());
+        if(contributee.isIncluded()) {
+            associations.addAll(getContributeeAssociations());
         }
-        return associations;
+        return Lists.newArrayList(Iterables.filter(
+                associations, ContributeeMember.Predicates.regularElse(contributee)));
     }
 
 
+
     /**
      * The association with the given {@link ObjectAssociation#getId() id}.
      * 
@@ -703,72 +704,56 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     @Override
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public List<OneToManyAssociation> getCollections(Contributed contributed) {
-        final List list = getAssociations(contributed, ObjectAssociationFilters.COLLECTIONS);
+        final List list = getAssociations(contributed, ObjectAssociation.Filters.COLLECTIONS);
         return list;
     }
 
     // //////////////////////////////////////////////////////////////////////
-    // getObjectAction, getAction, getActions
+    // getObjectActions
     // //////////////////////////////////////////////////////////////////////
 
     @Override
-    public List<ObjectAction> getObjectActions(final Contributed contributed) {
-
-        // REVIEW: this if/else below almost certainly isn't required;
-        // can probably just replace with:
-        //
-        // return getObjectActions(ActionType.ALL_EXCEPT_SET, contributed);
-
-        if (contributed.isExcluded()) {
-            return Collections.unmodifiableList(objectActions);
-        } else {
-            return getObjectActions(ActionType.ALL_EXCEPT_SET, Contributed.INCLUDED);
-        }
+    public List<ObjectAction> getObjectActions(
+            final Contributed contributed) {
+        return getObjectActions(ActionType.ALL, contributed, Filters.<ObjectAction>any());
     }
 
     @Override
-    public List<ObjectAction> getObjectActions(final List<ActionType> requestedTypes, final Contributed contributed) {
-        return getObjectActions(requestedTypes, contributed, Filters.<ObjectAction>any());
+    public List<ObjectAction> getObjectActions(
+            final ActionType type, 
+            final Contributed contributed, 
+            final Filter<ObjectAction> filter) {
+        return getObjectActions(Collections.singletonList(type), contributed, filter);
     }
 
     @Override
-    public List<ObjectAction> getObjectActions(final List<ActionType> requestedTypes, final Contributed contributed, Filter<ObjectAction> filter) {
+    public List<ObjectAction> getObjectActions(
+            final List<ActionType> types,
+            final Contributed contributed, 
+            final Filter<ObjectAction> filter) {
         final List<ObjectAction> actions = Lists.newArrayList();
-        for (final ActionType type : requestedTypes) {
+        for (final ActionType type : types) {
             addActions(type, contributed, filter, actions);
         }
-        return actions;
-    }
-
-    @Override
-    public List<ObjectAction> getObjectActions(final ActionType type, final Contributed contributed) {
-        return getObjectActions(type, contributed, Filters.<ObjectAction>any());
-    }
-
-    @Override
-    public List<ObjectAction> getObjectActions(final ActionType type, final Contributed contributed, Filter<ObjectAction> filter) {
-        final List<ObjectAction> actions = Lists.newArrayList();
-        return addActions(type, contributed, filter, actions);
+        return Lists.newArrayList(Iterables.filter(
+                actions, ContributeeMember.Predicates.regularElse(contributed)));
     }
 
-    private List<ObjectAction> addActions(final ActionType type, final Contributed contributed, final Filter<ObjectAction> filter, final List<ObjectAction> actionListToAppendTo) {
-        if (!isService() && contributed.isIncluded()) {
-            actionListToAppendTo.addAll(getContributedActions(type, filter));
+    private List<ObjectAction> addActions(final ActionType type, final Contributed contributee, final Filter<ObjectAction> filter, final List<ObjectAction> actionListToAppendTo) {
+        if(contributee.isIncluded()) {
+            actionListToAppendTo.addAll(getContributeeActions(type, filter));
         }
-        actionListToAppendTo.addAll(getFlattenedActions(objectActions, type, filter));
+        actionListToAppendTo.addAll(filterActions(objectActions, type, filter));
         return actionListToAppendTo;
     }
 
     @SuppressWarnings("unchecked")
-    private static List<ObjectAction> getFlattenedActions(final List<ObjectAction> objectActions, final ActionType type, final Filter<ObjectAction> filter) {
-        final List<ObjectAction> actions = ObjectActions.flattenedActions(objectActions);
-        return Lists.newArrayList(Iterables.filter(actions, Filters.asPredicate(Filters.and(ObjectActionFilters.filterOfType(type), filter))));
+    private static List<ObjectAction> filterActions(final List<ObjectAction> objectActions, final ActionType type, final Filter<ObjectAction> filter) {
+        return Lists.newArrayList(Iterables.filter(
+                objectActions, 
+                Filters.asPredicate(Filters.and(ObjectAction.Filters.ofType(type), filter))));
     }
 
-    @Override
-    public List<ObjectAction> getServiceActionsReturning(final ActionType type) {
-        return getServiceActionsReturning(Collections.singletonList(type));
-    }
 
     @Override
     public List<ObjectAction> getServiceActionsReturning(final List<ActionType> types) {
@@ -783,7 +768,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     private void appendServiceActionsReturning(final ObjectAdapter serviceAdapter, final List<ActionType> types, final List<ObjectAction> relatedActionsToAppendTo) {
         final List<ObjectAction> matchingActionsToAppendTo = Lists.newArrayList();
         for (final ActionType type : types) {
-            final List<ObjectAction> serviceActions = serviceAdapter.getSpecification().getObjectActions(type, Contributed.INCLUDED);
+            final List<ObjectAction> serviceActions = serviceAdapter.getSpecification().getObjectActions(type, Contributed.INCLUDED, Filters.<ObjectAction>any());
             for (final ObjectAction serviceAction : serviceActions) {
                 addIfReturnsSubtype(serviceAction, matchingActionsToAppendTo);
             }
@@ -815,43 +800,44 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     
     // //////////////////////////////////////////////////////////////////////
-    // contributed associations (properties and collections)
+    // contributee associations (properties and collections)
     // //////////////////////////////////////////////////////////////////////
 
-    private List<ObjectAssociation> getContributedAssociations() {
+    private List<ObjectAssociation> getContributeeAssociations() {
         if (isService()) {
             return Collections.emptyList();
         }
-        if (contributedAssociations == null) {
-            contributedAssociations = Lists.newArrayList();
+        if (contributeeAssociations == null) {
+            contributeeAssociations = Lists.newArrayList();
             final List<ObjectAdapter> services = getServicesProvider().getServices();
             for (final ObjectAdapter serviceAdapter : services) {
-                addContributedAssociationsIfAny(serviceAdapter, contributedAssociations);
+                addContributeeAssociationsIfAny(serviceAdapter, contributeeAssociations);
             }
         }
-        return contributedAssociations;
+        return contributeeAssociations;
     }
 
-    private void addContributedAssociationsIfAny(final ObjectAdapter serviceAdapter, final List<ObjectAssociation> contributedAssociationsToAppendTo) {
+    private void addContributeeAssociationsIfAny(
+            final ObjectAdapter serviceAdapter, 
+            final List<ObjectAssociation> contributeeAssociationsToAppendTo) {
         final ObjectSpecification specification = serviceAdapter.getSpecification();
         if (specification == this) {
             return;
         }
-        final List<ObjectAssociation> contributedAssociations = findContributedAssociations(serviceAdapter);
-        contributedAssociationsToAppendTo.addAll(contributedAssociations);
+        final List<ObjectAssociation> contributeeAssociations = findContributeeAssociations(serviceAdapter);
+        contributeeAssociationsToAppendTo.addAll(contributeeAssociations);
     }
 
     /**
      * Synthesises {@link ObjectAssociation}s from matching {@link ObjectAction}s of any of the services
      * that accept one parameter
      */
-    private List<ObjectAssociation> findContributedAssociations(final ObjectAdapter serviceAdapter) {
+    private List<ObjectAssociation> findContributeeAssociations(final ObjectAdapter serviceAdapter) {
         
         final ObjectSpecification specification = serviceAdapter.getSpecification();
-        
         final List<ObjectAction> serviceActions = specification.getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
         
-        final List<ObjectActionImpl> contributingActions = Lists.newArrayList();
+        final List<ObjectActionImpl> contributedActions = Lists.newArrayList();
         for (final ObjectAction serviceAction : serviceActions) {
             if (serviceAction.isAlwaysHidden()) {
                 continue;
@@ -869,11 +855,10 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             if(!(serviceAction instanceof ObjectActionImpl)) {
                 continue;
             }
-            ObjectActionImpl objectActionImpl = (ObjectActionImpl) serviceAction;
-            contributingActions.add(objectActionImpl);
+            contributedActions.add((ObjectActionImpl) serviceAction);
         }
         
-        return Lists.newArrayList(Iterables.transform(contributingActions, new Function<ObjectActionImpl, ObjectAssociation>(){
+        return Lists.newArrayList(Iterables.transform(contributedActions, new Function<ObjectActionImpl, ObjectAssociation>(){
             @Override
             public ObjectAssociation apply(ObjectActionImpl input) {
                 final ObjectSpecification returnType = input.getReturnType();
@@ -888,46 +873,42 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
 
     // //////////////////////////////////////////////////////////////////////
-    // contributed actions
+    // contributee actions
     // //////////////////////////////////////////////////////////////////////
 
     /**
-     * Finds all service actions that contribute to this spec, if any.
+     * All contributee actions (each wrapping a service's contributed action) for this spec;
+     * these are lazily created and then cached.
      * 
      * <p>
      * If this specification {@link #isService() is actually for} a service,
-     * then returns an empty array.
-     * @param filter TODO
-     * 
-     * @return an array of {@link ObjectActionSet}s (!!), each of which contains
-     *         {@link ObjectAction}s of the requested type.
-     * 
+     * then returns an empty list.
      */
-    protected List<ObjectAction> getContributedActions(final ActionType actionType, Filter<ObjectAction> filter) {
-        List<ObjectAction> contributedActionSets = getContributedActions(actionType);
-        return Lists.newArrayList(Iterables.filter(contributedActionSets, Filters.asPredicate(filter)));
-    }
-
-    private List<ObjectAction> getContributedActions(final ActionType actionType) {
+    protected List<ObjectAction> getContributeeActions(final ActionType actionType, Filter<ObjectAction> filter) {
         if (isService()) {
             return Collections.emptyList();
         }
-        List<ObjectAction> contributedActionSets = contributedActionSetsByType.get(actionType);
-        if (contributedActionSets == null) {
-            contributedActionSets = Lists.newArrayList();
-            contributedActionSetsByType.put(actionType, contributedActionSets);
+        List<ObjectAction> contributedActionSets = getContributeeActions(actionType);
+        return Lists.newArrayList(Iterables.filter(contributedActionSets, Filters.asPredicate(filter)));
+    }
+
+    private List<ObjectAction> getContributeeActions(final ActionType actionType) {
+        List<ObjectAction> contributeeActions = contributeeActionsByType.get(actionType);
+        if (contributeeActions == null) {
+            contributeeActions = Lists.newArrayList();
+            contributeeActionsByType.put(actionType, contributeeActions);
             
             // populate an ActionSet with all actions contributed by each
             // service
             final List<ObjectAdapter> services = getServicesProvider().getServices();
             for (final ObjectAdapter serviceAdapter : services) {
-                addContributedActionsIfAny(serviceAdapter, actionType, contributedActionSets);
+                addContributeeActionsIfAny(serviceAdapter, actionType, contributeeActions);
             }
         }
-        return contributedActionSets;
+        return contributeeActions;
     }
 
-    private void addContributedActionsIfAny(final ObjectAdapter serviceAdapter, final ActionType actionType, final List<ObjectAction> contributedActionsToAppendTo) {
+    private void addContributeeActionsIfAny(final ObjectAdapter serviceAdapter, final ActionType actionType, final List<ObjectAction> contributeeActionsToAppendTo) {
         final ObjectSpecification specification = serviceAdapter.getSpecification();
         if (specification == this) {
             return;
@@ -945,21 +926,21 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             if(!(serviceAction instanceof ObjectActionImpl)) {
                 continue;
             }
-            ObjectActionImpl serviceActionImpl = (ObjectActionImpl) serviceAction;
+            ObjectActionImpl contributedAction = (ObjectActionImpl) serviceAction;
         
             // see if qualifies by inspecting all parameters
-            final int contributeeParam = contributeeParameterMatchOf(serviceActionImpl);
+            final int contributeeParam = contributeeParameterMatchOf(contributedAction);
             if (contributeeParam != -1) {
-                ObjectActionContributee contributee = 
-                        new ObjectActionContributee(serviceAdapter, serviceActionImpl, contributeeParam, this, objectMemberContext);
-                contributeeActions.add(contributee);
+                ObjectActionContributee contributeeAction = 
+                        new ObjectActionContributee(serviceAdapter, contributedAction, contributeeParam, this, objectMemberContext);
+                contributeeActions.add(contributeeAction);
             }
         }
         // only add if there are matching subactions.
         if (contributeeActions.isEmpty()) {
             return;
         }
-        contributedActionsToAppendTo.addAll(contributeeActions);
+        contributeeActionsToAppendTo.addAll(contributeeActions);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
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 e5b65e2..bc2940b 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
@@ -385,33 +385,31 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
     @Override
     public ObjectAction getObjectAction(final ActionType type, final String id, final List<ObjectSpecification> parameters) {
-        final List<ObjectAction> availableActions = ListUtils.combine(getObjectActions(Contributed.EXCLUDED), getContributedActions(type, Filters.<ObjectAction>any()));
-        return getAction(availableActions, type, id, parameters);
+        final List<ObjectAction> actions = 
+                getObjectActions(type, Contributed.INCLUDED, Filters.<ObjectAction>any());
+        return firstAction(actions, id, parameters);
     }
 
     @Override
     public ObjectAction getObjectAction(final ActionType type, final String id) {
-        final List<ObjectAction> availableActions = ListUtils.combine(getObjectActions(type, Contributed.INCLUDED), getContributedActions(type, Filters.<ObjectAction>any()));
-        return getAction(availableActions, type, id);
+        final List<ObjectAction> actions = 
+                getObjectActions(type, Contributed.INCLUDED, Filters.<ObjectAction>any()); 
+        return firstAction(actions, id);
     }
 
     @Override
     public ObjectAction getObjectAction(final String id) {
-        for (final ActionType type : ActionType.values()) {
-            final ObjectAction action = getObjectAction(type, id);
-            if (action != null) {
-                return action;
-            }
-        }
-        return null;
+        final List<ObjectAction> actions = 
+                getObjectActions(ActionType.ALL, Contributed.INCLUDED, Filters.<ObjectAction>any()); 
+        return firstAction(actions, id);
     }
 
-    private ObjectAction getAction(final List<ObjectAction> availableActions, final ActionType type, final String actionName, final List<ObjectSpecification> parameters) {
-        outer: for (int i = 0; i < availableActions.size(); i++) {
-            final ObjectAction action = availableActions.get(i);
-            if (!action.getType().equals(type)) {
-                continue outer;
-            }
+    private static ObjectAction firstAction(
+            final List<ObjectAction> candidateActions, 
+            final String actionName, 
+            final List<ObjectSpecification> parameters) {
+        outer: for (int i = 0; i < candidateActions.size(); i++) {
+            final ObjectAction action = candidateActions.get(i);
             if (actionName != null && !actionName.equals(action.getId())) {
                 continue outer;
             }
@@ -428,15 +426,14 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
         return null;
     }
 
-    private ObjectAction getAction(final List<ObjectAction> availableActions, final ActionType type, final String id) {
+    private static ObjectAction firstAction(
+            final List<ObjectAction> candidateActions, 
+            final String id) {
         if (id == null) {
             return null;
         }
-        for (int i = 0; i < availableActions.size(); i++) {
-            final ObjectAction action = availableActions.get(i);
-            if (!type.matchesTypeOf(action)) {
-                continue;
-            }
+        for (int i = 0; i < candidateActions.size(); i++) {
+            final ObjectAction action = candidateActions.get(i);
             if (id.equals(action.getIdentifier().toNameParmsIdentityString())) {
                 return action;
             }
@@ -514,7 +511,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
     }
 
     private void catalogueActions(final Map<Method, ObjectMember> membersByMethod) {
-        final List<ObjectAction> userActions = getObjectActions(ActionType.USER, Contributed.INCLUDED);
+        final List<ObjectAction> userActions = getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
         for (int i = 0; i < userActions.size(); i++) {
             final ObjectAction userAction = userActions.get(i);
             final List<Facet> facets = userAction.getFacets(ImperativeFacet.FILTER);

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java
index 2a28783..e87f760 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java
@@ -161,14 +161,6 @@ public class ObjectSpecificationForFreeStandingList extends ObjectSpecificationA
      * Review: is it necessary to override for this subclass?
      */
     @Override
-    public List<ObjectAction> getServiceActionsReturning(final ActionType type) {
-        return Collections.emptyList();
-    }
-
-    /**
-     * Review: is it necessary to override for this subclass?
-     */
-    @Override
     public List<ObjectAction> getServiceActionsReturning(final List<ActionType> type) {
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java
index 42c7553..3b2995e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java
@@ -24,6 +24,7 @@ import java.util.List;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.debug.DebugString;
@@ -42,7 +43,6 @@ import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 
 public final class Dump {
 
@@ -142,11 +142,6 @@ public final class Dump {
         debugBuilder.indent();
         specificationActionMethods(specification, debugBuilder);
         debugBuilder.unindent();
-
-        debugBuilder.appendln("Related Service Actions");
-        debugBuilder.indent();
-        specificationServiceMethods(specification, debugBuilder);
-        debugBuilder.unindent();
     }
 
     private static String[] specificationNames(final List<ObjectSpecification> specifications) {
@@ -159,22 +154,10 @@ public final class Dump {
 
     private static void specificationActionMethods(final ObjectSpecification specification, final DebugBuilder debugBuilder) {
         try {
-            final List<ObjectAction> userActions = specification.getObjectActions(ActionType.USER, Contributed.INCLUDED);
-            final List<ObjectAction> explActions = specification.getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED);
-            final List<ObjectAction> prototypeActions = specification.getObjectActions(ActionType.PROTOTYPE, Contributed.INCLUDED);
-            final List<ObjectAction> debActions = specification.getObjectActions(ActionType.DEBUG, Contributed.INCLUDED);
-            specificationMethods(userActions, explActions, prototypeActions, debActions, debugBuilder);
-        } catch (final RuntimeException e) {
-            debugBuilder.appendException(e);
-        }
-    }
-
-    private static void specificationServiceMethods(final ObjectSpecification specification, final DebugBuilder debugBuilder) {
-        try {
-            final List<ObjectAction> userActions = specification.getServiceActionsReturning(ActionType.USER);
-            final List<ObjectAction> explActions = specification.getServiceActionsReturning(ActionType.EXPLORATION);
-            final List<ObjectAction> prototypeActions = specification.getServiceActionsReturning(ActionType.PROTOTYPE);
-            final List<ObjectAction> debActions = specification.getServiceActionsReturning(ActionType.DEBUG);
+            final List<ObjectAction> userActions = specification.getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
+            final List<ObjectAction> explActions = specification.getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, Filters.<ObjectAction>any());
+            final List<ObjectAction> prototypeActions = specification.getObjectActions(ActionType.PROTOTYPE, Contributed.INCLUDED, Filters.<ObjectAction>any());
+            final List<ObjectAction> debActions = specification.getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, Filters.<ObjectAction>any());
             specificationMethods(userActions, explActions, prototypeActions, debActions, debugBuilder);
         } catch (final RuntimeException e) {
             debugBuilder.appendException(e);
@@ -190,7 +173,7 @@ public final class Dump {
         }
         debugBuilder.unindent();
 
-        final List<ObjectAssociation> fields2 = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE);
+        final List<ObjectAssociation> fields2 = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE);
         debugBuilder.appendln("Static");
         debugBuilder.indent();
         for (int i = 0; i < fields2.size(); i++) {

http://git-wip-us.apache.org/repos/asf/isis/blob/02340bfa/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
----------------------------------------------------------------------
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 779c1af..97c1a7a 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
@@ -123,11 +123,6 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     }
 
     @Override
-    public List<ObjectAction> getServiceActionsReturning(final ActionType type) {
-        return null;
-    }
-
-    @Override
     public List<ObjectAction> getServiceActionsReturning(final List<ActionType> types) {
         return null;
     }
@@ -224,11 +219,6 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     }
 
     @Override
-    public List<ObjectAction> getObjectActions(final ActionType type, final Contributed contributed) {
-        return null;
-    }
-
-    @Override
     public ObjectAction getObjectAction(final String nameParmsIdentityString) {
         for (final ActionType type : ActionType.values()) {
             final ObjectAction action = getObjectAction(type, nameParmsIdentityString);
@@ -479,17 +469,12 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     }
 
     @Override
-    public List<ObjectAction> getObjectActions(final List<ActionType> types, final Contributed contributed) {
-        return null;
-    }
-
-    @Override
-    public List<ObjectAction> getObjectActions(ActionType type, Contributed contributed, Filter<ObjectAction> filter) {
+    public List<ObjectAction> getObjectActions(final ActionType type, final Contributed contributed, final Filter<ObjectAction> filter) {
         return null;
     }
 
     @Override
-    public List<ObjectAction> getObjectActions(List<ActionType> requestedTypes, Contributed contributed, Filter<ObjectAction> filter) {
+    public List<ObjectAction> getObjectActions(List<ActionType> types, final Contributed contributed, final Filter<ObjectAction> filter) {
         return null;
     }
 


[2/2] git commit: ISIS-503: store contributee members along with regular members

Posted by da...@apache.org.
ISIS-503: store contributee members along with regular members

- ie refactor how they are calculated

also:
- more refactorings of the overloads of getAssociations and getObjectActions
- rename "properties" to "metadataProperties" and convert to a field (in order to make available for sorting contributee actions later on when calculated and saved)
- rename "layoutProperties(...)" to "metadataProperties(...)"


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/242739ad
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/242739ad
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/242739ad

Branch: refs/heads/master
Commit: 242739ad6af3670bb443abfa3deac2c5a5ed8d1b
Parents: 02340bf
Author: Dan Haywood <da...@apache.org>
Authored: Wed Sep 4 00:42:54 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Wed Sep 4 00:42:54 2013 +0100

----------------------------------------------------------------------
 .../core/metamodel/facets/FacetFactory.java     |  57 ++++--
 .../specloader/ObjectReflectorDefault.java      |   8 +-
 .../facetprocessor/FacetProcessor.java          |  35 +++-
 .../specimpl/FacetedMethodsBuilder.java         |  74 ++++---
 .../specimpl/ObjectSpecificationAbstract.java   | 194 ++++++++++++-------
 .../dflt/ObjectSpecificationDefault.java        |  97 ++--------
 .../members/order/MemberOrderFacetFactory.java  |   2 +-
 .../MemberGroupLayoutFacetFactory.java          |   2 +-
 8 files changed, 262 insertions(+), 207 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
index 55ab363..7048ec6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
@@ -55,11 +55,16 @@ public interface FacetFactory {
      * the meta-model.
      */
     List<FeatureType> getFeatureTypes();
+    
+    
+    // //////////////////////////////////////
+    // process class
+    // //////////////////////////////////////
 
     public static class ProcessClassContext extends AbstractProcessContext<FacetHolder> implements MethodRemover {
         private final Class<?> cls;
         private final MethodRemover methodRemover;
-        private final Properties properties;
+        private final Properties metadataProperties;
 
         /**
          * For testing only.
@@ -68,11 +73,15 @@ public interface FacetFactory {
             this(cls, null, methodRemover, facetHolder);
         }
 
-        public ProcessClassContext(final Class<?> cls, final Properties properties, final MethodRemover methodRemover, final FacetHolder facetHolder) {
+        public ProcessClassContext(
+                final Class<?> cls, 
+                final Properties metadataProperties, 
+                final MethodRemover methodRemover, 
+                final FacetHolder facetHolder) {
             super(facetHolder);
             this.cls = cls;
             this.methodRemover = methodRemover;
-            this.properties = properties;
+            this.metadataProperties = metadataProperties;
         }
 
         /**
@@ -102,11 +111,11 @@ public interface FacetFactory {
             methodRemover.removeMethods(methods);
         }
 
-        public Properties layoutProperties(String prefix) {
-            if(properties == null) {
+        public Properties metadataProperties(String prefix) {
+            if(metadataProperties == null) {
                 return null;
             }
-            final Properties subsetProperties = PropertyUtil.subset(this.properties, prefix);
+            final Properties subsetProperties = PropertyUtil.subset(this.metadataProperties, prefix);
             return !subsetProperties.isEmpty() ? subsetProperties : null;
         }
     }
@@ -115,19 +124,30 @@ public interface FacetFactory {
      * Process the class, and return the correctly setup annotation if present.
      */
     void process(ProcessClassContext processClassContext);
+    
+    // //////////////////////////////////////
+    // process method
+    // //////////////////////////////////////
+
 
     public static class ProcessMethodContext extends AbstractProcessContext<FacetedMethod> implements MethodRemover {
         private final Class<?> cls;
         private final FeatureType featureType;
-        private final Properties properties;
+        private final Properties metadataProperties;
         private final Method method;
         private final MethodRemover methodRemover;
 
-        public ProcessMethodContext(final Class<?> cls, FeatureType featureType, Properties properties, final Method method, final MethodRemover methodRemover, final FacetedMethod facetedMethod) {
+        public ProcessMethodContext(
+                final Class<?> cls, 
+                final FeatureType featureType, 
+                final Properties metadataProperties, 
+                final Method method, 
+                final MethodRemover methodRemover, 
+                final FacetedMethod facetedMethod) {
             super(facetedMethod);
             this.cls = cls;
             this.featureType = featureType;
-            this.properties = properties;
+            this.metadataProperties = metadataProperties;
             this.method = method;
             this.methodRemover = methodRemover;
         }
@@ -160,9 +180,9 @@ public interface FacetFactory {
             methodRemover.removeMethods(methods);
         }
 
-        public Properties layoutProperties(String prefix) {
+        public Properties metadataProperties(String prefix) {
             
-            if(properties == null) {
+            if(metadataProperties == null) {
                 return null;
             }
             Identifier identifier = featureType.identifierFor(getCls(), getMethod());
@@ -171,15 +191,14 @@ public interface FacetFactory {
             // bit of a hack; to distinguish between actions and properties that have same identifier
             // eg getPaidBy() and paidBy()
             if(featureType.isAction()) {
-                Properties subsetProperties = PropertyUtil.subset(this.properties, prefix+"."+id+"()");
+                Properties subsetProperties = PropertyUtil.subset(this.metadataProperties, prefix+"."+id+"()");
                 if (!subsetProperties.isEmpty()) {
                     return subsetProperties;
                 } 
-                
             }
 
             // otherwise, regular processing...
-            Properties subsetProperties = PropertyUtil.subset(this.properties, prefix+"."+id);
+            Properties subsetProperties = PropertyUtil.subset(this.metadataProperties, prefix+"."+id);
             if (!subsetProperties.isEmpty()) {
                 return subsetProperties;
             }
@@ -193,11 +212,19 @@ public interface FacetFactory {
      */
     void process(ProcessMethodContext processMethodContext);
 
+    
+    // //////////////////////////////////////
+    // process param
+    // //////////////////////////////////////
+
     public static class ProcessParameterContext extends AbstractProcessContext<FacetedMethodParameter> {
         private final Method method;
         private final int paramNum;
 
-        public ProcessParameterContext(final Method method, final int paramNum, final FacetedMethodParameter facetedMethodParameter) {
+        public ProcessParameterContext(
+                final Method method, 
+                final int paramNum, 
+                final FacetedMethodParameter facetedMethodParameter) {
             super(facetedMethodParameter);
             this.method = method;
             this.paramNum = paramNum;

http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index a8da35e..35e49fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -528,13 +528,7 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
 
         final AuthenticationSessionProvider authenticationSessionProvider = getRuntimeContext().getAuthenticationSessionProvider();
         final SpecificationLoader specificationLookup = getRuntimeContext().getSpecificationLoader();
-        final ServicesProvider servicesProvider = getRuntimeContext().getServicesProvider();/* new ServicesProviderAbstract(){
-
-            @Override
-            public List<ObjectAdapter> getServices() {
-                return ObjectReflectorDefault.this.services;
-            }
-        };*/
+        final ServicesProvider servicesProvider = getRuntimeContext().getServicesProvider();
         final ObjectInstantiator objectInstantiator = getRuntimeContext().getObjectInstantiator();
 
         // create contexts as inputs ...

http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
index f6a80de..0ba8a87 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
@@ -276,19 +276,26 @@ public class FacetProcessor implements RuntimeContextAware {
      *            - class to process
      * @param facetHolder
      *            - holder to attach facets to.
-     * 
      */
-    public void process(final Class<?> cls, final Properties properties, final MethodRemover methodRemover, final FacetHolder facetHolder) {
+    public void process(
+            final Class<?> cls, 
+            final Properties metadataProperties, 
+            final MethodRemover methodRemover, 
+            final FacetHolder facetHolder) {
         final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.OBJECT);
         for (final FacetFactory facetFactory : factoryList) {
-            facetFactory.process(new ProcessClassContext(cls, properties, removerElseNullRemover(methodRemover), facetHolder));
+            facetFactory.process(new ProcessClassContext(cls, metadataProperties, removerElseNullRemover(methodRemover), facetHolder));
         }
     }
 
-    public void processPost(final Class<?> cls, Properties properties, final MethodRemover methodRemover, final FacetHolder facetHolder) {
+    public void processPost(
+            final Class<?> cls, 
+            final Properties metadataProperties, 
+            final MethodRemover methodRemover, 
+            final FacetHolder facetHolder) {
         final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.OBJECT_POST_PROCESSING);
         for (final FacetFactory facetFactory : factoryList) {
-            facetFactory.process(new ProcessClassContext(cls, properties, removerElseNullRemover(methodRemover), facetHolder));
+            facetFactory.process(new ProcessClassContext(cls, metadataProperties, removerElseNullRemover(methodRemover), facetHolder));
         }
     }
 
@@ -313,12 +320,19 @@ public class FacetProcessor implements RuntimeContextAware {
      * @param featureType
      *            - what type of feature the method represents (property,
      *            action, collection etc)
-     * @param properties TODO
+     * @param metadataProperties 
+     *            - additional properties to parse and use 
      */
-    public void process(final Class<?> cls, final Method method, final MethodRemover methodRemover, final FacetedMethod facetedMethod, final FeatureType featureType, Properties properties) {
+    public void process(
+            final Class<?> cls, 
+            final Method method, 
+            final MethodRemover methodRemover, 
+            final FacetedMethod facetedMethod, 
+            final FeatureType featureType, 
+            final Properties metadataProperties) {
         final List<FacetFactory> factoryList = getFactoryListByFeatureType(featureType);
         for (final FacetFactory facetFactory : factoryList) {
-            facetFactory.process(new ProcessMethodContext(cls, featureType, properties, method, removerElseNullRemover(methodRemover), facetedMethod));
+            facetFactory.process(new ProcessMethodContext(cls, featureType, metadataProperties, method, removerElseNullRemover(methodRemover), facetedMethod));
         }
     }
 
@@ -340,7 +354,10 @@ public class FacetProcessor implements RuntimeContextAware {
      * @param facetedMethodParameter
      *            - holder to attach facets to.
      */
-    public void processParams(final Method method, final int paramNum, final FacetedMethodParameter facetedMethodParameter) {
+    public void processParams(
+            final Method method, 
+            final int paramNum, 
+            final FacetedMethodParameter facetedMethodParameter) {
         final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.ACTION_PARAMETER);
         for (final FacetFactory facetFactory : factoryList) {
             facetFactory.processParams(new ProcessParameterContext(method, paramNum, facetedMethodParameter));

http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index 06cbf9d..38b62ef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -176,8 +176,6 @@ public class FacetedMethodsBuilder {
     // ////////////////////////////////////////////////////////////////////////////
 
 
-    
-    
     public Properties introspectClass() {
         LOG.info("introspecting " + getClassName());
         if (LOG.isDebugEnabled()) {
@@ -187,9 +185,9 @@ public class FacetedMethodsBuilder {
         // process facets at object level
         // this will also remove some methods, such as the superclass methods.
 
-        Properties properties = layoutMetadataProperties(introspectedClass);
+        final Properties metadataProperties = readMetadataProperties(introspectedClass);
 
-        getFacetProcessor().process(introspectedClass, properties, methodRemover, spec);
+        getFacetProcessor().process(introspectedClass, metadataProperties, methodRemover, spec);
 
         // if this class has additional facets (as per @Facets), then process
         // them.
@@ -206,10 +204,10 @@ public class FacetedMethodsBuilder {
                     throw new IsisException(e);
                 }
                 getFacetProcessor().injectDependenciesInto(facetFactory);
-                facetFactory.process(new ProcessClassContext(introspectedClass, properties, methodRemover, spec));
+                facetFactory.process(new ProcessClassContext(introspectedClass, metadataProperties, methodRemover, spec));
             }
         }
-        return properties;
+        return metadataProperties;
     }
 
     /**
@@ -218,10 +216,10 @@ public class FacetedMethodsBuilder {
      * <p>
      * Not doing for now, though, because expect the {@link LayoutMetadata} to evolve a bit yet. 
      */
-    private Properties layoutMetadataProperties(Class<?> domainClass) {
+    private Properties readMetadataProperties(Class<?> domainClass) {
         List<LayoutMetadataReader> layoutMetadataReaders = 
                 Lists.<LayoutMetadataReader>newArrayList(new LayoutMetadataReaderFromJson(), new LayoutMetadataReaderFromJson());
-        for (LayoutMetadataReader reader : layoutMetadataReaders) {
+        for (final LayoutMetadataReader reader : layoutMetadataReaders) {
             try {
                 Properties properties = reader.asProperties(domainClass);
                 if(properties != null) {
@@ -353,11 +351,10 @@ public class FacetedMethodsBuilder {
     /**
      * Returns a {@link List} of {@link FacetedMethod}s representing object
      * actions, lazily creating them first if required.
-     * @param properties TODO
      */
-    public List<FacetedMethod> getActionFacetedMethods(Properties properties) {
+    public List<FacetedMethod> getActionFacetedMethods(final Properties metadataProperties) {
         if (actionFacetedMethods == null) {
-            actionFacetedMethods = findActionFacetedMethods(MethodScope.OBJECT, properties);
+            actionFacetedMethods = findActionFacetedMethods(MethodScope.OBJECT, metadataProperties);
         }
         return actionFacetedMethods;
     }
@@ -374,18 +371,23 @@ public class FacetedMethodsBuilder {
      * 
      * <p>
      * Perhaps it's important to skip helpers first. I doubt it, though.
-     * @param properties TODO
      */
-    private List<FacetedMethod> findActionFacetedMethods(final MethodScope methodScope, Properties properties) {
+    private List<FacetedMethod> findActionFacetedMethods(
+            final MethodScope methodScope, 
+            final Properties metadataProperties) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("introspecting " + getClassName() + ": actions");
         }
-        final List<FacetedMethod> actionFacetedMethods1 = findActionFacetedMethods(methodScope, RecognisedHelpersStrategy.SKIP, properties);
-        final List<FacetedMethod> actionFacetedMethods2 = findActionFacetedMethods(methodScope, RecognisedHelpersStrategy.DONT_SKIP, properties);
+        final List<FacetedMethod> actionFacetedMethods1 = findActionFacetedMethods(methodScope, RecognisedHelpersStrategy.SKIP, metadataProperties);
+        final List<FacetedMethod> actionFacetedMethods2 = findActionFacetedMethods(methodScope, RecognisedHelpersStrategy.DONT_SKIP, metadataProperties);
         return ListUtils.combine(actionFacetedMethods1, actionFacetedMethods2);
     }
 
-    private List<FacetedMethod> findActionFacetedMethods(final MethodScope methodScope, final RecognisedHelpersStrategy recognisedHelpersStrategy, Properties properties) {
+    private List<FacetedMethod> findActionFacetedMethods(
+            final MethodScope methodScope, 
+            final RecognisedHelpersStrategy recognisedHelpersStrategy, 
+            final Properties metadataProperties) {
+        
         if (LOG.isDebugEnabled()) {
             LOG.debug("  looking for action methods");
         }
@@ -397,7 +399,7 @@ public class FacetedMethodsBuilder {
             if (method == null) {
                 continue;
             }
-            final FacetedMethod actionPeer = findActionMethodPeer(methodScope, recognisedHelpersStrategy, method, properties);
+            final FacetedMethod actionPeer = findActionFacetedMethod(methodScope, recognisedHelpersStrategy, method, metadataProperties);
             if (actionPeer != null) {
                 methods.set(i, null);
                 actionFacetedMethods.add(actionPeer);
@@ -407,17 +409,24 @@ public class FacetedMethodsBuilder {
         return actionFacetedMethods;
     }
 
-    private FacetedMethod findActionMethodPeer(final MethodScope methodScope, final RecognisedHelpersStrategy recognisedHelpersStrategy, final Method actionMethod, Properties properties) {
+    private FacetedMethod findActionFacetedMethod(
+            final MethodScope methodScope, 
+            final RecognisedHelpersStrategy recognisedHelpersStrategy, 
+            final Method actionMethod, 
+            final Properties metadataProperties) {
 
         if (!representsAction(actionMethod, methodScope, recognisedHelpersStrategy)) {
             return null;
         }
 
         // build action
-        return createActionFacetedMethod(actionMethod, properties);
+        return createActionFacetedMethod(actionMethod, metadataProperties);
     }
 
-    private FacetedMethod createActionFacetedMethod(final Method actionMethod, Properties properties) {
+    private FacetedMethod createActionFacetedMethod(
+            final Method actionMethod, 
+            final Properties metadataProperties) {
+        
         if (!isAllParamTypesValid(actionMethod)) {
             return null;
         }
@@ -425,7 +434,7 @@ public class FacetedMethodsBuilder {
         final FacetedMethod action = FacetedMethod.createForAction(introspectedClass, actionMethod);
 
         // process facets on the action & parameters
-        getFacetProcessor().process(introspectedClass, actionMethod, methodRemover, action, FeatureType.ACTION, properties);
+        getFacetProcessor().process(introspectedClass, actionMethod, methodRemover, action, FeatureType.ACTION, metadataProperties);
 
         final List<FacetedMethodParameter> actionParams = action.getParameters();
         for (int j = 0; j < actionParams.size(); j++) {
@@ -445,7 +454,10 @@ public class FacetedMethodsBuilder {
         return true;
     }
 
-    private boolean representsAction(final Method actionMethod, final MethodScope methodScope, final RecognisedHelpersStrategy recognisedHelpersStrategy) {
+    private boolean representsAction(
+            final Method actionMethod, 
+            final MethodScope methodScope, 
+            final RecognisedHelpersStrategy recognisedHelpersStrategy) {
 
         if (!MethodFinderUtils.inScope(methodScope, actionMethod)) {
             return false;
@@ -502,12 +514,12 @@ public class FacetedMethodsBuilder {
     // introspect class post processing
     // ////////////////////////////////////////////////////////////////////////////
 
-    public void introspectClassPostProcessing(Properties properties) {
+    public void introspectClassPostProcessing(final Properties metadataProperties) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("introspecting " + getClassName() + ": class-level post-processing");
         }
 
-        getFacetProcessor().processPost(introspectedClass, properties, methodRemover, spec);
+        getFacetProcessor().processPost(introspectedClass, metadataProperties, methodRemover, spec);
     }
 
     // ////////////////////////////////////////////////////////////////////////////
@@ -519,7 +531,12 @@ public class FacetedMethodsBuilder {
      * {@link #findAndRemovePrefixedNonVoidMethods(boolean, String, Class, int)}
      * , but appends to provided {@link List} (collecting parameter pattern).
      */
-    private void findAndRemovePrefixedNonVoidMethods(final MethodScope methodScope, final String prefix, final Class<?> returnType, final int paramCount, final List<Method> methodListToAppendTo) {
+    private void findAndRemovePrefixedNonVoidMethods(
+            final MethodScope methodScope, 
+            final String prefix, 
+            final Class<?> returnType, 
+            final int paramCount, 
+            final List<Method> methodListToAppendTo) {
         final List<Method> matchingMethods = findAndRemovePrefixedMethods(methodScope, prefix, returnType, false, paramCount);
         methodListToAppendTo.addAll(matchingMethods);
     }
@@ -533,7 +550,12 @@ public class FacetedMethodsBuilder {
      * @see MethodFinderUtils#removeMethods(Method[], boolean, String, Class,
      *      boolean, int, ClassSubstitutor)
      */
-    private List<Method> findAndRemovePrefixedMethods(final MethodScope methodScope, final String prefix, final Class<?> returnType, final boolean canBeVoid, final int paramCount) {
+    private List<Method> findAndRemovePrefixedMethods(
+            final MethodScope methodScope, 
+            final String prefix, 
+            final Class<?> returnType, 
+            final boolean canBeVoid, 
+            final int paramCount) {
         return MethodFinderUtils.removeMethods(methods, methodScope, prefix, returnType, canBeVoid, paramCount);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
----------------------------------------------------------------------
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 ce2608c..58ece62 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
@@ -39,6 +39,7 @@ import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.commons.exceptions.UnknownTypeException;
 import org.apache.isis.core.commons.lang.JavaClassUtils;
 import org.apache.isis.core.commons.lang.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -63,6 +64,7 @@ import org.apache.isis.core.metamodel.facets.object.dirty.MarkDirtyObjectFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.core.metamodel.facets.object.notpersistable.NotPersistableFacet;
 import org.apache.isis.core.metamodel.facets.object.objecttype.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
@@ -74,6 +76,7 @@ import org.apache.isis.core.metamodel.interactions.InteractionContext;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
 import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
+import org.apache.isis.core.metamodel.layout.DeweyOrderSet;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectInstantiator;
@@ -129,18 +132,15 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     protected final ObjectMemberContext objectMemberContext;
 
 
-    private final List<ObjectAction> objectActions = Lists.newArrayList();
     private final List<ObjectAssociation> associations = Lists.newArrayList();
+    private final List<ObjectAction> objectActions = Lists.newArrayList();
+    
+    private boolean contributeeAssociationsAdded;
+    private boolean contributeeActionsAdded;
+    
     private final List<ObjectSpecification> interfaces = Lists.newArrayList();
     private final SubclassList subclasses = new SubclassList();
 
-    private List<ObjectAssociation> contributeeAssociations;
-
-    /**
-     * Lazily populated in {@link #getContributeeActions(ActionType)}.
-     */
-    private final Map<ActionType, List<ObjectAction>> contributeeActionsByType = Maps.newLinkedHashMap();
-
     private final Class<?> correspondingClass;
     private final String fullName;
     private final String shortName;
@@ -332,20 +332,16 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         this.subclasses.addSubclass(subclass);
     }
 
-    /**
-     * Intended to be called within {@link #introspectTypeHierarchyAndMembers()}
-     */
-    protected void updateAssociations(final List<ObjectAssociation> associations) {
+    protected void sortAndUpdateAssociations(final List<ObjectAssociation> associations) {
+        final List<ObjectAssociation> orderedAssociations = sortAssociations(associations);
         this.associations.clear();
-        this.associations.addAll(associations);
+        this.associations.addAll(orderedAssociations);
     }
 
-    /**
-     * Intended to be called within {@link #introspectTypeHierarchyAndMembers()}
-     */
-    protected void updateObjectActions(final List<ObjectAction> objectActions) {
+    protected void sortAndUpdateActions(final List<ObjectAction> objectActions) {
+        final List<ObjectAction> orderedActions = sortActions(objectActions);
         this.objectActions.clear();
-        this.objectActions.addAll(objectActions);
+        this.objectActions.addAll(orderedActions);
     }
 
     // //////////////////////////////////////////////////////////////////////
@@ -653,10 +649,14 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     @Override
     public List<ObjectAssociation> getAssociations(final Contributed contributee) {
-        List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
-        if(contributee.isIncluded()) {
-            associations.addAll(getContributeeAssociations());
+        if(contributee.isIncluded() && !contributeeAssociationsAdded) {
+            List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
+            final List<ObjectAssociation> contributeeAssociations = createContributeeAssociations();
+            associations.addAll(contributeeAssociations);
+            sortAndUpdateAssociations(associations);
+            contributeeAssociationsAdded = true;
         }
+        final List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
         return Lists.newArrayList(Iterables.filter(
                 associations, ContributeeMember.Predicates.regularElse(contributee)));
     }
@@ -697,7 +697,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public List<OneToOneAssociation> getProperties(Contributed contributed) {
-        final List list = getAssociations(contributed, ObjectAssociationFilters.PROPERTIES);
+        final List list = getAssociations(contributed, ObjectAssociation.Filters.PROPERTIES);
         return list;
     }
 
@@ -714,6 +714,32 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     @Override
     public List<ObjectAction> getObjectActions(
+            final List<ActionType> types,
+            final Contributed contributed, 
+            final Filter<ObjectAction> filter) {
+        if(contributed.isIncluded() && !contributeeActionsAdded) {
+            final List<ObjectAction> actions = Lists.newArrayList(this.objectActions);
+            actions.addAll(createContributeeActions());
+            sortAndUpdateActions(actions);
+            contributeeActionsAdded = true;
+        }
+        
+        final List<ObjectAction> actions = Lists.newArrayList();
+        for (final ActionType type : types) {
+            @SuppressWarnings("unchecked")
+            final List<ObjectAction> filterActions = 
+                    Lists.newArrayList(Iterables.filter(
+                            objectActions, 
+                            Filters.asPredicate(Filters.and(
+                                    ObjectAction.Filters.ofType(type), filter))));
+            actions.addAll(filterActions);
+        }
+        return Lists.newArrayList(Iterables.filter(
+                actions, ContributeeMember.Predicates.regularElse(contributed)));
+    }
+    
+    @Override
+    public List<ObjectAction> getObjectActions(
             final Contributed contributed) {
         return getObjectActions(ActionType.ALL, contributed, Filters.<ObjectAction>any());
     }
@@ -726,34 +752,70 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return getObjectActions(Collections.singletonList(type), contributed, filter);
     }
 
-    @Override
-    public List<ObjectAction> getObjectActions(
-            final List<ActionType> types,
-            final Contributed contributed, 
-            final Filter<ObjectAction> filter) {
-        final List<ObjectAction> actions = Lists.newArrayList();
-        for (final ActionType type : types) {
-            addActions(type, contributed, filter, actions);
+    // //////////////////////////////////////////////////////////////////////
+    // sorting
+    // //////////////////////////////////////////////////////////////////////
+    
+    protected List<ObjectAssociation> sortAssociations(final List<ObjectAssociation> associations) {
+        final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(associations);
+        final MemberGroupLayoutFacet memberGroupLayoutFacet = this.getFacet(MemberGroupLayoutFacet.class);
+        
+        if(memberGroupLayoutFacet != null) {
+            final List<String> groupOrder = Lists.newArrayList();
+            groupOrder.addAll(memberGroupLayoutFacet.getLeft());
+            groupOrder.addAll(memberGroupLayoutFacet.getMiddle());
+            groupOrder.addAll(memberGroupLayoutFacet.getRight());
+            
+            orderSet.reorderChildren(groupOrder);
+        }
+        final List<ObjectAssociation> orderedAssociations = Lists.newArrayList();
+        sortAssociations(orderSet, orderedAssociations);
+        return orderedAssociations;
+    }
+
+    private static void sortAssociations(final DeweyOrderSet orderSet, final List<ObjectAssociation> associationsToAppendTo) {
+        for (final Object element : orderSet) {
+            if (element instanceof OneToManyAssociation) {
+                associationsToAppendTo.add((ObjectAssociation) element);
+            } else if (element instanceof OneToOneAssociation) {
+                associationsToAppendTo.add((ObjectAssociation) element);
+            } else if (element instanceof DeweyOrderSet) {
+                // just flatten.
+                DeweyOrderSet childOrderSet = (DeweyOrderSet) element;
+                sortAssociations(childOrderSet, associationsToAppendTo);
+            } else {
+                throw new UnknownTypeException(element);
+            }
         }
-        return Lists.newArrayList(Iterables.filter(
-                actions, ContributeeMember.Predicates.regularElse(contributed)));
     }
 
-    private List<ObjectAction> addActions(final ActionType type, final Contributed contributee, final Filter<ObjectAction> filter, final List<ObjectAction> actionListToAppendTo) {
-        if(contributee.isIncluded()) {
-            actionListToAppendTo.addAll(getContributeeActions(type, filter));
-        }
-        actionListToAppendTo.addAll(filterActions(objectActions, type, filter));
-        return actionListToAppendTo;
+    protected static List<ObjectAction> sortActions(final List<ObjectAction> actions) {
+        final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(actions);
+        final List<ObjectAction> orderedActions = Lists.newArrayList();
+        sortActions(orderSet, orderedActions);
+        return orderedActions;
     }
 
-    @SuppressWarnings("unchecked")
-    private static List<ObjectAction> filterActions(final List<ObjectAction> objectActions, final ActionType type, final Filter<ObjectAction> filter) {
-        return Lists.newArrayList(Iterables.filter(
-                objectActions, 
-                Filters.asPredicate(Filters.and(ObjectAction.Filters.ofType(type), filter))));
+    private static void sortActions(final DeweyOrderSet orderSet, final List<ObjectAction> actionsToAppendTo) {
+        for (final Object element : orderSet) {
+            if(element instanceof ObjectAction) {
+                final ObjectAction objectAction = (ObjectAction) element;
+                actionsToAppendTo.add(objectAction);
+            }
+            else if (element instanceof DeweyOrderSet) {
+                final DeweyOrderSet set = ((DeweyOrderSet) element);
+                final List<ObjectAction> actions = Lists.newArrayList();
+                sortActions(set, actions);
+                actionsToAppendTo.addAll(actions);
+            } else {
+                throw new UnknownTypeException(element);
+            }
+        }
     }
 
+    // //////////////////////////////////////////////////////////////////////
+    // getServiceActionsReturning
+    // //////////////////////////////////////////////////////////////////////
 
     @Override
     public List<ObjectAction> getServiceActionsReturning(final List<ActionType> types) {
@@ -803,16 +865,15 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     // contributee associations (properties and collections)
     // //////////////////////////////////////////////////////////////////////
 
-    private List<ObjectAssociation> getContributeeAssociations() {
+    private List<ObjectAssociation> createContributeeAssociations() {
         if (isService()) {
             return Collections.emptyList();
         }
-        if (contributeeAssociations == null) {
-            contributeeAssociations = Lists.newArrayList();
-            final List<ObjectAdapter> services = getServicesProvider().getServices();
-            for (final ObjectAdapter serviceAdapter : services) {
-                addContributeeAssociationsIfAny(serviceAdapter, contributeeAssociations);
-            }
+        
+        final List<ObjectAssociation> contributeeAssociations = Lists.newArrayList();
+        final List<ObjectAdapter> services = getServicesProvider().getServices();
+        for (final ObjectAdapter serviceAdapter : services) {
+            addContributeeAssociationsIfAny(serviceAdapter, contributeeAssociations);
         }
         return contributeeAssociations;
     }
@@ -877,44 +938,34 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     // //////////////////////////////////////////////////////////////////////
 
     /**
-     * All contributee actions (each wrapping a service's contributed action) for this spec;
-     * these are lazily created and then cached.
+     * All contributee actions (each wrapping a service's contributed action) for this spec.
      * 
      * <p>
      * If this specification {@link #isService() is actually for} a service,
      * then returns an empty list.
      */
-    protected List<ObjectAction> getContributeeActions(final ActionType actionType, Filter<ObjectAction> filter) {
+    protected List<ObjectAction> createContributeeActions() {
         if (isService()) {
             return Collections.emptyList();
         }
-        List<ObjectAction> contributedActionSets = getContributeeActions(actionType);
-        return Lists.newArrayList(Iterables.filter(contributedActionSets, Filters.asPredicate(filter)));
-    }
-
-    private List<ObjectAction> getContributeeActions(final ActionType actionType) {
-        List<ObjectAction> contributeeActions = contributeeActionsByType.get(actionType);
-        if (contributeeActions == null) {
-            contributeeActions = Lists.newArrayList();
-            contributeeActionsByType.put(actionType, contributeeActions);
+        final List<ObjectAction> contributeeActions = Lists.newArrayList();
             
-            // populate an ActionSet with all actions contributed by each
-            // service
-            final List<ObjectAdapter> services = getServicesProvider().getServices();
-            for (final ObjectAdapter serviceAdapter : services) {
-                addContributeeActionsIfAny(serviceAdapter, actionType, contributeeActions);
-            }
+        final List<ObjectAdapter> services = getServicesProvider().getServices();
+        for (final ObjectAdapter serviceAdapter : services) {
+            addContributeeActionsIfAny(serviceAdapter, contributeeActions);
         }
         return contributeeActions;
     }
 
-    private void addContributeeActionsIfAny(final ObjectAdapter serviceAdapter, final ActionType actionType, final List<ObjectAction> contributeeActionsToAppendTo) {
+    private void addContributeeActionsIfAny(
+            final ObjectAdapter serviceAdapter, 
+            final List<ObjectAction> contributeeActionsToAppendTo) {
         final ObjectSpecification specification = serviceAdapter.getSpecification();
         if (specification == this) {
             return;
         }
         final List<ObjectAction> contributeeActions = Lists.newArrayList();
-        final List<ObjectAction> serviceActions = specification.getObjectActions(actionType, Contributed.INCLUDED, Filters.<ObjectAction>any());
+        final List<ObjectAction> serviceActions = specification.getObjectActions(ActionType.ALL, Contributed.INCLUDED, Filters.<ObjectAction>any());
         for (final ObjectAction serviceAction : serviceActions) {
             if (serviceAction.isAlwaysHidden()) {
                 continue;
@@ -926,13 +977,14 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             if(!(serviceAction instanceof ObjectActionImpl)) {
                 continue;
             }
-            ObjectActionImpl contributedAction = (ObjectActionImpl) serviceAction;
+            final ObjectActionImpl contributedAction = (ObjectActionImpl) serviceAction;
         
             // see if qualifies by inspecting all parameters
             final int contributeeParam = contributeeParameterMatchOf(contributedAction);
             if (contributeeParam != -1) {
                 ObjectActionContributee contributeeAction = 
                         new ObjectActionContributee(serviceAdapter, contributedAction, contributeeParam, this, objectMemberContext);
+
                 contributeeActions.add(contributeeAction);
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
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 bc2940b..496f2fc 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
@@ -109,6 +109,11 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
     private FacetedMethodsBuilder facetedMethodsBuilder;
 
+    /**
+     * Only populated once {@link #introspectTypeHierarchyAndMembers()} is called.
+     */
+    private Properties metadataProperties;
+
     // //////////////////////////////////////////////////////////////////////
     // Constructor
     // //////////////////////////////////////////////////////////////////////
@@ -126,10 +131,9 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
     @Override
     public void introspectTypeHierarchyAndMembers() {
 
-        // class
-        Properties properties = null;
+        metadataProperties = null;
         if(isNotIntrospected()) {
-            properties = facetedMethodsBuilder.introspectClass();
+            metadataProperties = facetedMethodsBuilder.introspectClass();
         }
         
         // name
@@ -154,14 +158,15 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
         // walk superinterfaces
 
+        //
         // REVIEW: the processing here isn't quite the same as with
-        // superclasses,
-        // in that with superclasses the superclass adds this type as its
-        // subclass,
-        // whereas here this type defines itself as the subtype.
+        // superclasses, in that with superclasses the superclass adds this type as its
+        // subclass, whereas here this type defines itself as the subtype.
+        //
         // it'd be nice to push the responsibility for adding subclasses to
         // the interface type... needs some tests around it, though, before
         // making that refactoring.
+        //
         final Class<?>[] interfaceTypes = getCorrespondingClass().getInterfaces();
         final List<ObjectSpecification> interfaceSpecList = Lists.newArrayList();
         for (final Class<?> interfaceType : interfaceTypes) {
@@ -181,19 +186,17 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
         // associations and actions
         if(isNotIntrospected()) {
-            final List<ObjectAssociation> associations = createAssociations(properties);
-            final List<ObjectAssociation> orderedAssociations = sortAssociations(associations);
-            updateAssociations(orderedAssociations);
+            final List<ObjectAssociation> associations = createAssociations(metadataProperties);
+            sortAndUpdateAssociations(associations);
         }
 
         if(isNotIntrospected()) {
-            final List<ObjectAction> actions = createActions(properties);
-            final List<ObjectAction> orderedActions = sortActions(actions);
-            updateObjectActions(orderedActions);
+            final List<ObjectAction> actions = createActions(metadataProperties);
+            sortAndUpdateActions(actions);
         }
 
         if(isNotIntrospected()) {
-            facetedMethodsBuilder.introspectClassPostProcessing(properties);    
+            facetedMethodsBuilder.introspectClassPostProcessing(metadataProperties);    
         }
         
         if(isNotIntrospected()) {
@@ -242,8 +245,8 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
         }
     }
 
-    private List<ObjectAction> createActions(Properties properties) {
-        final List<FacetedMethod> actionFacetedMethods = facetedMethodsBuilder.getActionFacetedMethods(properties);
+    private List<ObjectAction> createActions(Properties metadataProperties) {
+        final List<FacetedMethod> actionFacetedMethods = facetedMethodsBuilder.getActionFacetedMethods(metadataProperties);
         final List<ObjectAction> actions = Lists.newArrayList();
         for (FacetedMethod facetedMethod : actionFacetedMethods) {
             final ObjectAction action = createAction(facetedMethod);
@@ -263,66 +266,6 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
         }
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // sorting
-    // //////////////////////////////////////////////////////////////////////
-    
-    private List<ObjectAssociation> sortAssociations(final List<ObjectAssociation> associations) {
-        final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(associations);
-        final MemberGroupLayoutFacet memberGroupLayoutFacet = this.getFacet(MemberGroupLayoutFacet.class);
-        
-        if(memberGroupLayoutFacet != null) {
-            final List<String> groupOrder = Lists.newArrayList();
-            groupOrder.addAll(memberGroupLayoutFacet.getLeft());
-            groupOrder.addAll(memberGroupLayoutFacet.getMiddle());
-            groupOrder.addAll(memberGroupLayoutFacet.getRight());
-            
-            orderSet.reorderChildren(groupOrder);
-        }
-        final List<ObjectAssociation> orderedAssociations = Lists.newArrayList();
-        sortAssociations(orderSet, orderedAssociations);
-        return orderedAssociations;
-    }
-
-    private List<ObjectAction> sortActions(final List<ObjectAction> actions) {
-        final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(actions);
-        final List<ObjectAction> orderedActions = Lists.newArrayList();
-        sortActions(orderSet, orderedActions);
-        return orderedActions;
-    }
-
-    private void sortAssociations(final DeweyOrderSet orderSet, final List<ObjectAssociation> associationsToAppendTo) {
-        for (final Object element : orderSet) {
-            if (element instanceof OneToManyAssociation) {
-                associationsToAppendTo.add((ObjectAssociation) element);
-            } else if (element instanceof OneToOneAssociation) {
-                associationsToAppendTo.add((ObjectAssociation) element);
-            } else if (element instanceof DeweyOrderSet) {
-                // just flatten.
-                DeweyOrderSet childOrderSet = (DeweyOrderSet) element;
-                sortAssociations(childOrderSet, associationsToAppendTo);
-            } else {
-                throw new UnknownTypeException(element);
-            }
-        }
-    }
-
-    private void sortActions(final DeweyOrderSet orderSet, final List<ObjectAction> actionsToAppendTo) {
-        for (final Object element : orderSet) {
-            if(element instanceof ObjectAction) {
-                final ObjectAction objectAction = (ObjectAction) element;
-                actionsToAppendTo.add(objectAction);
-            }
-            else if (element instanceof DeweyOrderSet) {
-                final DeweyOrderSet set = ((DeweyOrderSet) element);
-                final List<ObjectAction> actions = Lists.newArrayList();
-                sortActions(set, actions);
-                actionsToAppendTo.addAll(actions);
-            } else {
-                throw new UnknownTypeException(element);
-            }
-        }
-    }
 
     // //////////////////////////////////////////////////////////////////////
     // Whether a service or not
@@ -380,7 +323,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
     }
 
     // //////////////////////////////////////////////////////////////////////
-    // Actions
+    // getObjectAction
     // //////////////////////////////////////////////////////////////////////
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
index 334615a..52bafc3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
@@ -41,7 +41,7 @@ public class MemberOrderFacetFactory extends FacetFactoryAbstract {
         final FacetedMethod holder = processMethodContext.getFacetHolder();
         
         MemberOrderFacet memberOrderFacet = null;
-        final Properties properties = processMethodContext.layoutProperties("memberOrder");
+        final Properties properties = processMethodContext.metadataProperties("memberOrder");
         if(properties != null) {
             memberOrderFacet = new MemberOrderFacetProperties(properties, holder);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
index 65fb362..e10f81a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
@@ -60,7 +60,7 @@ public class MemberGroupLayoutFacetFactory extends FacetFactoryAbstract implemen
         
         final Class<?> cls = processClassContext.getCls();
 
-        final Properties properties = processClassContext.layoutProperties("memberGroupLayout");
+        final Properties properties = processClassContext.metadataProperties("memberGroupLayout");
         if(properties != null) {
             return new MemberGroupLayoutFacetProperties(properties, holder);
         }