keycloak-uncached
Details
diff --git a/model/api/src/main/java/org/keycloak/models/ModelProvider.java b/model/api/src/main/java/org/keycloak/models/ModelProvider.java
index 6e8e31e..1e166ac 100755
--- a/model/api/src/main/java/org/keycloak/models/ModelProvider.java
+++ b/model/api/src/main/java/org/keycloak/models/ModelProvider.java
@@ -5,5 +5,7 @@ package org.keycloak.models;
* @version $Revision: 1 $
*/
public interface ModelProvider {
+ String getId();
+
KeycloakSessionFactory createFactory();
}
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaModelProvider.java b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaModelProvider.java
index 1c5f743..629f795 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaModelProvider.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaModelProvider.java
@@ -11,6 +11,12 @@ import javax.persistence.Persistence;
* @version $Revision: 1 $
*/
public class JpaModelProvider implements ModelProvider {
+
+ @Override
+ public String getId() {
+ return "jpa";
+ }
+
@Override
public KeycloakSessionFactory createFactory() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa-keycloak-identity-store");
diff --git a/model/jpa/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider b/model/jpa/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider
new file mode 100644
index 0000000..199922e
--- /dev/null
+++ b/model/jpa/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider
@@ -0,0 +1 @@
+org.keycloak.models.jpa.JpaModelProvider
\ No newline at end of file
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 87c62af..c035b56 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,13 +3,31 @@ package org.keycloak.models.mongo.keycloak;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.ModelProvider;
+import java.lang.Override;
+
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class MongoModelProvider implements ModelProvider {
+
+ @Override
+ public String getId() {
+ return "mongo";
+ }
+
@Override
public KeycloakSessionFactory createFactory() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ String host = PropertiesManager.getMongoHost();
+ int port = PropertiesManager.getMongoPort();
+ String dbName = PropertiesManager.getMongoDbName();
+ boolean dropDatabaseOnStartup = PropertiesManager.dropDatabaseOnStartup();
+
+ // Create MongoDBSessionFactory via reflection now
+ try {
+ return new MongoDBSessionFactory(host, port, dbName, dropDatabaseOnStartup);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
}
}
diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/PropertiesManager.java b/model/mongo/src/main/java/org/keycloak/models/mongo/PropertiesManager.java
new file mode 100755
index 0000000..9e897ae
--- /dev/null
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/PropertiesManager.java
@@ -0,0 +1,58 @@
+package org.keycloak.models.mongo;
+
+/**
+ * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
+ */
+public class PropertiesManager {
+
+ private static final String MONGO_HOST = "keycloak.mongodb.host";
+ private static final String MONGO_PORT = "keycloak.mongodb.port";
+ private static final String MONGO_DB_NAME = "keycloak.mongodb.databaseName";
+ private static final String MONGO_DROP_DB_ON_STARTUP = "keycloak.mongodb.dropDatabaseOnStartup";
+ private static final String BOOTSTRAP_EMBEDDED_MONGO_AT_CONTEXT_INIT = "keycloak.mongodb.bootstrapEmbeddedMongoAtContextInit";
+
+ // Port where embedded MongoDB will be started during keycloak bootstrap. Same port will be used by KeycloakApplication then
+ private static final int MONGO_DEFAULT_PORT_KEYCLOAK_WAR_EMBEDDED = 37017;
+
+ // Port where MongoDB instance is normally started on linux. This port should be used if we're not starting embedded instance (keycloak.mongodb.bootstrapEmbeddedMongoAtContextInit is false)
+ private static final int MONGO_DEFAULT_PORT_KEYCLOAK_WAR = 27017;
+
+ // Port where unit tests will start embedded MongoDB instance
+ public static final int MONGO_DEFAULT_PORT_UNIT_TESTS = 27777;
+
+ public static String getMongoHost() {
+ return System.getProperty(MONGO_HOST, "localhost");
+ }
+
+ public static void setMongoHost(String mongoHost) {
+ System.setProperty(MONGO_HOST, mongoHost);
+ }
+
+ public static int getMongoPort() {
+ return Integer.parseInt(System.getProperty(MONGO_PORT, String.valueOf(MONGO_DEFAULT_PORT_KEYCLOAK_WAR_EMBEDDED)));
+ }
+
+ public static void setMongoPort(int mongoPort) {
+ System.setProperty(MONGO_PORT, String.valueOf(mongoPort));
+ }
+
+ public static String getMongoDbName() {
+ return System.getProperty(MONGO_DB_NAME, "keycloak");
+ }
+
+ public static void setMongoDbName(String mongoMongoDbName) {
+ System.setProperty(MONGO_DB_NAME, mongoMongoDbName);
+ }
+
+ public static boolean dropDatabaseOnStartup() {
+ return Boolean.parseBoolean(System.getProperty(MONGO_DROP_DB_ON_STARTUP, "true"));
+ }
+
+ public static void setDropDatabaseOnStartup(boolean dropDatabaseOnStartup) {
+ System.setProperty(MONGO_DROP_DB_ON_STARTUP, String.valueOf(dropDatabaseOnStartup));
+ }
+
+ public static boolean bootstrapEmbeddedMongoAtContextInit() {
+ return isMongoSessionFactory() && Boolean.parseBoolean(System.getProperty(BOOTSTRAP_EMBEDDED_MONGO_AT_CONTEXT_INIT, "true"));
+ }
+}
diff --git a/model/mongo/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider b/model/mongo/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider
new file mode 100644
index 0000000..c9e7539
--- /dev/null
+++ b/model/mongo/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider
@@ -0,0 +1 @@
+org.keycloak.models.mongo.keycloak.MongoModelProvider
\ No newline at end of file
diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/PicketlinkModelProvider.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/PicketlinkModelProvider.java
index 67f4d7a..3a87fa3 100755
--- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/PicketlinkModelProvider.java
+++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/PicketlinkModelProvider.java
@@ -37,6 +37,11 @@ public class PicketlinkModelProvider implements ModelProvider {
return new PicketlinkKeycloakSessionFactory(emf, buildPartitionManager());
}
+ @Override
+ public String getId() {
+ return "picketlink";
+ }
+
public static PartitionManager buildPartitionManager() {
IdentityConfigurationBuilder builder = new IdentityConfigurationBuilder();
diff --git a/model/picketlink/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider b/model/picketlink/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider
new file mode 100644
index 0000000..225bcaa
--- /dev/null
+++ b/model/picketlink/src/main/resources/META-INF/services/org.keycloak.models.ModelProvider
@@ -0,0 +1 @@
+org.keycloak.models.picketlink.PicketlinkModelProvider
\ No newline at end of file
services/pom.xml 7(+4 -3)
diff --git a/services/pom.xml b/services/pom.xml
index 1df957c..56b23b1 100755
--- a/services/pom.xml
+++ b/services/pom.xml
@@ -31,14 +31,15 @@
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
- <artifactId>keycloak-model-picketlink</artifactId>
+ <artifactId>keycloak-model-jpa</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
- <artifactId>keycloak-model-jpa</artifactId>
+ <artifactId>keycloak-model-picketlink</artifactId>
<version>${project.version}</version>
+ <scope>test</scope>
</dependency>
<!--<dependency>
diff --git a/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java b/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
index 867c2c1..01e3b45 100755
--- a/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
+++ b/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
@@ -1,18 +1,19 @@
package org.keycloak.services.resources;
+import org.jboss.resteasy.logging.Logger;
import org.keycloak.SkeletonKeyContextResolver;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.ModelProvider;
import org.keycloak.services.managers.SocialRequestManager;
import org.keycloak.services.managers.TokenManager;
-import org.keycloak.services.utils.PropertiesManager;
import javax.annotation.PreDestroy;
import javax.servlet.ServletContext;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
-import java.lang.reflect.Constructor;
import java.util.HashSet;
+import java.util.Iterator;
+import java.util.ServiceLoader;
import java.util.Set;
/**
@@ -21,14 +22,19 @@ import java.util.Set;
*/
public class KeycloakApplication extends Application {
+ private static final Logger log = Logger.getLogger(KeycloakApplication.class);
+
+ private static final String MODEL_PROVIDER = "keycloak.model";
+ private static final String DEFAULT_MODEL_PROVIDER = "jpa";
+
protected Set<Object> singletons = new HashSet<Object>();
protected Set<Class<?>> classes = new HashSet<Class<?>>();
protected KeycloakSessionFactory factory;
public KeycloakApplication(@Context ServletContext context) {
- KeycloakSessionFactory f = createSessionFactory();
- this.factory = f;
+ this.factory = createSessionFactory();
+
context.setAttribute(KeycloakSessionFactory.class.getName(), factory);
//classes.add(KeycloakSessionCleanupFilter.class);
@@ -41,57 +47,36 @@ public class KeycloakApplication extends Application {
classes.add(QRCodeResource.class);
}
- protected KeycloakSessionFactory createSessionFactory() {
- return buildSessionFactory();
- }
+ public static KeycloakSessionFactory createSessionFactory() {
+ ServiceLoader<ModelProvider> providers = ServiceLoader.load(ModelProvider.class);
+ String configuredProvider = System.getProperty(MODEL_PROVIDER);
+ ModelProvider provider = null;
- public static KeycloakSessionFactory buildSessionFactory() {
- if (PropertiesManager.isMongoSessionFactory()) {
- return buildMongoDBSessionFactory();
- } else if (PropertiesManager.isPicketlinkSessionFactory()) {
- return buildPicketlinkSessionFactory();
- } else if (PropertiesManager.isJpaSessionFactory()) {
- return buildJpaSessionFactory();
+ if (configuredProvider != null) {
+ for (ModelProvider p : providers) {
+ if (p.getId().equals(configuredProvider)) {
+ provider = p;
+ }
+ }
} else {
- throw new IllegalStateException("Unknown session factory type: " + PropertiesManager.getSessionFactoryType());
+ for (ModelProvider p : providers) {
+ if (provider == null) {
+ provider = p;
+ }
+
+ if (p.getId().equals(DEFAULT_MODEL_PROVIDER)) {
+ provider = p;
+ break;
+ }
+ }
}
- }
- private static KeycloakSessionFactory buildJpaSessionFactory() {
- ModelProvider provider = null;
- try {
- provider = (ModelProvider)Class.forName("org.keycloak.models.jpa.JpaModelProvider").newInstance();
- } catch (Exception e) {
- throw new RuntimeException(e);
+ if (provider != null) {
+ log.debug("Model provider: " + provider.getId());
+ return provider.createFactory();
}
- return provider.createFactory();
- }
-
- private static KeycloakSessionFactory buildPicketlinkSessionFactory() {
- ModelProvider provider = null;
- try {
- provider = (ModelProvider)Class.forName("org.keycloak.models.picketlink.PicketlinkModelProvider").newInstance();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- return provider.createFactory();
- }
-
- private static KeycloakSessionFactory buildMongoDBSessionFactory() {
- String host = PropertiesManager.getMongoHost();
- int port = PropertiesManager.getMongoPort();
- String dbName = PropertiesManager.getMongoDbName();
- boolean dropDatabaseOnStartup = PropertiesManager.dropDatabaseOnStartup();
-
- // Create MongoDBSessionFactory via reflection now
- try {
- Class<? extends KeycloakSessionFactory> mongoDBSessionFactoryClass = (Class<? extends KeycloakSessionFactory>)Class.forName("org.keycloak.models.mongo.keycloak.adapters.MongoDBSessionFactory");
- Constructor<? extends KeycloakSessionFactory> constr = mongoDBSessionFactoryClass.getConstructor(String.class, int.class, String.class, boolean.class);
- return constr.newInstance(host, port, dbName, dropDatabaseOnStartup);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+ throw new RuntimeException("Model provider not found");
}
public KeycloakSessionFactory getFactory() {
@@ -103,9 +88,6 @@ public class KeycloakApplication extends Application {
factory.close();
}
-
-
-
@Override
public Set<Class<?>> getClasses() {
return classes;
diff --git a/services/src/test/java/org/keycloak/test/ApplicationModelTest.java b/services/src/test/java/org/keycloak/test/ApplicationModelTest.java
index a5e2a01..e322481 100755
--- a/services/src/test/java/org/keycloak/test/ApplicationModelTest.java
+++ b/services/src/test/java/org/keycloak/test/ApplicationModelTest.java
@@ -31,7 +31,7 @@ public class ApplicationModelTest extends AbstractKeycloakServerTest {
@Before
public void before() throws Exception {
- factory = KeycloakApplication.buildSessionFactory();
+ factory = KeycloakApplication.createSessionFactory();
identitySession = factory.createSession();
identitySession.getTransaction().begin();
manager = new RealmManager(identitySession);
diff --git a/services/src/test/java/org/keycloak/test/common/AbstractKeycloakTest.java b/services/src/test/java/org/keycloak/test/common/AbstractKeycloakTest.java
index a6debbf..11512d7 100755
--- a/services/src/test/java/org/keycloak/test/common/AbstractKeycloakTest.java
+++ b/services/src/test/java/org/keycloak/test/common/AbstractKeycloakTest.java
@@ -72,7 +72,7 @@ public abstract class AbstractKeycloakTest {
@Before
public void before() throws Exception {
testContext.initEnvironment();
- factory = KeycloakApplication.buildSessionFactory();
+ factory = KeycloakApplication.createSessionFactory();
identitySession = factory.createSession();
identitySession.getTransaction().begin();
realmManager = new RealmManager(identitySession);
diff --git a/services/src/test/java/org/keycloak/test/ModelTest.java b/services/src/test/java/org/keycloak/test/ModelTest.java
index 33eb405..6771e29 100755
--- a/services/src/test/java/org/keycloak/test/ModelTest.java
+++ b/services/src/test/java/org/keycloak/test/ModelTest.java
@@ -23,7 +23,7 @@ public class ModelTest extends AbstractKeycloakServerTest {
@Before
public void before() throws Exception {
- factory = KeycloakApplication.buildSessionFactory();
+ factory = KeycloakApplication.createSessionFactory();
identitySession = factory.createSession();
identitySession.getTransaction().begin();
manager = new RealmManager(identitySession);
diff --git a/services/src/test/java/org/keycloak/test/UserModelTest.java b/services/src/test/java/org/keycloak/test/UserModelTest.java
index 910a20c..338af77 100755
--- a/services/src/test/java/org/keycloak/test/UserModelTest.java
+++ b/services/src/test/java/org/keycloak/test/UserModelTest.java
@@ -26,7 +26,7 @@ public class UserModelTest extends AbstractKeycloakServerTest {
@Before
public void before() throws Exception {
- factory = KeycloakApplication.buildSessionFactory();
+ factory = KeycloakApplication.createSessionFactory();
identitySession = factory.createSession();
identitySession.getTransaction().begin();
manager = new RealmManager(identitySession);
testsuite/integration/pom.xml 5(+5 -0)
diff --git a/testsuite/integration/pom.xml b/testsuite/integration/pom.xml
index ffbe981..4fb3d56 100755
--- a/testsuite/integration/pom.xml
+++ b/testsuite/integration/pom.xml
@@ -53,6 +53,11 @@
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
+ <artifactId>keycloak-model-jpa</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.keycloak</groupId>
<artifactId>keycloak-social-core</artifactId>
<version>${project.version}</version>
</dependency>
diff --git a/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java b/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
index 1d5f43e..8f33252 100755
--- a/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
+++ b/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
@@ -271,7 +271,7 @@ public class KeycloakServer {
server.deploy(di);
- factory = KeycloakApplication.buildSessionFactory();
+ factory = KeycloakApplication.createSessionFactory();
setupDefaultRealm();
diff --git a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/BaseJMeterPerformanceTest.java b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/BaseJMeterPerformanceTest.java
index 882f8bb..eda2761 100755
--- a/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/BaseJMeterPerformanceTest.java
+++ b/testsuite/performance/src/test/java/org/keycloak/testsuite/performance/BaseJMeterPerformanceTest.java
@@ -22,7 +22,7 @@ public class BaseJMeterPerformanceTest extends AbstractJavaSamplerClient {
@Override
public KeycloakSessionFactory call() throws Exception {
- return KeycloakApplication.buildSessionFactory();
+ return KeycloakApplication.createSessionFactory();
}
});