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:46 UTC

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

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