Skip to content

Commit

Permalink
Extract SchemaManagerDatabaseConfiguration and SchemaManagerLockConfi…
Browse files Browse the repository at this point in the history
…guration for more easier implementation of custom SchemaManager
  • Loading branch information
filiphr committed Aug 26, 2024
1 parent 266976f commit 754287e
Show file tree
Hide file tree
Showing 16 changed files with 482 additions and 270 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import org.apache.commons.lang3.StringUtils;
import org.flowable.app.engine.AppEngine;
import org.flowable.app.engine.impl.util.CommandContextUtil;
import org.flowable.common.engine.impl.AbstractEngineConfiguration;
import org.flowable.common.engine.impl.db.EngineSchemaManagerLockConfiguration;
import org.flowable.common.engine.impl.db.EngineSqlScriptBasedDbSchemaManager;

public class AppDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
Expand All @@ -31,7 +31,7 @@ public class AppDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
);

public AppDbSchemaManager() {
super("app");
super("app", new EngineSchemaManagerLockConfiguration(CommandContextUtil::getAppEngineConfiguration));
}

@Override
Expand All @@ -58,11 +58,6 @@ protected String getEngineTableName() {
protected String getChangeLogTableName() {
return "ACT_APP_DATABASECHANGELOG";
}

@Override
protected String getChangeLogTablePrefixName() {
return "ACT_APP";
}

@Override
protected String getDbVersionForChangelogVersion(String changeLogVersion) {
Expand All @@ -72,10 +67,6 @@ protected String getDbVersionForChangelogVersion(String changeLogVersion) {
return "6.3.0.1";
}

@Override
protected AbstractEngineConfiguration getEngineConfiguration() {
return CommandContextUtil.getAppEngineConfiguration();
}
@Override
protected String getResourcesRootDirectory() {
return "org/flowable/app/db/";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import org.apache.commons.lang3.StringUtils;
import org.flowable.cmmn.engine.CmmnEngine;
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
import org.flowable.common.engine.impl.AbstractEngineConfiguration;
import org.flowable.common.engine.impl.db.EngineSchemaManagerLockConfiguration;
import org.flowable.common.engine.impl.db.EngineSqlScriptBasedDbSchemaManager;

public class CmmnDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
Expand Down Expand Up @@ -48,7 +48,7 @@ public class CmmnDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
);

public CmmnDbSchemaManager() {
super("cmmn");
super("cmmn", new EngineSchemaManagerLockConfiguration(CommandContextUtil::getCmmnEngineConfiguration));
}

@Override
Expand All @@ -75,11 +75,6 @@ protected String getEngineTableName() {
protected String getChangeLogTableName() {
return "ACT_CMMN_DATABASECHANGELOG";
}

@Override
protected String getChangeLogTablePrefixName() {
return "ACT_CMMN";
}

@Override
protected String getDbVersionForChangelogVersion(String changeLogVersion) {
Expand All @@ -89,11 +84,6 @@ protected String getDbVersionForChangelogVersion(String changeLogVersion) {
return "6.1.2.0";
}

@Override
protected AbstractEngineConfiguration getEngineConfiguration() {
return CommandContextUtil.getCmmnEngineConfiguration();
}

@Override
protected String getResourcesRootDirectory() {
return "org/flowable/cmmn/db/";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.flowable.common.engine.impl.AbstractEngineConfiguration;
import org.flowable.common.engine.impl.db.EngineSchemaManagerLockConfiguration;
import org.flowable.common.engine.impl.db.EngineSqlScriptBasedDbSchemaManager;
import org.flowable.dmn.engine.DmnEngine;
import org.flowable.dmn.engine.impl.util.CommandContextUtil;
Expand All @@ -39,7 +39,7 @@ public class DmnDbSchemaManager extends EngineSqlScriptBasedDbSchemaManager {
);

public DmnDbSchemaManager() {
super("dmn");
super("dmn", new EngineSchemaManagerLockConfiguration(CommandContextUtil::getDmnEngineConfiguration));
}

@Override
Expand All @@ -66,11 +66,6 @@ protected String getEngineTableName() {
protected String getChangeLogTableName() {
return "ACT_DMN_DATABASECHANGELOG";
}

@Override
protected String getChangeLogTablePrefixName() {
return "ACT_DMN";
}

@Override
protected String getDbVersionForChangelogVersion(String changeLogVersion) {
Expand All @@ -80,11 +75,6 @@ protected String getDbVersionForChangelogVersion(String changeLogVersion) {
return "5.99.0.0";
}

@Override
protected AbstractEngineConfiguration getEngineConfiguration() {
return CommandContextUtil.getDmnEngineConfiguration();
}

@Override
protected String getResourcesRootDirectory() {
return "org/flowable/dmn/db/";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@
import org.flowable.common.engine.impl.db.MybatisTypeAliasConfigurator;
import org.flowable.common.engine.impl.db.MybatisTypeHandlerConfigurator;
import org.flowable.common.engine.impl.db.SchemaManager;
import org.flowable.common.engine.impl.db.SchemaManagerDatabaseConfiguration;
import org.flowable.common.engine.impl.db.SchemaManagerDatabaseConfigurationSessionFactory;
import org.flowable.common.engine.impl.db.SchemaOperationsEngineBuild;
import org.flowable.common.engine.impl.event.EventDispatchAction;
import org.flowable.common.engine.impl.event.FlowableEventDispatcherImpl;
Expand Down Expand Up @@ -122,6 +124,7 @@
import org.flowable.common.engine.impl.persistence.entity.data.impl.MybatisPropertyDataManager;
import org.flowable.common.engine.impl.runtime.Clock;
import org.flowable.common.engine.impl.service.CommonEngineServiceImpl;
import org.flowable.common.engine.impl.util.DbUtil;
import org.flowable.common.engine.impl.util.DefaultClockImpl;
import org.flowable.common.engine.impl.util.IoUtil;
import org.flowable.common.engine.impl.util.ReflectUtil;
Expand Down Expand Up @@ -382,38 +385,7 @@ public abstract class AbstractEngineConfiguration {
public static final String DATABASE_TYPE_COCKROACHDB = "cockroachdb";

public static Properties getDefaultDatabaseTypeMappings() {
Properties databaseTypeMappings = new Properties();
databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);
databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL);
databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);
databaseTypeMappings.setProperty("MariaDB", DATABASE_TYPE_MYSQL);
databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);
databaseTypeMappings.setProperty(PRODUCT_NAME_POSTGRES, DATABASE_TYPE_POSTGRES);
databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL);
databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2);
databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB);
return databaseTypeMappings;
return DbUtil.getDefaultDatabaseTypeMappings();
}

protected Map<Object, Object> beans;
Expand Down Expand Up @@ -498,46 +470,7 @@ protected void initDataSource() {
}

public void initDatabaseType() {
Connection connection = null;
try {
connection = dataSource.getConnection();
DatabaseMetaData databaseMetaData = connection.getMetaData();
String databaseProductName = databaseMetaData.getDatabaseProductName();
logger.debug("database product name: '{}'", databaseProductName);

// CRDB does not expose the version through the jdbc driver, so we need to fetch it through version().
if (PRODUCT_NAME_POSTGRES.equalsIgnoreCase(databaseProductName)) {
try (PreparedStatement preparedStatement = connection.prepareStatement("select version() as version;");
ResultSet resultSet = preparedStatement.executeQuery()) {
String version = null;
if (resultSet.next()) {
version = resultSet.getString("version");
}

if (StringUtils.isNotEmpty(version) && version.toLowerCase().startsWith(PRODUCT_NAME_CRDB.toLowerCase())) {
databaseProductName = PRODUCT_NAME_CRDB;
logger.info("CockroachDB version '{}' detected", version);
}
}
}

databaseType = databaseTypeMappings.getProperty(databaseProductName);
if (databaseType == null) {
throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'");
}
logger.debug("using database type: {}", databaseType);

} catch (SQLException e) {
throw new RuntimeException("Exception while initializing Database connection", e);
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
logger.error("Exception while closing the Database connection", e);
}
}
databaseType = DbUtil.determineDatabaseType(dataSource, logger, databaseTypeMappings);

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

if (usingRelationalDatabase) {
initDbSqlSessionFactory();
initSchemaManagerDatabaseConfigurationSessionFactory();
}

addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl::new));
Expand Down Expand Up @@ -811,6 +745,12 @@ public void initDbSqlSessionFactory() {
addSessionFactory(dbSqlSessionFactory);
}

protected void initSchemaManagerDatabaseConfigurationSessionFactory() {
if (!sessionFactories.containsKey(SchemaManagerDatabaseConfiguration.class)) {
addSessionFactory(new SchemaManagerDatabaseConfigurationSessionFactory());
}
}

public DbSqlSessionFactory createDbSqlSessionFactory() {
return new DbSqlSessionFactory(usePrefixId);
}
Expand Down
Loading

0 comments on commit 754287e

Please sign in to comment.