Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[KEYCLOAK-2538] - groups pagination and group search #4710

Closed
wants to merge 19 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
2f778b7
Merge remote-tracking branch 'upstream/master'
Sep 13, 2017
7844085
KEYCLOAK 2538 - UI group pagination
Sep 7, 2017
5680161
KEYCLOAK 2538 - UI group pagination - fix duplicate result for search…
Sep 12, 2017
1bf8a49
KEYCLOAK 2538 - UI group pagination - TU + some code improvement + ad…
Sep 12, 2017
e9bc897
KEYCLOAK 2538 - UI group pagination - Remove junit mocked TUs, add ar…
Sep 13, 2017
50d5ca0
Merge branch 'master' of https://github.com/keycloak/keycloak
Nov 10, 2017
476e9ae
Merge branch 'feature/group-search-and-pagination' of https://github.…
Nov 10, 2017
26f7743
Merge branch 'master' into feature/group-search-and-pagination
Nov 10, 2017
2072a53
KEYCLOAK 2538 - UI group pagination :
Nov 16, 2017
034c7f7
KEYCLOAK 2538 - UI group pagination - update pages number on group se…
Nov 17, 2017
80d9665
KEYCLOAK 2538 - UI group pagination - Remove GroupListLoader
Nov 17, 2017
049a7fa
Merge branch 'master' into feature/group-search-and-pagination
levyndot Jun 26, 2018
090742f
KEYCLOAK 2538 - compilation failed
Jun 26, 2018
8a5be04
Merge branch 'master' into feature/group-search-and-pagination
levyndot Jul 31, 2018
5f36d54
Merge branch 'master' of https://github.com/keycloak/keycloak
Sep 19, 2018
fa50540
Merge remote-tracking branch 'upstream/master'
Sep 21, 2018
621ab5b
Merge branch 'master' of https://github.com/keycloak/keycloak
Sep 25, 2018
ac58104
KEYCLOAK 2538 - UI group pagination
Sep 7, 2017
733cbf6
Merge remote-tracking branch 'origin/feature/group-search-and-paginat…
Sep 25, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view

This file was deleted.

@@ -0,0 +1 @@
OpenSans,Apache Software License 2.0.txt

This file was deleted.

@@ -0,0 +1 @@
OpenSans,Apache Software License 2.0.txt

This file was deleted.

@@ -0,0 +1 @@
OpenSans,Apache Software License 2.0.txt

This file was deleted.

@@ -0,0 +1 @@
OpenSans,Apache Software License 2.0.txt

This file was deleted.

@@ -0,0 +1 @@
org.bouncycastle,bcpkix-jdk15on,1.56,MIT License.txt

This file was deleted.

@@ -0,0 +1 @@
org.bouncycastle,bcpkix-jdk15on,1.52.0.redhat-3,MIT License.txt
Expand Up @@ -20,7 +20,14 @@
import org.jboss.resteasy.annotations.cache.NoCache;
import org.keycloak.representations.idm.GroupRepresentation;

