keycloak
クラス | 公開メンバ関数 | 限定公開メンバ関数 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory クラス
org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory の継承関係図
Inheritance graph
org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory 連携図
Collaboration graph

クラス

enum  MigrationStrategy
 

公開メンバ関数

JpaConnectionProvider create (KeycloakSession session)
 
void close ()
 
String getId ()
 
void init (Config.Scope config)
 
void postInit (KeycloakSessionFactory factory)
 
void migration (MigrationStrategy strategy, boolean initializeEmpty, String schema, File databaseUpdateFile, Connection connection, KeycloakSession session)
 
Connection getConnection ()
 
String getSchema ()
 
Map< String, String > getOperationalInfo ()
 
default int order ()
 

限定公開メンバ関数

void checkJtaEnabled (KeycloakSessionFactory factory)
 
void prepareOperationalInfo (Connection connection)
 
String detectDialect (Connection connection)
 
void startGlobalStats (KeycloakSession session, int globalStatsIntervalSecs)
 
void update (Connection connection, String schema, KeycloakSession session, JpaUpdaterProvider updater)
 
void export (Connection connection, String schema, File databaseUpdateFile, KeycloakSession session, JpaUpdaterProvider updater)
 

非公開メンバ関数

void lazyInit (KeycloakSession session)
 
File getDatabaseUpdateFile ()
 
MigrationStrategy getMigrationStrategy ()
 

非公開変数類

volatile EntityManagerFactory emf
 
Config.Scope config
 
Map< String, String > operationalInfo
 
boolean jtaEnabled
 
JtaTransactionManagerLookup jtaLookup
 
KeycloakSessionFactory factory
 

静的非公開変数類

static final Logger logger = Logger.getLogger(DefaultJpaConnectionProviderFactory.class)
 

詳解

著者
Stian Thorgersen

クラス詳解

◆ org::keycloak::connections::jpa::DefaultJpaConnectionProviderFactory::MigrationStrategy

enum org::keycloak::connections::jpa::DefaultJpaConnectionProviderFactory::MigrationStrategy
org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.MigrationStrategy 連携図
Collaboration graph
列挙値
MANUAL
UPDATE
VALIDATE

関数詳解

◆ checkJtaEnabled()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.checkJtaEnabled ( KeycloakSessionFactory  factory)
inlineprotected
117  {
118  jtaLookup = (JtaTransactionManagerLookup) factory.getProviderFactory(JtaTransactionManagerLookup.class);
119  if (jtaLookup != null) {
120  if (jtaLookup.getTransactionManager() != null) {
121  jtaEnabled = true;
122  }
123  }
124  }
KeycloakSessionFactory factory
Definition: DefaultJpaConnectionProviderFactory.java:73
boolean jtaEnabled
Definition: DefaultJpaConnectionProviderFactory.java:70
< T extends Provider > ProviderFactory< T > getProviderFactory(Class< T > clazz)
JtaTransactionManagerLookup jtaLookup
Definition: DefaultJpaConnectionProviderFactory.java:71

◆ close()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.close ( )
inline

org.keycloak.provider.ProviderFactory< T extends Provider >を実装しています。

94  {
95  if (emf != null) {
96  emf.close();
97  }
98  }
volatile EntityManagerFactory emf
Definition: DefaultJpaConnectionProviderFactory.java:64

◆ create()

JpaConnectionProvider org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.create ( KeycloakSession  session)
inline

org.keycloak.provider.ProviderFactory< T extends Provider >を実装しています。

76  {
77  logger.trace("Create JpaConnectionProvider");
78  lazyInit(session);
79 
80  EntityManager em = null;
81  if (!jtaEnabled) {
82  logger.trace("enlisting EntityManager in JpaKeycloakTransaction");
83  em = emf.createEntityManager();
84  } else {
85 
86  em = emf.createEntityManager(SynchronizationType.SYNCHRONIZED);
87  }
88  em = PersistenceExceptionConverter.create(em);
89  if (!jtaEnabled) session.getTransactionManager().enlist(new JpaKeycloakTransaction(em));
90  return new DefaultJpaConnectionProvider(em);
91  }
void lazyInit(KeycloakSession session)
Definition: DefaultJpaConnectionProviderFactory.java:126
boolean jtaEnabled
Definition: DefaultJpaConnectionProviderFactory.java:70
volatile EntityManagerFactory emf
Definition: DefaultJpaConnectionProviderFactory.java:64
static final Logger logger
Definition: DefaultJpaConnectionProviderFactory.java:58

