keycloak-developers
Changes
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java 11(+0 -11)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java 10(+0 -10)
model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java 26(+8 -18)
Details
diff --git a/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java b/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
index 2e94eed..b17629f 100755
--- a/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
+++ b/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
@@ -1,6 +1,7 @@
package org.keycloak.models;
import org.keycloak.provider.Provider;
+import org.keycloak.provider.ProviderEventManager;
import org.keycloak.provider.ProviderFactory;
import java.util.List;
@@ -9,7 +10,7 @@ import java.util.List;
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
-public interface KeycloakSessionFactory {
+public interface KeycloakSessionFactory extends ProviderEventManager {
KeycloakSession create();
<T extends Provider> ProviderFactory<T> getProviderFactory(Class<T> clazz);
diff --git a/model/api/src/main/java/org/keycloak/models/RealmProvider.java b/model/api/src/main/java/org/keycloak/models/RealmProvider.java
index 2c04cc1..f2454d4 100755
--- a/model/api/src/main/java/org/keycloak/models/RealmProvider.java
+++ b/model/api/src/main/java/org/keycloak/models/RealmProvider.java
@@ -1,6 +1,7 @@
package org.keycloak.models;
import org.keycloak.provider.Provider;
+import org.keycloak.provider.ProviderEvent;
import java.util.List;
@@ -9,16 +10,14 @@ import java.util.List;
* @version $Revision: 1 $
*/
public interface RealmProvider extends Provider {
- public interface RealmCreationListener {
- void created(RealmModel realm);
+ public interface RealmCreationEvent extends ProviderEvent {
+ RealmModel getCreatedRealm();
}
// Note: The reason there are so many query methods here is for layering a cache on top of an persistent KeycloakSession
RealmModel createRealm(String name);
RealmModel createRealm(String id, String name);
- void registerListener(RealmCreationListener listener);
- void unregisterListener(RealmCreationListener listener);
RealmModel getRealm(String id);
RealmModel getRealmByName(String name);
diff --git a/model/api/src/main/java/org/keycloak/provider/ProviderEvent.java b/model/api/src/main/java/org/keycloak/provider/ProviderEvent.java
new file mode 100755
index 0000000..403e112
--- /dev/null
+++ b/model/api/src/main/java/org/keycloak/provider/ProviderEvent.java
@@ -0,0 +1,8 @@
+package org.keycloak.provider;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public interface ProviderEvent {
+}
diff --git a/model/api/src/main/java/org/keycloak/provider/ProviderEventListener.java b/model/api/src/main/java/org/keycloak/provider/ProviderEventListener.java
new file mode 100755
index 0000000..8f99462
--- /dev/null
+++ b/model/api/src/main/java/org/keycloak/provider/ProviderEventListener.java
@@ -0,0 +1,9 @@
+package org.keycloak.provider;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public interface ProviderEventListener {
+ void onEvent(ProviderEvent event);
+}
diff --git a/model/api/src/main/java/org/keycloak/provider/ProviderEventManager.java b/model/api/src/main/java/org/keycloak/provider/ProviderEventManager.java
new file mode 100755
index 0000000..efdfa82
--- /dev/null
+++ b/model/api/src/main/java/org/keycloak/provider/ProviderEventManager.java
@@ -0,0 +1,16 @@
+package org.keycloak.provider;
+
+import org.keycloak.provider.ProviderEvent;
+import org.keycloak.provider.ProviderEventListener;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public interface ProviderEventManager {
+ void register(ProviderEventListener listener);
+
+ void unregister(ProviderEventListener listener);
+
+ void publish(ProviderEvent event);
+}
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
index 9419c91..a1d232e 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
@@ -51,17 +51,6 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
}
@Override
- public void registerListener(RealmCreationListener listener) {
- getDelegate().registerListener(listener);
- }
-
- @Override
- public void unregisterListener(RealmCreationListener listener) {
- getDelegate().unregisterListener(listener);
-
- }
-
- @Override
public boolean isEnabled() {
return cache.isEnabled();
}
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java
index 9896e51..e7b1551 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java
@@ -39,16 +39,6 @@ public class NoCacheRealmProvider implements CacheRealmProvider {
}
@Override
- public void registerListener(RealmCreationListener listener) {
- getDelegate().registerListener(listener);
- }
-
- @Override
- public void unregisterListener(RealmCreationListener listener) {
- getDelegate().unregisterListener(listener);
-
- }
- @Override
public void registerRealmInvalidation(String id) {
}
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
index 5529b83..371d048 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
@@ -3,7 +3,6 @@ package org.keycloak.models.jpa;
import org.keycloak.models.ApplicationModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.OAuthClientModel;
-import org.keycloak.models.RealmListenerHelper;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RealmProvider;
import org.keycloak.models.RoleModel;
@@ -26,24 +25,11 @@ import java.util.List;
public class JpaRealmProvider implements RealmProvider {
private final KeycloakSession session;
protected EntityManager em;
- protected RealmListenerHelper listeners;
- public JpaRealmProvider(KeycloakSession session, EntityManager em, RealmListenerHelper listeners) {
+ public JpaRealmProvider(KeycloakSession session, EntityManager em) {
this.session = session;
this.em = em;
- this.listeners = listeners;
- }
-
- @Override
- public void registerListener(RealmCreationListener listener) {
- listeners.registerListener(listener);
- }
-
- @Override
- public void unregisterListener(RealmCreationListener listener) {
- listeners.unregisterListener(listener);
-
}
@Override
@@ -58,8 +44,13 @@ public class JpaRealmProvider implements RealmProvider {
realm.setId(id);
em.persist(realm);
em.flush();
- RealmModel model = new RealmAdapter(session, em, realm);
- listeners.executeCreationListeners(model);
+ final RealmModel model = new RealmAdapter(session, em, realm);
+ session.getKeycloakSessionFactory().publish(new RealmCreationEvent() {
+ @Override
+ public RealmModel getCreatedRealm() {
+ return model;
+ }
+ });
return model;
}
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProviderFactory.java b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProviderFactory.java
index 4869ca7..7e090c2 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProviderFactory.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProviderFactory.java
@@ -3,7 +3,6 @@ package org.keycloak.models.jpa;
import org.keycloak.Config;
import org.keycloak.connections.jpa.JpaConnectionProvider;
import org.keycloak.models.KeycloakSession;
-import org.keycloak.models.RealmListenerHelper;
import org.keycloak.models.RealmProvider;
import org.keycloak.models.RealmProviderFactory;
@@ -15,8 +14,6 @@ import javax.persistence.EntityManager;
*/
public class JpaRealmProviderFactory implements RealmProviderFactory {
- protected RealmListenerHelper listeners = new RealmListenerHelper();
-
@Override
public void init(Config.Scope config) {
}
@@ -29,7 +26,7 @@ public class JpaRealmProviderFactory implements RealmProviderFactory {
@Override
public RealmProvider create(KeycloakSession session) {
EntityManager em = session.getProvider(JpaConnectionProvider.class).getEntityManager();
- return new JpaRealmProvider(session, em, listeners);
+ return new JpaRealmProvider(session, em);
}
@Override
diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java
index 3d6b735..997025e 100755
--- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java
@@ -8,7 +8,6 @@ import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.models.ApplicationModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.OAuthClientModel;
-import org.keycloak.models.RealmListenerHelper;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RealmProvider;
import org.keycloak.models.RoleModel;
@@ -28,12 +27,10 @@ public class MongoRealmProvider implements RealmProvider {
private final MongoStoreInvocationContext invocationContext;
private final KeycloakSession session;
- protected RealmListenerHelper listeners;
- public MongoRealmProvider(KeycloakSession session, MongoStoreInvocationContext invocationContext, RealmListenerHelper listeners) {
+ public MongoRealmProvider(KeycloakSession session, MongoStoreInvocationContext invocationContext) {
this.session = session;
this.invocationContext = invocationContext;
- this.listeners = listeners;
}
@Override
@@ -42,18 +39,6 @@ public class MongoRealmProvider implements RealmProvider {
}
@Override
- public void registerListener(RealmCreationListener listener) {
- listeners.registerListener(listener);
- }
-
- @Override
- public void unregisterListener(RealmCreationListener listener) {
- listeners.unregisterListener(listener);
-
- }
-
-
- @Override
public RealmModel createRealm(String name) {
return createRealm(KeycloakModelUtils.generateId(), name);
}
@@ -66,8 +51,13 @@ public class MongoRealmProvider implements RealmProvider {
getMongoStore().insertEntity(newRealm, invocationContext);
- RealmModel model = new RealmAdapter(session, newRealm, invocationContext);
- listeners.executeCreationListeners(model);
+ final RealmModel model = new RealmAdapter(session, newRealm, invocationContext);
+ session.getKeycloakSessionFactory().publish(new RealmCreationEvent() {
+ @Override
+ public RealmModel getCreatedRealm() {
+ return model;
+ }
+ });
return model;
}
diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProviderFactory.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProviderFactory.java
index c8f2f11..dd62b78 100755
--- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProviderFactory.java
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProviderFactory.java
@@ -4,7 +4,6 @@ import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.connections.mongo.MongoConnectionProvider;
import org.keycloak.models.KeycloakSession;
-import org.keycloak.models.RealmListenerHelper;
import org.keycloak.models.RealmProvider;
import org.keycloak.models.RealmProviderFactory;
@@ -16,7 +15,6 @@ import org.keycloak.models.RealmProviderFactory;
public class MongoRealmProviderFactory implements RealmProviderFactory {
protected static final Logger logger = Logger.getLogger(MongoRealmProviderFactory.class);
- protected RealmListenerHelper listeners = new RealmListenerHelper();
@Override
public String getId() {
@@ -30,7 +28,7 @@ public class MongoRealmProviderFactory implements RealmProviderFactory {
@Override
public RealmProvider create(KeycloakSession session) {
MongoConnectionProvider connection = session.getProvider(MongoConnectionProvider.class);
- return new MongoRealmProvider(session, connection.getInvocationContext(), listeners);
+ return new MongoRealmProvider(session, connection.getInvocationContext());
}
@Override
diff --git a/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java b/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
index ef3b176..361eb87 100755
--- a/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
+++ b/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
@@ -4,7 +4,11 @@ import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
+import org.keycloak.models.RealmModel;
+import org.keycloak.models.RealmProvider;
import org.keycloak.provider.Provider;
+import org.keycloak.provider.ProviderEvent;
+import org.keycloak.provider.ProviderEventListener;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.ProviderManager;
import org.keycloak.provider.Spi;
@@ -16,6 +20,7 @@ import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
public class DefaultKeycloakSessionFactory implements KeycloakSessionFactory {
@@ -23,6 +28,24 @@ public class DefaultKeycloakSessionFactory implements KeycloakSessionFactory {
private Map<Class<? extends Provider>, String> provider = new HashMap<Class<? extends Provider>, String>();
private Map<Class<? extends Provider>, Map<String, ProviderFactory>> factoriesMap = new HashMap<Class<? extends Provider>, Map<String, ProviderFactory>>();
+ protected CopyOnWriteArrayList<ProviderEventListener> listeners = new CopyOnWriteArrayList<ProviderEventListener>();
+
+ @Override
+ public void register(ProviderEventListener listener) {
+ listeners.add(listener);
+ }
+
+ @Override
+ public void unregister(ProviderEventListener listener) {
+ listeners.remove(listener);
+ }
+
+ @Override
+ public void publish(ProviderEvent event) {
+ for (ProviderEventListener listener : listeners) {
+ listener.onEvent(event);
+ }
+ }
public void init() {
ProviderManager pm = new ProviderManager(getClass().getClassLoader(), Config.scope().getArray("providers"));