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 2016/06/10 14:52:27 UTC

syncope git commit: [SYNCOPE-829] provides next button to browse resource connector objects. Furthermore a safety check has been provided into the method to retrieve the list of connector objects: the maximum number of returned items is set to 1k. Before

Repository: syncope
Updated Branches:
  refs/heads/master cc33c8dea -> 2ff73daa0


[SYNCOPE-829] provides next button to browse resource connector objects. Furthermore a safety check has been provided into the method to retrieve the list of connector objects: the maximum number of returned items is set to 1k. Before to close the related issue I will wait to discuss this last feature in order to collect feedbacks and evaluate the goodness of this implementation


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/2ff73daa
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/2ff73daa
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/2ff73daa

Branch: refs/heads/master
Commit: 2ff73daa024ea1ccaf20c9c6717058d85659c43f
Parents: cc33c8d
Author: fmartelli <fa...@gmail.com>
Authored: Fri Jun 10 16:52:06 2016 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Fri Jun 10 16:52:06 2016 +0200

----------------------------------------------------------------------
 .../panels/ConnObjectDirectoryPanel.java        | 194 -------------------
 .../console/panels/ConnObjectListViewPanel.java | 145 ++++++++++++++
 .../client/console/panels/ConnObjects.java      |  14 +-
 .../client/console/panels/ListViewPanel.java    |  32 ++-
 .../client/console/rest/ResourceRestClient.java |  31 ++-
 .../console/wizards/any/Relationships.java      |   4 +-
 .../resources/ResourceProvisionPanel.java       |   3 +-
 .../console/panels/ConnObjectListViewPanel.html |  26 +++
 .../syncope/core/logic/ResourceLogic.java       |   9 +-
 9 files changed, 235 insertions(+), 223 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java
