KEYCLOAK-1187

This commit is contained in:
Stian Thorgersen 2015-04-14 07:49:18 +02:00
parent a9ed193826
commit 9c6e6c8284
12 changed files with 64 additions and 69 deletions

View file

@ -3,7 +3,7 @@ package org.keycloak.models.cache.infinispan;
import org.infinispan.Cache; import org.infinispan.Cache;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.models.cache.RealmCache; import org.keycloak.models.cache.RealmCache;
import org.keycloak.models.cache.entities.CachedApplication; import org.keycloak.models.cache.entities.CachedClient;
import org.keycloak.models.cache.entities.CachedRealm; import org.keycloak.models.cache.entities.CachedRealm;
import org.keycloak.models.cache.entities.CachedRole; import org.keycloak.models.cache.entities.CachedRole;
@ -77,19 +77,19 @@ public class InfinispanRealmCache implements RealmCache {
} }
@Override @Override
public CachedApplication getApplication(String id) { public CachedClient getApplication(String id) {
if (!enabled) return null; if (!enabled) return null;
return get(id, CachedApplication.class); return get(id, CachedClient.class);
} }
@Override @Override
public void invalidateApplication(CachedApplication app) { public void invalidateApplication(CachedClient app) {
logger.tracev("Removing application {0}", app.getId()); logger.tracev("Removing application {0}", app.getId());
cache.remove(app.getId()); cache.remove(app.getId());
} }
@Override @Override
public void addCachedApplication(CachedApplication app) { public void addCachedClient(CachedClient app) {
if (!enabled) return; if (!enabled) return;
logger.tracev("Adding application {0}", app.getId()); logger.tracev("Adding application {0}", app.getId());
cache.put(app.getId(), app); cache.put(app.getId(), app);

View file

@ -6,7 +6,7 @@ import org.keycloak.models.ProtocolMapperModel;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleContainerModel; import org.keycloak.models.RoleContainerModel;
import org.keycloak.models.RoleModel; import org.keycloak.models.RoleModel;
import org.keycloak.models.cache.entities.CachedApplication; import org.keycloak.models.cache.entities.CachedClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -24,9 +24,9 @@ public class ClientAdapter implements ClientModel {
protected RealmCache cache; protected RealmCache cache;
protected ClientModel updated; protected ClientModel updated;
protected CachedApplication cached; protected CachedClient cached;
public ClientAdapter(RealmModel cachedRealm, CachedApplication cached, CacheRealmProvider cacheSession, RealmCache cache) { public ClientAdapter(RealmModel cachedRealm, CachedClient cached, CacheRealmProvider cacheSession, RealmCache cache) {
this.cachedRealm = cachedRealm; this.cachedRealm = cachedRealm;
this.cache = cache; this.cache = cache;
this.cacheSession = cacheSession; this.cacheSession = cacheSession;

View file

@ -6,8 +6,8 @@ import org.keycloak.models.KeycloakTransaction;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.models.RealmProvider; import org.keycloak.models.RealmProvider;
import org.keycloak.models.RoleModel; import org.keycloak.models.RoleModel;
import org.keycloak.models.cache.entities.CachedApplication; import org.keycloak.models.cache.entities.CachedClient;
import org.keycloak.models.cache.entities.CachedApplicationRole; import org.keycloak.models.cache.entities.CachedClientRole;
import org.keycloak.models.cache.entities.CachedRealm; import org.keycloak.models.cache.entities.CachedRealm;
import org.keycloak.models.cache.entities.CachedRealmRole; import org.keycloak.models.cache.entities.CachedRealmRole;
import org.keycloak.models.cache.entities.CachedRole; import org.keycloak.models.cache.entities.CachedRole;
@ -235,7 +235,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null; if (model == null) return null;
if (roleInvalidations.contains(id)) return model; if (roleInvalidations.contains(id)) return model;
if (model.getContainer() instanceof ClientModel) { if (model.getContainer() instanceof ClientModel) {
cached = new CachedApplicationRole(((ClientModel) model.getContainer()).getId(), model, realm); cached = new CachedClientRole(((ClientModel) model.getContainer()).getId(), model, realm);
} else { } else {
cached = new CachedRealmRole(model, realm); cached = new CachedRealmRole(model, realm);
} }
@ -254,7 +254,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
@Override @Override
public ClientModel getClientById(String id, RealmModel realm) { public ClientModel getClientById(String id, RealmModel realm) {
if (!cache.isEnabled()) return getDelegate().getClientById(id, realm); if (!cache.isEnabled()) return getDelegate().getClientById(id, realm);
CachedApplication cached = cache.getApplication(id); CachedClient cached = cache.getApplication(id);
if (cached != null && !cached.getRealm().equals(realm.getId())) { if (cached != null && !cached.getRealm().equals(realm.getId())) {
cached = null; cached = null;
} }
@ -263,8 +263,8 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
ClientModel model = getDelegate().getClientById(id, realm); ClientModel model = getDelegate().getClientById(id, realm);
if (model == null) return null; if (model == null) return null;
if (appInvalidations.contains(id)) return model; if (appInvalidations.contains(id)) return model;
cached = new CachedApplication(cache, getDelegate(), realm, model); cached = new CachedClient(cache, getDelegate(), realm, model);
cache.addCachedApplication(cached); cache.addCachedClient(cached);
} else if (appInvalidations.contains(id)) { } else if (appInvalidations.contains(id)) {
return getDelegate().getClientById(id, realm); return getDelegate().getClientById(id, realm);
} else if (managedApplications.containsKey(id)) { } else if (managedApplications.containsKey(id)) {

View file

@ -1,6 +1,6 @@
package org.keycloak.models.cache; package org.keycloak.models.cache;
import org.keycloak.models.cache.entities.CachedApplication; import org.keycloak.models.cache.entities.CachedClient;
import org.keycloak.models.cache.entities.CachedRealm; import org.keycloak.models.cache.entities.CachedRealm;
import org.keycloak.models.cache.entities.CachedRole; import org.keycloak.models.cache.entities.CachedRole;
@ -14,7 +14,7 @@ public class MemoryRealmCache implements RealmCache {
protected ConcurrentHashMap<String, CachedRealm> realmCache = new ConcurrentHashMap<String, CachedRealm>(); protected ConcurrentHashMap<String, CachedRealm> realmCache = new ConcurrentHashMap<String, CachedRealm>();
protected ConcurrentHashMap<String, CachedRealm> realmCacheByName = new ConcurrentHashMap<String, CachedRealm>(); protected ConcurrentHashMap<String, CachedRealm> realmCacheByName = new ConcurrentHashMap<String, CachedRealm>();
protected ConcurrentHashMap<String, CachedApplication> applicationCache = new ConcurrentHashMap<String, CachedApplication>(); protected ConcurrentHashMap<String, CachedClient> applicationCache = new ConcurrentHashMap<String, CachedClient>();
protected ConcurrentHashMap<String, CachedRole> roleCache = new ConcurrentHashMap<String, CachedRole>(); protected ConcurrentHashMap<String, CachedRole> roleCache = new ConcurrentHashMap<String, CachedRole>();
protected volatile boolean enabled = true; protected volatile boolean enabled = true;
@ -72,18 +72,18 @@ public class MemoryRealmCache implements RealmCache {
} }
@Override @Override
public CachedApplication getApplication(String id) { public CachedClient getApplication(String id) {
if (!enabled) return null; if (!enabled) return null;
return applicationCache.get(id); return applicationCache.get(id);
} }
@Override @Override
public void invalidateApplication(CachedApplication app) { public void invalidateApplication(CachedClient app) {
applicationCache.remove(app.getId()); applicationCache.remove(app.getId());
} }
@Override @Override
public void addCachedApplication(CachedApplication app) { public void addCachedClient(CachedClient app) {
if (!enabled) return; if (!enabled) return;
applicationCache.put(app.getId(), app); applicationCache.put(app.getId(), app);
} }

View file

@ -474,7 +474,7 @@ public class RealmAdapter implements RealmModel {
public Map<String, ClientModel> getClientNameMap() { public Map<String, ClientModel> getClientNameMap() {
if (updated != null) return updated.getClientNameMap(); if (updated != null) return updated.getClientNameMap();
Map<String, ClientModel> map = new HashMap<String, ClientModel>(); Map<String, ClientModel> map = new HashMap<String, ClientModel>();
for (String id : cached.getApplications().values()) { for (String id : cached.getClients().values()) {
ClientModel model = cacheSession.getClientById(id, this); ClientModel model = cacheSession.getClientById(id, this);
if (model == null) { if (model == null) {
throw new IllegalStateException("Cached application not found: " + id); throw new IllegalStateException("Cached application not found: " + id);
@ -488,7 +488,7 @@ public class RealmAdapter implements RealmModel {
public List<ClientModel> getClients() { public List<ClientModel> getClients() {
if (updated != null) return updated.getClients(); if (updated != null) return updated.getClients();
List<ClientModel> apps = new LinkedList<ClientModel>(); List<ClientModel> apps = new LinkedList<ClientModel>();
for (String id : cached.getApplications().values()) { for (String id : cached.getClients().values()) {
ClientModel model = cacheSession.getClientById(id, this); ClientModel model = cacheSession.getClientById(id, this);
if (model == null) { if (model == null) {
throw new IllegalStateException("Cached application not found: " + id); throw new IllegalStateException("Cached application not found: " + id);
@ -531,7 +531,7 @@ public class RealmAdapter implements RealmModel {
@Override @Override
public ClientModel getClientByClientId(String clientId) { public ClientModel getClientByClientId(String clientId) {
if (updated != null) return updated.getClientByClientId(clientId); if (updated != null) return updated.getClientByClientId(clientId);
String id = cached.getApplications().get(clientId); String id = cached.getClients().get(clientId);
if (id == null) return null; if (id == null) return null;
return getClientById(id); return getClientById(id);
} }
@ -752,7 +752,7 @@ public class RealmAdapter implements RealmModel {
@Override @Override
public ClientModel getMasterAdminClient() { public ClientModel getMasterAdminClient() {
return cacheSession.getRealm(Config.getAdminRealm()).getClientById(cached.getMasterAdminApp()); return cacheSession.getRealm(Config.getAdminRealm()).getClientById(cached.getMasterAdminClient());
} }
@Override @Override

View file

@ -1,6 +1,6 @@
package org.keycloak.models.cache; package org.keycloak.models.cache;
import org.keycloak.models.cache.entities.CachedApplication; import org.keycloak.models.cache.entities.CachedClient;
import org.keycloak.models.cache.entities.CachedRealm; import org.keycloak.models.cache.entities.CachedRealm;
import org.keycloak.models.cache.entities.CachedRole; import org.keycloak.models.cache.entities.CachedRole;
@ -21,11 +21,11 @@ public interface RealmCache {
void invalidateCachedRealmById(String id); void invalidateCachedRealmById(String id);
CachedApplication getApplication(String id); CachedClient getApplication(String id);
void invalidateApplication(CachedApplication app); void invalidateApplication(CachedClient app);
void addCachedApplication(CachedApplication app); void addCachedClient(CachedClient app);
void invalidateCachedApplicationById(String id); void invalidateCachedApplicationById(String id);

View file

@ -3,7 +3,7 @@ package org.keycloak.models.cache;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleContainerModel; import org.keycloak.models.RoleContainerModel;
import org.keycloak.models.RoleModel; import org.keycloak.models.RoleModel;
import org.keycloak.models.cache.entities.CachedApplicationRole; import org.keycloak.models.cache.entities.CachedClientRole;
import org.keycloak.models.cache.entities.CachedRealmRole; import org.keycloak.models.cache.entities.CachedRealmRole;
import org.keycloak.models.cache.entities.CachedRole; import org.keycloak.models.cache.entities.CachedRole;
import org.keycloak.models.utils.KeycloakModelUtils; import org.keycloak.models.utils.KeycloakModelUtils;
@ -106,8 +106,8 @@ public class RoleAdapter implements RoleModel {
if (cached instanceof CachedRealmRole) { if (cached instanceof CachedRealmRole) {
return realm; return realm;
} else { } else {
CachedApplicationRole appRole = (CachedApplicationRole)cached; CachedClientRole appRole = (CachedClientRole)cached;
return realm.getClientById(appRole.getAppId()); return realm.getClientById(appRole.getIdClient());
} }
} }

View file

@ -1,22 +0,0 @@
package org.keycloak.models.cache.entities;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class CachedApplicationRole extends CachedRole {
private final String appId;
public CachedApplicationRole(String appId, RoleModel model, RealmModel realm) {
super(model, realm);
this.appId = appId;
}
public String getAppId() {
return appId;
}
}

View file

@ -21,7 +21,7 @@ import java.util.TreeMap;
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $ * @version $Revision: 1 $
*/ */
public class CachedApplication { public class CachedClient {
private String id; private String id;
private String name; private String name;
private String realm; private String realm;
@ -49,7 +49,7 @@ public class CachedApplication {
private int nodeReRegistrationTimeout; private int nodeReRegistrationTimeout;
private Map<String, Integer> registeredNodes; private Map<String, Integer> registeredNodes;
public CachedApplication(RealmCache cache, RealmProvider delegate, RealmModel realm, ClientModel model) { public CachedClient(RealmCache cache, RealmProvider delegate, RealmModel realm, ClientModel model) {
id = model.getId(); id = model.getId();
secret = model.getSecret(); secret = model.getSecret();
name = model.getClientId(); name = model.getClientId();
@ -79,7 +79,7 @@ public class CachedApplication {
consentRequired = model.isConsentRequired(); consentRequired = model.isConsentRequired();
for (RoleModel role : model.getRoles()) { for (RoleModel role : model.getRoles()) {
roles.put(role.getName(), role.getId()); roles.put(role.getName(), role.getId());
cache.addCachedRole(new CachedApplicationRole(id, role, realm)); cache.addCachedRole(new CachedClientRole(id, role, realm));
} }
nodeReRegistrationTimeout = model.getNodeReRegistrationTimeout(); nodeReRegistrationTimeout = model.getNodeReRegistrationTimeout();

View file

@ -0,0 +1,22 @@
package org.keycloak.models.cache.entities;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class CachedClientRole extends CachedRole {
private final String idClient;
public CachedClientRole(String idClient, RoleModel model, RealmModel realm) {
super(model, realm);
this.idClient = idClient;
}
public String getIdClient() {
return idClient;
}
}

View file

@ -66,7 +66,7 @@ public class CachedRealm {
private String accountTheme; private String accountTheme;
private String adminTheme; private String adminTheme;
private String emailTheme; private String emailTheme;
private String masterAdminApp; private String masterAdminClient;
private List<RequiredCredentialModel> requiredCredentials = new ArrayList<RequiredCredentialModel>(); private List<RequiredCredentialModel> requiredCredentials = new ArrayList<RequiredCredentialModel>();
private List<UserFederationProviderModel> userFederationProviders = new ArrayList<UserFederationProviderModel>(); private List<UserFederationProviderModel> userFederationProviders = new ArrayList<UserFederationProviderModel>();
@ -81,7 +81,6 @@ public class CachedRealm {
private Set<String> enabledEventTypes = new HashSet<String>(); private Set<String> enabledEventTypes = new HashSet<String>();
private List<String> defaultRoles = new LinkedList<String>(); private List<String> defaultRoles = new LinkedList<String>();
private Map<String, String> realmRoles = new HashMap<String, String>(); private Map<String, String> realmRoles = new HashMap<String, String>();
private Map<String, String> applications = new HashMap<String, String>();
private Map<String, String> clients = new HashMap<String, String>(); private Map<String, String> clients = new HashMap<String, String>();
private boolean internationalizationEnabled; private boolean internationalizationEnabled;
private Set<String> supportedLocales = new HashSet<String>(); private Set<String> supportedLocales = new HashSet<String>();
@ -155,7 +154,7 @@ public class CachedRealm {
eventsListeners.addAll(model.getEventsListeners()); eventsListeners.addAll(model.getEventsListeners());
enabledEventTypes.addAll(model.getEnabledEventTypes()); enabledEventTypes.addAll(model.getEnabledEventTypes());
defaultRoles.addAll(model.getDefaultRoles()); defaultRoles.addAll(model.getDefaultRoles());
masterAdminApp = model.getMasterAdminClient().getId(); masterAdminClient = model.getMasterAdminClient().getId();
for (RoleModel role : model.getRoles()) { for (RoleModel role : model.getRoles()) {
realmRoles.put(role.getName(), role.getId()); realmRoles.put(role.getName(), role.getId());
@ -163,10 +162,10 @@ public class CachedRealm {
cache.addCachedRole(cachedRole); cache.addCachedRole(cachedRole);
} }
for (ClientModel app : model.getClients()) { for (ClientModel client : model.getClients()) {
applications.put(app.getClientId(), app.getId()); clients.put(client.getClientId(), client.getId());
CachedApplication cachedApp = new CachedApplication(cache, delegate, model, app); CachedClient cachedClient = new CachedClient(cache, delegate, model, client);
cache.addCachedApplication(cachedApp); cache.addCachedClient(cachedClient);
} }
internationalizationEnabled = model.isInternationalizationEnabled(); internationalizationEnabled = model.isInternationalizationEnabled();
@ -180,8 +179,8 @@ public class CachedRealm {
return id; return id;
} }
public String getMasterAdminApp() { public String getMasterAdminClient() {
return masterAdminApp; return masterAdminClient;
} }
public String getName() { public String getName() {
@ -196,10 +195,6 @@ public class CachedRealm {
return realmRoles; return realmRoles;
} }
public Map<String, String> getApplications() {
return applications;
}
public Map<String, String> getClients() { public Map<String, String> getClients() {
return clients; return clients;
} }

View file

@ -91,7 +91,7 @@ public class RealmAdapter extends AbstractMongoAdapter<MongoRealmEntity> impleme
@Override @Override
public SslRequired getSslRequired() { public SslRequired getSslRequired() {
return SslRequired.valueOf(realm.getSslRequired()); return realm.getSslRequired() != null ? SslRequired.valueOf(realm.getSslRequired()) : null;
} }
@Override @Override