◆ detectDialect()

String org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.detectDialect ( Connection  connection)
inlineprotected
244  {
245  String driverDialect = config.get("driverDialect");
246  if (driverDialect != null && driverDialect.length() > 0) {
247  return driverDialect;
248  } else {
249  try {
250  String dbProductName = connection.getMetaData().getDatabaseProductName();
251  String dbProductVersion = connection.getMetaData().getDatabaseProductVersion();
252 
253  // For MSSQL2014, we may need to fix the autodetected dialect by hibernate
254  if (dbProductName.equals("Microsoft SQL Server")) {
255  String topVersionStr = dbProductVersion.split("\\.")[0];
256  boolean shouldSet2012Dialect = true;
257  try {
258  int topVersion = Integer.parseInt(topVersionStr);
259  if (topVersion < 12) {
260  shouldSet2012Dialect = false;
261  }
262  } catch (NumberFormatException nfe) {
263  }
264  if (shouldSet2012Dialect) {
265  String sql2012Dialect = "org.hibernate.dialect.SQLServer2012Dialect";
266  logger.debugf("Manually override hibernate dialect to %s", sql2012Dialect);
267  return sql2012Dialect;
268  }
269  }
270  } catch (SQLException e) {
271  logger.warnf("Unable to detect hibernate dialect due database exception : %s", e.getMessage());
272  }
273 
274  return null;
275  }
276  }
Config.Scope config
Definition: DefaultJpaConnectionProviderFactory.java:66
static final Logger logger
Definition: DefaultJpaConnectionProviderFactory.java:58

◆ export()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.export ( Connection  connection,
String  schema,
File  databaseUpdateFile,
KeycloakSession  session,
JpaUpdaterProvider  updater 
)
inlineprotected
340  {
341  DBLockProvider dbLock = new DBLockManager(session).getDBLock();
342  if (dbLock.hasLock()) {
343  updater.export(connection, schema, databaseUpdateFile);
344  } else {
345  KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), new KeycloakSessionTask() {
346  @Override
347  public void run(KeycloakSession lockSession) {
348  DBLockManager dbLockManager = new DBLockManager(lockSession);
349  DBLockProvider dbLock2 = dbLockManager.getDBLock();
350  dbLock2.waitForLock();
351  try {
352  updater.export(connection, schema, databaseUpdateFile);
353  } finally {
354  dbLock2.releaseLock();
355  }
356  }
357  });
358  }
359  }

◆ getConnection()

Connection org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getConnection ( )
inline

org.keycloak.connections.jpa.JpaConnectionProviderFactoryを実装しています。

362  {
363  try {
364  String dataSourceLookup = config.get("dataSource");
365  if (dataSourceLookup != null) {
366  DataSource dataSource = (DataSource) new InitialContext().lookup(dataSourceLookup);
367  return dataSource.getConnection();
368  } else {
369  Class.forName(config.get("driver"));
370  return DriverManager.getConnection(config.get("url"), config.get("user"), config.get("password"));
371  }
372  } catch (Exception e) {
373  throw new RuntimeException("Failed to connect to database", e);
374  }
375  }
Config.Scope config
Definition: DefaultJpaConnectionProviderFactory.java:66

◆ getDatabaseUpdateFile()

File org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getDatabaseUpdateFile ( )
inlineprivate
223  {
224  String databaseUpdateFile = config.get("migrationExport", "keycloak-database-update.sql");
225  return new File(databaseUpdateFile);
226  }
Config.Scope config
Definition: DefaultJpaConnectionProviderFactory.java:66

◆ getId()

String org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getId ( )
inline

org.keycloak.provider.ProviderFactory< T extends Provider >を実装しています。

