package org.jbpm.persistence.scripts.util; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.Comparator; import java.util.Properties; import org.jbpm.persistence.scripts.DatabaseType; import org.jbpm.persistence.scripts.PersistenceUnit; import org.jbpm.persistence.scripts.TestPersistenceContext; /** * Contains util methods that are used for testing SQL scripts. */ public final class TestsUtil { /** * Gets SQL scripts for selected database type. * @param folderWithDDLs Root folder containing SQL scripts for all database types. * @param databaseType Database type. * @param sortByName If true, resulting array of SQL script files will be sorted by filename using String * comparator. * @return Array of SQL script files. If there are no SQL script files found, returns empty array. */ public static File[] getDDLScriptFilesByDatabaseType(final File folderWithDDLs, final DatabaseType databaseType, final boolean sortByName) { final File folderWithScripts = new File(folderWithDDLs.getPath() + File.separator + databaseType.getScriptsFolderName()); if (folderWithScripts.exists()) { final File[] foundFiles = folderWithScripts.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".sql"); } }); if (foundFiles == null) { return new File[0]; } if (sortByName) { Arrays.sort(foundFiles, new Comparator<File>() { @Override public int compare(File o1, File o2) { return o1.getName().compareTo(o2.getName()); } }); } return foundFiles; } else { return new File[0]; } } /** * Gets database type based on dialect property specified in data source properties. * @param dataSourceProperties Data source properties. * @return Database type based on specified dialect property. If no dialect is specified, * returns H2 database type. */ public static DatabaseType getDatabaseType(final Properties dataSourceProperties) { final String hibernateDialect = dataSourceProperties.getProperty("dialect"); if (!"".equals(hibernateDialect)) { return getDatabaseTypeBySQLDialect(hibernateDialect); } else { return DatabaseType.H2; } } /** * Gets database type based on specified SQL dialect. * @param sqlDialect SQL dialect. * @return Database type based on specified SQL dialect. * If specified SQL dialect is not supported, throws IllegalArgumentException. */ public static DatabaseType getDatabaseTypeBySQLDialect(final String sqlDialect) { if (sqlDialect.contains("DB2Dialect")) { return DatabaseType.DB2; } else if (sqlDialect.contains("DerbyDialect")) { return DatabaseType.DERBY; } else if (sqlDialect.contains("H2Dialect")) { return DatabaseType.H2; } else if (sqlDialect.contains("HSQLDialect")) { return DatabaseType.HSQLDB; } else if (sqlDialect.contains("MySQL5Dialect")) { return DatabaseType.MYSQL5; } else if (sqlDialect.contains("MySQL5InnoDBDialect")) { return DatabaseType.MYSQLINNODB; } else if (sqlDialect.contains("Oracle")) { return DatabaseType.ORACLE; } else if (sqlDialect.contains("Postgre")) { return DatabaseType.POSTGRESQL; } else if (sqlDialect.contains("SQLServer2008Dialect") || sqlDialect.contains("SQLServer2012Dialect")) { return DatabaseType.SQLSERVER2008; } else if (sqlDialect.contains("SQLServerDialect") || sqlDialect.contains("SQLServer2005Dialect")) { return DatabaseType.SQLSERVER; } else { throw new IllegalArgumentException("SQL dialect type " + sqlDialect + " is not supported!"); } } public static byte[] hexStringToByteArray(final String hexString) { int len = hexString.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16)); } return data; } /** * Clears database schema. */ public static void clearSchema() { final TestPersistenceContext clearSchemaContext = new TestPersistenceContext(); clearSchemaContext.init(PersistenceUnit.CLEAR_SCHEMA); clearSchemaContext.clean(); } private TestsUtil() { // It makes no sense to create instances of util classes. } }