package liquibase.integration.commandline; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Constructor; import java.util.Properties; import liquibase.changelog.visitor.ChangeExecListener; import liquibase.database.Database; import liquibase.logging.LogFactory; import liquibase.logging.Logger; import liquibase.resource.ResourceAccessor; public final class ChangeExecListenerUtils { private ChangeExecListenerUtils() { } public static ChangeExecListener getChangeExecListener( Database database, ResourceAccessor resourceAccessor, String changeExecListenerClass, String changeExecListenerPropertiesFile) throws Exception { ChangeExecListener changeExecListener = null; if (changeExecListenerClass != null) { Logger logger = LogFactory.getInstance().getLog(); logger.debug("Setting ChangeExecListener: " + changeExecListenerClass); ClassLoader classLoader = resourceAccessor.toClassLoader(); Class<?> clazz = Class.forName(changeExecListenerClass, true, classLoader); Properties properties = loadProperties(changeExecListenerPropertiesFile); Constructor<?> cons = getConstructor(clazz, Database.class, Properties.class); if (cons != null) { logger.debug("Create " + clazz.getSimpleName() + "(Database, Properties)"); changeExecListener = (ChangeExecListener) cons.newInstance(database, properties); } else { cons = getConstructor(clazz, Properties.class, Database.class); if (cons != null) { logger.debug("Create " + clazz.getSimpleName() + "(Properties, Database)"); changeExecListener = (ChangeExecListener) cons.newInstance(properties, database); } else { cons = getConstructor(clazz, Database.class); if (cons != null) { logger.debug("Create " + clazz.getSimpleName() + "(Database)"); changeExecListener = (ChangeExecListener) cons.newInstance(database); } else { cons = getConstructor(clazz, Properties.class); if (cons != null) { logger.debug("Create " + clazz.getSimpleName() + "(Properties)"); changeExecListener = (ChangeExecListener) cons.newInstance(properties); } else { logger.debug("Create " + clazz.getSimpleName() + "()"); changeExecListener = (ChangeExecListener) clazz.newInstance(); } } } } } return changeExecListener; } private static Constructor<?> getConstructor(Class<?> clazz, Class<?> ... params) { try { return clazz.getConstructor(params); } catch (Exception e) { return null; } } private static Properties loadProperties(String propertiesFile) throws IOException { if (propertiesFile != null) { File file = new File(propertiesFile); if (file.exists()) { Properties properties = new Properties(); FileInputStream inputStream = new FileInputStream(propertiesFile); try { properties.load(inputStream); } finally { inputStream.close(); } return properties; } else { throw new FileNotFoundException(propertiesFile); } } else { return null; } } }