101  {
102  return "default";
103  }

◆ getMigrationStrategy()

MigrationStrategy org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getMigrationStrategy ( )
inlineprivate
387  {
388  String migrationStrategy = config.get("migrationStrategy");
389  if (migrationStrategy == null) {
390  // Support 'databaseSchema' for backwards compatibility
391  migrationStrategy = config.get("databaseSchema");
392  }
393 
394  if (migrationStrategy != null) {
395  return MigrationStrategy.valueOf(migrationStrategy.toUpperCase());
396  } else {
397  return MigrationStrategy.UPDATE;
398  }
399  }
Config.Scope config
Definition: DefaultJpaConnectionProviderFactory.java:66

◆ getOperationalInfo()

Map<String, String> org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getOperationalInfo ( )
inline

org.keycloak.provider.ServerInfoAwareProviderFactoryを実装しています。

383  {
384  return operationalInfo;
385  }
Map< String, String > operationalInfo
Definition: DefaultJpaConnectionProviderFactory.java:68

◆ getSchema()

String org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getSchema ( )
inline

org.keycloak.connections.jpa.JpaConnectionProviderFactoryを実装しています。

378  {
379  return config.get("schema");
380  }
Config.Scope config
Definition: DefaultJpaConnectionProviderFactory.java:66

◆ init()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.init ( Config.Scope  config)
inline

org.keycloak.provider.ProviderFactory< T extends Provider >を実装しています。

106  {
107  this.config = config;
108  }
Config.Scope config
Definition: DefaultJpaConnectionProviderFactory.java:66

◆ lazyInit()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.lazyInit ( KeycloakSession  session)
inlineprivate
126  {
127  if (emf == null) {
128  synchronized (this) {
129  if (emf == null) {
130  KeycloakModelUtils.suspendJtaTransaction(session.getKeycloakSessionFactory(), () -> {
131  logger.debug("Initializing JPA connections");
132 
133  Map<String, Object> properties = new HashMap<String, Object>();
134 
135  String unitName = "keycloak-default";
136 
137  String dataSource = config.get("dataSource");
138  if (dataSource != null) {
139  if (config.getBoolean("jta", jtaEnabled)) {
140  properties.put(AvailableSettings.JTA_DATASOURCE, dataSource);
141  } else {
142  properties.put(AvailableSettings.NON_JTA_DATASOURCE, dataSource);
143  }
144  } else {
145  properties.put(AvailableSettings.JDBC_URL, config.get("url"));
146  properties.put(AvailableSettings.JDBC_DRIVER, config.get("driver"));
147 
148  String user = config.get("user");
149  if (user != null) {
150  properties.put(AvailableSettings.JDBC_USER, user);
151  }
152  String password = config.get("password");
153  if (password != null) {
154  properties.put(AvailableSettings.JDBC_PASSWORD, password);
155  }
156  }
157 
158  String schema = getSchema();
159  if (schema != null) {
160  properties.put(JpaUtils.HIBERNATE_DEFAULT_SCHEMA, schema);
161  }
162 
163  MigrationStrategy migrationStrategy = getMigrationStrategy();
164  boolean initializeEmpty = config.getBoolean("initializeEmpty", true);
165  File databaseUpdateFile = getDatabaseUpdateFile();
166 
167  properties.put("hibernate.show_sql", config.getBoolean("showSql", false));
168  properties.put("hibernate.format_sql", config.getBoolean("formatSql", true));
169 
170  Connection connection = getConnection();
171  try {
172  prepareOperationalInfo(connection);
173 
174  String driverDialect = detectDialect(connection);
175  if (driverDialect != null) {
176  properties.put("hibernate.dialect", driverDialect);
177  }
178 
179  migration(migrationStrategy, initializeEmpty, schema, databaseUpdateFile, connection, session);
180 
181  int globalStatsInterval = config.getInt("globalStatsInterval", -1);
182  if (globalStatsInterval != -1) {
183  properties.put("hibernate.generate_statistics", true);
184  }
185 
186  logger.trace("Creating EntityManagerFactory");
187  logger.tracev("***** create EMF jtaEnabled {0} ", jtaEnabled);
188  if (jtaEnabled) {
189  properties.put(org.hibernate.cfg.AvailableSettings.JTA_PLATFORM, new AbstractJtaPlatform() {
190  @Override
191  protected TransactionManager locateTransactionManager() {
193  }
194 
195  @Override
196  protected UserTransaction locateUserTransaction() {
197  return null;
198  }
199  });
200  }
201  emf = JpaUtils.createEntityManagerFactory(session, unitName, properties, getClass().getClassLoader(), jtaEnabled);
202  logger.trace("EntityManagerFactory created");
203 
204  if (globalStatsInterval != -1) {
205  startGlobalStats(session, globalStatsInterval);
206  }
207  } finally {
208  // Close after creating EntityManagerFactory to prevent in-mem databases from closing
209  if (connection != null) {
210  try {
211  connection.close();
212  } catch (SQLException e) {
213  logger.warn("Can't close connection", e);
214  }
215  }
216  }
217  });
218  }
219  }
220  }
221  }
String detectDialect(Connection connection)
Definition: DefaultJpaConnectionProviderFactory.java:244
void prepareOperationalInfo(Connection connection)
Definition: DefaultJpaConnectionProviderFactory.java:228
File getDatabaseUpdateFile()
Definition: DefaultJpaConnectionProviderFactory.java:223
boolean jtaEnabled
Definition: DefaultJpaConnectionProviderFactory.java:70
String getSchema()
Definition: DefaultJpaConnectionProviderFactory.java:378
Config.Scope config
Definition: DefaultJpaConnectionProviderFactory.java:66
Connection getConnection()
Definition: DefaultJpaConnectionProviderFactory.java:362
void startGlobalStats(KeycloakSession session, int globalStatsIntervalSecs)
Definition: DefaultJpaConnectionProviderFactory.java:278
MigrationStrategy getMigrationStrategy()
Definition: DefaultJpaConnectionProviderFactory.java:387
volatile EntityManagerFactory emf
Definition: DefaultJpaConnectionProviderFactory.java:64
static final Logger logger
Definition: DefaultJpaConnectionProviderFactory.java:58
void migration(MigrationStrategy strategy, boolean initializeEmpty, String schema, File databaseUpdateFile, Connection connection, KeycloakSession session)
Definition: DefaultJpaConnectionProviderFactory.java:284
JtaTransactionManagerLookup jtaLookup
Definition: DefaultJpaConnectionProviderFactory.java:71

