Author: tchemit Date: 2010-12-27 13:16:41 +0100 (Mon, 27 Dec 2010) New Revision: 2171 Url: http://nuiton.org/repositories/revision/topia/2171 Log: introduce a resolver of migration class by version Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClass.java Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClass.java =================================================================== --- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClass.java 2010-12-27 10:08:51 UTC (rev 2170) +++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClass.java 2010-12-27 12:16:41 UTC (rev 2171) @@ -39,7 +39,7 @@ * <p/> * You must fill in the constructor the mapping for each version of * {@link #getAvailableVersions()} a matching migrator for version which - * extends {@link AbstractMigrationCallBackForVersion}. + * extends {@link MigrationCallBackForVersion}. * <p/> * Use the callback when you have a lot of version to migrate and the * {@link TopiaMigrationCallbackByMethod} begins to be messy. @@ -50,15 +50,16 @@ */ public abstract class TopiaMigrationCallbackByClass extends AbstractTopiaMigrationCallback { - protected Map<Version, Class<? extends AbstractMigrationCallBackForVersion>> versionMigrationMapping; + protected MigrationCallBackForVersionResolver callBackResolver; - protected TopiaMigrationCallbackByClass(Map<Version, Class<? extends AbstractMigrationCallBackForVersion>> versionMigrationMapping) { + protected TopiaMigrationCallbackByClass(MigrationCallBackForVersionResolver callBackResolver) { - this.versionMigrationMapping = versionMigrationMapping; + this.callBackResolver = callBackResolver; // check for each version of migration we have a migrator for (Version version : getAvailableVersions()) { - if (!this.versionMigrationMapping.containsKey(version)) { + Class<? extends MigrationCallBackForVersion> callBack = this.callBackResolver.getCallBack(version); + if (callBack == null) { throw new IllegalStateException("It misses a migration class for version " + version); } } @@ -69,10 +70,11 @@ TopiaContextImplementor tx, boolean showSql, boolean showProgression) throws Exception { - Class<? extends AbstractMigrationCallBackForVersion> migratorClass = versionMigrationMapping.get(version); - AbstractMigrationCallBackForVersion migrator = ObjectUtil.newInstance(migratorClass, Arrays.asList(this), true); + Class<? extends MigrationCallBackForVersion> migratorClass = callBackResolver.getCallBack(version); + MigrationCallBackForVersion migrator = ObjectUtil.newInstance(migratorClass, Arrays.asList(this), true); + String[] queries = migrator.prepareMigration(tx, showSql, showProgression); executeSQL(tx, showSql, showProgression, queries); @@ -80,19 +82,19 @@ } /** - * La classe de base pour chaque migration de version. + * Call back for a given version. * * @author tchemit <chemit@codelutin.com> * @since 2.5 */ - public abstract static class AbstractMigrationCallBackForVersion { + public abstract static class MigrationCallBackForVersion { protected final Version version; protected final TopiaMigrationCallbackByClass callBack; - public AbstractMigrationCallBackForVersion(Version version, - TopiaMigrationCallbackByClass callBack) { + public MigrationCallBackForVersion(Version version, + TopiaMigrationCallbackByClass callBack) { this.version = version; this.callBack = callBack; @@ -114,6 +116,48 @@ boolean showSql, boolean showProgression) throws TopiaException; + public void executeSQL(TopiaContextImplementor tx, + String... sqls) throws TopiaException { + callBack.executeSQL(tx, sqls); + } + public void executeSQL(TopiaContextImplementor tx, + boolean showSql, + boolean showProgression, + String... sqls) throws TopiaException { + callBack.executeSQL(tx, showSql, showProgression, sqls); + } + } + + /** + * Resolver to obtain the correct migration class for a given version. + * + * @since 2.5 + */ + public interface MigrationCallBackForVersionResolver { + + Class<? extends MigrationCallBackForVersion> getCallBack(Version version); + + } + + /** + * A simple call back resolver via a constant map. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.5 + */ + public static class MigrationCallBackForVersionResolverByMap implements MigrationCallBackForVersionResolver { + + protected final Map<Version, Class<? extends MigrationCallBackForVersion>> versionMigrationMapping; + + public MigrationCallBackForVersionResolverByMap(Map<Version, Class<? extends MigrationCallBackForVersion>> versionMigrationMapping) { + this.versionMigrationMapping = versionMigrationMapping; + } + + @Override + public Class<? extends MigrationCallBackForVersion> getCallBack(Version version) { + return versionMigrationMapping.get(version); + } + } } \ No newline at end of file