keycloak-uncached

Added MongoClientProvider. Possibility to configure mongo

3/7/2014 9:39:43 AM

Details

diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoKeycloakSessionFactory.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoKeycloakSessionFactory.java
index 563dba4..f1d1913 100755
--- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoKeycloakSessionFactory.java
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoKeycloakSessionFactory.java
@@ -1,13 +1,12 @@
 package org.keycloak.models.mongo.keycloak.adapters;
 
-import com.mongodb.DB;
-import com.mongodb.MongoClient;
 import org.jboss.logging.Logger;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.mongo.api.MongoEntity;
 import org.keycloak.models.mongo.api.MongoStore;
 import org.keycloak.models.mongo.impl.MongoStoreImpl;
+import org.keycloak.models.mongo.keycloak.config.MongoClientProvider;
 import org.keycloak.models.mongo.keycloak.entities.ApplicationEntity;
 import org.keycloak.models.mongo.keycloak.entities.CredentialEntity;
 import org.keycloak.models.mongo.keycloak.entities.OAuthClientEntity;
@@ -16,9 +15,6 @@ import org.keycloak.models.mongo.keycloak.entities.RequiredCredentialEntity;
 import org.keycloak.models.mongo.keycloak.entities.RoleEntity;
 import org.keycloak.models.mongo.keycloak.entities.SocialLinkEntity;
 import org.keycloak.models.mongo.keycloak.entities.UserEntity;
-import org.keycloak.models.mongo.utils.MongoConfiguration;
-
-import java.net.UnknownHostException;
 
 /**
  * KeycloakSessionFactory implementation based on MongoDB
@@ -39,22 +35,12 @@ public class MongoKeycloakSessionFactory implements KeycloakSessionFactory {
             OAuthClientEntity.class
     };
 
-    private final MongoClient mongoClient;
+    private final MongoClientProvider mongoClientProvider;
     private final MongoStore mongoStore;
 
-    public MongoKeycloakSessionFactory(MongoConfiguration config) {
-        logger.info(String.format("Configuring MongoStore with: " + config));
-
-        try {
-            // TODO: authentication support
-            mongoClient = new MongoClient(config.getHost(), config.getPort());
-
-            DB db = mongoClient.getDB(config.getDbName());
-            mongoStore = new MongoStoreImpl(db, config.isClearCollectionsOnStartup(), MANAGED_ENTITY_TYPES);
-
-        } catch (UnknownHostException e) {
-            throw new RuntimeException(e);
-        }
+    public MongoKeycloakSessionFactory(MongoClientProvider provider) {
+        this.mongoClientProvider = provider;
+        this.mongoStore = new MongoStoreImpl(provider.getDB(), provider.clearCollectionsOnStartup(), MANAGED_ENTITY_TYPES);
     }
 
     @Override
@@ -64,7 +50,6 @@ public class MongoKeycloakSessionFactory implements KeycloakSessionFactory {
 
     @Override
     public void close() {
-        logger.info("Closing MongoDB client");
-        mongoClient.close();
+        this.mongoClientProvider.close();
     }
 }
diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/config/MongoClientProvider.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/config/MongoClientProvider.java
new file mode 100644
index 0000000..180f37d
--- /dev/null
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/config/MongoClientProvider.java
@@ -0,0 +1,21 @@
+package org.keycloak.models.mongo.keycloak.config;
+
+import com.mongodb.DB;
+import com.mongodb.MongoClient;
+
+/**
+ * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
+ */
+public interface MongoClientProvider {
+
+    MongoClient getMongoClient();
+
+    DB getDB();
+
+    /**
+     * @return true if collections should be cleared on startup
+     */
+    boolean clearCollectionsOnStartup();
+
+    void close();
+}
diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/config/MongoClientProviderHolder.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/config/MongoClientProviderHolder.java
new file mode 100644
index 0000000..4c3eeae
--- /dev/null
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/config/MongoClientProviderHolder.java
@@ -0,0 +1,20 @@
+package org.keycloak.models.mongo.keycloak.config;
+
+/**
+ * Provides {@link MongoClientProvider} instance
+ *
+ * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
+ */
+public class MongoClientProviderHolder {
+
+    // Just use static object for now. Default impl is SystemPropsMongoClientProvider
+    private static MongoClientProvider instance = new SystemPropertiesMongoClientProvider();
+
+    public static MongoClientProvider getInstance() {
+        return instance;
+    }
+
+    public static void setInstance(MongoClientProvider instance) {
+        MongoClientProviderHolder.instance = instance;
+    }
+}
diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/MongoModelProvider.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/MongoModelProvider.java
index 910adde..45197c7 100755
--- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/MongoModelProvider.java
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/MongoModelProvider.java
@@ -3,8 +3,8 @@ package org.keycloak.models.mongo.keycloak;
 import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.ModelProvider;
 import org.keycloak.models.mongo.keycloak.adapters.MongoKeycloakSessionFactory;
