You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2013/12/31 11:31:14 UTC

svn commit: r1554395 - /syncope/branches/1_1_X/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java

Author: fmartelli
Date: Tue Dec 31 10:31:14 2013
New Revision: 1554395

URL: http://svn.apache.org/r1554395
Log:
Fixes SYNCOPE-465 on the branch

Modified:
    syncope/branches/1_1_X/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java

Modified: syncope/branches/1_1_X/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java?rev=1554395&r1=1554394&r2=1554395&view=diff
==============================================================================
--- syncope/branches/1_1_X/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java (original)
+++ syncope/branches/1_1_X/console/src/main/java/org/apache/syncope/console/pages/panels/AjaxDataTablePanel.java Tue Dec 31 10:31:14 2013
@@ -20,7 +20,10 @@ package org.apache.syncope.console.pages
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import org.apache.syncope.console.commons.Constants;
 import org.apache.syncope.console.pages.AbstractBasePage;
 import org.apache.syncope.console.pages.BulkActionModalPage;
@@ -29,6 +32,7 @@ import org.apache.syncope.console.rest.B
 import org.apache.syncope.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
 import org.apache.syncope.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
 import org.apache.syncope.console.wicket.markup.html.form.ActionLink;
+import org.apache.wicket.Component;
 import org.apache.wicket.Page;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -36,12 +40,15 @@ import org.apache.wicket.ajax.form.AjaxF
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
+import org.apache.wicket.extensions.markup.html.repeater.data.grid.DataGridView;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
 import org.apache.wicket.markup.html.form.CheckGroup;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.model.IModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,13 +59,15 @@ public class AjaxDataTablePanel<T, S> ex
     /**
      * Logger.
      */
-    private static final Logger LOG = LoggerFactory.getLogger(AjaxDataTablePanel.class);
+    protected static final Logger LOG = LoggerFactory.getLogger(AjaxDataTablePanel.class);
 
     private final CheckGroup<T> group;
 
-    private final Form bulkActionForm;
+    private final Form<?> bulkActionForm;
 
-    private final AjaxFallbackDefaultDataTable<T, S> dataTable;
+    protected final AjaxFallbackDefaultDataTable<T, S> dataTable;
+
+    protected IModel<Collection<T>> model;
 
     public AjaxDataTablePanel(
             final String id,
@@ -73,6 +82,31 @@ public class AjaxDataTablePanel<T, S> ex
 
         super(id);
 
+        model = new IModel<Collection<T>>() {
+
+            private static final long serialVersionUID = 4886729136344643465L;
+
+            private Collection<T> values = new HashSet<T>();
+
+            @Override
+            public Collection<T> getObject() {
+                // Someone or something call this method to change the model: this is not the right behavior.
+                // Return a copy of the model object in order to avoid SYNCOPE-465
+                return new HashSet<T>(values);
+            }
+
+            @Override
+            public void setObject(final Collection<T> selected) {
+                final Collection<T> all = getGroupModelObjects();
+                values.removeAll(all);
+                values.addAll(selected);
+            }
+
+            @Override
+            public void detach() {
+            }
+        };
+
         final ModalWindow bulkModalWin = new ModalWindow("bulkModal");
         bulkModalWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
         bulkModalWin.setInitialHeight(600);
@@ -111,7 +145,7 @@ public class AjaxDataTablePanel<T, S> ex
         bulkActionForm = new Form("groupForm");
         fragment.add(bulkActionForm);
 
-        group = new CheckGroup<T>("checkgroup", new ArrayList<T>());
+        group = new CheckGroup<T>("checkgroup", model);
         group.add(new AjaxFormChoiceComponentUpdatingBehavior() {
 
             private static final long serialVersionUID = -151291731388673682L;
@@ -119,7 +153,6 @@ public class AjaxDataTablePanel<T, S> ex
             @Override
             protected void onUpdate(final AjaxRequestTarget target) {
             }
-
         });
         bulkActionForm.add(group);
 
@@ -174,4 +207,19 @@ public class AjaxDataTablePanel<T, S> ex
     public void setItemsPerPage(final int resourcePaginatorRows) {
         dataTable.setItemsPerPage(resourcePaginatorRows);
     }
+
+    protected Collection<T> getGroupModelObjects() {
+        final Set<T> res = new HashSet<T>();
+
+        final Component rows = group.get("dataTable:body:rows");
+        if (rows instanceof DataGridView) {
+            @SuppressWarnings("unchecked")
+            final Iterator<Item<T>> iter = ((DataGridView<T>) rows).getItems();
+
+            while (iter.hasNext()) {
+                res.add(iter.next().getModelObject());
+            }
+        }
+        return res;
+    }
 }