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