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/06/21 12:18:20 UTC

git commit: ISIS-443: logical application menus

Updated Branches:
  refs/heads/master 14de691ed -> 40c55b627


ISIS-443: logical application menus


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

Branch: refs/heads/master
Commit: 40c55b62797a78d1c2049f66bb094347876550ce
Parents: 14de691
Author: Dan Haywood <da...@apache.org>
Authored: Fri Jun 21 11:18:02 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Fri Jun 21 11:18:02 2013 +0100

----------------------------------------------------------------------
 .../cssmenu/AppActionsCssMenuFactory.java       | 147 +++++++++++++------
 1 file changed, 105 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/40c55b62/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java
index ea8e3ac..2518b49 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuFactory.java
@@ -19,14 +19,18 @@
 
 package org.apache.isis.viewer.wicket.ui.components.appactions.cssmenu;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.facets.named.NamedFacet;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -49,8 +53,23 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuPanel;
  */
 public class AppActionsCssMenuFactory extends ComponentFactoryAbstract {
 
-    private static final long serialVersionUID = 1L;
-    private final CssMenuLinkFactory cssMenuLinkFactory = new AppActionsCssMenuLinkFactory();
+    private final static long serialVersionUID = 1L;
+    
+    private final static CssMenuLinkFactory cssMenuLinkFactory = new AppActionsCssMenuLinkFactory();
+
+    static class LogicalServiceAction {
+        private final String serviceName;
+        private final ObjectAdapter serviceAdapter;
+        private final ObjectAdapterMemento serviceAdapterMemento;
+        private final ObjectAction objectAction;
+        
+        LogicalServiceAction(final String serviceName, final ObjectAdapter serviceAdapter, final ObjectAction objectAction) {
+            this.serviceName = serviceName;
+            this.serviceAdapter = serviceAdapter;
+            this.serviceAdapterMemento = ObjectAdapterMemento.createOrNull(serviceAdapter);
+            this.objectAction = objectAction;
+        }
+    }
 
     public AppActionsCssMenuFactory() {
         super(ComponentType.APPLICATION_ACTIONS);
@@ -70,60 +89,104 @@ public class AppActionsCssMenuFactory extends ComponentFactoryAbstract {
         return new CssMenuPanel(id, CssMenuPanel.Style.REGULAR, buildMenu(applicationActionsModel));
     }
 
-    private List<CssMenuItem> buildMenu(final ApplicationActionsModel cssModel) {
+    private List<CssMenuItem> buildMenu(final ApplicationActionsModel appActionsModel) {
 
-        final List<ObjectAdapter> serviceAdapters = cssModel.getObject();
-        final List<CssMenuItem> menuItems = new ArrayList<CssMenuItem>();
+        final List<ObjectAdapter> serviceAdapters = appActionsModel.getObject();
+
+        final List<LogicalServiceAction> serviceActions = Lists.newArrayList();
         for (final ObjectAdapter serviceAdapter : serviceAdapters) {
-            addMenuItemsIfVisible(menuItems, serviceAdapter);
+            collateServiceActions(serviceAdapter, ActionType.USER, serviceActions);
+            collateServiceActions(serviceAdapter, ActionType.PROTOTYPE, serviceActions);
         }
-
-        // addPlaytimeMenu(menuItems);
-
-        return menuItems;
+        
+        final List<String> serviceNamesInOrder = serviceNamesInOrder(serviceActions);
+        final Map<String, List<LogicalServiceAction>> serviceActionsByName = groupByServiceName(serviceActions);
+        
+        return buildMenuItems(serviceNamesInOrder, serviceActionsByName);
     }
 
-    private void addMenuItemsIfVisible(final List<CssMenuItem> menuItems, final ObjectAdapter serviceAdapter) {
-        final ObjectSpecification serviceSpec = serviceAdapter.getSpecification();
-        if (serviceSpec.isHidden()) {
-            return;
-        }
-        final ObjectAdapterMemento serviceAdapterMemento = ObjectAdapterMemento.createOrNull(serviceAdapter);
-        final String serviceName = serviceSpec.getFacet(NamedFacet.class).value();
-        final CssMenuItem serviceMenuItem = CssMenuItem.newMenuItem(serviceName).build();
-
-        addActionSubMenuItems(serviceAdapterMemento, serviceMenuItem);
-        if (serviceMenuItem.hasSubMenuItems()) {
-            menuItems.add(serviceMenuItem);
+    /**
+     * Builds a hierarchy of {@link CssMenuItem}s, following the provided map of {@link LogicalServiceAction}s (keyed by their service Name).
+     */
+    private List<CssMenuItem> buildMenuItems(final List<String> serviceNamesInOrder, final Map<String, List<LogicalServiceAction>> serviceActionsByName) {
+        final List<CssMenuItem> menuItems = Lists.newArrayList();
+        for (String serviceName : serviceNamesInOrder) {
+            final CssMenuItem serviceMenuItem = CssMenuItem.newMenuItem(serviceName).build();
+            final List<LogicalServiceAction> serviceActionsForName = serviceActionsByName.get(serviceName);
+            for (LogicalServiceAction logicalServiceAction : serviceActionsForName) {
+                final ObjectAdapter serviceAdapter = logicalServiceAction.serviceAdapter;
+                final ObjectSpecification serviceSpec = serviceAdapter.getSpecification();
+                if (serviceSpec.isHidden()) {
+                    continue;
+                }
+                final ObjectAdapterMemento serviceAdapterMemento = logicalServiceAction.serviceAdapterMemento;
+                final ObjectAction objectAction = logicalServiceAction.objectAction;
+                final Builder subMenuItemBuilder = serviceMenuItem.newSubMenuItem(serviceAdapterMemento, objectAction, cssMenuLinkFactory);
+                if (subMenuItemBuilder == null) {
+                    // not visible
+                    continue;
+                } 
+                subMenuItemBuilder.build();
+            }
+            if (serviceMenuItem.hasSubMenuItems()) {
+                menuItems.add(serviceMenuItem);
+            }
         }
+        return menuItems;
     }
 
-    private void addActionSubMenuItems(final ObjectAdapterMemento serviceAdapterMemento, final CssMenuItem serviceMenuItem) {
-
-        addActionSubMenuItems(serviceAdapterMemento, serviceMenuItem, ActionType.USER);
-        addActionSubMenuItems(serviceAdapterMemento, serviceMenuItem, ActionType.PROTOTYPE);
-    }
 
-    private void addActionSubMenuItems(
-        final ObjectAdapterMemento serviceAdapterMemento,
-        final CssMenuItem serviceMenuItem,
-        ActionType actionType) {
-        final ObjectSpecification serviceSpec = serviceAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK).getSpecification();
-        for (final ObjectAction noAction : serviceSpec.getObjectActions(actionType, Contributed.INCLUDED)) {
+    // //////////////////////////////////////
 
+    /**
+     * Spin through all object actions of the service adapter, and add to the provided List of {@link LogicalServiceAction}s. 
+     */
+    private static void collateServiceActions(final ObjectAdapter serviceAdapter, ActionType actionType, List<LogicalServiceAction> serviceActions) {
+        final ObjectSpecification serviceSpec = serviceAdapter.getSpecification();
+        for (final ObjectAction objectAction : serviceSpec.getObjectActions(actionType, Contributed.INCLUDED)) {
             // skip if annotated to not be included in repository menu
-            if (noAction.getFacet(NotInServiceMenuFacet.class) != null) {
+            if (objectAction.getFacet(NotInServiceMenuFacet.class) != null) {
                 continue;
             }
-            final Builder subMenuItemBuilder = serviceMenuItem.newSubMenuItem(serviceAdapterMemento, noAction, getLinkFactory());
-            if (subMenuItemBuilder != null) {
-                // not visible
-                subMenuItemBuilder.build();
+
+            final MemberOrderFacet memberOrderFacet = objectAction.getFacet(MemberOrderFacet.class);
+            String serviceName = memberOrderFacet != null? memberOrderFacet.name(): null;
+            if(Strings.isNullOrEmpty(serviceName)){
+                serviceName = serviceSpec.getFacet(NamedFacet.class).value();
+            }
+            serviceActions.add(new LogicalServiceAction(serviceName, serviceAdapter, objectAction));
+        }
+    }
+
+    /**
+     * The unique service names, as they appear in order of the provided List of {@link LogicalServiceAction}s.
+     */
+    private List<String> serviceNamesInOrder(final List<LogicalServiceAction> serviceActions) {
+        final List<String> serviceNameOrder = Lists.newArrayList();
+        for (LogicalServiceAction serviceAction : serviceActions) {
+            if(!serviceNameOrder.contains(serviceAction.serviceName)) {
+                serviceNameOrder.add(serviceAction.serviceName);
             }
         }
+        return serviceNameOrder;
     }
 
-    private CssMenuLinkFactory getLinkFactory() {
-        return cssMenuLinkFactory;
+    /**
+     * Group the provided {@link LogicalServiceAction}s by their service name. 
+     */
+    private static Map<String, List<LogicalServiceAction>> groupByServiceName(final List<LogicalServiceAction> serviceActions) {
+        final Map<String, List<LogicalServiceAction>> serviceActionsByName = Maps.newTreeMap(); 
+        for (LogicalServiceAction serviceAction : serviceActions) {
+            List<LogicalServiceAction> serviceActionsForName = serviceActionsByName.get(serviceAction.serviceName);
+            if(serviceActionsForName == null) {
+                serviceActionsForName = Lists.newArrayList();
+                serviceActionsByName.put(serviceAction.serviceName, serviceActionsForName);
+            }
+            serviceActionsForName.add(serviceAction);
+        }
+        return serviceActionsByName;
     }
+
+
+
 }