◆ migration()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.migration ( MigrationStrategy  strategy,
boolean  initializeEmpty,
String  schema,
File  databaseUpdateFile,
Connection  connection,
KeycloakSession  session 
)
inline
284  {
285  JpaUpdaterProvider updater = session.getProvider(JpaUpdaterProvider.class);
286 
287  JpaUpdaterProvider.Status status = updater.validate(connection, schema);
288  if (status == JpaUpdaterProvider.Status.VALID) {
289  logger.debug("Database is up-to-date");
290  } else if (status == JpaUpdaterProvider.Status.EMPTY) {
291  if (initializeEmpty) {
292  update(connection, schema, session, updater);
293  } else {
294  switch (strategy) {
295  case UPDATE:
296  update(connection, schema, session, updater);
297  break;
298  case MANUAL:
299  export(connection, schema, databaseUpdateFile, session, updater);
300  throw new ServerStartupError("Database not initialized, please initialize database with " + databaseUpdateFile.getAbsolutePath(), false);
301  case VALIDATE:
302  throw new ServerStartupError("Database not initialized, please enable database initialization", false);
303  }
304  }
305  } else {
306  switch (strategy) {
307  case UPDATE:
308  update(connection, schema, session, updater);
309  break;
310  case MANUAL:
311  export(connection, schema, databaseUpdateFile, session, updater);
312  throw new ServerStartupError("Database not up-to-date, please migrate database with " + databaseUpdateFile.getAbsolutePath(), false);
313  case VALIDATE:
314  throw new ServerStartupError("Database not up-to-date, please enable database migration", false);
315  }
316  }
317  }
void export(Connection connection, String schema, File databaseUpdateFile, KeycloakSession session, JpaUpdaterProvider updater)
Definition: DefaultJpaConnectionProviderFactory.java:340
void update(Connection connection, String schema, KeycloakSession session, JpaUpdaterProvider updater)
Definition: DefaultJpaConnectionProviderFactory.java:319
static final Logger logger
Definition: DefaultJpaConnectionProviderFactory.java:58

