diff --git a/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java b/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java index 1795cd13c5..aac1cdebd4 100755 --- a/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java +++ b/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java @@ -1,19 +1,5 @@ package org.keycloak.connections.jpa; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; - -import javax.naming.InitialContext; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import javax.sql.DataSource; - import org.hibernate.ejb.AvailableSettings; import org.jboss.logging.Logger; import org.keycloak.Config; @@ -22,215 +8,232 @@ import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSessionFactory; import org.keycloak.provider.ProviderOperationalInfo; +import javax.naming.InitialContext; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.sql.DataSource; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + /** * @author Stian Thorgersen */ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProviderFactory { - private static final Logger logger = Logger.getLogger(DefaultJpaConnectionProviderFactory.class); + private static final Logger logger = Logger.getLogger(DefaultJpaConnectionProviderFactory.class); - private volatile EntityManagerFactory emf; + private volatile EntityManagerFactory emf; - private Config.Scope config; + private Config.Scope config; + + private DatabaseInfo databaseInfo; - private DatabaseInfo databaseInfo; + @Override + public JpaConnectionProvider create(KeycloakSession session) { + lazyInit(session); - @Override - public JpaConnectionProvider create(KeycloakSession session) { - lazyInit(session); + EntityManager em = emf.createEntityManager(); + em = PersistenceExceptionConverter.create(em); + session.getTransaction().enlist(new JpaKeycloakTransaction(em)); + return new DefaultJpaConnectionProvider(em); + } - EntityManager em = emf.createEntityManager(); - em = PersistenceExceptionConverter.create(em); - session.getTransaction().enlist(new JpaKeycloakTransaction(em)); - return new DefaultJpaConnectionProvider(em); - } + @Override + public void close() { + if (emf != null) { + emf.close(); + } + } - @Override - public void close() { - if (emf != null) { - emf.close(); - } - } + @Override + public String getId() { + return "default"; + } - @Override - public String getId() { - return "default"; - } + @Override + public void init(Config.Scope config) { + this.config = config; + } - @Override - public void init(Config.Scope config) { - this.config = config; - } + @Override + public void postInit(KeycloakSessionFactory factory) { - @Override - public void postInit(KeycloakSessionFactory factory) { + } - } + private void lazyInit(KeycloakSession session) { + if (emf == null) { + synchronized (this) { + if (emf == null) { + logger.debug("Initializing JPA connections"); - private void lazyInit(KeycloakSession session) { - if (emf == null) { - synchronized (this) { - if (emf == null) { - logger.debug("Initializing JPA connections"); + Connection connection = null; - Connection connection = null; + String databaseSchema = config.get("databaseSchema"); - String databaseSchema = config.get("databaseSchema"); + Map properties = new HashMap(); - Map properties = new HashMap(); + String unitName = "keycloak-default"; - String unitName = "keycloak-default"; + String dataSource = config.get("dataSource"); + if (dataSource != null) { + if (config.getBoolean("jta", false)) { + properties.put(AvailableSettings.JTA_DATASOURCE, dataSource); + } else { + properties.put(AvailableSettings.NON_JTA_DATASOURCE, dataSource); + } + } else { + properties.put(AvailableSettings.JDBC_URL, config.get("url")); + properties.put(AvailableSettings.JDBC_DRIVER, config.get("driver")); - String dataSource = config.get("dataSource"); - if (dataSource != null) { - if (config.getBoolean("jta", false)) { - properties.put(AvailableSettings.JTA_DATASOURCE, dataSource); - } else { - properties.put(AvailableSettings.NON_JTA_DATASOURCE, dataSource); - } - } else { - properties.put(AvailableSettings.JDBC_URL, config.get("url")); - properties.put(AvailableSettings.JDBC_DRIVER, config.get("driver")); + String user = config.get("user"); + if (user != null) { + properties.put(AvailableSettings.JDBC_USER, user); + } + String password = config.get("password"); + if (password != null) { + properties.put(AvailableSettings.JDBC_PASSWORD, password); + } + } - String user = config.get("user"); - if (user != null) { - properties.put(AvailableSettings.JDBC_USER, user); - } - String password = config.get("password"); - if (password != null) { - properties.put(AvailableSettings.JDBC_PASSWORD, password); - } - } + String driverDialect = config.get("driverDialect"); + if (driverDialect != null && driverDialect.length() > 0) { + properties.put("hibernate.dialect", driverDialect); + } - String driverDialect = config.get("driverDialect"); - if (driverDialect != null && driverDialect.length() > 0) { - properties.put("hibernate.dialect", driverDialect); - } + String schema = config.get("schema"); + if (schema != null) { + properties.put("hibernate.default_schema", schema); + } - String schema = config.get("schema"); - if (schema != null) { - properties.put("hibernate.default_schema", schema); - } + if (databaseSchema != null) { + if (databaseSchema.equals("development-update")) { + properties.put("hibernate.hbm2ddl.auto", "update"); + databaseSchema = null; + } else if (databaseSchema.equals("development-validate")) { + properties.put("hibernate.hbm2ddl.auto", "validate"); + databaseSchema = null; + } + } - if (databaseSchema != null) { - if (databaseSchema.equals("development-update")) { - properties.put("hibernate.hbm2ddl.auto", "update"); - databaseSchema = null; - } else if (databaseSchema.equals("development-validate")) { - properties.put("hibernate.hbm2ddl.auto", "validate"); - databaseSchema = null; - } - } + properties.put("hibernate.show_sql", config.getBoolean("showSql", false)); + properties.put("hibernate.format_sql", config.getBoolean("formatSql", true)); - properties.put("hibernate.show_sql", config.getBoolean("showSql", false)); - properties.put("hibernate.format_sql", config.getBoolean("formatSql", true)); + connection = getConnection(); + try{ + prepareDatabaseInfo(connection); + + if (databaseSchema != null) { + logger.trace("Updating database"); + + JpaUpdaterProvider updater = session.getProvider(JpaUpdaterProvider.class); + if (updater == null) { + throw new RuntimeException("Can't update database: JPA updater provider not found"); + } + + if (databaseSchema.equals("update")) { + String currentVersion = null; + try { + ResultSet resultSet = connection.createStatement().executeQuery(updater.getCurrentVersionSql(schema)); + if (resultSet.next()) { + currentVersion = resultSet.getString(1); + } + } catch (SQLException e) { + } + + if (currentVersion == null || !JpaUpdaterProvider.LAST_VERSION.equals(currentVersion)) { + updater.update(session, connection, schema); + } else { + logger.debug("Database is up to date"); + } + } else if (databaseSchema.equals("validate")) { + updater.validate(connection, schema); + } else { + throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema); + } + + logger.trace("Database update completed"); + } + + logger.trace("Creating EntityManagerFactory"); + emf = Persistence.createEntityManagerFactory(unitName, properties); + logger.trace("EntityManagerFactory created"); - connection = getConnection(); - prepareDatabaseInfo(connection); + } finally { + // Close after creating EntityManagerFactory to prevent in-mem databases from closing + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + logger.warn(e); + } + } + } + } + } + } + } + + protected void prepareDatabaseInfo(Connection connection) { + try { + databaseInfo = new DatabaseInfo(); + DatabaseMetaData md = connection.getMetaData(); + databaseInfo.databaseDriver = md.getDriverName() + " " + md.getDriverVersion(); + databaseInfo.databaseProduct = md.getDatabaseProductName() + " " + md.getDatabaseProductVersion(); + databaseInfo.databaseUser = md.getUserName(); + databaseInfo.jdbcUrl = md.getURL(); + } catch (SQLException e) { + logger.warn("Unable to get database info due " + e.getMessage()); + } + } - if (databaseSchema != null) { - logger.trace("Updating database"); + private Connection getConnection() { + try { + String dataSourceLookup = config.get("dataSource"); + if (dataSourceLookup != null) { + DataSource dataSource = (DataSource) new InitialContext().lookup(dataSourceLookup); + return dataSource.getConnection(); + } else { + Class.forName(config.get("driver")); + return DriverManager.getConnection(config.get("url"), config.get("user"), config.get("password")); + } + } catch (Exception e) { + throw new RuntimeException("Failed to connect to database", e); + } + } + + @Override + public DatabaseInfo getOperationalInfo() { + return databaseInfo; + } - JpaUpdaterProvider updater = session.getProvider(JpaUpdaterProvider.class); - if (updater == null) { - throw new RuntimeException("Can't update database: JPA updater provider not found"); - } + public static class DatabaseInfo implements ProviderOperationalInfo { + protected String jdbcUrl; + protected String databaseUser; + protected String databaseProduct; + protected String databaseDriver; - if (databaseSchema.equals("update")) { - String currentVersion = null; - try { - ResultSet resultSet = connection.createStatement().executeQuery(updater.getCurrentVersionSql(schema)); - if (resultSet.next()) { - currentVersion = resultSet.getString(1); - } - } catch (SQLException e) { - } + public String getJdbcUrl() { + return jdbcUrl; + } - if (currentVersion == null || !JpaUpdaterProvider.LAST_VERSION.equals(currentVersion)) { - updater.update(session, connection, schema); - } else { - logger.debug("Database is up to date"); - } - } else if (databaseSchema.equals("validate")) { - updater.validate(connection, schema); - } else { - throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema); - } + public String getDatabaseDriver() { + return databaseDriver; + } - logger.trace("Database update completed"); - } + public String getDatabaseUser() { + return databaseUser; + } - logger.trace("Creating EntityManagerFactory"); - emf = Persistence.createEntityManagerFactory(unitName, properties); - logger.trace("EntityManagerFactory created"); - - // Close after creating EntityManagerFactory to prevent in-mem databases from closing - if (connection != null) { - try { - connection.close(); - } catch (SQLException e) { - logger.warn(e); - } - } - } - } - } - } - - protected void prepareDatabaseInfo(Connection connection) { - try { - databaseInfo = new DatabaseInfo(); - DatabaseMetaData md = connection.getMetaData(); - databaseInfo.databaseDriver = md.getDriverName() + " " + md.getDriverVersion(); - databaseInfo.databaseProduct = md.getDatabaseProductName() + " " + md.getDatabaseProductVersion(); - databaseInfo.databaseUser = md.getUserName(); - databaseInfo.jdbcUrl = md.getURL(); - } catch (SQLException e) { - logger.warn("Unable to get database info due " + e.getMessage()); - } - } - - private Connection getConnection() { - try { - String dataSourceLookup = config.get("dataSource"); - if (dataSourceLookup != null) { - DataSource dataSource = (DataSource) new InitialContext().lookup(dataSourceLookup); - return dataSource.getConnection(); - } else { - Class.forName(config.get("driver")); - return DriverManager.getConnection(config.get("url"), config.get("user"), config.get("password")); - } - } catch (Exception e) { - throw new RuntimeException("Failed to connect to database", e); - } - } - - @Override - public DatabaseInfo getOperationalInfo() { - return databaseInfo; - } - - public static class DatabaseInfo implements ProviderOperationalInfo { - protected String jdbcUrl; - protected String databaseUser; - protected String databaseProduct; - protected String databaseDriver; - - public String getJdbcUrl() { - return jdbcUrl; - } - - public String getDatabaseDriver() { - return databaseDriver; - } - - public String getDatabaseUser() { - return databaseUser; - } - - public String getDatabaseProduct() { - return databaseProduct; - } - } + public String getDatabaseProduct() { + return databaseProduct; + } + } } 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 248b880be6..2df4b85363 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 @@ -1,10 +1,10 @@ package org.keycloak.connections.mongo; -import java.lang.reflect.Method; -import java.net.UnknownHostException; -import java.util.Collections; - -import javax.net.ssl.SSLSocketFactory; +import com.mongodb.DB; +import com.mongodb.MongoClient; +import com.mongodb.MongoClientOptions; +import com.mongodb.MongoCredential; +import com.mongodb.ServerAddress; import org.jboss.logging.Logger; import org.keycloak.Config; @@ -16,217 +16,234 @@ import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSessionFactory; import org.keycloak.provider.ProviderOperationalInfo; -import com.mongodb.DB; -import com.mongodb.MongoClient; -import com.mongodb.MongoClientOptions; -import com.mongodb.MongoCredential; -import com.mongodb.ServerAddress; +import javax.net.ssl.SSLSocketFactory; + +import java.lang.reflect.Method; +import java.net.UnknownHostException; +import java.util.Collections; /** * @author Stian Thorgersen */ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionProviderFactory { - // TODO Make configurable - private String[] entities = new String[] { "org.keycloak.models.mongo.keycloak.entities.MongoRealmEntity", "org.keycloak.models.mongo.keycloak.entities.MongoUserEntity", "org.keycloak.models.mongo.keycloak.entities.MongoRoleEntity", - "org.keycloak.models.entities.IdentityProviderEntity", "org.keycloak.models.entities.ClientIdentityProviderMappingEntity", "org.keycloak.models.entities.RequiredCredentialEntity", "org.keycloak.models.entities.CredentialEntity", - "org.keycloak.models.entities.FederatedIdentityEntity", "org.keycloak.models.mongo.keycloak.entities.MongoClientEntity", "org.keycloak.models.sessions.mongo.entities.MongoUsernameLoginFailureEntity", - "org.keycloak.models.sessions.mongo.entities.MongoUserSessionEntity", "org.keycloak.models.sessions.mongo.entities.MongoClientSessionEntity", "org.keycloak.models.entities.UserFederationProviderEntity", - "org.keycloak.models.entities.UserFederationMapperEntity", "org.keycloak.models.entities.ProtocolMapperEntity", "org.keycloak.models.entities.IdentityProviderMapperEntity", - "org.keycloak.models.mongo.keycloak.entities.MongoUserConsentEntity", "org.keycloak.models.mongo.keycloak.entities.MongoMigrationModelEntity", "org.keycloak.models.entities.AuthenticationExecutionEntity", - "org.keycloak.models.entities.AuthenticationFlowEntity", "org.keycloak.models.entities.AuthenticatorConfigEntity", "org.keycloak.models.entities.RequiredActionProviderEntity", }; + // TODO Make configurable + private String[] entities = new String[]{ + "org.keycloak.models.mongo.keycloak.entities.MongoRealmEntity", + "org.keycloak.models.mongo.keycloak.entities.MongoUserEntity", + "org.keycloak.models.mongo.keycloak.entities.MongoRoleEntity", + "org.keycloak.models.entities.IdentityProviderEntity", + "org.keycloak.models.entities.ClientIdentityProviderMappingEntity", + "org.keycloak.models.entities.RequiredCredentialEntity", + "org.keycloak.models.entities.CredentialEntity", + "org.keycloak.models.entities.FederatedIdentityEntity", + "org.keycloak.models.mongo.keycloak.entities.MongoClientEntity", + "org.keycloak.models.sessions.mongo.entities.MongoUsernameLoginFailureEntity", + "org.keycloak.models.sessions.mongo.entities.MongoUserSessionEntity", + "org.keycloak.models.sessions.mongo.entities.MongoClientSessionEntity", + "org.keycloak.models.entities.UserFederationProviderEntity", + "org.keycloak.models.entities.UserFederationMapperEntity", + "org.keycloak.models.entities.ProtocolMapperEntity", + "org.keycloak.models.entities.IdentityProviderMapperEntity", + "org.keycloak.models.mongo.keycloak.entities.MongoUserConsentEntity", + "org.keycloak.models.mongo.keycloak.entities.MongoMigrationModelEntity", + "org.keycloak.models.entities.AuthenticationExecutionEntity", + "org.keycloak.models.entities.AuthenticationFlowEntity", + "org.keycloak.models.entities.AuthenticatorConfigEntity", + "org.keycloak.models.entities.RequiredActionProviderEntity", + }; - private static final Logger logger = Logger.getLogger(DefaultMongoConnectionFactoryProvider.class); + private static final Logger logger = Logger.getLogger(DefaultMongoConnectionFactoryProvider.class); - private volatile MongoClient client; + private volatile MongoClient client; - private MongoStore mongoStore; - private DB db; - protected Config.Scope config; + private MongoStore mongoStore; + private DB db; + protected Config.Scope config; + + private MongoDbInfo mongoDbInfo; - private MongoDbInfo mongoDbInfo; + @Override + public MongoConnectionProvider create(KeycloakSession session) { + lazyInit(session); - @Override - public MongoConnectionProvider create(KeycloakSession session) { - lazyInit(session); + TransactionMongoStoreInvocationContext invocationContext = new TransactionMongoStoreInvocationContext(mongoStore); + session.getTransaction().enlist(new MongoKeycloakTransaction(invocationContext)); + return new DefaultMongoConnectionProvider(db, mongoStore, invocationContext); + } - TransactionMongoStoreInvocationContext invocationContext = new TransactionMongoStoreInvocationContext(mongoStore); - session.getTransaction().enlist(new MongoKeycloakTransaction(invocationContext)); - return new DefaultMongoConnectionProvider(db, mongoStore, invocationContext); - } + @Override + public void init(Config.Scope config) { + this.config = config; + } - @Override - public void init(Config.Scope config) { - this.config = config; - } + @Override + public void postInit(KeycloakSessionFactory factory) { - @Override - public void postInit(KeycloakSessionFactory factory) { + } - } - private void lazyInit(KeycloakSession session) { - if (client == null) { - synchronized (this) { - if (client == null) { - try { - this.client = createMongoClient(); + private void lazyInit(KeycloakSession session) { + if (client == null) { + synchronized (this) { + if (client == null) { + try { + this.client = createMongoClient(); - String dbName = config.get("db", "keycloak"); - this.db = client.getDB(dbName); + String dbName = config.get("db", "keycloak"); + this.db = client.getDB(dbName); - String databaseSchema = config.get("databaseSchema"); - if (databaseSchema != null) { - if (databaseSchema.equals("update")) { - MongoUpdaterProvider mongoUpdater = session.getProvider(MongoUpdaterProvider.class); + String databaseSchema = config.get("databaseSchema"); + if (databaseSchema != null) { + if (databaseSchema.equals("update")) { + MongoUpdaterProvider mongoUpdater = session.getProvider(MongoUpdaterProvider.class); - if (mongoUpdater == null) { - throw new RuntimeException("Can't update database: Mongo updater provider not found"); - } + if (mongoUpdater == null) { + throw new RuntimeException("Can't update database: Mongo updater provider not found"); + } - mongoUpdater.update(session, db); - } else { - throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema); - } - } + mongoUpdater.update(session, db); + } else { + throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema); + } + } - this.mongoStore = new MongoStoreImpl(db, getManagedEntities()); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - } - } + this.mongoStore = new MongoStoreImpl(db, getManagedEntities()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + } + } - private Class[] getManagedEntities() throws ClassNotFoundException { - Class[] entityClasses = new Class[entities.length]; - for (int i = 0; i < entities.length; i++) { - entityClasses[i] = Thread.currentThread().getContextClassLoader().loadClass(entities[i]); - } - return entityClasses; - } + private Class[] getManagedEntities() throws ClassNotFoundException { + Class[] entityClasses = new Class[entities.length]; + for (int i = 0; i < entities.length; i++) { + entityClasses[i] = Thread.currentThread().getContextClassLoader().loadClass(entities[i]); + } + return entityClasses; + } - @Override - public void close() { - if (client != null) { - client.close(); - } - } + @Override + public void close() { + if (client != null) { + client.close(); + } + } - @Override - public String getId() { - return "default"; - } + @Override + public String getId() { + 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"); + /** + * 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"); + String user = config.get("user"); + String password = config.get("password"); - MongoClientOptions clientOptions = getClientOptions(); + 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); - } + 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); + } + + mongoDbInfo = new MongoDbInfo(); + mongoDbInfo.driverVersion = client.getVersion(); + mongoDbInfo.address = client.getAddress().toString(); + mongoDbInfo.database = dbName; + mongoDbInfo.user = user; + + logger.debugv("Initialized mongo model. host: %s, port: %d, db: %s", host, port, dbName); + return client; + } - mongoDbInfo = new MongoDbInfo(); - mongoDbInfo.driverVersion = client.getVersion(); - mongoDbInfo.address = client.getAddress().toString(); - mongoDbInfo.database = dbName; - mongoDbInfo.user = user; + protected MongoClientOptions getClientOptions() { + MongoClientOptions.Builder builder = MongoClientOptions.builder(); + checkIntOption("connectionsPerHost", builder); + checkIntOption("threadsAllowedToBlockForConnectionMultiplier", builder); + checkIntOption("maxWaitTime", builder); + checkIntOption("connectTimeout", builder); + checkIntOption("socketTimeout", builder); + checkBooleanOption("socketKeepAlive", builder); + checkBooleanOption("autoConnectRetry", builder); + if (config.getLong("maxAutoConnectRetryTime") != null) { + builder.maxAutoConnectRetryTime(config.getLong("maxAutoConnectRetryTime")); + } + if(config.getBoolean("ssl", false)) { + builder.socketFactory(SSLSocketFactory.getDefault()); + } - logger.debugv("Initialized mongo model. host: %s, port: %d, db: %s", host, port, dbName); - return client; - } + return builder.build(); + } - protected MongoClientOptions getClientOptions() { - MongoClientOptions.Builder builder = MongoClientOptions.builder(); - checkIntOption("connectionsPerHost", builder); - checkIntOption("threadsAllowedToBlockForConnectionMultiplier", builder); - checkIntOption("maxWaitTime", builder); - checkIntOption("connectTimeout", builder); - checkIntOption("socketTimeout", builder); - checkBooleanOption("socketKeepAlive", builder); - checkBooleanOption("autoConnectRetry", builder); - if (config.getLong("maxAutoConnectRetryTime") != null) { - builder.maxAutoConnectRetryTime(config.getLong("maxAutoConnectRetryTime")); - } - if (config.getBoolean("ssl", false)) { - builder.socketFactory(SSLSocketFactory.getDefault()); - } + protected void checkBooleanOption(String optionName, MongoClientOptions.Builder builder) { + Boolean val = config.getBoolean(optionName); + if (val != null) { + try { + Method m = MongoClientOptions.Builder.class.getMethod(optionName, boolean.class); + m.invoke(builder, val); + } catch (Exception e) { + throw new IllegalStateException("Problem configuring boolean option " + optionName + " for mongo client. Ensure you used correct value true or false and if this option is supported by mongo driver", e); + } + } + } - return builder.build(); - } + protected void checkIntOption(String optionName, MongoClientOptions.Builder builder) { + Integer val = config.getInt(optionName); + if (val != null) { + try { + Method m = MongoClientOptions.Builder.class.getMethod(optionName, int.class); + m.invoke(builder, val); + } catch (Exception e) { + throw new IllegalStateException("Problem configuring int option " + optionName + " for mongo client. Ensure you used correct value (number) and if this option is supported by mongo driver", e); + } + } + } + + @Override + public ProviderOperationalInfo getOperationalInfo() { + return mongoDbInfo; + } - protected void checkBooleanOption(String optionName, MongoClientOptions.Builder builder) { - Boolean val = config.getBoolean(optionName); - if (val != null) { - try { - Method m = MongoClientOptions.Builder.class.getMethod(optionName, boolean.class); - m.invoke(builder, val); - } catch (Exception e) { - throw new IllegalStateException("Problem configuring boolean option " + optionName + " for mongo client. Ensure you used correct value true or false and if this option is supported by mongo driver", e); - } - } - } + public static class MongoDbInfo implements ProviderOperationalInfo { - protected void checkIntOption(String optionName, MongoClientOptions.Builder builder) { - Integer val = config.getInt(optionName); - if (val != null) { - try { - Method m = MongoClientOptions.Builder.class.getMethod(optionName, int.class); - m.invoke(builder, val); - } catch (Exception e) { - throw new IllegalStateException("Problem configuring int option " + optionName + " for mongo client. Ensure you used correct value (number) and if this option is supported by mongo driver", e); - } - } - } + public String address; + public String database; + public String driverVersion; + public String user; - @Override - public ProviderOperationalInfo getOperationalInfo() { - return mongoDbInfo; - } + public String getAddress() { + return address; + } - public static class MongoDbInfo implements ProviderOperationalInfo { + public String getDatabase() { + return database; + } - public String address; - public String database; - public String driverVersion; - public String user; - - public String getAddress() { - return address; - } - - public String getDatabase() { - return database; - } - - public String getDriverVersion() { - return driverVersion; - } - - public String getUser() { - return user; - } - } + public String getDriverVersion() { + return driverVersion; + } + public String getUser() { + return user; + } + } } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java index dbb0ff0c8f..3b69304b06 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java @@ -1,19 +1,5 @@ package org.keycloak.services.resources.admin; -import java.io.Serializable; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.ServiceLoader; -import java.util.Set; - -import javax.ws.rs.GET; -import javax.ws.rs.core.Context; - import org.jboss.logging.Logger; import org.keycloak.Version; import org.keycloak.broker.provider.IdentityProvider; @@ -43,6 +29,19 @@ import org.keycloak.representations.idm.ProtocolMapperRepresentation; import org.keycloak.representations.idm.ProtocolMapperTypeRepresentation; import org.keycloak.social.SocialIdentityProvider; +import javax.ws.rs.GET; +import javax.ws.rs.core.Context; +import java.io.Serializable; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.ServiceLoader; +import java.util.Set; + /** * @author Stian Thorgersen */ @@ -219,7 +218,6 @@ public class ServerInfoAdminResource { public static class MemoryInfo implements Serializable { protected long total; - protected long used; public MemoryInfo(){ diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/AdminAPITest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/AdminAPITest.java index 85a81bbbeb..2cca19a0c9 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/AdminAPITest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/AdminAPITest.java @@ -21,22 +21,6 @@ */ package org.keycloak.testsuite.admin; -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.ClientRequestContext; -import javax.ws.rs.client.ClientRequestFilter; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriBuilder; - import org.junit.Assert; import org.junit.ClassRule; import org.junit.Test; @@ -57,8 +41,23 @@ import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.services.managers.RealmManager; import org.keycloak.services.resources.admin.AdminRoot; -import org.keycloak.testsuite.KeycloakServer; import org.keycloak.testsuite.rule.AbstractKeycloakRule; +import org.keycloak.testsuite.KeycloakServer; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriBuilder; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * Tests Undertow Adapter