import javax.ws.rs.*;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
Expand Down
4 changes: 4 additions & 0 deletions model/infinispan/pom.xml
Expand Up @@ -57,6 +57,10 @@
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi-private</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
Expand Up @@ -21,16 +21,55 @@
import org.keycloak.cluster.ClusterProvider;
import org.keycloak.component.ComponentModel;
import org.keycloak.migration.MigrationModel;
import org.keycloak.models.*;
import org.keycloak.models.ClientInitialAccessModel;
import org.keycloak.models.ClientModel;
import org.keycloak.models.ClientProvider;
import org.keycloak.models.ClientScopeModel;
import org.keycloak.models.GroupModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakTransaction;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RealmProvider;
import org.keycloak.models.RoleModel;
import org.keycloak.models.cache.CacheRealmProvider;
import org.keycloak.models.cache.CachedRealmModel;
import org.keycloak.models.cache.infinispan.entities.*;
import org.keycloak.models.cache.infinispan.events.*;
import org.keycloak.models.cache.infinispan.entities.CachedClient;
import org.keycloak.models.cache.infinispan.entities.CachedClientRole;
import org.keycloak.models.cache.infinispan.entities.CachedClientScope;
import org.keycloak.models.cache.infinispan.entities.CachedGroup;
import org.keycloak.models.cache.infinispan.entities.CachedRealm;
import org.keycloak.models.cache.infinispan.entities.CachedRealmRole;
import org.keycloak.models.cache.infinispan.entities.CachedRole;
import org.keycloak.models.cache.infinispan.entities.ClientListQuery;
import org.keycloak.models.cache.infinispan.entities.GroupListQuery;
import org.keycloak.models.cache.infinispan.entities.RealmListQuery;
import org.keycloak.models.cache.infinispan.entities.RoleListQuery;
import org.keycloak.models.cache.infinispan.events.ClientAddedEvent;
import org.keycloak.models.cache.infinispan.events.ClientRemovedEvent;
import org.keycloak.models.cache.infinispan.events.ClientTemplateEvent;
import org.keycloak.models.cache.infinispan.events.ClientUpdatedEvent;
import org.keycloak.models.cache.infinispan.events.GroupAddedEvent;
import org.keycloak.models.cache.infinispan.events.GroupMovedEvent;
import org.keycloak.models.cache.infinispan.events.GroupRemovedEvent;
import org.keycloak.models.cache.infinispan.events.GroupUpdatedEvent;
import org.keycloak.models.cache.infinispan.events.InvalidationEvent;
import org.keycloak.models.cache.infinispan.events.RealmRemovedEvent;
import org.keycloak.models.cache.infinispan.events.RealmUpdatedEvent;
import org.keycloak.models.cache.infinispan.events.RoleAddedEvent;
import org.keycloak.models.cache.infinispan.events.RoleRemovedEvent;
import org.keycloak.models.cache.infinispan.events.RoleUpdatedEvent;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.storage.StorageId;
import org.keycloak.storage.client.ClientStorageProviderModel;

import java.util.*;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;