◆ order()

default int org.keycloak.provider.ProviderFactory< T extends Provider >.order ( )
inlineinherited

◆ postInit()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.postInit ( KeycloakSessionFactory  factory)
inline

org.keycloak.provider.ProviderFactory< T extends Provider >を実装しています。

111  {
112  this.factory = factory;
114 
115  }
KeycloakSessionFactory factory
Definition: DefaultJpaConnectionProviderFactory.java:73
void checkJtaEnabled(KeycloakSessionFactory factory)
Definition: DefaultJpaConnectionProviderFactory.java:117

◆ prepareOperationalInfo()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.prepareOperationalInfo ( Connection  connection)
inlineprotected
228  {
229  try {
230  operationalInfo = new LinkedHashMap<>();
231  DatabaseMetaData md = connection.getMetaData();
232  operationalInfo.put("databaseUrl", md.getURL());
233  operationalInfo.put("databaseUser", md.getUserName());
234  operationalInfo.put("databaseProduct", md.getDatabaseProductName() + " " + md.getDatabaseProductVersion());
235  operationalInfo.put("databaseDriver", md.getDriverName() + " " + md.getDriverVersion());
236 
237  logger.debugf("Database info: %s", operationalInfo.toString());
238  } catch (SQLException e) {
239  logger.warn("Unable to prepare operational info due database exception: " + e.getMessage());
240  }
241  }
Map< String, String > operationalInfo
Definition: DefaultJpaConnectionProviderFactory.java:68
static final Logger logger
Definition: DefaultJpaConnectionProviderFactory.java:58

◆ startGlobalStats()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.startGlobalStats ( KeycloakSession  session,
int  globalStatsIntervalSecs 
)
inlineprotected
278  {
279  logger.debugf("Started Hibernate statistics with the interval %s seconds", globalStatsIntervalSecs);
280  TimerProvider timer = session.getProvider(TimerProvider.class);
281  timer.scheduleTask(new HibernateStatsReporter(emf), globalStatsIntervalSecs * 1000, "ReportHibernateGlobalStats");
282  }
volatile EntityManagerFactory emf
Definition: DefaultJpaConnectionProviderFactory.java:64
static final Logger logger
Definition: DefaultJpaConnectionProviderFactory.java:58

◆ update()

void org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.update ( Connection  connection,
String  schema,
KeycloakSession  session,
JpaUpdaterProvider  updater 
)
inlineprotected
319  {
320  DBLockProvider dbLock = new DBLockManager(session).getDBLock();
321  if (dbLock.hasLock()) {
322  updater.update(connection, schema);
323  } else {
324  KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), new KeycloakSessionTask() {
325  @Override
326  public void run(KeycloakSession lockSession) {
327  DBLockManager dbLockManager = new DBLockManager(lockSession);
328  DBLockProvider dbLock2 = dbLockManager.getDBLock();
329  dbLock2.waitForLock();
330  try {
331  updater.update(connection, schema);
332  } finally {
333  dbLock2.releaseLock();
334  }
335  }
336  });
337  }
338  }

メンバ詳解

◆ config

Config.Scope org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.config
private

◆ emf

volatile EntityManagerFactory org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.emf
private

◆ factory

KeycloakSessionFactory org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.factory
private

◆ jtaEnabled

boolean org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.jtaEnabled
private

◆ jtaLookup

JtaTransactionManagerLookup org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.jtaLookup
private

◆ logger

final Logger org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.logger = Logger.getLogger(DefaultJpaConnectionProviderFactory.class)
staticprivate

◆ operationalInfo

Map<String, String> org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.operationalInfo
private

このクラス詳解は次のファイルから抽出されました: