keycloak-uncached

KEYCLOAK-1284 Allow users to easily inject or configure MongoClient

5/7/2015 3:40:17 PM

Details

diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/DefaultMongoConnectionFactoryProvider.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/DefaultMongoConnectionFactoryProvider.java
index 7bc507a..73d6b84 100755
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/DefaultMongoConnectionFactoryProvider.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/DefaultMongoConnectionFactoryProvider.java
@@ -16,6 +16,7 @@ import org.keycloak.models.KeycloakSessionFactory;
 
 import javax.net.ssl.SSLSocketFactory;
 import java.lang.reflect.Method;
+import java.net.UnknownHostException;
 import java.util.Collections;
 
 /**
@@ -50,7 +51,7 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
 
     private MongoStore mongoStore;
     private DB db;
-    private Config.Scope config;
+    protected Config.Scope config;
 
     @Override
     public MongoConnectionProvider create(KeycloakSession session) {
@@ -77,21 +78,9 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
             synchronized (this) {
                 if (client == null) {
                     try {
-                        String host = config.get("host", ServerAddress.defaultHost());
-                        int port = config.getInt("port", ServerAddress.defaultPort());
-                        String dbName = config.get("db", "keycloak");
-
-                        String user = config.get("user");
-                        String password = config.get("password");
-
-                        MongoClientOptions clientOptions = getClientOptions();
-                        if (user != null && password != null) {
-                            MongoCredential credential = MongoCredential.createMongoCRCredential(user, dbName, password.toCharArray());
-                            client = new MongoClient(new ServerAddress(host, port), Collections.singletonList(credential), clientOptions);
-                        } else {
-                            client = new MongoClient(new ServerAddress(host, port), clientOptions);
-                        }
+                        this.client = createMongoClient();
 
+                        String dbName = config.get("db", "keycloak");
                         this.db = client.getDB(dbName);
 
                         String databaseSchema = config.get("databaseSchema");
@@ -110,8 +99,6 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
                         }
 
                         this.mongoStore = new MongoStoreImpl(db, getManagedEntities());
-
-                        logger.debugv("Initialized mongo model. host: %s, port: %d, db: %s", host, port, dbName);
                     } catch (Exception e) {
                         throw new RuntimeException(e);
                     }
@@ -140,6 +127,38 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
         return "default";
     }
 
+    /**
+     * Override this method if you want more possibility to configure Mongo client. It can be also used to inject mongo client
+     * from different source.
+     *
+     * This method can assume that "config" is already set and can use it.
+     *
+     * @return mongoClient instance, which will be shared for whole Keycloak
+     *
+     * @throws UnknownHostException
+     */
+    protected MongoClient createMongoClient() throws UnknownHostException {
+        String host = config.get("host", ServerAddress.defaultHost());
+        int port = config.getInt("port", ServerAddress.defaultPort());
+        String dbName = config.get("db", "keycloak");
+
+        String user = config.get("user");
+        String password = config.get("password");
+
+        MongoClientOptions clientOptions = getClientOptions();
+
+        MongoClient client;
+        if (user != null && password != null) {
+            MongoCredential credential = MongoCredential.createMongoCRCredential(user, dbName, password.toCharArray());
+            client = new MongoClient(new ServerAddress(host, port), Collections.singletonList(credential), clientOptions);
+        } else {
+            client = new MongoClient(new ServerAddress(host, port), clientOptions);
+        }
+
+        logger.debugv("Initialized mongo model. host: %s, port: %d, db: %s", host, port, dbName);
+        return client;
+    }
+
     protected MongoClientOptions getClientOptions() {
         MongoClientOptions.Builder builder = MongoClientOptions.builder();
         checkIntOption("connectionsPerHost", builder);