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 2012/10/05 13:20:39 UTC

svn commit: r1394445 - in /incubator/isis/trunk/framework: applib/src/docbkx/guide/ applib/src/main/java/org/apache/isis/applib/annotation/ core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/facets/ core/metamodel/src/main/java/org/apac...

Author: danhaywood
Date: Fri Oct  5 11:20:38 2012
New Revision: 1394445

URL: http://svn.apache.org/viewvc?rev=1394445&view=rev
Log:
ISIS-232: allow property members to be grouped

- new @MemberGroups annotation and corresponding MemberGroupsFacet annotation
- ObjectSpecificationDefault.getAssociations() now includes associations that have been grouped using @MemberOrder(name=...)
  - previously it just ignored them;
  - are returned in 'flattened' form
- Wicket viewer now uses the MemberOrderFacet and MemberGroupsFacet to render properties inside groups

Added:
    incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacet.java
      - copied, changed from r1394123, incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/facets/FacetsFacet.java
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupsFacet.java
      - copied, changed from r1394123, incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsFacetAbstract.java
      - copied, changed from r1394123, incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsAnnotationElseFallbackFacetFactory.java
      - copied, changed from r1394123, incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetAnnotation.java
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetFallback.java
      - copied, changed from r1394123, incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java
    incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/membergroups/
    incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsAnnotationElseFallbackFacetFactoryTest.java
    incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java
    incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/test/java/org/apache/isis/viewer/wicket/model/util/
    incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/test/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecificationsTest.java
Removed:
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/facets/FacetsFacet.java
Modified:
    incubator/isis/trunk/framework/applib/src/docbkx/guide/isis-applib.xml
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsFacetAbstract.java
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java
    incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsAnnotationFacetFactoryTest.java
    incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
    incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java
    incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.html
    incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.java

Modified: incubator/isis/trunk/framework/applib/src/docbkx/guide/isis-applib.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/applib/src/docbkx/guide/isis-applib.xml?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/applib/src/docbkx/guide/isis-applib.xml (original)
+++ incubator/isis/trunk/framework/applib/src/docbkx/guide/isis-applib.xml Fri Oct  5 11:20:38 2012
@@ -6771,13 +6771,48 @@ public class CustomerFirstName {
         parameters.</para>
       </sect1>
 
+      <sect1 id="sec.MemberGroupsAnnotation">
+        <title>@MemberGroups</title>
+
+        <para><code>@MemberGroups</code> is designed to work in conjunction
+        with <classname>@MemberOrder</classname> (see <xref
+        linkend="sec.MemberOrderAnnotation" />), and specifies the order in
+        which groups of members should be rendered.</para>
+
+        <para>For example:</para>
+
+        <programlisting>@MemberGroups({"General", "Dates", "Other"})
+public Class Customer {
+    @MemberOrder(name="General", sequence="1.1")
+    Public String getFirstName() {...}
+    Public void setFirstName(value as String) {...}
+
+    @MemberOrder(name="General", sequence="1.2")
+    Public String getLastName() {...}
+    Public void setLastName(value as String) {...}
+
+    @MemberOrder(name="Other", sequence="1")
+    Public String getAddress() {...}
+    Public void setAddress(value as String) {...}
+
+    @MemberOrder(name="Dates", sequence="1")
+    Public Date getDateOfBirth() {...}
+    Public void setDateOfBirth(value as Date) {...}
+    ...
+}   </programlisting>
+
+        <para>If the <classname>@MemberOrder</classname>'s name is not
+        specified, then its group is assumed to be
+        "<literal>General</literal>".</para>
+      </sect1>
+
       <sect1 id="sec.MemberOrderAnnotation">
         <title>@MemberOrder</title>
 
         <para><code>@MemberOrder</code> is the recommended mechanism for
         specifying the order in which fields and/or actions are presented to
         the user. (<code>@ActionOrder</code> and <code>@FieldOrder</code>
-        provide alternative mechanisms).</para>
+        provide alternative, deprecated mechanisms).</para>
 
         <para><code>@MemberOrder</code> is specified at the individual member
         level, relative to other members, as a string. The simplest convention