deleted file mode 100644
index 99dde2e..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * 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.syncope.client.console.panels;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
-import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
-import org.apache.syncope.client.console.panels.ConnObjectDirectoryPanel.ConnObjectDataProvider;
-import org.apache.syncope.client.console.rest.ResourceRestClient;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
-import org.apache.syncope.common.lib.to.ConnObjectTO;
-import org.apache.syncope.common.lib.types.SchemaType;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.ResourceModel;
-
-public abstract class ConnObjectDirectoryPanel
-        extends DirectoryPanel<ConnObjectTO, ConnObjectTO, ConnObjectDataProvider, ResourceRestClient>
-        implements ModalPanel {
-
-    private static final long serialVersionUID = 4986172040062752781L;
-
-    private final String resource;
-
-    private final String anyType;
-
-    protected final BaseModal<?> baseModal;
-
-    private final MultilevelPanel multiLevelPanelRef;
-
-    protected ConnObjectDirectoryPanel(
-            final BaseModal<?> baseModal,
-            final MultilevelPanel multiLevelPanelRef,
-            final String resource,
-            final String anyType,
-            final PageReference pageRef) {
-
-        super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false);
-        this.resource = resource;
-        this.anyType = anyType;
-        this.baseModal = baseModal;
-        this.multiLevelPanelRef = multiLevelPanelRef;
-        restClient = new ResourceRestClient();
-        setShowResultPage(false);
-        disableCheckBoxes();
-        initResultTable();
-    }
-
-    @Override
-    protected void resultTableCustomChanges(final AjaxDataTablePanel.Builder<ConnObjectTO, String> resultTableBuilder) {
-        resultTableBuilder.setMultiLevelPanel(baseModal, multiLevelPanelRef);
-    }
-
-    @Override
-    protected ConnObjectDataProvider dataProvider() {
-        return new ConnObjectDataProvider(rows);
-    }
-
-    @Override
-    protected String paginatorRowsKey() {
-        return Constants.PREF_CONNOBJECTS_PAGINATOR_ROWS;
-    }
-
-    @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    protected List<IColumn<ConnObjectTO, String>> getColumns() {
-        final List<IColumn<ConnObjectTO, String>> columns = new ArrayList<>();
-
-        columns.add(new AttrColumn<>(ConnIdSpecialAttributeName.UID, SchemaType.PLAIN));
-        columns.add(new AttrColumn<>(ConnIdSpecialAttributeName.NAME, SchemaType.PLAIN));
-        columns.add(new AttrColumn<>(ConnIdSpecialAttributeName.ENABLE, SchemaType.PLAIN));
-
-        columns.add(new ActionColumn<ConnObjectTO, String>(new ResourceModel("actions")) {
-
-            private static final long serialVersionUID = 906457126287899096L;
-
-            @Override
-            public ActionLinksPanel<ConnObjectTO> getActions(
-                    final String componentId, final IModel<ConnObjectTO> model) {
-
-                final ConnObjectTO connObjectTO = model.getObject();
-
-                final ActionLinksPanel<ConnObjectTO> panel = ActionLinksPanel.<ConnObjectTO>builder().
-                        add(new ActionLink<ConnObjectTO>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final ConnObjectTO ignore) {
-                                viewConnObject(connObjectTO, target);
-                            }
-                        }, ActionLink.ActionType.VIEW, StandardEntitlement.RESOURCE_GET_CONNOBJECT).
-                        build(componentId);
-
-                return panel;
-            }
-
-            @Override
-            public ActionLinksPanel<ConnObjectTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<ConnObjectTO> panel = ActionLinksPanel.builder();
-
-                return panel.add(new ActionLink<ConnObjectTO>() {
-
-                    private static final long serialVersionUID = 7511002881490248598L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final ConnObjectTO ignore) {
-                        if (target != null) {
-                            target.add(container);
-                        }
-                    }
-                }, ActionLink.ActionType.RELOAD, StandardEntitlement.RESOURCE_LIST_CONNOBJECT).build(componentId);
-            }
-        });
-
-        return columns;
-    }
-
-    protected abstract void viewConnObject(ConnObjectTO connObjectTO, AjaxRequestTarget target);
-
-    protected class ConnObjectDataProvider extends DirectoryDataProvider<ConnObjectTO> {
-
-        private static final long serialVersionUID = -20112718133295756L;
-
-        private final SortableDataProviderComparator<ConnObjectTO> comparator;
-
-        private final List<ConnObjectTO> connObjectTOs;
-
-        public ConnObjectDataProvider(final int paginatorRows) {
-            super(paginatorRows);
-
-            setSort("lastChangeDate", SortOrder.DESCENDING);
-            comparator = new SortableDataProviderComparator<>(this);
-            connObjectTOs = restClient.listConnObjects(resource, anyType, getSort());
-        }
-
-        public SortableDataProviderComparator<ConnObjectTO> getComparator() {
-            return comparator;
-        }
-
-        @Override
-        public IModel<ConnObjectTO> model(final ConnObjectTO object) {
-            return new CompoundPropertyModel<>(object);
-        }
-
-        @Override
-        public long size() {
-            return connObjectTOs.size();
-        }
-
-        @Override
-        public Iterator<? extends ConnObjectTO> iterator(final long first, final long count) {
-            List<ConnObjectTO> sublist = connObjectTOs.subList((int) first, (int) (first + count));
-
-            Collections.sort(sublist, getComparator());
-            return sublist.iterator();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java
new file mode 100644
index 0000000..53e2c69
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java
@@ -0,0 +1,145 @@
+/*
+ * 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.syncope.client.console.panels;
+
+import java.io.Serializable;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
+import org.apache.syncope.client.console.panels.ListViewPanel.ListViewReload;
+import org.apache.syncope.client.console.rest.ResourceRestClient;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CollectionPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.ConnObjectTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.Component;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.Panel;
+
+public abstract class ConnObjectListViewPanel extends Panel {
+
+    private static final long serialVersionUID = 4986172040062752781L;
+
+    private static final int SIZE = 10;
+
+    private String nextPageCookie = null;
+
+    protected ConnObjectListViewPanel(
+            final String id,
+            final String resource,
+            final String anyType,
+            final PageReference pageRef) {
+
+        super(id);
+
+        final List<ConnObjectTO> listOfItems = reloadItems(resource, anyType, null);
+
+        final ListViewPanel.Builder<ConnObjectTO> builder = new ListViewPanel.Builder<ConnObjectTO>(
+                ConnObjectTO.class, pageRef) {
+
+            private static final long serialVersionUID = -8251750413385566738L;
+
+            @Override
+            protected Component getValueComponent(final String key, final ConnObjectTO bean) {
+                final AttrTO attrTO = IterableUtils.find(bean.getPlainAttrs(), new Predicate<AttrTO>() {
+
+                    @Override
+                    public boolean evaluate(final AttrTO object) {
+                        return object.getSchema().equals(key);
+                    }
+                });
+
+                return attrTO == null || CollectionUtils.isEmpty(attrTO.getValues())
+                        ? new Label("field", StringUtils.EMPTY)
+                        : new CollectionPanel("field", attrTO.getValues());
+            }
+
+        };
+
+        builder.setReuseItem(false);
+        builder.addAction(new ActionLink<ConnObjectTO>() {
+
+            private static final long serialVersionUID = 7511002881490248598L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final ConnObjectTO modelObject) {
+                viewConnObject(modelObject, target);
+            }
+        }, ActionLink.ActionType.VIEW, StandardEntitlement.RESOURCE_GET_CONNOBJECT).
+                setItems(listOfItems).
+                includes(
+                        ConnIdSpecialAttributeName.UID,
+                        ConnIdSpecialAttributeName.NAME,
+                        ConnIdSpecialAttributeName.ENABLE).
+                withChecks(ListViewPanel.CheckAvailability.NONE).
+                setReuseItem(false);
+
+        add(builder.build("objs"));
+
+        final WebMarkupContainer arrows = new WebMarkupContainer("arrows");
+        add(arrows.setOutputMarkupId(true));
+
+        arrows.add(new AjaxLink<Serializable>("next") {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                final List<ConnObjectTO> listOfItems = reloadItems(resource, anyType, nextPageCookie);
+                target.add(arrows);
+                send(ConnObjectListViewPanel.this, Broadcast.DEPTH,
+                        new ListViewReload<ConnObjectTO>(listOfItems, target));
+            }
+
+            @Override
+            public boolean isVisible() {
+                return nextPageCookie != null;
+            }
+        });
+    }
+
+    protected abstract void viewConnObject(ConnObjectTO connObjectTO, AjaxRequestTarget target);
+
+    private List<ConnObjectTO> reloadItems(
+            final String resource,
+            final String anyType,
+            final String cookie) {
+
+        final Pair<String, List<ConnObjectTO>> items = new ResourceRestClient().listConnObjects(
+                resource,
+                anyType,
+                SIZE,
+                cookie,
+                new SortParam<String>(ConnIdSpecialAttributeName.UID, true));
+
+        nextPageCookie = items.getLeft();
+        return items.getRight();
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
index 5d08ebe..cd29d21 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
@@ -50,8 +50,8 @@ public class ConnObjects extends Panel implements ModalPanel {
 
         super(BaseModal.CONTENT_ID);
 
-        List<String> availableAnyTypes =
-                CollectionUtils.collect(new ResourceRestClient().read(resource).getProvisions(),
+        List<String> availableAnyTypes = CollectionUtils.
+                collect(new ResourceRestClient().read(resource).getProvisions(),
                         new Transformer<ProvisionTO, String>() {
 
                     @Override
@@ -104,10 +104,14 @@ public class ConnObjects extends Panel implements ModalPanel {
         });
     }
 
-    private class NextableConnObjectDirectoryPanel extends ConnObjectDirectoryPanel {
+    private class NextableConnObjectDirectoryPanel extends ConnObjectListViewPanel {
 
         private static final long serialVersionUID = 956427874406567048L;
 
+        private final BaseModal<?> baseModal;
+
+        private final PageReference pageRef;
+
         NextableConnObjectDirectoryPanel(
                 final BaseModal<?> baseModal,
                 final MultilevelPanel multiLevelPanelRef,
@@ -115,7 +119,9 @@ public class ConnObjects extends Panel implements ModalPanel {
                 final String anyType,
                 final PageReference pageRef) {
 
-            super(baseModal, multiLevelPanelRef, resource, anyType, pageRef);
+            super(MultilevelPanel.FIRST_LEVEL_ID, resource, anyType, pageRef);
+            this.baseModal = baseModal;
+            this.pageRef = pageRef;
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
index e5fa626..ca63496 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -29,6 +29,7 @@ import java.util.List;
 import org.apache.commons.collections4.IteratorUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
@@ -36,7 +37,6 @@ import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.core.util.lang.PropertyResolver;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.markup.html.basic.Label;
@@ -110,7 +110,7 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
         final CheckGroup<T> checkGroup = new CheckGroup<>("group", model);
         checkGroup.setOutputMarkupId(true);
-        checkGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() {
+        checkGroup.add(new IndicatorAjaxFormChoiceComponentUpdatingBehavior() {
 
             private static final long serialVersionUID = -151291731388673682L;
 
@@ -391,8 +391,17 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
             target.add(ListViewPanel.this);
             super.onEvent(event);
-        } else if (event.getPayload() instanceof ListViewReload) {
-            ((ListViewReload) event.getPayload()).getTarget().add(ListViewPanel.this);
+        } else if (event.getPayload() instanceof ListViewPanel.ListViewReload) {
+            final ListViewPanel.ListViewReload<?> payload = (ListViewPanel.ListViewReload<?>) event.getPayload();
+            if (payload.getItems() != null) {
+                ListViewPanel.this.listOfItems.clear();
+                try {
+                    ListViewPanel.this.listOfItems.addAll((List<T>) payload.getItems());
+                } catch (RuntimeException re) {
+                    LOG.warn("Error reloading items", re);
+                }
+            }
+            payload.getTarget().add(ListViewPanel.this);
         } else {
             super.onEvent(event);
         }
@@ -400,17 +409,30 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
     protected abstract T getActualItem(final T item, final List<T> list);
 
-    public static class ListViewReload {
+    public static class ListViewReload<T extends Serializable> implements Serializable {
+
+        private static final long serialVersionUID = 1509151005816590312L;
 
         private final AjaxRequestTarget target;
 
+        private final List<T> items;
+
         public ListViewReload(final AjaxRequestTarget target) {
             this.target = target;
+            this.items = null;
+        }
+
+        public ListViewReload(final List<T> items, final AjaxRequestTarget target) {
+            this.target = target;
+            this.items = items;
         }
 
         public AjaxRequestTarget getTarget() {
             return target;
         }
 
+        public List<T> getItems() {
+            return items;
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
index f8ed1b3..b6b8db2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
@@ -61,34 +61,31 @@ public class ResourceRestClient extends BaseRestClient {
         return getService(ResourceService.class).readConnObject(resource, anyTypeKey, anyKey);
     }
 
-    public List<ConnObjectTO> listConnObjects(
+    public Pair<String, List<ConnObjectTO>> listConnObjects(
             final String resource,
             final String anyTypeKey,
+            final int size,
+            final String pagedResultCookie,
             final SortParam<String> sort) {
 
-        ConnObjectTOListQuery.Builder builder = new ConnObjectTOListQuery.Builder().size(100).orderBy(toOrderBy(sort));
+        ConnObjectTOListQuery.Builder builder = new ConnObjectTOListQuery.Builder().
+                pagedResultsCookie(pagedResultCookie).
+                size(size).
+                orderBy(toOrderBy(sort));
+
+        final List<ConnObjectTO> result = new ArrayList<>();
+        String nextPageResultCookie = null;
 
-        List<ConnObjectTO> result = new ArrayList<>();
         PagedConnObjectTOResult list;
         try {
-            do {
-                list = getService(ResourceService.class).listConnObjects(resource, anyTypeKey, builder.build());
-                result.addAll(list.getResult());
-
-                // TMP - see SYNCOPE-829
-                if (result.size() >= 100) {
-                    break;
-                }
-
-                if (list.getPagedResultsCookie() != null) {
-                    builder.pagedResultsCookie(list.getPagedResultsCookie());
-                }
-            } while (list.getPagedResultsCookie() != null);
+            list = getService(ResourceService.class).listConnObjects(resource, anyTypeKey, builder.build());
+            result.addAll(list.getResult());
+            nextPageResultCookie = list.getPagedResultsCookie();
         } catch (Exception e) {
             LOG.error("While listing objects on {} for any type {}", resource, anyTypeKey, e);
         }
 
-        return result;
+        return Pair.of(nextPageResultCookie, result);
     }
 
     public ResourceTO read(final String name) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
index d3699f3..c57557b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.wizards.any;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -134,7 +135,8 @@ public class Relationships extends WizardStep {
                                             public void onClick(
                                                     final AjaxRequestTarget target, final RelationshipTO modelObject) {
                                                 removeRelationships(relationships, modelObject);
-                                                send(Relationships.this, Broadcast.DEPTH, new ListViewReload(target));
+                                                send(Relationships.this, Broadcast.DEPTH, 
+                                                        new ListViewReload<Serializable>(target));
                                             }
                                         }, ActionType.DELETE, AnyEntitlement.UPDATE.getFor(anyTO.getType())).
                                         build(panelId);

http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
index 4ad8fb8..22e5e58 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
@@ -31,6 +31,7 @@ import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.panels.ListViewPanel;
+import org.apache.syncope.client.console.panels.ListViewPanel.ListViewReload;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
@@ -167,7 +168,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
                     @Override
                     public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
                         resourceTO.getProvisions().remove(provisionTO);
-                        send(ResourceProvisionPanel.this, Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
+                        send(ResourceProvisionPanel.this, Broadcast.DEPTH, new ListViewReload<Serializable>(target));
                     }
                 }, ActionLink.ActionType.DELETE, StandardEntitlement.RESOURCE_DELETE);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.html
new file mode 100644
index 0000000..d700143
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.html
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:panel>
+    <span wicket:id="objs"/>
+    <div wicket:id="arrows">
+      <a haref="#" class="btn btn-primary btn-circle btn-lg pull-right" wicket:id="next"><i class="fa fa-chevron-right"></i></a>
+    </div>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/2ff73daa/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
index e95e0b9..34d9544 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
@@ -77,6 +77,8 @@ import org.springframework.transaction.annotation.Transactional;
 @Component
 public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
 
+    private static final transient int MAX_CONNOBJ_SEARCH_SIZE = 1000;
+
     @Autowired
     private ExternalResourceDAO resourceDAO;
 
@@ -334,8 +336,11 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
 
         final SearchResult[] searchResult = new SearchResult[1];
         final List<ConnObjectTO> connObjects = new ArrayList<>();
+
         connector.search(init.getRight().getObjectClass(), null, new SearchResultsHandler() {
 
+            private int count = 0;
+
             @Override
             public void handleResult(final SearchResult result) {
                 searchResult[0] = result;
@@ -344,7 +349,9 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
             @Override
             public boolean handle(final ConnectorObject connectorObject) {
                 connObjects.add(connObjectUtils.getConnObjectTO(connectorObject));
-                return true;
+                // provide safety approach in case of pagination not supported or not required (SYNCOPE-829 reworking)
+                count++;
+                return count < MAX_CONNOBJ_SEARCH_SIZE;
             }
         }, size, pagedResultsCookie, orderBy, mapItems);