package liquibase.database.typeconversion; import liquibase.database.Database; import liquibase.database.core.CacheDatabase; import liquibase.database.core.DB2Database; import liquibase.database.core.DerbyDatabase; import liquibase.database.core.FirebirdDatabase; import liquibase.database.core.H2Database; import liquibase.database.core.HsqlDatabase; import liquibase.database.core.InformixDatabase; import liquibase.database.core.MSSQLDatabase; import liquibase.database.core.MaxDBDatabase; import liquibase.database.core.MySQLDatabase; import liquibase.database.core.OracleDatabase; import liquibase.database.core.PostgresDatabase; import liquibase.database.core.SQLiteDatabase; import liquibase.database.core.SybaseASADatabase; import liquibase.database.core.SybaseDatabase; import liquibase.database.typeconversion.core.CacheTypeConverter; import liquibase.database.typeconversion.core.DB2TypeConverter; import liquibase.database.typeconversion.core.DefaultTypeConverter; import liquibase.database.typeconversion.core.DerbyTypeConverter; import liquibase.database.typeconversion.core.FirebirdTypeConverter; import liquibase.database.typeconversion.core.H2TypeConverter; import liquibase.database.typeconversion.core.HsqlTypeConverter; import liquibase.database.typeconversion.core.InformixTypeConverter; import liquibase.database.typeconversion.core.MSSQLTypeConverter; import liquibase.database.typeconversion.core.MaxDBTypeConverter; import liquibase.database.typeconversion.core.MySQLTypeConverter; import liquibase.database.typeconversion.core.OracleTypeConverter; import liquibase.database.typeconversion.core.PostgresTypeConverter; import liquibase.database.typeconversion.core.SQLiteTypeConverter; import liquibase.database.typeconversion.core.SybaseASATypeConverter; import liquibase.database.typeconversion.core.SybaseTypeConverter; import liquibase.servicelocator.ServiceLocator; import liquibase.exception.UnexpectedLiquibaseException; import java.util.*; public class TypeConverterFactory { private static TypeConverterFactory instance; private Set<TypeConverter> allConverters; public static TypeConverterFactory getInstance() { if (instance == null) { instance = new TypeConverterFactory(); } return instance; } private TypeConverterFactory() { allConverters = new HashSet<TypeConverter>(); try { for (Class<? extends TypeConverter> converterClass : ServiceLocator.getInstance().findClasses(TypeConverter.class)) { register(converterClass.newInstance()); } } catch (Exception e) { throw new UnexpectedLiquibaseException(e); } } public TypeConverter findTypeConverter(Database database) { SortedSet<TypeConverter> converters = new TreeSet<TypeConverter>(new Comparator<TypeConverter>() { public int compare(TypeConverter o1, TypeConverter o2) { return Integer.valueOf(o1.getPriority()).compareTo(o2.getPriority()); } }); //noinspection unchecked for (TypeConverter converter : allConverters) { if (converter.supports(database)) { converters.add(converter); } } return converters.last(); } public void register(TypeConverter typeConverter) { allConverters.add(typeConverter); } public void register(Class<? extends TypeConverter> typeConverterClass) { try { allConverters.add(typeConverterClass.newInstance()); } catch (Exception e) { throw new UnexpectedLiquibaseException(e); } } }