-import org.keycloak.models.mongo.utils.MongoConfiguration;
-import org.keycloak.models.mongo.utils.SystemPropertiesConfigurationProvider;
+import org.keycloak.models.mongo.keycloak.config.MongoClientProvider;
+import org.keycloak.models.mongo.keycloak.config.MongoClientProviderHolder;
 
 import java.lang.Override;
 
@@ -21,7 +21,7 @@ public class MongoModelProvider implements ModelProvider {
 
     @Override
     public KeycloakSessionFactory createFactory() {
-        MongoConfiguration config = SystemPropertiesConfigurationProvider.createConfiguration();
-        return new MongoKeycloakSessionFactory(config);
+        MongoClientProvider mongoClientProvider = MongoClientProviderHolder.getInstance();
+        return new MongoKeycloakSessionFactory(mongoClientProvider);
     }
 }
diff --git a/model/mongo/src/test/java/org/keycloak/models/mongo/test/MongoStoreTest.java b/model/mongo/src/test/java/org/keycloak/models/mongo/test/MongoStoreTest.java
index 8128dde..7200806 100755
--- a/model/mongo/src/test/java/org/keycloak/models/mongo/test/MongoStoreTest.java
+++ b/model/mongo/src/test/java/org/keycloak/models/mongo/test/MongoStoreTest.java
@@ -1,8 +1,6 @@
 package org.keycloak.models.mongo.test;
 
-import com.mongodb.DB;
 import com.mongodb.DBObject;
-import com.mongodb.MongoClient;
 import com.mongodb.QueryBuilder;
 import org.junit.After;
 import org.junit.Assert;
@@ -13,9 +11,8 @@ import org.keycloak.models.mongo.api.MongoStore;
 import org.keycloak.models.mongo.api.context.MongoStoreInvocationContext;
 import org.keycloak.models.mongo.impl.MongoStoreImpl;
 import org.keycloak.models.mongo.impl.context.TransactionMongoStoreInvocationContext;
-import org.keycloak.models.mongo.utils.SystemPropertiesConfigurationProvider;
-
-import java.net.UnknownHostException;
+import org.keycloak.models.mongo.keycloak.config.MongoClientProvider;
+import org.keycloak.models.mongo.keycloak.config.MongoClientProviderHolder;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -31,26 +28,18 @@ public class MongoStoreTest {
             AddressWithFlats.class
     };
 
-    private MongoClient mongoClient;
+    private MongoClientProvider mongoClientProvider;
     private MongoStore mongoStore;
 
     @Before
     public void before() throws Exception {
-        try {
-            // TODO: authentication support
-            mongoClient = new MongoClient("localhost", SystemPropertiesConfigurationProvider.getMongoPort());
-
-            DB db = mongoClient.getDB("keycloakTest");
-            mongoStore = new MongoStoreImpl(db, true, MANAGED_DATA_TYPES);
-
-        } catch (UnknownHostException e) {
-            throw new RuntimeException(e);
-        }
+        mongoClientProvider = MongoClientProviderHolder.getInstance();
+        mongoStore = new MongoStoreImpl(mongoClientProvider.getDB(), true, MANAGED_DATA_TYPES);
     }
 
     @After
     public void after() throws Exception {
-        mongoClient.close();
+        mongoClientProvider.close();
     }
 
     @Test