@@ -6791,7 +6826,7 @@ public class CustomerFirstName {
 
         <para>For example:</para>
 
-        <programlisting>Public Class Customer {
+        <programlisting>public Class Customer {
     @MemberOrder(sequence="2.1")
     Public String getAddress() {...}
     Public void setAddress(value as String) {...}
@@ -6823,6 +6858,37 @@ public class CustomerFirstName {
           properties and collections together, and of all actions
           together.</para>
         </note>
+
+        <para>As a refinement to this, some viewers support the notion of
+        grouping members together. In this case the <varname>name</varname>
+        attribute can be specified.</para>
+
+        <para>For example:</para>
+
+        <programlisting>public Class Customer {
+    @MemberOrder(name="General", sequence="1.1")
+    Public String getFirstName() {...}
+    Public void setFirstName(value as String) {...}
+
+    @MemberOrder(name="General", sequence="1.2")
+    Public String getLastName() {...}
+    Public void setLastName(value as String) {...}
+
+    @MemberOrder(name="Other", sequence="1")
+    Public String getAddress() {...}
+    Public void setAddress(value as String) {...}
+
+    @MemberOrder(name="Dates", sequence="1")
+    Public Date getDateOfBirth() {...}
+    Public void setDateOfBirth(value as Date) {...}
+    ...
+}   </programlisting>
+
+        <para>In this case the <varname>sequence</varname> is ordered with
+        respect to the <varname>name</varname>. If using group names in this
+        way, typically the MemberGroups annotation (see <xref
+        linkend="sec.MemberGroupsAnnotation" />) should also be specified,
+        allowing the order of the groups themselves to be sorted.</para>
       </sect1>
 
       <sect1>

Added: incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java?rev=1394445&view=auto
==============================================================================
--- incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java (added)
+++ incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java Fri Oct  5 11:20:38 2012
@@ -0,0 +1,51 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.applib.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Indicates that the class has additional facets, and specifies the how to
+ * obtain the <tt>FacetFactory</tt> to manufacture them.
+ * 
+ * <p>
+ * At least one named factory (as per {@link #facetFactoryNames()}) or one class
+ * factory (as per {@link #facetFactoryClasses()}) should be specified.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MemberGroups {
+
+    /**
+     * Array of group names, as they appear as names in the {@link MemberOrder} annotation.
+     * 
+     * <p>
+     * The order in this list determines the order that the groups will be rendered.  By convention
+     * any {@link MemberOrder} that does not have a {@link MemberOrder#name() name} is considered
+     * to be in the default group, whose name is hard-coded as <i>General</i>.
+     */
+    String[] value() default {};
+
+}

Copied: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacet.java (from r1394123, incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/facets/FacetsFacet.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacet.java?p2=incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacet.java&p1=incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/facets/FacetsFacet.java&r1=1394123&r2=1394445&rev=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/facets/FacetsFacet.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacet.java Fri Oct  5 11:20:38 2012
@@ -17,8 +17,9 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.facets;
+package org.apache.isis.core.metamodel.facets.object.facets;
 
+import org.apache.isis.applib.annotation.Facets;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.MultipleValueFacet;
@@ -27,7 +28,7 @@ import org.apache.isis.core.metamodel.fa
  * Indicates that this class has additional arbitrary facets, to be processed.
  * 
  * <p>
- * Corresponds to the <tt>@Facets</tt> annotation in the applib.
+ * Corresponds to the {@link Facets} annotation in the applib.
  * 
  * <p>
  * <i>This</i> {@link Facet} allows the {@link FacetFactory}(s) that will create

Copied: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupsFacet.java (from r1394123, incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupsFacet.java?p2=incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupsFacet.java&p1=incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java&r1=1394123&r2=1394445&rev=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupsFacet.java Fri Oct  5 11:20:38 2012
@@ -17,25 +17,25 @@
  *  under the License.
  */
 
-package org.apache.isis.viewer.wicket.model.util;
+package org.apache.isis.core.metamodel.facets.object.membergroups;
 
-import com.google.common.base.Function;
+import java.util.List;
 
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-
-public final class ObjectAssociations {
-
-    private ObjectAssociations() {
-    }
-
-    public static Function<String, OneToOneAssociation> fromId(final ObjectSpecification noSpec) {
-        return new Function<String, OneToOneAssociation>() {
-            @Override
-            public OneToOneAssociation apply(final String from) {
-                return (OneToOneAssociation) noSpec.getAssociation(from);
-            }
-        };
-    }
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.core.metamodel.facets.SingleValueFacet;
+import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+
+/**
+ * Indicates the order in which the member groups (as defined by {@link MemberOrderFacet})
+ * should be rendered.
+ * 
+ * <p>
+ * Corresponds to the {@link MemberOrder} annotation in the applib.
+ */
+public interface MemberGroupsFacet extends SingleValueFacet<List<String>> {
 
+    /**
+     * The default group if not otherwise specified.
+     */
+    public final static String DEFAULT_GROUP = "General";
 }

Modified: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java Fri Oct  5 11:20:38 2012
@@ -42,7 +42,7 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
-import org.apache.isis.core.metamodel.facets.facets.FacetsFacet;
+import org.apache.isis.core.metamodel.facets.object.facets.FacetsFacet;
 import org.apache.isis.core.metamodel.facets.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.methodutils.MethodFinderUtils;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;

Modified: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java Fri Oct  5 11:20:38 2012
@@ -183,7 +183,7 @@ public class ObjectSpecificationDefault 
 
         if(isNotIntrospected()) {
             final OrderSet associationOrderSet = getMemberLayoutArranger().createAssociationOrderSetFor(this, associationFacetedMethods);
-            updateAssociations(asAssociations(associationOrderSet));
+            updateAssociations(asFlattenedAssociations(associationOrderSet));
         }
 
         if(isNotIntrospected()) {
@@ -218,11 +218,17 @@ public class ObjectSpecificationDefault 
         }
     }
 
-    private List<ObjectAssociation> asAssociations(final OrderSet orderSet) {
+    private List<ObjectAssociation> asFlattenedAssociations(final OrderSet orderSet) {
         if (orderSet == null) {
             return null;
         }
         final List<ObjectAssociation> associations = Lists.newArrayList();
+        addAssociations(orderSet, associations);
+
+        return associations;
+    }
+
+    private void addAssociations(final OrderSet orderSet, final List<ObjectAssociation> associations) {
         for (final Object element : orderSet) {
             if (element instanceof FacetedMethod) {
                 final FacetedMethod facetMethod = (FacetedMethod) element;
@@ -232,13 +238,13 @@ public class ObjectSpecificationDefault 
                     associations.add(createProperty(facetMethod));
                 }
             } else if (element instanceof OrderSet) {
-                // Not supported at present
+                // just flatten.
+                OrderSet childOrderSet = (OrderSet) element;
+                addAssociations(childOrderSet, associations);
             } else {
                 throw new UnknownTypeException(element);
             }
         }
-
-        return associations;
     }
 
     private List<ObjectAction> asObjectActions(final OrderSet orderSet) {

Modified: incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsFacetAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsFacetAbstract.java?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsFacetAbstract.java (original)
+++ incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsFacetAbstract.java Fri Oct  5 11:20:38 2012
@@ -28,7 +28,7 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.facets.facets.FacetsFacet;
+import org.apache.isis.core.metamodel.facets.object.facets.FacetsFacet;
 
 public abstract class FacetsFacetAbstract extends FacetAbstract implements FacetsFacet {
 

Modified: incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java (original)
+++ incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java Fri Oct  5 11:20:38 2012
@@ -25,7 +25,7 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.facets.FacetsFacet;
+import org.apache.isis.core.metamodel.facets.object.facets.FacetsFacet;
 
 public class FacetsAnnotationFacetFactory extends FacetFactoryAbstract {
 

Copied: incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsFacetAbstract.java (from r1394123, incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsFacetAbstract.java?p2=incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsFacetAbstract.java&p1=incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java&r1=1394123&r2=1394445&rev=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java (original)
+++ incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsFacetAbstract.java Fri Oct  5 11:20:38 2012
@@ -17,25 +17,22 @@
  *  under the License.
  */
 
-package org.apache.isis.viewer.wicket.model.util;
+package org.apache.isis.core.progmodel.facets.object.membergroups;
 
-import com.google.common.base.Function;
+import java.util.List;
 
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupsFacet;
 
-public final class ObjectAssociations {
+public abstract class MemberGroupsFacetAbstract extends SingleValueFacetAbstract<List<String>> implements MemberGroupsFacet {
 
-    private ObjectAssociations() {
+    public static Class<? extends Facet> type() {
+        return MemberGroupsFacet.class;
     }
 
-    public static Function<String, OneToOneAssociation> fromId(final ObjectSpecification noSpec) {
-        return new Function<String, OneToOneAssociation>() {
-            @Override
-            public OneToOneAssociation apply(final String from) {
-                return (OneToOneAssociation) noSpec.getAssociation(from);
-            }
-        };
+    public MemberGroupsFacetAbstract(List<String> value, FacetHolder holder) {
+        super(type(), value, holder);
     }
-
 }

Copied: incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsAnnotationElseFallbackFacetFactory.java (from r1394123, incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsAnnotationElseFallbackFacetFactory.java?p2=incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsAnnotationElseFallbackFacetFactory.java&p1=incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java&r1=1394123&r2=1394445&rev=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/facets/annotation/FacetsAnnotationFacetFactory.java (original)
+++ incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsAnnotationElseFallbackFacetFactory.java Fri Oct  5 11:20:38 2012
@@ -17,25 +17,26 @@
  *  under the License.
  */
 
-package org.apache.isis.core.progmodel.facets.object.facets.annotation;
+package org.apache.isis.core.progmodel.facets.object.membergroups.annotation;
 
-import org.apache.isis.applib.annotation.Facets;
+import org.apache.isis.applib.annotation.MemberGroups;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.facets.FacetsFacet;
+import org.apache.isis.core.metamodel.facets.object.facets.FacetsFacet;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupsFacet;
 
-public class FacetsAnnotationFacetFactory extends FacetFactoryAbstract {
+public class MemberGroupsAnnotationElseFallbackFacetFactory extends FacetFactoryAbstract {
 
-    public FacetsAnnotationFacetFactory() {
+    public MemberGroupsAnnotationElseFallbackFacetFactory() {
         super(FeatureType.OBJECTS_ONLY);
     }
 
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
-        final Facets annotation = Annotations.getAnnotation(processClassContaxt.getCls(), Facets.class);
+        final MemberGroups annotation = Annotations.getAnnotation(processClassContaxt.getCls(), MemberGroups.class);
         FacetUtil.addFacet(create(annotation, processClassContaxt.getFacetHolder()));
     }
 
@@ -43,12 +44,10 @@ public class FacetsAnnotationFacetFactor
      * Returns a {@link FacetsFacet} impl provided that at least one valid
      * {@link FacetsFacet#facetFactories() factory} was specified.
      */
-    private FacetsFacet create(final Facets annotation, final FacetHolder holder) {
+    private MemberGroupsFacet create(final MemberGroups annotation, final FacetHolder holder) {
         if (annotation == null) {
-            return null;
+            return new MemberGroupsFacetFallback(holder);
         }
-        final FacetsFacetAnnotation facetsFacetAnnotation = new FacetsFacetAnnotation(annotation, holder);
-        return facetsFacetAnnotation.facetFactories().length > 0 ? facetsFacetAnnotation : null;
+        return new MemberGroupsFacetAnnotation(annotation, holder);
     }
-
 }

Added: incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetAnnotation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetAnnotation.java?rev=1394445&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetAnnotation.java (added)
+++ incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetAnnotation.java Fri Oct  5 11:20:38 2012
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.object.membergroups.annotation;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.isis.applib.annotation.MemberGroups;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupsFacet;
+import org.apache.isis.core.progmodel.facets.object.membergroups.MemberGroupsFacetAbstract;
+
+public class MemberGroupsFacetAnnotation extends MemberGroupsFacetAbstract {
+
+    private static List<String> asList(final String[] value) {
+        return value == null || value.length == 0 
+                ? Arrays.asList(MemberGroupsFacet.DEFAULT_GROUP) 
+                : Arrays.asList(value);
+    }
+    
+    public MemberGroupsFacetAnnotation(final MemberGroups annotation, final FacetHolder holder) {
+        super(asList(annotation.value()), holder);
+    }
+
+}

Copied: incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetFallback.java (from r1394123, incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetFallback.java?p2=incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetFallback.java&p1=incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java&r1=1394123&r2=1394445&rev=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java (original)
+++ incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/annotation/MemberGroupsFacetFallback.java Fri Oct  5 11:20:38 2012
@@ -17,25 +17,18 @@
  *  under the License.
  */
 
-package org.apache.isis.viewer.wicket.model.util;
+package org.apache.isis.core.progmodel.facets.object.membergroups.annotation;
 
-import com.google.common.base.Function;
+import java.util.Arrays;
 
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupsFacet;
+import org.apache.isis.core.progmodel.facets.object.membergroups.MemberGroupsFacetAbstract;
 
-public final class ObjectAssociations {
+public class MemberGroupsFacetFallback extends MemberGroupsFacetAbstract {
 
-    private ObjectAssociations() {
-    }
-
-    public static Function<String, OneToOneAssociation> fromId(final ObjectSpecification noSpec) {
-        return new Function<String, OneToOneAssociation>() {
-            @Override
-            public OneToOneAssociation apply(final String from) {
-                return (OneToOneAssociation) noSpec.getAssociation(from);
-            }
-        };
+    public MemberGroupsFacetFallback(final FacetHolder holder) {
+        super(Arrays.asList(MemberGroupsFacet.DEFAULT_GROUP), holder);
     }
 
 }

Modified: incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsAnnotationFacetFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsAnnotationFacetFactoryTest.java?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsAnnotationFacetFactoryTest.java (original)
+++ incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/facets/FacetsAnnotationFacetFactoryTest.java Fri Oct  5 11:20:38 2012
@@ -26,7 +26,7 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.facets.FacetsFacet;
+import org.apache.isis.core.metamodel.facets.object.facets.FacetsFacet;
 import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.progmodel.facets.object.facets.annotation.FacetsAnnotationFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.facets.annotation.FacetsFacetAnnotation;

Added: incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsAnnotationElseFallbackFacetFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsAnnotationElseFallbackFacetFactoryTest.java?rev=1394445&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsAnnotationElseFallbackFacetFactoryTest.java (added)
+++ incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupsAnnotationElseFallbackFacetFactoryTest.java Fri Oct  5 11:20:38 2012
@@ -0,0 +1,103 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.object.membergroups;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.isis.applib.annotation.MemberGroups;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupsFacet;
+import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.progmodel.facets.object.membergroups.annotation.MemberGroupsAnnotationElseFallbackFacetFactory;
+import org.apache.isis.core.progmodel.facets.object.membergroups.annotation.MemberGroupsFacetAnnotation;
+import org.apache.isis.core.progmodel.facets.object.membergroups.annotation.MemberGroupsFacetFallback;
+
+public class MemberGroupsAnnotationElseFallbackFacetFactoryTest extends AbstractFacetFactoryTest {
+
+    private MemberGroupsAnnotationElseFallbackFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new MemberGroupsAnnotationElseFallbackFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    @MemberGroups({"General","Foo", "Bar"})
+    public static class ClassWithMemberGroupsAnnotation {
+        
+    }
+    
+    @MemberGroups()
+    public static class ClassWithMemberGroupsAnnotationButNoGroupsNamed {
+    }
+    
+    public static class ClassWithoutMemberGroupsAnnotation {
+    }
+    
+
+    public void testWithMemberGroups() {
+        facetFactory.process(new ProcessClassContext(ClassWithMemberGroupsAnnotation.class, methodRemover, facetHolder));
+
+        final Facet facet = facetHolder.getFacet(MemberGroupsFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof MemberGroupsFacetAnnotation);
+        final MemberGroupsFacetAnnotation memberGroupsFacet = (MemberGroupsFacetAnnotation) facet;
+        final List<String> groupNames = memberGroupsFacet.value();
+        assertEquals(Arrays.asList("General", "Foo", "Bar"), groupNames);
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testWithMemberGroupsButNoGroupsNamed() {
+        facetFactory.process(new ProcessClassContext(ClassWithMemberGroupsAnnotationButNoGroupsNamed.class, methodRemover, facetHolder));
+
+        final Facet facet = facetHolder.getFacet(MemberGroupsFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof MemberGroupsFacetAnnotation);
+        final MemberGroupsFacetAnnotation memberGroupsFacet = (MemberGroupsFacetAnnotation) facet;
+        final List<String> groupNames = memberGroupsFacet.value();
+        assertEquals(Arrays.asList("General"), groupNames);
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testWithoutMemberGroups() {
+        facetFactory.process(new ProcessClassContext(ClassWithoutMemberGroupsAnnotation.class, methodRemover, facetHolder));
+
+        final Facet facet = facetHolder.getFacet(MemberGroupsFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof MemberGroupsFacetFallback);
+        final MemberGroupsFacetFallback memberGroupsFacet = (MemberGroupsFacetFallback) facet;
+        final List<String> groupNames = memberGroupsFacet.value();
+        assertEquals(Arrays.asList("General"), groupNames);
+
+        assertNoMethodsRemoved();
+    }
+
+}

Modified: incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java (original)
+++ incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java Fri Oct  5 11:20:38 2012
@@ -92,6 +92,7 @@ import org.apache.isis.core.progmodel.fa
 import org.apache.isis.core.progmodel.facets.object.immutable.markerifc.ImmutableMarkerInterfaceFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.mask.annotation.MaskAnnotationForTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.maxlen.annotation.MaxLengthAnnotationForTypeFacetFactory;
+import org.apache.isis.core.progmodel.facets.object.membergroups.annotation.MemberGroupsAnnotationElseFallbackFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.multiline.annotation.MultiLineAnnotationOnTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.named.annotation.NamedAnnotationOnTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.named.staticmethod.NamedFacetViaSingularNameStaticMethodFacetFactory;
@@ -281,7 +282,11 @@ public class ProgrammingModelFacetsJava5
         addFactory(TitleAnnotationFacetFactory.class);
         addFactory(TitleMethodFacetFactory.class);
 
+        addFactory(MemberOrderAnnotationFacetFactory.class);
         addFactory(ActionOrderAnnotationFacetFactory.class);
+        addFactory(FieldOrderAnnotationFacetFactory.class);
+        addFactory(MemberGroupsAnnotationElseFallbackFacetFactory.class);
+        
         addFactory(AggregatedAnnotationFacetFactory.class);
         addFactory(BoundedAnnotationFacetFactory.class);
         addFactory(BoundedMarkerInterfaceFacetFactory.class);
@@ -302,7 +307,6 @@ public class ProgrammingModelFacetsJava5
         addFactory(NotContributedAnnotationFacetFactory.class);
         addFactory(NotInServiceMenuAnnotationFacetFactory.class);
         addFactory(NotInServiceMenuMethodFacetFactory.class);
-        addFactory(FieldOrderAnnotationFacetFactory.class);
 
         addFactory(HiddenAnnotationForTypeFacetFactory.class);
         // must come after the TitleAnnotationFacetFactory, because can act as an override
@@ -323,8 +327,6 @@ public class ProgrammingModelFacetsJava5
         addFactory(MaxLengthAnnotationForPropertyFacetFactory.class);
         addFactory(MaxLengthAnnotationForParameterFacetFactory.class);
 
-        addFactory(MemberOrderAnnotationFacetFactory.class);
-
         addFactory(MustSatisfySpecificationOnTypeFacetFactory.class);
         addFactory(MustSatisfySpecificationOnPropertyFacetFactory.class);
         addFactory(MustSatisfySpecificationOnParameterFacetFactory.class);
@@ -353,12 +355,10 @@ public class ProgrammingModelFacetsJava5
 
         addFactory(AutoCompleteAnnotationFacetFactory.class);
 
-
         // must come after any facets that install titles
         addFactory(MaskAnnotationForTypeFacetFactory.class);
         addFactory(MaskAnnotationForPropertyFacetFactory.class);
         addFactory(MaskAnnotationForParameterFacetFactory.class);
-        
 
         // must come after any facets that install titles, and after mask
         // if takes precedence over mask.

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectAssociations.java Fri Oct  5 11:20:38 2012
@@ -19,9 +19,17 @@
 
 package org.apache.isis.viewer.wicket.model.util;
 
+import java.util.List;
+import java.util.Map;
+
 import com.google.common.base.Function;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
+import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public final class ObjectAssociations {
@@ -38,4 +46,34 @@ public final class ObjectAssociations {
         };
     }
 
+    public static Map<String, List<ObjectAssociation>> groupByMemberOrderName(List<ObjectAssociation> associations) {
+        Map<String, List<ObjectAssociation>> associationsByGroup = Maps.newHashMap();
+        for(ObjectAssociation association: associations) {
+            addAssociationIntoGroup(associationsByGroup, association);
+        }
+        return associationsByGroup;
+    }
+
+    private static void addAssociationIntoGroup(Map<String, List<ObjectAssociation>> associationsByGroup, ObjectAssociation association) {
+        final MemberOrderFacet memberOrderFacet = association.getFacet(MemberOrderFacet.class);
+        if(memberOrderFacet != null) {
+            final String name = memberOrderFacet.name();
+            if(!Strings.isNullOrEmpty(name)) {
+                getFrom(associationsByGroup, name).add(association);
+                return;
+            }
+        }
+        getFrom(associationsByGroup, "General").add(association);
+    }
+
+    private static List<ObjectAssociation> getFrom(Map<String, List<ObjectAssociation>> associationsByGroup, final String groupName) {
+        List<ObjectAssociation> list = associationsByGroup.get(groupName);
+        if(list == null) {
+            list = Lists.newArrayList();
+            associationsByGroup.put(groupName, list);
+        }
+        return list;
+    }
+
+
 }

Added: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java?rev=1394445&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java (added)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java Fri Oct  5 11:20:38 2012
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.model.util;
+
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupsFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+
+public final class ObjectSpecifications {
+
+    private ObjectSpecifications() {
+    }
+
+    public static List<String> orderByMemberGroups(ObjectSpecification objSpec, Set<String> groupNamesToOrder) {
+        final MemberGroupsFacet facet = objSpec.getFacet(MemberGroupsFacet.class);
+        final List<String> groupNames = Lists.newArrayList(groupNamesToOrder);
+        
+        // not expected to happen
+        if(facet == null) {
+            return groupNames;
+        }
+        
+        final List<String> groupNamedInRequiredOrder = facet.value();
+        return order(groupNames, groupNamedInRequiredOrder);
+    }
+
+    static List<String> order(final List<String> valuesToOrder, final List<String> valuesInRequiredOrder) {
+        int i=0;
+        for(String memberGroup: valuesInRequiredOrder) {
+            if(valuesToOrder.contains(memberGroup)) {
+                // move to next position
+                valuesToOrder.remove(memberGroup);
+                valuesToOrder.add(i++, memberGroup);
+            }
+        }
+        
+        return valuesToOrder;
+    }
+
+
+}

Added: incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/test/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecificationsTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/test/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecificationsTest.java?rev=1394445&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/test/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecificationsTest.java (added)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-model/src/test/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecificationsTest.java Fri Oct  5 11:20:38 2012
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.model.util;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class ObjectSpecificationsTest {
+    
+    @Parameters
+    public static Collection<Object[][]> data() {
+        return Arrays.asList(new Object[][][]{
+                {
+                    {"X","Y","Z"}, {"X","Y","Z"}, {"X","Y","Z"},
+                },
+                {
+                    {"X","Y","Z"}, {"A","B","C"}, {"X","Y","Z"}
+                },
+                {
+                    {"X","Y","Z"}, {"Z","B","C"}, {"Z","X","Y"}
+                },
+                {
+                    {"X","Y","Z"}, {"Z","Y","X"}, {"Z","Y","X"}
+                },
+                {
+                    {"Dates","General"}, {"General"}, {"General","Dates"}
+                },
+        });
+    }
+
+    private static List<String> asListOfStrings(Object[] values) {
+        final List<String> list = Lists.newArrayList();
+        for(Object value: values) {
+            list.add((String) value);
+        }
+        return list;
+    }
+
+    private final List<String> valuesToOrder;
+    private final List<String> valuesInRequiredOrder;
+    private final List<String> expected;
+     
+    public ObjectSpecificationsTest(Object[] valuesToOrder, Object[] valuesInRequiredOrder, Object[] expected) {
+        this.valuesToOrder = asListOfStrings(valuesToOrder);
+        this.valuesInRequiredOrder = asListOfStrings(valuesInRequiredOrder);
+        this.expected = asListOfStrings(expected);
+    }
+    
+    @Test
+    public void test() throws Exception {
+        assertThat(ObjectSpecifications.order(valuesToOrder, valuesInRequiredOrder), is(expected));
+    }
+}

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.html
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.html?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.html (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.html Fri Oct  5 11:20:38 2012
@@ -24,7 +24,7 @@
 			    <form wicket:id="entityProperties" class="inputForm">
 			    	<div class="inputFormTable properties">
 		    	    	<fieldset wicket:id="memberGroup" class="memberGroup">
-		    	    		<legend>General</legend>
+		    	    		<legend wicket:id="memberGroupName">[group name]</legend>
 					    	<div wicket:id="properties">
 				              <div wicket:id="property" class="property">[property]</div>
 					    	</div>

Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.java?rev=1394445&r1=1394444&r2=1394445&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesPanel.java Fri Oct  5 11:20:38 2012
@@ -20,12 +20,14 @@
 package org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.Session;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.FormComponent;
@@ -52,6 +54,8 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.util.ObjectAssociations;
+import org.apache.isis.viewer.wicket.model.util.ObjectSpecifications;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.panels.AjaxButtonWithPreSubmitHook;
@@ -68,8 +72,8 @@ public class EntityPropertiesPanel exten
 
     private static final long serialVersionUID = 1L;
 
-    private static final String ID_MEMBER_GROUP = "memberGroup";
     private static final String ID_ENTITY_PROPERTIES = "entityProperties";
+    
 
     private PropCollForm form;
 
@@ -99,6 +103,9 @@ public class EntityPropertiesPanel exten
 
         private static final long serialVersionUID = 1L;
 
+        private static final String ID_MEMBER_GROUP = "memberGroup";
+        private static final String ID_MEMBER_GROUP_NAME = "memberGroupName";
+
         private static final String ID_PROPERTIES = "properties";
         private static final String ID_PROPERTY = "property";
         private static final String ID_EDIT_BUTTON = "edit";
@@ -137,30 +144,40 @@ public class EntityPropertiesPanel exten
         private void addPropertiesAndOrCollections() {
             final EntityModel entityModel = (EntityModel) getModel();
             final ObjectAdapter adapter = entityModel.getObject();
-            final ObjectSpecification noSpec = adapter.getSpecification();
+            final ObjectSpecification objSpec = adapter.getSpecification();
 
-            final List<ObjectAssociation> associations = visibleAssociations(adapter, noSpec, Where.OBJECT_FORMS);
+            final List<ObjectAssociation> associations = visibleAssociations(adapter, objSpec, Where.OBJECT_FORMS);
 
             final RepeatingView memberGroupRv = new RepeatingView(ID_MEMBER_GROUP);
             add(memberGroupRv);
-            final WebMarkupContainer memberGroupRvContainer = new WebMarkupContainer(memberGroupRv.newChildId());
-            memberGroupRv.add(memberGroupRvContainer);
+
+            Map<String, List<ObjectAssociation>> associationsByGroup = ObjectAssociations.groupByMemberOrderName(associations);
+            final List<String> groupNames = ObjectSpecifications.orderByMemberGroups(objSpec, associationsByGroup.keySet());
             
-            final RepeatingView propertyRv = new RepeatingView(ID_PROPERTIES);
-            final EvenOrOddCssClassAppenderFactory eo = new EvenOrOddCssClassAppenderFactory();
-            memberGroupRvContainer.add(propertyRv);
-
-            @SuppressWarnings("unused")
-            Component component;
-            for (final ObjectAssociation association : associations) {
-                final WebMarkupContainer propertyRvContainer = new WebMarkupContainer(propertyRv.newChildId());
-                propertyRv.add(propertyRvContainer);
-                propertyRvContainer.add(eo.nextClass());
-                addPropertyToForm(entityModel, association, propertyRvContainer);
+            for(String groupName: groupNames) {
+                final List<ObjectAssociation> associationsInGroup = associationsByGroup.get(groupName);
+
+                final WebMarkupContainer memberGroupRvContainer = new WebMarkupContainer(memberGroupRv.newChildId());
+                memberGroupRv.add(memberGroupRvContainer);
+                memberGroupRvContainer.add(new Label(ID_MEMBER_GROUP_NAME, groupName));
+
+
+                final RepeatingView propertyRv = new RepeatingView(ID_PROPERTIES);
+                final EvenOrOddCssClassAppenderFactory eo = new EvenOrOddCssClassAppenderFactory();
+                memberGroupRvContainer.add(propertyRv);
+
+                @SuppressWarnings("unused")
+                Component component;
+                for (final ObjectAssociation association : associationsInGroup) {
+                    final WebMarkupContainer propertyRvContainer = new WebMarkupContainer(propertyRv.newChildId());
+                    propertyRv.add(propertyRvContainer);
+                    propertyRvContainer.add(eo.nextClass());
+                    addPropertyToForm(entityModel, association, propertyRvContainer);
+                }
             }
         }
 
-		private void addPropertyToForm(final EntityModel entityModel,
+        private void addPropertyToForm(final EntityModel entityModel,
 				final ObjectAssociation association,
 				final WebMarkupContainer container) {
 			final OneToOneAssociation otoa = (OneToOneAssociation) association;