Author: tchemit Date: 2010-06-09 12:17:21 +0200 (Wed, 09 Jun 2010) New Revision: 1999 Url: http://nuiton.org/repositories/revision/topia/1999 Log: improvde desing delgate to concrete listeners in engine, TopiaMigrationSerivce has nothing to do with listeners Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/ManualMigrationEngine.java trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationService.java trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationServiceImpl.java Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/ManualMigrationEngine.java =================================================================== --- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/ManualMigrationEngine.java 2010-06-09 06:28:55 UTC (rev 1998) +++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/ManualMigrationEngine.java 2010-06-09 10:17:21 UTC (rev 1999) @@ -25,14 +25,26 @@ package org.nuiton.topia.migration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.hibernate.cfg.Configuration; +import org.hibernate.tool.hbm2ddl.SchemaExport; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaRuntimeException; import org.nuiton.topia.event.TopiaContextEvent; +import org.nuiton.topia.event.TopiaContextListener; import org.nuiton.topia.event.TopiaTransactionEvent; +import org.nuiton.topia.event.TopiaTransactionVetoable; +import org.nuiton.topia.framework.TopiaContextImpl; import org.nuiton.topia.framework.TopiaContextImplementor; +import org.nuiton.topia.framework.TopiaUtil; +import org.nuiton.topia.migration.ManualMigrationCallback.MigrationChoice; +import org.nuiton.util.Resource; +import org.nuiton.util.Version; +import org.nuiton.util.VersionUtil; +import org.nuiton.util.VersionUtil.VersionComparator; - import java.io.File; import java.net.URL; import java.net.URLClassLoader; @@ -43,114 +55,72 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.util.Version; -import org.nuiton.util.Resource; -import org.hibernate.cfg.Configuration; -import org.hibernate.tool.hbm2ddl.SchemaExport; import static org.nuiton.i18n.I18n._; -import org.nuiton.topia.framework.TopiaContextImpl; -import org.nuiton.topia.framework.TopiaUtil; -import org.nuiton.topia.migration.ManualMigrationCallback.MigrationChoice; -import org.nuiton.util.VersionUtil; -import org.nuiton.util.VersionUtil.VersionComparator; /** * TopiaMigrationServiceImpl.java - * + * <p/> * Classe principale du projet. - * + * * @author tchemit * @deprecated since 2.4, please use now the simplify service {@link TopiaMigrationEngine} */ @Deprecated public class ManualMigrationEngine //extends MigrationServiceImpl - implements TopiaMigrationService { + implements TopiaMigrationService , TopiaContextListener, TopiaTransactionVetoable { // log + private final static Log log = LogFactory.getLog(ManualMigrationEngine.class); - /** - * La version de référence - */ + + /** La version de référence */ static public final String MIGRATION_APPLICATION_VERSION = "topia.service.migration.version"; - /** - * L'emplacement de tous les mappings - */ + + /** L'emplacement de tous les mappings */ static public final String MIGRATION_MAPPING_DIRECTORY = "topia.service.migration.mappingdir"; - /** - * Les noms des modèles connus - */ + + /** Les noms des modèles connus */ static public final String MIGRATION_MODEL_NAME = "topia.service.migration.modelname"; - /** - * L'unique handler a utiliser - */ - static public final String MIGRATION_CALLBACK = "topia.service.migration.callback"; - /** - * Un drapeau pour indiquer si on doit lancer le service au demarrage - */ - static public final String MIGRATION_MIGRATE_ON_INIT = "topia.service.migration.no.migrate.on.init"; - /** - * Pour afficher les requetes sql executees - */ - static public final String MIGRATION_SHOW_SQL = "showSql"; - /** - * Pour afficher la progression des requetes sql executees - */ - static public final String MIGRATION_SHOW_PROGRESSION = "showProgression"; - /** - * Configuration hibernate ne mappant que l'entite version (initialise en pre-init) - */ + + /** Configuration hibernate ne mappant que l'entite version (initialise en pre-init) */ protected Configuration versionConfiguration; - /** - * Chemin du dossier contenant les schemas de toutes les versions (initialise en pre-init) - */ + + /** Chemin du dossier contenant les schemas de toutes les versions (initialise en pre-init) */ protected String mappingsDirectory; - /** - * ensemble des versions connues par le service - */ + + /** ensemble des versions connues par le service */ protected SortedSet<Version> versions; - /** - * Version courante de l'application (initialise en pre-init) - */ + + /** Version courante de l'application (initialise en pre-init) */ protected Version applicationVersion; - /** - * Un drapeau pour savoir si la table version existe en base (initialise en pre-init) - */ + + /** Un drapeau pour savoir si la table version existe en base (initialise en pre-init) */ protected boolean versionTableExist; - /** - * Version courante de la base (initialise en pre-init) - */ + + /** Version courante de la base (initialise en pre-init) */ protected Version dbVersion; - /** - * Drapeau pour savoir si la base est versionnée ou non - */ + + /** Drapeau pour savoir si la base est versionnée ou non */ protected boolean dbNotVersioned; - /** - * Un drapeau pour effectuer la migration au demarrage (initialise en pre-init) - */ + + /** Un drapeau pour effectuer la migration au demarrage (initialise en pre-init) */ protected boolean migrateOnInit; - /** - * CallbackHandler list (initialise en pre-init) - */ + + /** CallbackHandler list (initialise en pre-init) */ protected ManualMigrationCallback callback; - /** - * topia root context (initialise en pre-init) - */ + + /** topia root context (initialise en pre-init) */ protected TopiaContextImplementor rootContext; - /** - * Un drapeau pour savoir si le service a bien ete initialise (i.e a bien fini la methode preInit) - */ - protected boolean init = false; - /** - * Un drapeau pour afficher les requetes sql executees - */ - protected boolean showSql = false; - /** - * Un drapeau pour afficher la progression des requetes sql executees - */ - protected boolean showProgression= false; + /** Un drapeau pour savoir si le service a bien ete initialise (i.e a bien fini la methode preInit) */ + protected boolean init; + + /** Un drapeau pour afficher les requetes sql executees */ + protected boolean showSql; + + /** Un drapeau pour afficher la progression des requetes sql executees */ + protected boolean showProgression; + @Override public Class<?>[] getPersistenceClasses() { return new Class<?>[]{TMSVersionImpl.class}; @@ -158,7 +128,7 @@ @Override public String getServiceName() { - return TopiaMigrationService.SERVICE_NAME; + return SERVICE_NAME; } @Override @@ -349,8 +319,8 @@ if (log.isDebugEnabled()) { log.debug("Migrate schema start version = " + dbVersion + - " _ not versioned = " + dbNotVersioned + - " _ TMSVersion exists = " + versionTableExist); + " _ not versioned = " + dbNotVersioned + + " _ TMSVersion exists = " + versionTableExist); } if (versionTableExist && dbVersion.equals(applicationVersion)) { @@ -384,11 +354,11 @@ log.info(_("topia.migration.migrate.versions", versionsToApply)); // ask handler for migration MigrationChoice bMigrationWanted = callback.doMigration(rootContext, - dbVersion, - applicationVersion, - showSql, - showProgression, - versionsToApply); + dbVersion, + applicationVersion, + showSql, + showProgression, + versionsToApply); if (log.isDebugEnabled()) { log.debug("Handler choose : " + bMigrationWanted); @@ -428,7 +398,7 @@ if (log.isDebugEnabled()) { log.debug("Save version = " + version + - " _ table exists = " + versionTableExist); + " _ table exists = " + versionTableExist); } if (dbVersion == null) { @@ -502,7 +472,7 @@ * Recupere toutes les versions prises en charge par le service de migration. * * @return l'ensemble triee (par ordre croissant) de toutes les versions - * detectees a partir du repertoire des mappings pour le modele donne. + * detectees a partir du repertoire des mappings pour le modele donne. * @throws MigrationServiceException pour tout probleme */ protected SortedSet<Version> getVersions() throws MigrationServiceException { @@ -544,12 +514,11 @@ /** * Recupere depuis la base les états internes du service : - * + * <p/> * <ul> * <li>versionTableExist</li> * <li>dbVersion</li> * </ul> - * */ protected synchronized void detectDbVersion() { Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java =================================================================== --- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java 2010-06-09 06:28:55 UTC (rev 1998) +++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java 2010-06-09 10:17:21 UTC (rev 1999) @@ -34,7 +34,9 @@ import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaRuntimeException; import org.nuiton.topia.event.TopiaContextEvent; +import org.nuiton.topia.event.TopiaContextListener; import org.nuiton.topia.event.TopiaTransactionEvent; +import org.nuiton.topia.event.TopiaTransactionVetoable; import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.framework.TopiaUtil; import org.nuiton.util.Version; @@ -53,9 +55,9 @@ * Le moteur de migration proposé par topia. Il est basé sur un {@link TopiaMigrationCallback} * qui donne la version de l'application, les version de mises à jour disponibles. * <p/> - * Le call back offre aussi les commandes sql à passer poru chaque version de mise à jour. + * Le call back offre aussi les commandes sql à passer pour chaque version de mise à jour. * <p/> - * TODO Finir cette documentation + * FIXME Finir cette documentation * * @author tchemit * @version $Id$ @@ -66,18 +68,6 @@ /** logger */ private final static Log log = LogFactory.getLog(TopiaMigrationEngine.class); - /** L'unique handler a utiliser */ - static public final String MIGRATION_CALLBACK = "topia.service.migration.callback"; - - /** Un drapeau pour indiquer si on doit lancer le service au demarrage */ - static public final String MIGRATION_MIGRATE_ON_INIT = "topia.service.migration.no.migrate.on.init"; - - /** Pour afficher les requetes sql executees */ - static public final String MIGRATION_SHOW_SQL = "topia.service.migration.showSql"; - - /** Pour afficher la progression des requetes sql executees */ - static public final String MIGRATION_SHOW_PROGRESSION = "topia.service.migration.showProgression"; - /** Configuration hibernate ne mappant que l'entite version (initialise en pre-init) */ protected Configuration versionConfiguration; @@ -108,6 +98,16 @@ /** Un drapeau pour afficher la progression des requetes sql executees */ protected boolean showProgression; + /** delegate context listener. */ + protected TopiaContextListener contextListener; + + /** delgate transaction listener */ + protected TopiaTransactionVetoable transactionVetoable; + + //-------------------------------------------------------------------------- + //-- TopiaService implementation + //-------------------------------------------------------------------------- + @Override public Class<?>[] getPersistenceClasses() { return new Class<?>[]{TMSVersionImpl.class}; @@ -118,14 +118,6 @@ return SERVICE_NAME; } - protected String getSafeParameter(Properties config, String key) { - String value = config.getProperty(key, null); - if (StringUtils.isEmpty(value)) { - throw new IllegalStateException("'" + key + "' not set."); - } - return value; - } - @Override public boolean preInit(TopiaContextImplementor context) { rootContext = context; @@ -180,12 +172,15 @@ init = true; // add topia context listener - context.addTopiaContextListener(this); - context.addTopiaTransactionVetoable(this); + context.addTopiaContextListener(contextListener); + context.addTopiaTransactionVetoable(transactionVetoable); if (migrateOnInit) { try { + if (log.isDebugEnabled()) { + log.debug("Starts Migrate from preInit..."); + } doMigrateSchema(); } catch (MigrationServiceException e) { @@ -205,62 +200,6 @@ return true; } - @Override - public void preCreateSchema(TopiaContextEvent event) { - } - - @Override - public void preRestoreSchema(TopiaContextEvent event) { - } - - @Override - public void preUpdateSchema(TopiaContextEvent event) { - } - - @Override - public void postCreateSchema(TopiaContextEvent event) { - - if (log.isDebugEnabled()) { - log.debug("postCreateSchema event called : put version in database"); - } - - saveApplicationVersion(); - } - - @Override - public void postUpdateSchema(TopiaContextEvent event) { - if (log.isDebugEnabled()) { - log.debug("postUpdateSchema event called : put version in database"); - } - - saveApplicationVersion(); - } - - @Override - public void postRestoreSchema(TopiaContextEvent event) { - if (log.isDebugEnabled()) { - log.debug("postRestoreSchema event detected, redo, schema migration"); - } - try { - - doMigrateSchema(); - - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error("postRestoreSchema schema migration failed for reason " + e.getMessage(), e); - } - } - } - - @Override - public void beginTransaction(TopiaTransactionEvent event) { - - TopiaContextImplementor context = (TopiaContextImplementor) event.getSource(); - - // add topia context listener - context.addTopiaContextListener(this); - } - public void doMigrateSchema() throws MigrationServiceException { // migration boolean complete = migrateSchema(); @@ -449,6 +388,78 @@ dbVersion = version; } + + protected TopiaContextListener getContextListener() { + if (contextListener == null) { + contextListener = new TopiaContextListener() { + @Override + public void preCreateSchema(TopiaContextEvent event) { + } + + @Override + public void postCreateSchema(TopiaContextEvent event) { + if (log.isDebugEnabled()) { + log.debug("postCreateSchema event called : will save version in database"); + } + + saveApplicationVersion(); + } + + @Override + public void preUpdateSchema(TopiaContextEvent event) { + + } + + @Override + public void postUpdateSchema(TopiaContextEvent event) { + if (log.isDebugEnabled()) { + log.debug("postUpdateSchema event called : will save version in database"); + } + + saveApplicationVersion(); + } + + @Override + public void preRestoreSchema(TopiaContextEvent event) { + } + + @Override + public void postRestoreSchema(TopiaContextEvent event) { + if (log.isDebugEnabled()) { + log.debug("postRestoreSchema event detected, redo, schema migration"); + } + try { + + doMigrateSchema(); + + } catch (Exception e) { + if (log.isErrorEnabled()) { + log.error("postRestoreSchema schema migration failed for reason " + e.getMessage(), e); + } + } + } + }; + } + return contextListener; + } + + protected TopiaTransactionVetoable getTransactionVetoable() { + if (transactionVetoable == null) { + transactionVetoable = new TopiaTransactionVetoable() { + @Override + public void beginTransaction(TopiaTransactionEvent event) { + + TopiaContextImplementor context = (TopiaContextImplementor) event.getSource(); + + // add topia context listener + context.addTopiaContextListener(contextListener); + + } + }; + } + return transactionVetoable; + } + /** * Recupere depuis la base les états internes du service : * <p/> @@ -501,6 +512,14 @@ dbVersion = v; } + protected String getSafeParameter(Properties config, String key) { + String value = config.getProperty(key, null); + if (StringUtils.isEmpty(value)) { + throw new IllegalStateException("'" + key + "' not set."); + } + return value; + } + protected void checkInit() { if (!init) { throw new IllegalStateException("le service n'est pas initialisé!"); Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationService.java =================================================================== --- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationService.java 2010-06-09 06:28:55 UTC (rev 1998) +++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationService.java 2010-06-09 10:17:21 UTC (rev 1999) @@ -25,8 +25,6 @@ package org.nuiton.topia.migration; -import org.nuiton.topia.event.TopiaContextListener; -import org.nuiton.topia.event.TopiaTransactionVetoable; import org.nuiton.topia.framework.TopiaService; /** @@ -36,16 +34,28 @@ * @author Chevallereau Benjamin * @author Eon Sébastien * @author Trève Vincent - * @version $Revision$ - * - * Last update : $Date$ + * @author tchemit <chemit@codelutin.com> + * @version $Id$ */ -public interface TopiaMigrationService extends TopiaService, TopiaContextListener, TopiaTransactionVetoable { +public interface TopiaMigrationService extends TopiaService{ //}, TopiaContextListener, TopiaTransactionVetoable { - /** - * Nom du service - */ + /** Nom du service */ String SERVICE_NAME = "migration"; + /** Nom du service topia */ + String TOPIA_SERVICE_NAME = "topia.service.migration"; + + /** Pour spécifier dans la configuration le callback a utiliser */ + String MIGRATION_CALLBACK = "topia.service.migration.callback"; + + /** Un drapeau pour indiquer si on doit lancer le service au demarrage */ + String MIGRATION_MIGRATE_ON_INIT = "topia.service.migration.no.migrate.on.init"; + + /** Pour afficher les requetes sql executees */ + String MIGRATION_SHOW_SQL = "topia.service.migration.showSql"; + + /** Pour afficher la progression des requetes sql executees */ + String MIGRATION_SHOW_PROGRESSION = "topia.service.migration.showProgression"; + boolean migrateSchema() throws MigrationServiceException; } Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationServiceImpl.java =================================================================== --- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationServiceImpl.java 2010-06-09 06:28:55 UTC (rev 1998) +++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationServiceImpl.java 2010-06-09 10:17:21 UTC (rev 1999) @@ -32,7 +32,9 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.topia.TopiaRuntimeException; import org.nuiton.topia.event.TopiaContextEvent; +import org.nuiton.topia.event.TopiaContextListener; import org.nuiton.topia.event.TopiaTransactionEvent; +import org.nuiton.topia.event.TopiaTransactionVetoable; import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.migration.callback.MigrationCallbackHandler; import org.nuiton.util.Version; @@ -50,7 +52,7 @@ * @deprecated since 2.4, please use now the simplify service {@link TopiaMigrationEngine} */ @Deprecated -public class TopiaMigrationServiceImpl extends MigrationServiceImpl implements TopiaMigrationService { +public class TopiaMigrationServiceImpl extends MigrationServiceImpl implements TopiaMigrationService, TopiaContextListener, TopiaTransactionVetoable { // log private final static Log log = LogFactory.getLog(TopiaMigrationServiceImpl.class);