ISIS-537: factoring out BulkActionsProvider interface.

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

Branch: refs/heads/master
Commit: 276472f96301ab5c971879bd18c91ad1320a086e
Parents: 5022f85
Author: Dan Haywood <[email protected]>
Authored: Mon Nov 10 18:40:52 2014 +0000
Committer: Dan Haywood <[email protected]>
Committed: Mon Nov 10 18:40:52 2014 +0000

----------------------------------------------------------------------
 .../ajaxtable/BulkActionsLinkFactory.java       |   8 +-
 .../ajaxtable/BulkActionsProvider.java          |  28 +++
 .../CollectionContentsAsAjaxTablePanel.java     | 186 ++++++++++---------
 .../widgets/cssmenu/CssMenuBuilder.java         |   5 +-
 4 files changed, 138 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/276472f9/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
index 4d7a9a8..826aebf 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
@@ -61,14 +61,16 @@ final class BulkActionsLinkFactory implements 
ActionLinkFactory {
     
     @SuppressWarnings("unused")
     private final DataTable<ObjectAdapter,String> dataTable;
-    private final ObjectAdapterToggleboxColumn toggleboxColumn;
+    private ObjectAdapterToggleboxColumn toggleboxColumn;
 
     BulkActionsLinkFactory(
             final EntityCollectionModel model, 
-            final DataTable<ObjectAdapter,String> dataTable, 
-            final ObjectAdapterToggleboxColumn toggleboxColumn) {
+            final DataTable<ObjectAdapter,String> dataTable) {
         this.model = model;
         this.dataTable = dataTable;
+    }
+
+    public void setToggleboxColumn(ObjectAdapterToggleboxColumn 
toggleboxColumn) {
         this.toggleboxColumn = toggleboxColumn;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/276472f9/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java
new file mode 100644
index 0000000..697f556
--- /dev/null
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java
@@ -0,0 +1,28 @@
+/*
+ *  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.ui.components.collectioncontents.ajaxtable;
+
+import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
+import 
org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFactory;
+
+public interface BulkActionsProvider {
+
+    public void configureBulkActionsProvider(ActionLinkFactory linkFactory, 
ActionPromptProvider actionPromptProvider);
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/276472f9/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index aca3535..74ec5d9 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -19,10 +19,8 @@
 
 package 
org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
 
-import java.util.Collections;
 import java.util.List;
 import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import org.apache.wicket.Component;
@@ -40,16 +38,16 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import 
org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.common.SelectionHandler;
 import org.apache.isis.viewer.wicket.model.hints.UiHintPathSignificant;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 import 
org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptModalWindow;
@@ -68,7 +66,7 @@ import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
  * {@link PanelAbstract Panel} that represents a {@link EntityCollectionModel
  * collection of entity}s rendered using {@link AjaxFallbackDefaultDataTable}.
  */
-public class CollectionContentsAsAjaxTablePanel extends 
PanelAbstract<EntityCollectionModel> implements CollectionCountProvider, 
ActionPromptProvider, UiHintPathSignificant {
+public class CollectionContentsAsAjaxTablePanel extends 
PanelAbstract<EntityCollectionModel> implements CollectionCountProvider, 
ActionPromptProvider, BulkActionsProvider, UiHintPathSignificant {
 
     private static final long serialVersionUID = 1L;
 
@@ -81,9 +79,12 @@ public class CollectionContentsAsAjaxTablePanel extends 
PanelAbstract<EntityColl
     private static final Predicate<ObjectAction> BULK = 
Filters.asPredicate(ObjectAction.Filters.bulk());
     
     private IsisAjaxFallbackDataTable<ObjectAdapter,String> dataTable;
+    private final BulkActionsHelper bulkActionsHelper;
+
 
     public CollectionContentsAsAjaxTablePanel(final String id, final 
EntityCollectionModel model) {
         super(id, model);
+        bulkActionsHelper = new BulkActionsHelper(model);
     }
     
     @Override
@@ -97,23 +98,47 @@ public class CollectionContentsAsAjaxTablePanel extends 
PanelAbstract<EntityColl
 
         final List<IColumn<ObjectAdapter,String>> columns = 
Lists.newArrayList();
 
-        List<ObjectAction> bulkActions = determineBulkActions();
+        List<ObjectAction> bulkActions = bulkActionsHelper.getBulkActions();
+
+        final ObjectAdapterToggleboxColumn toggleboxColumn = 
addToggleboxColumnIfRequired(columns, bulkActions);
 
-        ObjectAdapterToggleboxColumn toggleboxColumn = 
addToggleboxColumnIfRequired(columns, bulkActions);
         addTitleColumn(columns, model.getParentObjectAdapterMemento(), 
getSettings().getMaxTitleLengthInStandaloneTables(), 
getSettings().getMaxTitleLengthInStandaloneTables());
         addPropertyColumnsIfRequired(columns);
 
         final SortableDataProvider<ObjectAdapter,String> dataProvider = new 
CollectionContentsSortableDataProvider(model);
         dataTable = new IsisAjaxFallbackDataTable<>(ID_TABLE, columns, 
dataProvider, model.getPageSize());
-        
-        addActionPromptModalWindow();
-        buildEntityActionsGui(bulkActions, this, toggleboxColumn);
-
         addOrReplace(dataTable);
         dataTable.honourHints();
+
+        addActionPromptModalWindow();
+
+        // bulkactions
+        if(bulkActions.isEmpty() || getModel().isParented()) {
+            permanentlyHide(ID_ENTITY_ACTIONS);
+        } else {
+            BulkActionsLinkFactory linkFactory = new 
BulkActionsLinkFactory(getModel(), dataTable);
+            linkFactory.setToggleboxColumn(toggleboxColumn);
+
+            actionLinkFactoryDelegating = new ActionLinkFactoryDelegating();
+            actionPromptProviderDelegating = new 
ActionPromptProviderDelegating();
+
+            getBulkActionsProvider().configureBulkActionsProvider(linkFactory, 
this);
+
+            final CssMenuBuilder cssMenuBuilder = new CssMenuBuilder(null, 
bulkActions, actionLinkFactoryDelegating, actionPromptProviderDelegating, null);
+            final CssMenuPanel cssMenuPanel = 
cssMenuBuilder.buildPanel(ID_ENTITY_ACTIONS, "Actions");
+
+            this.addOrReplace(cssMenuPanel);
+
+        }
     }
 
-    private ObjectAdapterToggleboxColumn addToggleboxColumnIfRequired(final 
List<IColumn<ObjectAdapter,String>> columns, List<ObjectAction> bulkActions) {
+    private BulkActionsProvider getBulkActionsProvider() {
+        return this;
+    }
+
+    private ObjectAdapterToggleboxColumn addToggleboxColumnIfRequired(
+            final List<IColumn<ObjectAdapter,String>> columns,
+            final List<ObjectAction> bulkActions) {
         final EntityCollectionModel entityCollectionModel = getModel();
         if(bulkActions.isEmpty() || entityCollectionModel.isParented()) {
             return null;
@@ -149,58 +174,6 @@ public class CollectionContentsAsAjaxTablePanel extends 
PanelAbstract<EntityColl
         return toggleboxColumn;
     }
 
-    private void buildEntityActionsGui(
-            final List<ObjectAction> bulkActions,
-            final ActionPromptProvider actionPromptProvider,
-            final ObjectAdapterToggleboxColumn toggleboxColumn) {
-        final EntityCollectionModel model = getModel();
-
-        if(bulkActions.isEmpty() || model.isParented()) {
-            permanentlyHide(ID_ENTITY_ACTIONS);
-            return;
-        }
-
-        if(!bulkActions.isEmpty()) {
-            final ActionLinkFactory linkFactory = new 
BulkActionsLinkFactory(model, dataTable, toggleboxColumn);
-
-            final CssMenuBuilder cssMenuBuilder = new CssMenuBuilder(null, 
bulkActions, linkFactory, actionPromptProvider, null);
-            // TODO: i18n
-            final CssMenuPanel cssMenuPanel = 
cssMenuBuilder.buildPanel(ID_ENTITY_ACTIONS, "Actions");
-
-            this.addOrReplace(cssMenuPanel);
-        } else {
-            permanentlyHide(ID_ENTITY_ACTIONS);
-        }
-    }
-
-    private List<ObjectAction> determineBulkActions() {
-        final EntityCollectionModel model = getModel();
-        
-        if(model.isParented()) {
-            return Collections.emptyList();
-        }
-        
-        final ObjectSpecification typeSpec = model.getTypeOfSpecification();
-        
-        List<ObjectAction> objectActions = 
typeSpec.getObjectActions(ActionType.USER, Contributed.INCLUDED, 
Filters.<ObjectAction>any());
-        
-        if ( isExploring() || isPrototyping()) {
-            List<ObjectAction> explorationActions = 
typeSpec.getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, 
Filters.<ObjectAction>any());
-            List<ObjectAction> prototypeActions = 
typeSpec.getObjectActions(ActionType.PROTOTYPE, Contributed.INCLUDED, 
Filters.<ObjectAction>any());
-            objectActions.addAll(explorationActions);
-            objectActions.addAll(prototypeActions);
-        }
-        if (isDebugMode()) {
-            List<ObjectAction> debugActions = 
typeSpec.getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, 
Filters.<ObjectAction>any());
-            objectActions.addAll(debugActions);
-        }
-
-        List<ObjectAction> flattenedActions = objectActions;
-        
-        return Lists.newArrayList(Iterables.filter(flattenedActions, BULK));
-    }
-
-    
 
     private void addTitleColumn(final List<IColumn<ObjectAdapter,String>> 
columns, ObjectAdapterMemento parentAdapterMementoIfAny, int maxTitleParented, 
int maxTitleStandalone) {
         int maxTitleLength = getModel().isParented()? maxTitleParented: 
maxTitleStandalone;
@@ -270,10 +243,13 @@ public class CollectionContentsAsAjaxTablePanel extends 
PanelAbstract<EntityColl
         return model.getCount();
     }
 
-    
-    // ///////////////////////////////////////////////////////////////////
-    // ActionPromptModalWindowProvider
-    // ///////////////////////////////////////////////////////////////////
+
+    //region > BulkActionsProvider
+
+    //endregion
+
+
+    //region > ActionPromptModalWindowProvider
     
     private ActionPromptModalWindow actionPromptModalWindow;
     public ActionPromptModalWindow getActionPrompt() {
@@ -285,26 +261,10 @@ public class CollectionContentsAsAjaxTablePanel extends 
PanelAbstract<EntityColl
         addOrReplace(actionPromptModalWindow);
     }
 
+    //endregion
 
     // //////////////////////////////////////
     
-    public boolean isExploring() {
-        return IsisContext.getDeploymentType().isExploring();
-    }
-    public boolean isPrototyping() {
-        return IsisContext.getDeploymentType().isPrototyping();
-    }
-
-    /**
-     * Protected so can be overridden in testing if required.
-     */
-    protected boolean isDebugMode() {
-        // TODO: need to figure out how to switch into debug mode;
-        // probably call a Debug toggle page, and stuff into
-        // Session.getMetaData()
-        return true;
-    }
-
     @Override
     public void renderHead(IHeaderResponse response) {
         super.renderHead(response);
@@ -323,4 +283,60 @@ public class CollectionContentsAsAjaxTablePanel extends 
PanelAbstract<EntityColl
     protected MessageBroker getMessageBroker() {
         return getAuthenticationSession().getMessageBroker();
     }
+
+    // //////////////////////////////////////
+
+
+    private ActionPromptProviderDelegating actionPromptProviderDelegating;
+    private ActionLinkFactoryDelegating actionLinkFactoryDelegating;
+
+    @Override
+    public void configureBulkActionsProvider(
+            final ActionLinkFactory linkFactory,
+            final ActionPromptProvider actionPromptProvider) {
+        actionLinkFactoryDelegating.setDelegate(linkFactory);
+        actionPromptProviderDelegating.setDelegate(actionPromptProvider);
+    }
+
+    public static class ActionLinkFactoryDelegating implements 
ActionLinkFactory {
+
+        private ActionLinkFactory delegate;
+
+        public ActionLinkFactory getDelegate() {
+            return delegate;
+        }
+
+        public void setDelegate(ActionLinkFactory delegate) {
+            this.delegate = delegate;
+        }
+
+        @Override
+        public LinkAndLabel newLink(
+                final ObjectAdapterMemento adapter,
+                final ObjectAction noAction,
+                final String linkId,
+                final ActionPromptProvider actionPromptProvider) {
+            return delegate.newLink(adapter, noAction, linkId, 
actionPromptProvider);
+        }
+    }
+
+    public static class ActionPromptProviderDelegating implements 
ActionPromptProvider {
+
+        private ActionPromptProvider delegate;
+
+        public ActionPromptProvider getDelegate() {
+            return delegate;
+        }
+
+        public void setDelegate(ActionPromptProvider delegate) {
+            this.delegate = delegate;
+        }
+
+        @Override
+        public ActionPrompt getActionPrompt() {
+            return delegate.getActionPrompt();
+        }
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/276472f9/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
index c9f54e9..6b9189f 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
@@ -55,7 +55,10 @@ public class CssMenuBuilder {
         private final ActionPromptProvider actionPromptProvider;
         private final Predicate<ObjectAction> objectActionPredicate;
 
-        public CssMenuContext(ActionLinkFactory cssMenuLinkFactory, 
ActionPromptProvider actionPromptProvider, Predicate<ObjectAction> 
objectActionPredicate) {
+        public CssMenuContext(
+                final ActionLinkFactory cssMenuLinkFactory,
+                final ActionPromptProvider actionPromptProvider,
+                final Predicate<ObjectAction> objectActionPredicate) {
             this.cssMenuLinkFactory = cssMenuLinkFactory;
             this.actionPromptProvider = actionPromptProvider;
             this.objectActionPredicate = objectActionPredicate != null? 
objectActionPredicate: Predicates.<ObjectAction>alwaysTrue();

Reply via email to