/**
Expand Down Expand Up @@ -516,7 +555,11 @@ static String getGroupsQueryCacheKey(String realm) {
}

static String getTopGroupsQueryCacheKey(String realm) {
return realm + ".top.groups";
return getTopGroupsQueryCacheKey(realm, null, null);
}

static String getTopGroupsQueryCacheKey(String realm, Integer first, Integer max) {
return realm + ".top.groups" + ((first!=null)?"." + first:"") + ((max!=null)?"." + max:"");
}

static String getRolesCacheKey(String container) {
Expand Down Expand Up @@ -910,7 +953,7 @@ public List<GroupModel> getTopLevelGroups(RealmModel realm) {

@Override
public List<GroupModel> getTopLevelGroups(RealmModel realm, Integer first, Integer max) {
String cacheKey = getTopGroupsQueryCacheKey(realm.getId() + first + max);
String cacheKey = getTopGroupsQueryCacheKey(realm.getId(), first, max);
boolean queryDB = invalidations.contains(cacheKey) || listInvalidations.contains(realm.getId() + first + max);
if (queryDB) {
return getRealmDelegate().getTopLevelGroups(realm, first, max);
Expand Down
Expand Up @@ -17,6 +17,8 @@

package org.keycloak.models.jpa;

import com.sun.org.apache.xpath.internal.operations.Bool;
import org.apache.commons.codec.binary.StringUtils;
import org.jboss.logging.Logger;
import org.keycloak.common.util.Time;
import org.keycloak.connections.jpa.util.JpaUtils;
Expand Down
Expand Up @@ -17,6 +17,18 @@

package org.keycloak.models.utils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

import org.keycloak.authorization.AuthorizationProvider;
import org.keycloak.authorization.model.PermissionTicket;
import org.keycloak.authorization.model.Policy;
Expand All @@ -32,13 +44,61 @@
import org.keycloak.events.Event;
import org.keycloak.events.admin.AdminEvent;
import org.keycloak.events.admin.AuthDetails;
import org.keycloak.models.*;
import org.keycloak.models.AuthenticatedClientSessionModel;
import org.keycloak.models.AuthenticationExecutionModel;
import org.keycloak.models.AuthenticationFlowModel;
import org.keycloak.models.AuthenticatorConfigModel;
import org.keycloak.models.ClientModel;
import org.keycloak.models.ClientScopeModel;
import org.keycloak.models.FederatedIdentityModel;
import org.keycloak.models.GroupModel;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.ModelException;
import org.keycloak.models.OTPPolicy;
import org.keycloak.models.ProtocolMapperModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RequiredActionProviderModel;
import org.keycloak.models.RequiredCredentialModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserConsentModel;
import org.keycloak.models.UserCredentialModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.idm.*;
import org.keycloak.representations.idm.authorization.*;
import org.keycloak.representations.idm.AdminEventRepresentation;
import org.keycloak.representations.idm.AuthDetailsRepresentation;
import org.keycloak.representations.idm.AuthenticationExecutionExportRepresentation;
import org.keycloak.representations.idm.AuthenticationFlowRepresentation;
import org.keycloak.representations.idm.AuthenticatorConfigRepresentation;
import org.keycloak.representations.idm.ClientRepresentation;
import org.keycloak.representations.idm.ClientScopeRepresentation;
import org.keycloak.representations.idm.ComponentRepresentation;
import org.keycloak.representations.idm.ConfigPropertyRepresentation;
import org.keycloak.representations.idm.CredentialRepresentation;
import org.keycloak.representations.idm.EventRepresentation;
import org.keycloak.representations.idm.FederatedIdentityRepresentation;
import org.keycloak.representations.idm.GroupRepresentation;
import org.keycloak.representations.idm.IdentityProviderMapperRepresentation;
import org.keycloak.representations.idm.IdentityProviderRepresentation;
import org.keycloak.representations.idm.ProtocolMapperRepresentation;
import org.keycloak.representations.idm.RealmEventsConfigRepresentation;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.representations.idm.RequiredActionProviderRepresentation;
import org.keycloak.representations.idm.RoleRepresentation;
import org.keycloak.representations.idm.UserConsentRepresentation;
import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.representations.idm.UserSessionRepresentation;
import org.keycloak.representations.idm.authorization.AbstractPolicyRepresentation;
import org.keycloak.representations.idm.authorization.PermissionTicketRepresentation;
import org.keycloak.representations.idm.authorization.PolicyRepresentation;
import org.keycloak.representations.idm.authorization.ResourceOwnerRepresentation;
import org.keycloak.representations.idm.authorization.ResourceRepresentation;
import org.keycloak.representations.idm.authorization.ResourceServerRepresentation;
import org.keycloak.representations.idm.authorization.ScopeRepresentation;
import org.keycloak.storage.StorageId;

import java.util.*;
import java.util.stream.Collectors;
import java.util.Map;
import java.util.Objects;
Expand Down
Expand Up @@ -37,13 +37,15 @@
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.keycloak.services.resources.admin.permissions.AdminPermissionEvaluator;

/**
* @resource Groups
Expand Down
Expand Up @@ -657,9 +657,6 @@ module.config([ '$routeProvider', function($routeProvider) {
},
user : function(UserLoader) {
return UserLoader();
},
groups : function(GroupListLoader) {
return GroupListLoader();
}
},
controller : 'UserGroupMembershipCtrl'
Expand Down Expand Up @@ -892,9 +889,6 @@ module.config([ '$routeProvider', function($routeProvider) {
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
groups : function(GroupListLoader) {
return GroupListLoader();
}
},
controller : 'DefaultGroupsCtrl'
Expand Down