Repository: syncope
Updated Branches:
  refs/heads/2_0_X a7bf2af6d -> f5f489e2b


[SYNCOPE-1098] improves user and anyobject edit by improving performance in 
dealing with groups and memberships


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

Branch: refs/heads/2_0_X
Commit: f5f489e2b6fa5b7443a6a1e78c96553be7603819
Parents: a7bf2af
Author: fmartelli <fabio.marte...@gmail.com>
Authored: Thu May 25 14:45:19 2017 +0200
Committer: fmartelli <fabio.marte...@gmail.com>
Committed: Thu May 25 14:45:19 2017 +0200

----------------------------------------------------------------------
 .../client/console/wizards/any/Groups.java      | 62 +++++++++++++++-----
 .../console/wizards/any/Groups.properties       |  1 +
 .../console/wizards/any/Groups_it.properties    |  1 +
 .../console/wizards/any/Groups_pt_BR.properties |  1 +
 .../console/wizards/any/Groups_ru.properties    |  1 +
 5 files changed, 52 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/f5f489e2/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
index 1cdafc8..184f657 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
@@ -19,17 +19,18 @@
 package org.apache.syncope.client.console.wizards.any;
 
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition;
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
 import org.apache.syncope.client.console.rest.GroupRestClient;
 import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.search.GroupFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.GroupTO;
@@ -54,6 +55,8 @@ public class Groups extends WizardStep implements ICondition {
 
     private final List<GroupTO> allGroups;
 
+    private static final int MAX_GROUP_LIST_CARDINALITY = 30;
+
     public <T extends AnyTO> Groups(final T anyTO, final boolean templateMode) 
{
         super();
 
@@ -100,6 +103,17 @@ public class Groups extends WizardStep implements 
ICondition {
                     }
                 });
 
+        allGroups = groupRestClient.search(
+                realm,
+                
SyncopeClient.getGroupSearchConditionBuilder().isAssignable().query(),
+                1,
+                MAX_GROUP_LIST_CARDINALITY,
+                new SortParam<>("name", true),
+                null);
+
+        // ---------------------------------
+        // Retrieve group memberships
+        // ---------------------------------
         add(builder.setAllowOrder(true).withFilter().build("groups",
                 new 
ListModel<>(GroupableRelatableTO.class.cast(anyTO).getMemberships()),
                 new AjaxPalettePanel.Builder.Query<MembershipTO>() {
@@ -109,11 +123,13 @@ public class Groups extends WizardStep implements 
ICondition {
             @Override
             public List<MembershipTO> execute(final String filter) {
                 return CollectionUtils.collect(
-                        groupRestClient.search(
+                        StringUtils.isEmpty(filter) || "*".equals(filter)
+                        ? allGroups
+                        : groupRestClient.search(
                                 realm,
                                 SyncopeClient.getGroupSearchConditionBuilder().
-                                        
isAssignable().and().is("name").equalTo(filter).query(),
-                                -1, -1,
+                                
isAssignable().and().is("name").equalTo(filter).query(),
+                                1, MAX_GROUP_LIST_CARDINALITY,
                                 new SortParam<>("name", true),
                                 null),
                         new Transformer<GroupTO, MembershipTO>() {
@@ -127,20 +143,36 @@ public class Groups extends WizardStep implements 
ICondition {
                 }, new ArrayList<MembershipTO>());
             }
         }).hideLabel().setOutputMarkupId(true));
+        // ---------------------------------
+
+        // ---------------------------------
+        // Retrieve dyn group memberships
+        // ---------------------------------
+        final GroupFiqlSearchConditionBuilder searchConditionBuilder = 
SyncopeClient.getGroupSearchConditionBuilder();
 
-        allGroups = groupRestClient.search("/", null, -1, -1, new 
SortParam<>("name", true), null);
+        List<CompleteCondition> conditions = new ArrayList<>();
+        for (String groupKey : 
GroupableRelatableTO.class.cast(anyTO).getDynGroups()) {
+            
conditions.add(searchConditionBuilder.is("key").equalTo(groupKey).wrap());
+        }
 
-        final Map<String, GroupTO> allGroupsByKey = new 
LinkedHashMap<>(allGroups.size());
-        for (GroupTO group : allGroups) {
-            allGroupsByKey.put(group.getKey(), group);
+        final List<GroupTO> dynGroups = new ArrayList<>();
+        if (!conditions.isEmpty()) {
+            dynGroups.addAll(groupRestClient.search(
+                    "/",
+                    searchConditionBuilder.or(conditions).query(),
+                    -1,
+                    -1,
+                    new SortParam<>("name", true),
+                    null));
         }
+
         add(new 
AjaxPalettePanel.Builder<String>().setAllowOrder(true).build("dyngroups",
-                new 
ListModel<>(CollectionUtils.collect(GroupableRelatableTO.class.cast(anyTO).getDynGroups(),
-                        new Transformer<String, String>() {
+                new ListModel<>(CollectionUtils.collect(dynGroups,
+                        new Transformer<GroupTO, String>() {
 
                     @Override
-                    public String transform(final String input) {
-                        return allGroupsByKey.get(input).getName();
+                    public String transform(final GroupTO input) {
+                        return input.getName();
                     }
                 }, new ArrayList<String>())),
                 new ListModel<>(CollectionUtils.collect(allGroups, new 
Transformer<GroupTO, String>() {
@@ -151,12 +183,14 @@ public class Groups extends WizardStep implements 
ICondition {
                     }
                 }, new ArrayList<String>()))).
                 hideLabel().setEnabled(false).setOutputMarkupId(true));
+
+        // ---------------------------------
     }
 
     @Override
     public boolean evaluate() {
         return CollectionUtils.isNotEmpty(allGroups)
                 && 
SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy().
-                        isActionAuthorized(this, RENDER);
+                isActionAuthorized(this, RENDER);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f5f489e2/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups.properties
index c1cf4c4..295f1ac 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups.properties
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups.properties
@@ -16,3 +16,4 @@
 # under the License.
 groups.palette=Groups
 dyngroups.palette=Dynamic groups
+palette.available=Available (limited to the first 30 results)

http://git-wip-us.apache.org/repos/asf/syncope/blob/f5f489e2/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_it.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_it.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_it.properties
index c345f38..aa56e3c 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_it.properties
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_it.properties
@@ -16,3 +16,4 @@
 # under the License.
 groups.palette=Gruppi
 dyngroups.palette=Gruppi dinamici
+palette.available=Disponibili (limitato ai primi 30 risultati)

http://git-wip-us.apache.org/repos/asf/syncope/blob/f5f489e2/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_pt_BR.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_pt_BR.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_pt_BR.properties
index b4a0d34..b058c3d 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_pt_BR.properties
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_pt_BR.properties
@@ -16,3 +16,4 @@
 # under the License.
 groups.palette=Grupos
 dyngroups.palette=Grupos din\u00e2micos
+palette.available=Available (limited to the first 30 results)

http://git-wip-us.apache.org/repos/asf/syncope/blob/f5f489e2/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_ru.properties
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_ru.properties
 
b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_ru.properties
index aaa3ad3..4507518 100644
--- 
a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_ru.properties
+++ 
b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Groups_ru.properties
@@ -17,3 +17,4 @@
 #
 groups.palette=\u0413\u0440\u0443\u043f\u043f\u044b
 
dyngroups.palette=\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435
 \u0433\u0440\u0443\u043f\u043f\u044b
+palette.available=Available (limited to the first 30 results)

Reply via email to