This is an automated email from the git hooks/post-receive script. New commit to branch feature/6417 in repository tutti. See http://git.codelutin.com/tutti.git commit cedb29990dda8fc9a371a902fafb8788c840624b Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jan 12 22:10:54 2015 +0100 introduction d'un context de preparation à la mise à jour du schema + renommage de getter dans TechnicalPersistenceService --- .../tutti/persistence/TuttiPersistenceImpl.java | 14 +- .../persistence/TuttiPersistenceNoDbImpl.java | 10 +- .../service/TechnicalPersistenceService.java | 16 +- .../service/TechnicalPersistenceServiceImpl.java | 14 +- .../service/UpdateSchemaContextSupport.java | 87 +++++++++ .../tutti/persistence/test/DatabaseFixtures.java | 10 - .../ifremer/tutti/service/PersistenceService.java | 14 +- .../tutti/ui/swing/action/ImportDbAction.java | 184 +++++++++--------- .../tutti/ui/swing/action/OpenDbAction.java | 206 +++++++++++---------- .../ui/swing/content/db/DbManagerUIHandler.java | 2 +- 10 files changed, 344 insertions(+), 213 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java index 471f592..3195d44 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java @@ -66,6 +66,7 @@ import fr.ifremer.tutti.persistence.service.ProtocolPersistenceService; import fr.ifremer.tutti.persistence.service.SpeciesBatchPersistenceService; import fr.ifremer.tutti.persistence.service.TechnicalPersistenceService; import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator; +import fr.ifremer.tutti.persistence.service.UpdateSchemaContextSupport; import fr.ifremer.tutti.persistence.service.referential.CaracteristicPersistenceService; import fr.ifremer.tutti.persistence.service.referential.GearPersistenceService; import fr.ifremer.tutti.persistence.service.referential.LocationPersistenceService; @@ -175,13 +176,18 @@ public class TuttiPersistenceImpl implements TuttiPersistence { } @Override - public Version getDbVersion() { - return getTechnicalPersistenceService().getDbVersion(); + public <U extends UpdateSchemaContextSupport> void prepareUpdateSchemaContext(U context) { + getTechnicalPersistenceService().prepareUpdateSchemaContext(context); } @Override - public Version getApplicationVersion() { - return getTechnicalPersistenceService().getApplicationVersion(); + public Version getSchemaVersion() { + return getTechnicalPersistenceService().getSchemaVersion(); + } + + @Override + public Version getSchemaVersionIfUpdate() { + return getTechnicalPersistenceService().getSchemaVersionIfUpdate(); } @Override diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java index 775b3a4..0e21672 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java @@ -49,6 +49,7 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.TuttiReferentialEntity; import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.persistence.service.UpdateSchemaContextSupport; import org.nuiton.util.version.Version; import java.io.File; @@ -81,12 +82,17 @@ public class TuttiPersistenceNoDbImpl implements TuttiPersistence { } @Override - public Version getDbVersion() { + public <U extends UpdateSchemaContextSupport> void prepareUpdateSchemaContext(U context) { throw notImplemented(); } @Override - public Version getApplicationVersion() { + public Version getSchemaVersion() { + throw notImplemented(); + } + + @Override + public Version getSchemaVersionIfUpdate() { throw notImplemented(); } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TechnicalPersistenceService.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TechnicalPersistenceService.java index 4202a42..341db16 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TechnicalPersistenceService.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TechnicalPersistenceService.java @@ -63,9 +63,21 @@ public interface TechnicalPersistenceService extends TuttiPersistenceServiceImpl @Transactional(readOnly = false) <V> V invoke(Callable<V> call); - Version getDbVersion(); + Version getSchemaVersion(); - Version getApplicationVersion(); + Version getSchemaVersionIfUpdate(); + + /** + * To init the update schema context. + * + * We are initialized it with current schema version, next schema version and use the call back if needed to + * interact with user. + * + * @param <U> type of context + * @param context context to fill. + * @since 3.12 + */ + <U extends UpdateSchemaContextSupport> void prepareUpdateSchemaContext(U context); @Transactional(readOnly = false) void updateSchema(); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TechnicalPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TechnicalPersistenceServiceImpl.java index c817a91..d0989ee 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TechnicalPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TechnicalPersistenceServiceImpl.java @@ -76,12 +76,7 @@ public class TechnicalPersistenceServiceImpl extends AbstractPersistenceService } @Override - public Version getDbVersion() { - Version version = getDbVersion0(); - return version; - } - - private Version getDbVersion0() { + public Version getSchemaVersion() { Version version; try { version = databaseSchemaDao.getSchemaVersion(); @@ -95,12 +90,17 @@ public class TechnicalPersistenceServiceImpl extends AbstractPersistenceService } @Override - public Version getApplicationVersion() { + public Version getSchemaVersionIfUpdate() { Version version = databaseSchemaDao.getSchemaVersionIfUpdate(); return Versions.valueOf(version.toString()); } @Override + public <U extends UpdateSchemaContextSupport> void prepareUpdateSchemaContext(U context) { + context.init(getSchemaVersion(), getSchemaVersionIfUpdate()); + } + + @Override public void updateSchema() { try { databaseSchemaDao.updateSchema(); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/UpdateSchemaContextSupport.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/UpdateSchemaContextSupport.java new file mode 100644 index 0000000..93f486b --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/UpdateSchemaContextSupport.java @@ -0,0 +1,87 @@ +package fr.ifremer.tutti.persistence.service; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.version.Version; + +/** + * Created on 1/12/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.12 + */ +public abstract class UpdateSchemaContextSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(UpdateSchemaContextSupport.class); + + private Version schemaVersion; + + private Version schemaVersionIfUpdate; + + private boolean willUpdate; + + public Version getSchemaVersion() { + return schemaVersion; + } + + public Version getSchemaVersionIfUpdate() { + return schemaVersionIfUpdate; + } + + public boolean isNeedUpdate() { + return schemaVersion.compareTo(schemaVersionIfUpdate) < 0; + } + + public boolean isSchemaVersionTooHigh() { + return schemaVersion.compareTo(schemaVersionIfUpdate) > 0; + } + + public boolean isWillUpdate() { + return willUpdate; + } + + protected abstract boolean askUserToMigrate(Version schemaVersion, Version schemaVersionIfUpdate); + + public void init(Version schemaVersion, Version schemaVersionIfUpdate) { + + this.schemaVersion = schemaVersion; + + if (log.isInfoEnabled()) { + log.info(String.format("Detected schema version: %s", schemaVersion)); + } + + this.schemaVersionIfUpdate = schemaVersionIfUpdate; + + if (log.isInfoEnabled()) { + log.info(String.format("Detected schema version if update: %s", schemaVersionIfUpdate)); + } + + if (isSchemaVersionTooHigh()) { + + if (log.isInfoEnabled()) { + log.info(String.format("Schema version %s is higher than incoming schema version %s, can't update!", schemaVersion, schemaVersionIfUpdate)); + } + + } else if (isNeedUpdate()) { + + if (log.isInfoEnabled()) { + log.info(String.format("Schema version %s is smaller than incoming schema version %s, ask to update", schemaVersion, schemaVersionIfUpdate)); + } + willUpdate = askUserToMigrate(schemaVersion, schemaVersionIfUpdate); + + if (log.isInfoEnabled()) { + log.info("Should we update? " + willUpdate); + } + + } else { + + if (log.isInfoEnabled()) { + log.info(String.format("Schema version %s is up-to-date, no need to update.", schemaVersion)); + } + + } + + } + +} diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/test/DatabaseFixtures.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/test/DatabaseFixtures.java index 954515d..94fde6c 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/test/DatabaseFixtures.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/test/DatabaseFixtures.java @@ -57,8 +57,6 @@ import fr.ifremer.tutti.persistence.service.referential.LocationPersistenceServi import fr.ifremer.tutti.persistence.service.referential.PersonPersistenceService; import fr.ifremer.tutti.persistence.service.referential.SpeciesPersistenceService; import org.junit.Assert; -import org.nuiton.util.version.Version; -import org.nuiton.util.version.Versions; import java.io.Serializable; import java.util.Calendar; @@ -74,14 +72,6 @@ import java.util.List; */ public class DatabaseFixtures { - public Version lastAdagioSchemaVersion() { - return Versions.valueOf("3.5.0"); - } - - public Version currentAdagioSchemaVersion() { - return Versions.valueOf("3.2.1.01"); - } - public String programCode() { // campaign CGFS return "CAM-CGFS"; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java index a44144f..a7ce38b 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java @@ -66,6 +66,7 @@ import fr.ifremer.tutti.persistence.entities.referential.TuttiReferentialEntity; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.persistence.entities.referential.Vessels; import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator; +import fr.ifremer.tutti.persistence.service.UpdateSchemaContextSupport; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -247,13 +248,18 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer } @Override - public Version getDbVersion() { - return driver.getDbVersion(); + public <U extends UpdateSchemaContextSupport> void prepareUpdateSchemaContext(U context) { + driver.prepareUpdateSchemaContext(context); } @Override - public Version getApplicationVersion() { - return driver.getApplicationVersion(); + public Version getSchemaVersion() { + return driver.getSchemaVersion(); + } + + @Override + public Version getSchemaVersionIfUpdate() { + return driver.getSchemaVersionIfUpdate(); } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportDbAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportDbAction.java index 83d61ef..83dd241 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportDbAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportDbAction.java @@ -25,6 +25,7 @@ package fr.ifremer.tutti.ui.swing.action; import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.TuttiPersistence; +import fr.ifremer.tutti.persistence.service.UpdateSchemaContextSupport; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; @@ -53,16 +54,10 @@ public class ImportDbAction extends AbstractMainUITuttiAction { protected String jdbcUrl; - protected boolean updateSchema; - - protected boolean closeDb; - - protected Version dbVersion; - - protected Version applicationVersion; - protected PersistenceService.ImportStructureType importStructureType; + private UpdateSchemaContext updateSchemaContext; + public ImportDbAction(MainUIHandler handler) { super(handler, true); setActionDescription(t("tutti.dbManager.action.importDb.tip")); @@ -72,13 +67,88 @@ public class ImportDbAction extends AbstractMainUITuttiAction { this.importFile = importFile; } + + public class UpdateSchemaContext extends UpdateSchemaContextSupport { + + private boolean closeDb; + + @Override + public void init(Version schemaVersion, Version schemaVersionIfUpdate) { + + super.init(schemaVersion, schemaVersionIfUpdate); + + if (isSchemaVersionTooHigh()) { + + // database schema version is higher than application one + String message = t("tutti.dbManager.action.upgradeDb.schema.too.high", schemaVersion, schemaVersionIfUpdate); + + String htmlMessage = String.format( + AbstractTuttiUIHandler.CONFIRMATION_FORMAT, + message, + t("tutti.dbManager.action.upgradeDb.schema.too.high.help")); + int i = JOptionPane.showConfirmDialog( + handler.getTopestUI(), + htmlMessage, + t("tutti.dbManager.title.schema.toupdate"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + boolean continueAction = i == JOptionPane.OK_OPTION; + + if (!continueAction) { + + //close db + closeDb = true; + } + } + } + + @Override + protected boolean askUserToMigrate(Version schemaVersion, Version schemaVersionIfUpdate) { + + // database schema need to migrate + // ask user to migrate or not (if not will close db) + + String message = t("tutti.dbManager.action.upgradeDb.schema.to.update.message", schemaVersion, schemaVersionIfUpdate); + + String htmlMessage = String.format( + AbstractTuttiUIHandler.CONFIRMATION_FORMAT, + message, + t("tutti.dbManager.action.upgradeDb.schema.to.update.message.help")); + int i = JOptionPane.showConfirmDialog( + handler.getTopestUI(), + htmlMessage, + t("tutti.dbManager.title.schema.toupdate"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + boolean continueAction = i == JOptionPane.OK_OPTION; + + if (continueAction) { + + // will migrate + continueAction = true; + } else { + + //close db + closeDb = true; + } + + + return continueAction; + + } + + public boolean isCloseDb() { + return closeDb; + } + + } + @Override public boolean prepareAction() throws Exception { importStructureType = null; jdbcUrl = null; - dbVersion = applicationVersion = null; - closeDb = updateSchema = false; + updateSchemaContext = null; boolean doAction = super.prepareAction(); @@ -171,88 +241,24 @@ public class ImportDbAction extends AbstractMainUITuttiAction { progressionModel.increments(t("tutti.importDb.step.checkSchemaVersion")); - TuttiPersistence persistenceService = - getContext().getPersistenceService(); + TuttiPersistence persistenceService = getContext().getPersistenceService(); - dbVersion = persistenceService.getDbVersion(); + updateSchemaContext = new UpdateSchemaContext(); + persistenceService.prepareUpdateSchemaContext(updateSchemaContext); + + Version schemaVersion = updateSchemaContext.getSchemaVersion(); if (log.isInfoEnabled()) { - log.info("Detected database version: " + dbVersion); + log.info("Detected database version: " + schemaVersion); } - applicationVersion = persistenceService.getApplicationVersion(); + Version schemaVersionIfUpdate = updateSchemaContext.getSchemaVersionIfUpdate(); if (log.isInfoEnabled()) { - log.info("Detected schema application version:" + applicationVersion); + log.info("Detected schema application version:" + schemaVersionIfUpdate); } - if (dbVersion == null) { - - // no database version filled (can not migrate schema) - String message = t("tutti.dbManager.action.upgradeDb.schema.version.not.found"); - displayWarningMessage(t("tutti.dbManager.title.schema.toupdate"), message); - - closeDb = true; - } else if (dbVersion.equals(applicationVersion)) { - - // database schema is up to date - if (log.isInfoEnabled()) { - log.info("Database schema is up-to-date at version: " + dbVersion); - } - } else if (dbVersion.compareTo(applicationVersion) < 0) { - - // database schema need to migrate - // ask user to migrate or not (if not will close db) - - String message = t("tutti.dbManager.action.upgradeDb.schema.to.update.message", dbVersion, applicationVersion); - - String htmlMessage = String.format( - AbstractTuttiUIHandler.CONFIRMATION_FORMAT, - message, - t("tutti.dbManager.action.upgradeDb.schema.to.update.message.help")); - int i = JOptionPane.showConfirmDialog( - handler.getTopestUI(), - htmlMessage, - t("tutti.dbManager.title.schema.toupdate"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE); - boolean continueAction = i == JOptionPane.OK_OPTION; - - if (continueAction) { - - // will migrate - updateSchema = true; - } else { - - //close db - closeDb = true; - } - - - } else { - - // database schema version is higher than application one - String message = t("tutti.dbManager.action.upgradeDb.schema.too.high", dbVersion, applicationVersion); - - String htmlMessage = String.format( - AbstractTuttiUIHandler.CONFIRMATION_FORMAT, - message, - t("tutti.dbManager.action.upgradeDb.schema.too.high.help")); - int i = JOptionPane.showConfirmDialog( - handler.getTopestUI(), - htmlMessage, - t("tutti.dbManager.title.schema.toupdate"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE); - boolean continueAction = i == JOptionPane.OK_OPTION; - - if (!continueAction) { - - //close db - closeDb = true; - } - } - if (closeDb) { + if (updateSchemaContext.isCloseDb()) { // ------------------------------------------------------------------ // // --- close db // @@ -264,7 +270,7 @@ public class ImportDbAction extends AbstractMainUITuttiAction { return; } - if (updateSchema) { + if (updateSchemaContext.isWillUpdate()) { // need to migrate schema progressionModel.adaptTotal(progressionModel.getTotal() + 2); @@ -273,22 +279,20 @@ public class ImportDbAction extends AbstractMainUITuttiAction { // --- update schema // // ------------------------------------------------------------------ // - String message = t("tutti.importDb.step.will.migrateSchema", - dbVersion, applicationVersion); + String message = t("tutti.importDb.step.will.migrateSchema", schemaVersion, schemaVersionIfUpdate); progressionModel.increments(message); sendMessage(message); getContext().getPersistenceService().updateSchema(); - sendMessage(t("tutti.flash.info.db.schema.updated", dbVersion, applicationVersion)); + sendMessage(t("tutti.flash.info.db.schema.updated", schemaVersion, schemaVersionIfUpdate)); } // ------------------------------------------------------------------ // // --- check db context // // ------------------------------------------------------------------ // - String message = t("tutti.importDb.step.check.dbContext", - dbVersion, applicationVersion); + String message = t("tutti.importDb.step.check.dbContext", schemaVersion, schemaVersionIfUpdate); progressionModel.increments(message); @@ -310,7 +314,7 @@ public class ImportDbAction extends AbstractMainUITuttiAction { super.postSuccessAction(); - if (closeDb) { + if (updateSchemaContext.isCloseDb()) { sendMessage(t("tutti.flash.info.db.imported.but.closed", jdbcUrl)); } else { sendMessage(t("tutti.flash.info.db.imported", jdbcUrl)); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/OpenDbAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/OpenDbAction.java index fed3dea..e5f003f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/OpenDbAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/OpenDbAction.java @@ -25,6 +25,7 @@ package fr.ifremer.tutti.ui.swing.action; import fr.ifremer.tutti.TuttiConfiguration; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.TuttiPersistence; +import fr.ifremer.tutti.persistence.service.UpdateSchemaContextSupport; import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiScreen; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; @@ -55,18 +56,10 @@ public class OpenDbAction extends AbstractChangeScreenAction { /** Logger. */ private static final Log log = LogFactory.getLog(OpenDbAction.class); - protected Version dbVersion; - - protected Version applicationVersion; - - protected File file; - - protected boolean updateSchema; + protected UpdateSchemaContext updateSchemaContext; protected boolean updateReferentiel; - protected boolean closeDb; - protected String jdbcUrl; protected ApplicationInfo updateDbVersion; @@ -85,10 +78,9 @@ public class OpenDbAction extends AbstractChangeScreenAction { boolean canContinue = super.prepareAction(); if (canContinue) { + jdbcUrl = null; - dbVersion = applicationVersion = null; - file = null; - closeDb = updateSchema = false; + updateSchemaContext = null; updateDbVersion = null; updateReferentiel &= getContext().checkUpdateDataReachable(false); @@ -102,8 +94,7 @@ public class OpenDbAction extends AbstractChangeScreenAction { Map<String, ApplicationInfo> dbVersions = up.getVersions(getConfig().getUpdateDataUrl(), getConfig().getDataDirectory()); - updateDbVersion = - dbVersions.get(TuttiDbUpdaterCallBack.DB_UPDATE_NAME); + updateDbVersion = dbVersions.get(TuttiDbUpdaterCallBack.DB_UPDATE_NAME); if (updateDbVersion != null && updateDbVersion.newVersion != null) { @@ -127,87 +118,40 @@ public class OpenDbAction extends AbstractChangeScreenAction { return canContinue; } - @Override - public void doAction() throws Exception { - - if (log.isDebugEnabled()) { - log.debug("Will open db..."); - } - - jdbcUrl = getConfig().getJdbcUrl(); - - // at the beginning 3 steps (open db + check version + check db context) - ProgressionModel progressionModel = new ProgressionModel(); - setProgressionModel(progressionModel); - progressionModel.setTotal(3 + (updateReferentiel ? 1 : 0)); - - // ------------------------------------------------------------------ // - // --- open db // - // ------------------------------------------------------------------ // - - progressionModel.increments(t("tutti.openDb.step.open", jdbcUrl)); - try { - getContext().setDbLoaded(true); - getContext().reloadPersistenceService(); - } catch (Exception e) { - - if (log.isErrorEnabled()) { - log.error("Could not open db", e); - } - // no more db - getContext().setDbLoaded(false); - getContext().reloadPersistenceService(); - - // could not load db - throw new ApplicationBusinessException(t("tutti.dbManager.action.openDb.couldNotOpen")); - } - - // ------------------------------------------------------------------ // - // --- check schema version // - // ------------------------------------------------------------------ // - - progressionModel.increments(t("tutti.openDb.step.checkSchemaVersion")); + public class UpdateSchemaContext extends UpdateSchemaContextSupport { - TuttiPersistence persistenceService = - getContext().getPersistenceService(); + private boolean closeDb; - dbVersion = persistenceService.getDbVersion(); + private File file; - if (log.isInfoEnabled()) { - log.info("Detected database version: " + dbVersion); - } - applicationVersion = persistenceService.getApplicationVersion(); + private final File dbBackupDirectory; - if (log.isInfoEnabled()) { - log.info("Detected schema application version:" + applicationVersion); + public UpdateSchemaContext(File dbBackupDirectory) { + this.dbBackupDirectory = dbBackupDirectory; } - TuttiConfiguration config = getConfig(); - if (dbVersion.equals(applicationVersion)) { - - // database schema is up to date - if (log.isInfoEnabled()) { - log.info("Database schema is up-to-date at version: " + dbVersion); - } - } else if (dbVersion.compareTo(applicationVersion) < 0) { + @Override + protected boolean askUserToMigrate(Version schemaVersion, Version schemaVersionIfUpdate) { // database schema need to migrate // ask user to migrate or not (if not will close db) // ask user where to backup db - String message = t("tutti.dbManager.action.upgradeDb.schema.to.update.message", dbVersion, applicationVersion); + String message = t("tutti.dbManager.action.upgradeDb.schema.to.update.message", schemaVersion, schemaVersionIfUpdate); String htmlMessage = String.format( AbstractTuttiUIHandler.CONFIRMATION_FORMAT, message, t("tutti.dbManager.action.upgradeDb.schema.to.update.message.help")); + int i = JOptionPane.showConfirmDialog( getHandler().getTopestUI(), htmlMessage, t("tutti.dbManager.title.schema.toupdate"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + boolean continueAction = i == JOptionPane.OK_OPTION; if (continueAction) { @@ -215,7 +159,7 @@ public class OpenDbAction extends AbstractChangeScreenAction { // ask user file where to backup db file = saveFile( - config.getDbBackupDirectory(), + dbBackupDirectory, "tutti-db-" + ExportDbAction.df.format(new Date()), "zip", t("tutti.dbManager.title.choose.dbBackupFile"), @@ -227,6 +171,7 @@ public class OpenDbAction extends AbstractChangeScreenAction { // won't migrate db closeDb = true; + continueAction = false; displayWarningMessage( t("tutti.dbManager.title.choose.dbBackupFile"), @@ -234,7 +179,7 @@ public class OpenDbAction extends AbstractChangeScreenAction { ); } else { - updateSchema = true; + continueAction = true; } } else { @@ -242,16 +187,99 @@ public class OpenDbAction extends AbstractChangeScreenAction { closeDb = true; } - } else { + return continueAction; - // database schema version is higher than application one - displayWarningMessage( - t("tutti.dbManager.title.schema.toupdate"), - t("tutti.dbManager.action.upgradeDb.schema.not.update.message", dbVersion, applicationVersion) - ); } - if (closeDb) { + @Override + public void init(Version schemaVersion, Version schemaVersionIfUpdate) { + + super.init(schemaVersion, schemaVersionIfUpdate); + + + if (isSchemaVersionTooHigh()) { + + // database schema version is higher than application one + displayWarningMessage( + t("tutti.dbManager.title.schema.toupdate"), + t("tutti.dbManager.action.upgradeDb.schema.not.update.message", schemaVersion, schemaVersionIfUpdate) + ); + + } + + } + + public boolean isCloseDb() { + return closeDb; + } + + public File getFile() { + return file; + } + } + + @Override + public void doAction() throws Exception { + + if (log.isDebugEnabled()) { + log.debug("Will open db..."); + } + + jdbcUrl = getConfig().getJdbcUrl(); + + // at the beginning 3 steps (open db + check version + check db context) + ProgressionModel progressionModel = new ProgressionModel(); + setProgressionModel(progressionModel); + progressionModel.setTotal(3 + (updateReferentiel ? 1 : 0)); + + // ------------------------------------------------------------------ // + // --- open db // + // ------------------------------------------------------------------ // + + progressionModel.increments(t("tutti.openDb.step.open", jdbcUrl)); + try { + getContext().setDbLoaded(true); + getContext().reloadPersistenceService(); + } catch (Exception e) { + + if (log.isErrorEnabled()) { + log.error("Could not open db", e); + } + // no more db + getContext().setDbLoaded(false); + getContext().reloadPersistenceService(); + + // could not load db + throw new ApplicationBusinessException(t("tutti.dbManager.action.openDb.couldNotOpen")); + } + + // ------------------------------------------------------------------ // + // --- check schema version // + // ------------------------------------------------------------------ // + + progressionModel.increments(t("tutti.openDb.step.checkSchemaVersion")); + + TuttiPersistence persistenceService = getContext().getPersistenceService(); + + TuttiConfiguration config = getConfig(); + + updateSchemaContext = new UpdateSchemaContext(config.getDbBackupDirectory()); + persistenceService.prepareUpdateSchemaContext(updateSchemaContext); + + Version schemaVersion = updateSchemaContext.getSchemaVersion(); + + if (log.isInfoEnabled()) { + log.info("Detected database version: " + schemaVersion); + } + Version schemaVersionIfUpdate = updateSchemaContext.getSchemaVersionIfUpdate(); + + if (log.isInfoEnabled()) { + log.info("Detected schema application version:" + schemaVersionIfUpdate); + } + + boolean updateSchema = updateSchemaContext.isWillUpdate(); + + if (updateSchemaContext.isCloseDb()) { // ------------------------------------------------------------------ // // --- close current db // @@ -277,7 +305,7 @@ public class OpenDbAction extends AbstractChangeScreenAction { ApplicationUIAction<ExportDbAction> backupAction = getActionFactory().createUIAction(getHandler(), ExportDbAction.class); backupAction.getLogicAction().setProgressionModel(getProgressionModel()); - backupAction.getLogicAction().setFile(file); + backupAction.getLogicAction().setFile(updateSchemaContext.getFile()); backupAction.getLogicAction().setNoUI(true); getActionEngine().runInternalAction(backupAction.getLogicAction()); @@ -285,8 +313,7 @@ public class OpenDbAction extends AbstractChangeScreenAction { // --- update schema // // ------------------------------------------------------------------ // - String message = t("tutti.openDb.step.will.migrateSchema", - dbVersion, applicationVersion); + String message = t("tutti.openDb.step.will.migrateSchema", schemaVersion, schemaVersionIfUpdate); progressionModel.increments(message); sendMessage(message); @@ -330,8 +357,7 @@ public class OpenDbAction extends AbstractChangeScreenAction { // --- check db context // // ------------------------------------------------------------------ // - String message = t("tutti.openDb.step.check.dbContext", - dbVersion, applicationVersion); + String message = t("tutti.openDb.step.check.dbContext", schemaVersion, schemaVersionIfUpdate); progressionModel.increments(message); @@ -351,15 +377,9 @@ public class OpenDbAction extends AbstractChangeScreenAction { // make sure title is reloaded handler.changeTitle(); - if (closeDb) { + if (updateSchemaContext.isCloseDb()) { sendMessage(t("tutti.flash.info.db.not.opened", jdbcUrl)); } else { - - if (updateSchema) { - - sendMessage(t("tutti.flash.info.db.schema.updated", dbVersion, applicationVersion)); - } - sendMessage(t("tutti.flash.info.db.opened", jdbcUrl)); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUIHandler.java index 689ba0c..5ab3367 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUIHandler.java @@ -80,7 +80,7 @@ public class DbManagerUIHandler extends AbstractTuttiUIHandler<TuttiUIContext, D if (dbLoaded) { - Version dbVersion = getContext().getPersistenceService().getDbVersion(); + Version dbVersion = getContext().getPersistenceService().getSchemaVersion(); // db loaded title = n("tutti.dbManager.info.db.loaded"); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.