Skip to content

Commit 754287e

Browse files
committed
Extract SchemaManagerDatabaseConfiguration and SchemaManagerLockConfiguration for more easier implementation of custom SchemaManager
1 parent 266976f commit 754287e

File tree

16 files changed

+482
-270
lines changed

16 files changed

+482
-270
lines changed

modules/flowable-app-engine/src/main/java/org/flowable/app/engine/impl/db/AppDbSchemaManager.java

+2-11
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.apache.commons.lang3.StringUtils;
1818
import org.flowable.app.engine.AppEngine;
1919
import org.flowable.app.engine.impl.util.CommandContextUtil;
20-
import org.flowable.common.engine.impl.AbstractEngineConfiguration;
20+
import org.flowable.common.engine.impl.db.EngineSchemaManagerLockConfiguration;
2121
import org.flowable.common.engine.impl.db.EngineSqlScriptBasedDbSchemaManager;
2222

2323
public class AppDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
@@ -31,7 +31,7 @@ public class AppDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
3131
);
3232

3333
public AppDbSchemaManager() {
34-
super("app");
34+
super("app", new EngineSchemaManagerLockConfiguration(CommandContextUtil::getAppEngineConfiguration));
3535
}
3636

3737
@Override
@@ -58,11 +58,6 @@ protected String getEngineTableName() {
5858
protected String getChangeLogTableName() {
5959
return "ACT_APP_DATABASECHANGELOG";
6060
}
61-
62-
@Override
63-
protected String getChangeLogTablePrefixName() {
64-
return "ACT_APP";
65-
}
6661

6762
@Override
6863
protected String getDbVersionForChangelogVersion(String changeLogVersion) {
@@ -72,10 +67,6 @@ protected String getDbVersionForChangelogVersion(String changeLogVersion) {
7267
return "6.3.0.1";
7368
}
7469

75-
@Override
76-
protected AbstractEngineConfiguration getEngineConfiguration() {
77-
return CommandContextUtil.getAppEngineConfiguration();
78-
}
7970
@Override
8071
protected String getResourcesRootDirectory() {
8172
return "org/flowable/app/db/";

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/db/CmmnDbSchemaManager.java

+2-12
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.apache.commons.lang3.StringUtils;
1818
import org.flowable.cmmn.engine.CmmnEngine;
1919
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
20-
import org.flowable.common.engine.impl.AbstractEngineConfiguration;
20+
import org.flowable.common.engine.impl.db.EngineSchemaManagerLockConfiguration;
2121
import org.flowable.common.engine.impl.db.EngineSqlScriptBasedDbSchemaManager;
2222

2323
public class CmmnDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
@@ -48,7 +48,7 @@ public class CmmnDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
4848
);
4949

5050
public CmmnDbSchemaManager() {
51-
super("cmmn");
51+
super("cmmn", new EngineSchemaManagerLockConfiguration(CommandContextUtil::getCmmnEngineConfiguration));
5252
}
5353

5454
@Override
@@ -75,11 +75,6 @@ protected String getEngineTableName() {
7575
protected String getChangeLogTableName() {
7676
return "ACT_CMMN_DATABASECHANGELOG";
7777
}
78-
79-
@Override
80-
protected String getChangeLogTablePrefixName() {
81-
return "ACT_CMMN";
82-
}
8378

8479
@Override
8580
protected String getDbVersionForChangelogVersion(String changeLogVersion) {
@@ -89,11 +84,6 @@ protected String getDbVersionForChangelogVersion(String changeLogVersion) {
8984
return "6.1.2.0";
9085
}
9186

92-
@Override
93-
protected AbstractEngineConfiguration getEngineConfiguration() {
94-
return CommandContextUtil.getCmmnEngineConfiguration();
95-
}
96-
9787
@Override
9888
protected String getResourcesRootDirectory() {
9989
return "org/flowable/cmmn/db/";

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/db/DmnDbSchemaManager.java

+2-12
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.util.Map;
1717

1818
import org.apache.commons.lang3.StringUtils;
19-
import org.flowable.common.engine.impl.AbstractEngineConfiguration;
19+
import org.flowable.common.engine.impl.db.EngineSchemaManagerLockConfiguration;
2020
import org.flowable.common.engine.impl.db.EngineSqlScriptBasedDbSchemaManager;
2121
import org.flowable.dmn.engine.DmnEngine;
2222
import org.flowable.dmn.engine.impl.util.CommandContextUtil;
@@ -39,7 +39,7 @@ public class DmnDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
3939
);
4040

4141
public DmnDbSchemaManager() {
42-
super("dmn");
42+
super("dmn", new EngineSchemaManagerLockConfiguration(CommandContextUtil::getDmnEngineConfiguration));
4343
}
4444

4545
@Override
@@ -66,11 +66,6 @@ protected String getEngineTableName() {
6666
protected String getChangeLogTableName() {
6767
return "ACT_DMN_DATABASECHANGELOG";
6868
}
69-
70-
@Override
71-
protected String getChangeLogTablePrefixName() {
72-
return "ACT_DMN";
73-
}
7469

7570
@Override
7671
protected String getDbVersionForChangelogVersion(String changeLogVersion) {
@@ -80,11 +75,6 @@ protected String getDbVersionForChangelogVersion(String changeLogVersion) {
8075
return "5.99.0.0";
8176
}
8277

83-
@Override
84-
protected AbstractEngineConfiguration getEngineConfiguration() {
85-
return CommandContextUtil.getDmnEngineConfiguration();
86-
}
87-
8878
@Override
8979
protected String getResourcesRootDirectory() {
9080
return "org/flowable/dmn/db/";

modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java

+12-72
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@
8787
import org.flowable.common.engine.impl.db.MybatisTypeAliasConfigurator;
8888
import org.flowable.common.engine.impl.db.MybatisTypeHandlerConfigurator;
8989
import org.flowable.common.engine.impl.db.SchemaManager;
90+
import org.flowable.common.engine.impl.db.SchemaManagerDatabaseConfiguration;
91+
import org.flowable.common.engine.impl.db.SchemaManagerDatabaseConfigurationSessionFactory;
9092
import org.flowable.common.engine.impl.db.SchemaOperationsEngineBuild;
9193
import org.flowable.common.engine.impl.event.EventDispatchAction;
9294
import org.flowable.common.engine.impl.event.FlowableEventDispatcherImpl;
@@ -122,6 +124,7 @@
122124
import org.flowable.common.engine.impl.persistence.entity.data.impl.MybatisPropertyDataManager;
123125
import org.flowable.common.engine.impl.runtime.Clock;
124126
import org.flowable.common.engine.impl.service.CommonEngineServiceImpl;
127+
import org.flowable.common.engine.impl.util.DbUtil;
125128
import org.flowable.common.engine.impl.util.DefaultClockImpl;
126129
import org.flowable.common.engine.impl.util.IoUtil;
127130
import org.flowable.common.engine.impl.util.ReflectUtil;
@@ -382,38 +385,7 @@ public abstract class AbstractEngineConfiguration {
382385
public static final String DATABASE_TYPE_COCKROACHDB = "cockroachdb";
383386

384387
public static Properties getDefaultDatabaseTypeMappings() {
385-
Properties databaseTypeMappings = new Properties();
386-
databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);
387-
databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL);
388-
databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);
389-
databaseTypeMappings.setProperty("MariaDB", DATABASE_TYPE_MYSQL);
390-
databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);
391-
databaseTypeMappings.setProperty(PRODUCT_NAME_POSTGRES, DATABASE_TYPE_POSTGRES);
392-
databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL);
393-
databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2);
394-
databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2);
395-
databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2);
396-
databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2);
397-
databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2);
398-
databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2);
399-
databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2);
400-
databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2);
401-
databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2);
402-
databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2);
403-
databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", DATABASE_TYPE_DB2);
404-
databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2);
405-
databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2);
406-
databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2);
407-
databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2);
408-
databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2);
409-
databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2);
410-
databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2);
411-
databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2);
412-
databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2);
413-
databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2);
414-
databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2);
415-
databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB);
416-
return databaseTypeMappings;
388+
return DbUtil.getDefaultDatabaseTypeMappings();
417389
}
418390

419391
protected Map<Object, Object> beans;
@@ -498,46 +470,7 @@ protected void initDataSource() {
498470
}
499471

500472
public void initDatabaseType() {
501-
Connection connection = null;
502-
try {
503-
connection = dataSource.getConnection();
504-
DatabaseMetaData databaseMetaData = connection.getMetaData();
505-
String databaseProductName = databaseMetaData.getDatabaseProductName();
506-
logger.debug("database product name: '{}'", databaseProductName);
507-
508-
// CRDB does not expose the version through the jdbc driver, so we need to fetch it through version().
509-
if (PRODUCT_NAME_POSTGRES.equalsIgnoreCase(databaseProductName)) {
510-
try (PreparedStatement preparedStatement = connection.prepareStatement("select version() as version;");
511-
ResultSet resultSet = preparedStatement.executeQuery()) {
512-
String version = null;
513-
if (resultSet.next()) {
514-
version = resultSet.getString("version");
515-
}
516-
517-
if (StringUtils.isNotEmpty(version) && version.toLowerCase().startsWith(PRODUCT_NAME_CRDB.toLowerCase())) {
518-
databaseProductName = PRODUCT_NAME_CRDB;
519-
logger.info("CockroachDB version '{}' detected", version);
520-
}
521-
}
522-
}
523-
524-
databaseType = databaseTypeMappings.getProperty(databaseProductName);
525-
if (databaseType == null) {
526-
throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'");
527-
}
528-
logger.debug("using database type: {}", databaseType);
529-
530-
} catch (SQLException e) {
531-
throw new RuntimeException("Exception while initializing Database connection", e);
532-
} finally {
533-
try {
534-
if (connection != null) {
535-
connection.close();
536-
}
537-
} catch (SQLException e) {
538-
logger.error("Exception while closing the Database connection", e);
539-
}
540-
}
473+
databaseType = DbUtil.determineDatabaseType(dataSource, logger, databaseTypeMappings);
541474

542475
// Special care for MSSQL, as it has a hard limit of 2000 params per statement (incl bulk statement).
543476
// Especially with executions, with 100 as default, this limit is passed.
@@ -765,6 +698,7 @@ public void initSessionFactories() {
765698

766699
if (usingRelationalDatabase) {
767700
initDbSqlSessionFactory();
701+
initSchemaManagerDatabaseConfigurationSessionFactory();
768702
}
769703

770704
addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl::new));
@@ -811,6 +745,12 @@ public void initDbSqlSessionFactory() {
811745
addSessionFactory(dbSqlSessionFactory);
812746
}
813747

748+
protected void initSchemaManagerDatabaseConfigurationSessionFactory() {
749+
if (!sessionFactories.containsKey(SchemaManagerDatabaseConfiguration.class)) {
750+
addSessionFactory(new SchemaManagerDatabaseConfigurationSessionFactory());
751+
}
752+
}
753+
814754
public DbSqlSessionFactory createDbSqlSessionFactory() {
815755
return new DbSqlSessionFactory(usePrefixId);
816756
}

0 commit comments

Comments
 (0)