r1223 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/content java/fr/ifremer/tutti/ui/swing/content/db resources/i18n
Author: tchemit Date: 2013-09-25 15:31:19 +0200 (Wed, 25 Sep 2013) New Revision: 1223 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1223 Log: fixes #3317: [TECH] - Mise ?\195?\160 jour de la base de donn?\195?\169es : pas de v?\195?\169rification au lancement Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDbUpdaterCallBack.java Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/CloseDbAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/InstallDbAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/OpenDbAction.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -102,15 +102,6 @@ // check application url is reachable boolean canUpdate = context.checkUpdateApplicationReachable(); -// try { -// TuttiUIUtil.tryToConnectToUpdateUrl( -// config.getUpdateApplicationUrl(), -// n_("tutti.error.update.could.not.reach.url") -// ); -// } catch (TuttiBusinessException e) { -// TuttiUIContext.getErrorHelper().showWarningDialog(e.getMessage()); -// canUpdate = false; -// } if (canUpdate) { // try to update jre - i18n - application - help and exit if so Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -29,24 +29,16 @@ import com.google.common.collect.Maps; import fr.ifremer.tutti.LabelAware; import fr.ifremer.tutti.TuttiIOUtil; -import fr.ifremer.tutti.TuttiTechnicalException; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.config.TuttiPersistenceConfig; -import fr.ifremer.tutti.persistence.service.synchro.ReferentialSynchronizeResult; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.referential.TuttiReferentialSynchronizeService; import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; import fr.ifremer.tutti.ui.swing.util.action.TuttiActionException; -import fr.ifremer.tutti.ui.swing.util.action.TuttiActionUI; -import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.updater.ApplicationInfo; -import org.nuiton.updater.ApplicationUpdater; import org.nuiton.updater.ApplicationUpdaterCallback; import java.io.File; -import java.io.IOException; import java.util.List; import java.util.Map; @@ -54,7 +46,7 @@ import static org.nuiton.i18n.I18n.n_; /** - * CallBack to update jre, application, i18n or db. + * CallBack to update jre, application, i18n. * * @author tchemit <chemit@codelutin.com> * @since 1.0 @@ -69,8 +61,7 @@ JRE(n_("tutti.update.jre")), TUTTI(n_("tutti.update.tutti")), I18N(n_("tutti.update.i18n")), - HELP(n_("tutti.update.help")), - DB(n_("tutti.update.db")); + HELP(n_("tutti.update.help")); private final String i18nKey; @@ -92,10 +83,6 @@ protected boolean applicationUpdated; - protected boolean dbInstalled; - - protected boolean dbUpdated; - protected final AbstractTuttiAction action; public TuttiApplicationUpdaterCallBack(AbstractTuttiAction action, @@ -113,14 +100,6 @@ return applicationUpdated; } - public boolean isDbUpdated() { - return dbUpdated; - } - - public boolean isDbInstalled() { - return dbInstalled; - } - @Override public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) { Map<String, ApplicationInfo> result = Maps.newHashMap(); @@ -129,48 +108,13 @@ ApplicationInfo info = getInfo(type, appToUpdate); if (info != null) { result.put(info.name, info); - if (UpdateType.DB.equals(type)) { - // add auth - info.setAuthentication( - "t" + "u" + "t" + "t" + "i" + "d" + "b", - new char[]{'3', 'R', 'A', 'C', 'e', 'v', '2', 'N', 'w', '8', 'u', 'E', 'D', 'E', 'v', 's', 'y', '0', 'v', 'J'} - ); - } } } - if (types.contains(UpdateType.DB)) { - - ApplicationInfo info = getInfo(UpdateType.DB, result); - - if (info == null) { - dbInstalled = false; - dbUpdated = false; - } else { - if (context.isDbExist()) { - - // when db exists always an update - dbUpdated = true; - } else { - - // when no db, then always install - dbInstalled = true; - } - } - } return result; } @Override public void startUpdate(ApplicationInfo info) { - if (UpdateType.DB.name().toLowerCase().equals(info.name)) { - - if (dbInstalled) { - - progressionModel.setMessage(_("tutti.applicationUpdater.startUpdate.db.installation", info.newVersion)); - } else if (dbUpdated) { - progressionModel.setMessage(_("tutti.applicationUpdater.startUpdate.db.update", info.newVersion)); - } - } if (UpdateType.JRE.name().toLowerCase().equals(info.name)) { progressionModel.setMessage(_("tutti.applicationUpdater.startUpdate.jre", info.newVersion)); } @@ -198,8 +142,6 @@ boolean doRestart = updateJRE || updateTutti || updateI18n || updateHelp; - updateDoneDb(appToUpdate, appUpdateError); - if (doRestart) { applicationUpdated = true; @@ -284,6 +226,13 @@ i18nDirectory, _("tutti.applicationUpdater.updateDone.deleteDirectory.i18n.error", i18nDirectory) ); + + // must remove db cache directory + File cacheDirectory = context.getConfig().getServiceConfig().getPersistenceConfig().getCacheDirectory(); + TuttiIOUtil.forceDeleteOnExit( + cacheDirectory, + _("tutti.applicationUpdater.updateDone.deleteDirectory.caches.error", i18nDirectory) + ); } } return doRestart; @@ -339,56 +288,6 @@ return doRestart; } - protected void updateDoneDb(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - Exception error = getError(UpdateType.DB, appUpdateError); - if (error != null) { - - // something bad while updating db - if (log.isErrorEnabled()) { - log.error("Could not update db", error); - } - throw new TuttiActionException(action, error); - } else { - ApplicationInfo info = getInfo(UpdateType.DB, appToUpdate); - if (info != null) { - - if (log.isInfoEnabled()) { - log.info(String.format( - "A db update was downloaded (oldVersion: %s, newVersion: %s), will process it.", - info.oldVersion, info.newVersion)); - } - - // before install or update, regenerate db configuration files - - TuttiPersistenceConfig persistenceConfig = regenerateDbConf(); - - persistenceConfig.generateExternalDbFiles(true); - - if (dbInstalled) { - - // first database, just copy it to correct directory - - prepareFirstDatabase(info); - } else if (dbUpdated) { - - // launch a referential synchronize operation - synchronizetDatabase(info); - } - } - } - } - - protected TuttiPersistenceConfig regenerateDbConf() { - - TuttiPersistenceConfig persistenceConfig = - context.getConfig().getServiceConfig().getPersistenceConfig(); - - context.showInformationMessage( - "Regénérer les fichiers de configuration de la base"); - return persistenceConfig; - } - protected ApplicationInfo getInfo(UpdateType type, Map<String, ApplicationInfo> appToUpdate) { return appToUpdate.get(type.name().toLowerCase()); @@ -407,67 +306,4 @@ File result = sources[0]; return result; } - - protected void prepareFirstDatabase(ApplicationInfo info) { - if (log.isInfoEnabled()) { - log.info("First time database was downloaded at version: " + info.newVersion); - } - File source = getDbDirectory(info); - File target = context.getConfig().getServiceConfig().getPersistenceConfig().getDbDirectory(); - if (log.isInfoEnabled()) { - log.info("Copy from " + source + " to " + target); - } - try { - FileUtils.copyDirectory(source, target); - } catch (IOException e) { - throw new TuttiTechnicalException(_("tutti.applicationUpdater.prepareFirstDB.copyDirectory.error", source, target), e); - } - try { - FileUtils.deleteDirectory(source.getParentFile()); - } catch (IOException e) { - throw new TuttiTechnicalException(_("tutti.applicationUpdater.prepareFirstDB.deleteDirectory.error", target), e); - } - } - - protected void synchronizetDatabase(ApplicationInfo info) { - if (log.isInfoEnabled()) { - log.info(String.format("A database update was downloaded (oldVersion: %s, newVersion: %s), will launch a referential synchronize operation ", info.oldVersion, info.newVersion)); - } - TuttiReferentialSynchronizeService service = context.getTuttiReferentialSynchronizeService(); - ReferentialSynchronizeResult result = new ReferentialSynchronizeResult(); - File dbDirectory = getDbDirectory(info); - - TuttiActionUI actionUI = context.getActionUI(); - actionUI.getModel().setProgressionModel(result.getProgressionModel()); - service.prepare(dbDirectory, result); - - if (!result.isSuccess()) { - throw new TuttiTechnicalException(_("tutti.applicationUpdater.synchroDB.prepare.error"), result.getError()); - } - - service.synchronize(dbDirectory, result); - - if (!result.isSuccess()) { - throw new TuttiTechnicalException(_("tutti.applicationUpdater.synchroDB.synchro.error"), result.getError()); - } - - // reset cache - if (log.isInfoEnabled()) { - log.info("Reset all caches."); - } - PersistenceService persistence = context.getPersistenceService(); - persistence.clearAllCaches(); - - // replace the version.appup file content - File target = context.getConfig().getServiceConfig().getPersistenceConfig().getDbDirectory(); - File versionFile = ApplicationUpdater.getVersionFile(target); - if (log.isInfoEnabled()) { - log.info("Replace content of file " + versionFile + " with " + info.newVersion); - } - try { - ApplicationUpdater.storeVersionFile(target, info.newVersion); - } catch (IOException e) { - throw new TuttiTechnicalException(_("tutti.applicationUpdater.synchroDB.writeVersion.error", versionFile)); - } - } } Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDbUpdaterCallBack.java (from rev 1217, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDbUpdaterCallBack.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDbUpdaterCallBack.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -0,0 +1,273 @@ +package fr.ifremer.tutti.ui.swing; + +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; +import fr.ifremer.tutti.TuttiTechnicalException; +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.persistence.config.TuttiPersistenceConfig; +import fr.ifremer.tutti.persistence.service.synchro.ReferentialSynchronizeResult; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.referential.TuttiReferentialSynchronizeService; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionException; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionUI; +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; +import org.nuiton.updater.ApplicationUpdater; +import org.nuiton.updater.ApplicationUpdaterCallback; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +import static org.nuiton.i18n.I18n._; +import static org.nuiton.i18n.I18n.n_; + +/** + * CallBack to update db. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.6 + */ +public class TuttiDbUpdaterCallBack implements ApplicationUpdaterCallback { + + /** Logger. */ + private static final Log log = + LogFactory.getLog(TuttiDbUpdaterCallBack.class); + + public static final String DB_UPDATE_NAME = "db"; + + static { + n_("tutti.update.db"); + } + + protected final TuttiUIContext context; + + protected ProgressionModel progressionModel; + + protected boolean dbInstalled; + + protected boolean dbUpdated; + + protected final AbstractTuttiAction action; + + public TuttiDbUpdaterCallBack(AbstractTuttiAction action, + ProgressionModel progressionModel) { + this.action = action; + this.context = action.getContext(); + this.progressionModel = progressionModel; + } + + public boolean isDbUpdated() { + return dbUpdated; + } + + public boolean isDbInstalled() { + return dbInstalled; + } + + @Override + public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) { + Map<String, ApplicationInfo> result = Maps.newHashMap(); + + ApplicationInfo info = appToUpdate.get(DB_UPDATE_NAME); + if (info == null) { + dbInstalled = false; + dbUpdated = false; + } else { + result.put(info.name, info); + + // add auth + info.setAuthentication( + "t" + "u" + "t" + "t" + "i" + "d" + "b", + new char[]{'3', 'R', 'A', 'C', 'e', 'v', '2', 'N', 'w', '8', 'u', 'E', 'D', 'E', 'v', 's', 'y', '0', 'v', 'J'} + ); + + if (context.isDbExist()) { + + // when db exists always an update + dbUpdated = true; + } else { + + // when no db, then always install + dbInstalled = true; + } + } + + return result; + } + + @Override + public void startUpdate(ApplicationInfo info) { + + if (dbInstalled) { + progressionModel.setMessage(_("tutti.applicationUpdater.startUpdate.db.installation", info.newVersion)); + } else if (dbUpdated) { + progressionModel.setMessage(_("tutti.applicationUpdater.startUpdate.db.update", info.newVersion)); + } + } + + @Override + public void updateDone(Map<String, ApplicationInfo> appToUpdate, + Map<String, Exception> appUpdateError) { + + updateDoneDb(appToUpdate, appUpdateError); + } + + @Override + public void aborted(String propertiesURL, Exception eee) { + if (log.isErrorEnabled()) { + log.error("Could not update from " + propertiesURL, eee); + } + throw TuttiActionException.propagateError(action, eee); + } + + + protected void updateDoneDb(Map<String, ApplicationInfo> appToUpdate, + Map<String, Exception> appUpdateError) { + Exception error = appUpdateError.get(DB_UPDATE_NAME); + if (error != null) { + + // something bad while updating db + if (log.isErrorEnabled()) { + log.error("Could not update db", error); + } + throw new TuttiActionException(action, error); + } else { + ApplicationInfo info = appToUpdate.get(DB_UPDATE_NAME); + if (info != null) { + + if (log.isInfoEnabled()) { + log.info(String.format( + "A db update was downloaded (oldVersion: %s, newVersion: %s), will process it.", + info.oldVersion, info.newVersion)); + } + + // before install or update, regenerate db configuration files + + TuttiPersistenceConfig persistenceConfig = regenerateDbConf(); + + persistenceConfig.generateExternalDbFiles(true); + + if (dbInstalled) { + + // first database, just copy it to correct directory + + prepareFirstDatabase(info); + } else if (dbUpdated) { + + // launch a referential synchronize operation + synchronizetDatabase(info); + } + } + } + } + + protected TuttiPersistenceConfig regenerateDbConf() { + + TuttiPersistenceConfig persistenceConfig = + context.getConfig().getServiceConfig().getPersistenceConfig(); + + context.showInformationMessage( + "Regénérer les fichiers de configuration de la base"); + return persistenceConfig; + } + + protected File getDbDirectory(ApplicationInfo info) { + File[] sources = info.destDir.listFiles(); + Preconditions.checkState( + sources != null && sources.length == 1, + "Downloaded db should contains one directory at " + info.destDir); + File result = sources[0]; + return result; + } + + protected void prepareFirstDatabase(ApplicationInfo info) { + if (log.isInfoEnabled()) { + log.info("First time database was downloaded at version: " + info.newVersion); + } + File source = getDbDirectory(info); + File target = context.getConfig().getServiceConfig().getPersistenceConfig().getDbDirectory(); + if (log.isInfoEnabled()) { + log.info("Copy from " + source + " to " + target); + } + try { + FileUtils.copyDirectory(source, target); + } catch (IOException e) { + throw new TuttiTechnicalException(_("tutti.applicationUpdater.prepareFirstDB.copyDirectory.error", source, target), e); + } + try { + FileUtils.deleteDirectory(source.getParentFile()); + } catch (IOException e) { + throw new TuttiTechnicalException(_("tutti.applicationUpdater.prepareFirstDB.deleteDirectory.error", target), e); + } + } + + protected void synchronizetDatabase(ApplicationInfo info) { + if (log.isInfoEnabled()) { + log.info(String.format("A database update was downloaded (oldVersion: %s, newVersion: %s), will launch a referential synchronize operation ", info.oldVersion, info.newVersion)); + } + TuttiReferentialSynchronizeService service = context.getTuttiReferentialSynchronizeService(); + ReferentialSynchronizeResult result = new ReferentialSynchronizeResult(); + File dbDirectory = getDbDirectory(info); + + TuttiActionUI actionUI = context.getActionUI(); + actionUI.getModel().setProgressionModel(result.getProgressionModel()); + service.prepare(dbDirectory, result); + + if (!result.isSuccess()) { + throw new TuttiTechnicalException(_("tutti.applicationUpdater.synchroDB.prepare.error"), result.getError()); + } + + service.synchronize(dbDirectory, result); + + if (!result.isSuccess()) { + throw new TuttiTechnicalException(_("tutti.applicationUpdater.synchroDB.synchro.error"), result.getError()); + } + + // reset cache + if (log.isInfoEnabled()) { + log.info("Reset all caches."); + } + PersistenceService persistence = context.getPersistenceService(); + persistence.clearAllCaches(); + + // replace the version.appup file content + File target = context.getConfig().getServiceConfig().getPersistenceConfig().getDbDirectory(); + File versionFile = ApplicationUpdater.getVersionFile(target); + if (log.isInfoEnabled()) { + log.info("Replace content of file " + versionFile + " with " + info.newVersion); + } + try { + ApplicationUpdater.storeVersionFile(target, info.newVersion); + } catch (IOException e) { + throw new TuttiTechnicalException(_("tutti.applicationUpdater.synchroDB.writeVersion.error", versionFile)); + } + } +} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -39,6 +39,7 @@ import fr.ifremer.tutti.ui.swing.content.cruise.EditCruiseUIHandler; import fr.ifremer.tutti.ui.swing.content.cruise.ValidateCruiseUI; import fr.ifremer.tutti.ui.swing.content.db.DbManagerUI; +import fr.ifremer.tutti.ui.swing.content.db.DbManagerUIHandler; import fr.ifremer.tutti.ui.swing.content.db.OpenDbAction; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUI; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; @@ -102,6 +103,15 @@ this.persistenceService = null; } + public void reloadDbManagerText() { + + AbstractTuttiUIHandler currentHandler = getCurrentHandler(); + if (currentHandler instanceof DbManagerUIHandler) { + DbManagerUIHandler dbManagerUIHandler = (DbManagerUIHandler) currentHandler; + dbManagerUIHandler.updateMessage(); + } + } + //------------------------------------------------------------------------// //-- AbstractTuttiUIHandler methods --// //------------------------------------------------------------------------// @@ -215,6 +225,7 @@ TuttiUIAction<OpenDbAction> uiAction = TuttiActionHelper.createUIAction(this, OpenDbAction.class); OpenDbAction logicAction = uiAction.getLogicAction(); logicAction.setSkipCheckCurrentScreen(true); + logicAction.setUpdateReferentiel(true); uiAction.actionPerformed(null); } else { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -28,6 +28,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; @@ -184,12 +185,9 @@ protected void addUpdate(Map<String, ApplicationInfo> source, Map<String, ApplicationInfo> target, - TuttiApplicationUpdaterCallBack.UpdateType... types) { - for (TuttiApplicationUpdaterCallBack.UpdateType type : types) { - String appName = type.name().toLowerCase(); - ApplicationInfo info = source.get(appName); - target.put(appName, info); - } + String type) { + ApplicationInfo info = source.get(type.toLowerCase()); + target.put(type, info); } protected void addUpdateTab(TuttiApplicationConfig config) { @@ -207,11 +205,14 @@ // create final update map final Map<String, ApplicationInfo> versions = Maps.newTreeMap(); - addUpdate(applicationVersions, versions, - UpdateApplicationAction.ALL_APPLICATION_TYPES); - addUpdate(dbVersions, versions, - TuttiApplicationUpdaterCallBack.UpdateType.DB); + addUpdate(applicationVersions, versions, TuttiApplicationUpdaterCallBack.UpdateType.JRE.name()); + addUpdate(applicationVersions, versions, TuttiApplicationUpdaterCallBack.UpdateType.TUTTI.name()); + addUpdate(applicationVersions, versions, TuttiApplicationUpdaterCallBack.UpdateType.I18N.name()); + addUpdate(applicationVersions, versions, TuttiApplicationUpdaterCallBack.UpdateType.HELP.name()); + + addUpdate(dbVersions, versions, TuttiDbUpdaterCallBack.DB_UPDATE_NAME); + JScrollPane updatePane = new JScrollPane(); JEditorPane updateArea = new JEditorPane(); updateArea.setContentType("text/html"); @@ -222,12 +223,13 @@ updateArea.setBorder(null); List<String> params = Lists.newArrayList(); - for (TuttiApplicationUpdaterCallBack.UpdateType type : TuttiApplicationUpdaterCallBack.UpdateType.values()) { - String appName = type.name().toLowerCase(); - ApplicationInfo info = versions.get(appName); + for (Map.Entry<String, ApplicationInfo> entry : versions.entrySet()) { + String appName = entry.getKey(); + ApplicationInfo info = entry.getValue(); String oldVersion = info.oldVersion; String newVersion = info.newVersion; - String appLabel = type.getLabel(); + String i18nKey = "tutti.update." + appName.toLowerCase(); + String appLabel = _(i18nKey); if (log.isInfoEnabled()) { log.info(String.format( @@ -243,6 +245,7 @@ params.add(_("tutti.about.update.app.up.detail", appLabel, oldVersion, newVersion, appName)); } } + String updateText = _("tutti.about.update.content", urlApplication, urlDb, Joiner.on("\n").join(params)); updateArea.setText(updateText); updatePane.getViewport().add(updateArea); @@ -255,33 +258,33 @@ TuttiUIUtil.openLink(url); } else { String appType = e.getDescription(); - TuttiApplicationUpdaterCallBack.UpdateType updateType = - TuttiApplicationUpdaterCallBack.UpdateType.valueOf(appType.toUpperCase()); + if (log.isInfoEnabled()) { - log.info("Open url: " + updateType); + log.info("Open url: " + appType); } AbstractTuttiAction action; - switch (updateType) { - case DB: { - UpdateDbAction logicAction = TuttiActionHelper.createLogicAction(getHandler(), UpdateDbAction.class); - action = logicAction; - if (!getContext().isDbExist()) { + if (TuttiDbUpdaterCallBack.DB_UPDATE_NAME.equals(appType)) { + UpdateDbAction logicAction = TuttiActionHelper.createLogicAction(getHandler(), UpdateDbAction.class); + action = logicAction; + if (!getContext().isDbExist()) { - // install db - action.setActionDescription( - _("tutti.dbManager.action.installDb.tip")); - } + // install db + action.setActionDescription( + _("tutti.dbManager.action.installDb.tip")); } - break; - default: { - UpdateApplicationAction logicAction = TuttiActionHelper.createLogicAction(getHandler(), UpdateApplicationAction.class); - logicAction.setTypes(updateType); - logicAction.setActionDescription(_("tutti.main.action.updateSpecificApplication.tip", updateType.getLabel())); - action = logicAction; - } + } else { + + TuttiApplicationUpdaterCallBack.UpdateType updateType = + TuttiApplicationUpdaterCallBack.UpdateType.valueOf(appType.toUpperCase()); + + UpdateApplicationAction logicAction = TuttiActionHelper.createLogicAction(getHandler(), UpdateApplicationAction.class); + logicAction.setTypes(updateType); + logicAction.setActionDescription(_("tutti.main.action.updateSpecificApplication.tip", updateType.getLabel())); + action = logicAction; } + // close this dialog TuttiActionHelper.runAction(about.getClose()); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -51,17 +51,10 @@ private static final Log log = LogFactory.getLog(UpdateApplicationAction.class); - public static final TuttiApplicationUpdaterCallBack.UpdateType[] ALL_APPLICATION_TYPES = new TuttiApplicationUpdaterCallBack.UpdateType[]{ - TuttiApplicationUpdaterCallBack.UpdateType.JRE, - TuttiApplicationUpdaterCallBack.UpdateType.I18N, - TuttiApplicationUpdaterCallBack.UpdateType.TUTTI, - TuttiApplicationUpdaterCallBack.UpdateType.HELP - }; - public UpdateApplicationAction(MainUIHandler handler) { super(handler, true); setActionDescription(_("tutti.main.action.updateApplication.tip")); - types = ALL_APPLICATION_TYPES; + types = TuttiApplicationUpdaterCallBack.UpdateType.values(); } protected TuttiApplicationUpdaterCallBack.UpdateType[] types; @@ -76,18 +69,6 @@ // check application url is reachable TuttiUIContext context = getContext(); doAction = context.checkUpdateApplicationReachable(); -// TuttiApplicationConfig config = context.getConfig(); -// String url = config.getUpdateApplicationUrl(); -// -// try { -// TuttiUIUtil.tryToConnectToUpdateUrl( -// url, -// n_("tutti.error.update.could.not.reach.url") -// ); -// } catch (TuttiBusinessException e) { -// TuttiUIContext.getErrorHelper().showWarningDialog(e.getMessage()); -// doAction = false; -// } } return doAction; } @@ -95,7 +76,7 @@ @Override public void releaseAction() { super.releaseAction(); - types = ALL_APPLICATION_TYPES; + types = TuttiApplicationUpdaterCallBack.UpdateType.values(); } @Override Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -25,16 +25,18 @@ */ import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; -import fr.ifremer.tutti.ui.swing.content.db.OpenDbAction; -import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; import org.nuiton.updater.ApplicationUpdater; +import javax.swing.JOptionPane; import java.io.File; +import java.util.Map; import static org.nuiton.i18n.I18n._; @@ -50,6 +52,8 @@ private static final Log log = LogFactory.getLog(UpdateDbAction.class); + protected ApplicationInfo updateDbVersion; + public UpdateDbAction(MainUIHandler handler) { super(handler, true); setActionDescription(_("tutti.dbManager.action.upgradeDb.tip")); @@ -59,24 +63,42 @@ public boolean prepareAction() throws Exception { boolean doAction = super.prepareAction(); + updateDbVersion = null; + if (doAction) { // check db url is reachable - TuttiUIContext context = getContext(); - doAction = context.checkUpdateDbReachable(); -// TuttiApplicationConfig config = context.getConfig(); -// String url = config.getUpdateDbUrl(); -// -// try { -// TuttiUIUtil.tryToConnectToUpdateUrl( -// url, -// n_("tutti.error.update.could.not.reach.url") -// ); -// } catch (TuttiBusinessException e) { -// TuttiUIContext.getErrorHelper().showWarningDialog(e.getMessage()); -// doAction = false; -// } + doAction = getContext().checkUpdateDbReachable(); } + if (doAction) { + + // get the next db version + ApplicationUpdater up = new ApplicationUpdater(); + + // get db updates + Map<String, ApplicationInfo> dbVersions = + up.getVersions(getConfig().getUpdateDbUrl(), + getConfig().getDataDirectory()); + updateDbVersion = + dbVersions.get(TuttiDbUpdaterCallBack.DB_UPDATE_NAME); + + if (updateDbVersion != null) { + + // ask user if it wants to do the update + String htmlMessage = String.format( + AbstractTuttiUIHandler.CONFIRMATION_FORMAT, + _("tutti.dbManager.updatedb.found", updateDbVersion.newVersion), + _("tutti.common.askBeforeUpdate.help")); + int i = JOptionPane.showConfirmDialog( + getHandler().getUI(), + htmlMessage, + _("tutti.dbManager.title.confirm.updatedb"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + + doAction = i == JOptionPane.OK_OPTION; + } + } return doAction; } @@ -96,10 +118,10 @@ ProgressionModel progressionModel = new ProgressionModel(); context.getActionUI().getModel().setProgressionModel(progressionModel); progressionModel.setMessage(_("tutti.dbManager.action.upgradeDb.check")); - TuttiApplicationUpdaterCallBack callback = - new TuttiApplicationUpdaterCallBack(this, progressionModel); - callback.setTypes(TuttiApplicationUpdaterCallBack.UpdateType.DB); + TuttiDbUpdaterCallBack callback = + new TuttiDbUpdaterCallBack(this, progressionModel); ApplicationUpdater up = new ApplicationUpdater(); + up.update(url, current, dest, @@ -107,24 +129,24 @@ callback, progressionModel); - if (callback.isDbInstalled()) { + if (callback.isDbUpdated()) { - progressionModel.setMessage(_("tutti.dbManager.action.upgradeDb.opening")); + sendMessage(_("tutti.dbManager.action.upgradeDb.done", updateDbVersion.newVersion)); - getContext().setDbExist(true); - - // open db - TuttiActionHelper.runInternalAction(getHandler(), OpenDbAction.class); - - } else if (callback.isDbUpdated()) { - - progressionModel.setMessage(_("tutti.dbManager.action.upgradeDb.reloading")); - - // open db - TuttiActionHelper.runInternalAction(getHandler(), OpenDbAction.class); - } else { sendMessage(_("tutti.dbManager.action.upgradeDb.upToDate")); } } + + @Override + public void postSuccessAction() { + handler.reloadDbManagerText(); + super.postSuccessAction(); + } + + @Override + public void postFailedAction(Throwable error) { + handler.reloadDbManagerText(); + super.postFailedAction(error); + } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/CloseDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/CloseDbAction.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/CloseDbAction.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -74,9 +74,6 @@ // clean db context getContext().clearDbContext(); - - // Close the application, will exit and restart application - //RunTutti.closeTutti(getHandler(), RunTutti.DELETE_DB_EXIT_CODE); } @Override @@ -86,7 +83,13 @@ sendMessage(_("tutti.flash.info.db.closed", jdbcUrl)); // make sure title is reloaded - getUI().getHandler().changeTitle(); + handler.reloadDbManagerText(); + handler.changeTitle(); } + @Override + public void postFailedAction(Throwable error) { + handler.reloadDbManagerText(); + super.postFailedAction(error); + } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.css 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.css 2013-09-25 13:31:19 UTC (rev 1223) @@ -36,7 +36,6 @@ focusable:false; contentType: "text/html"; border: {new EmptyBorder(5, 5, 5, 5)}; - text: {handler.updateMessage(model.isDbExist(), model.isDbLoaded())}; } #installOrReinstallDbButton { @@ -67,16 +66,6 @@ _help: {"tutti.dbManager.action.openDb.help"}; } -/*#closeDbButton { - actionIcon: close-db; - text: "tutti.dbManager.action.closeDb"; - i18nMnemonic: "tutti.dbManager.action.closeDb.mnemonic"; - visible: {model.isDbLoaded()}; - _tuttiAction: {CloseDbAction.class}; - toolTipText: "tutti.dbManager.action.closeDb.tip"; - _help: {"tutti.dbManager.action.closeDb.help"}; -}*/ - #upgradeDbButton { actionIcon: update-referential; text: "tutti.dbManager.action.upgradeDb"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUIHandler.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUIHandler.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -24,18 +24,27 @@ * #L% */ +import com.google.common.collect.Maps; +import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; +import org.nuiton.updater.ApplicationUpdater; import org.nuiton.util.Version; import javax.swing.JComponent; import javax.swing.SwingUtilities; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.Map; import static org.nuiton.i18n.I18n._; +import static org.nuiton.i18n.I18n.n_; /** * @author tchemit <chemit@codelutin.com> @@ -43,6 +52,9 @@ */ public class DbManagerUIHandler extends AbstractTuttiUIHandler<TuttiUIContext, DbManagerUI> { + /** Logger. */ + private static final Log log = LogFactory.getLog(DbManagerUIHandler.class); + public DbManagerUIHandler(TuttiUIContext context, DbManagerUI ui) { super(context, ui); } @@ -51,32 +63,84 @@ public void beforeInitUI() { } - public String updateMessage(boolean dbExist, boolean dbLoaded) { + public void updateMessage() { + + boolean dbExist = getContext().isDbExist(); + boolean dbLoaded = getContext().isDbLoaded(); + + + if (log.isInfoEnabled()) { + log.info("Rebuild information text... (dbExist?" + dbExist + + "/ dbLoaded?" + dbLoaded + ")"); + } + String message; if (dbExist) { - String jdbcUrl = getConfig().getServiceConfig().getPersistenceConfig().getJdbcUrl(); + TuttiApplicationConfig config = getConfig(); + String jdbcUrl = config.getServiceConfig().getPersistenceConfig().getJdbcUrl(); + + Map<String, String> caracteristics = Maps.newLinkedHashMap(); + + String title; + + caracteristics.put(_("tutti.dbManager.caracteristic.url"), jdbcUrl); + if (dbLoaded) { Version dbVersion = getContext().getPersistenceService().getDbVersion(); // db loaded - message = _("tutti.dbManager.info.db.loaded", jdbcUrl, dbVersion); + title = n_("tutti.dbManager.info.db.loaded"); + caracteristics.put(_("tutti.dbManager.caracteristic.schemaVersion"), dbVersion.toString()); + } else { // no db loaded - message = _("tutti.dbManager.info.no.db.loaded", jdbcUrl); + title = n_("tutti.dbManager.info.no.db.loaded"); } + + // get referential version + + if (getContext().checkUpdateDbReachable()) { + String urlDb = config.getUpdateDbUrl(); + + ApplicationUpdater up = new ApplicationUpdater(); + Map<String, ApplicationInfo> dbVersions = up.getVersions(urlDb, config.getDataDirectory()); + + ApplicationInfo updateDbVersion = + dbVersions.get(TuttiDbUpdaterCallBack.DB_UPDATE_NAME); + + String currentReferentialVersion = updateDbVersion.oldVersion; + String newReferentialVersion = updateDbVersion.newVersion; + caracteristics.put(_("tutti.dbManager.caracteristic.referentialVersion"), currentReferentialVersion); + if (newReferentialVersion != null) { + caracteristics.put(_("tutti.dbManager.caracteristic.lastReferentialVersion"), newReferentialVersion); + } + } + + StringBuilder caracteristicsToString = new StringBuilder("<ul>"); + for (Map.Entry<String, String> entry : caracteristics.entrySet()) { + caracteristicsToString.append("<li>"); + caracteristicsToString.append(entry.getKey()); + caracteristicsToString.append(" : <strong>"); + caracteristicsToString.append(entry.getValue()); + caracteristicsToString.append("</strong></li>"); + } + caracteristicsToString.append("</ul>"); + + message = _(title, caracteristicsToString); + } else { // db does not exist message = _("tutti.dbManager.info.no.db.exist"); -// ui.getInformationLabel().setText(_(message)); } - return "<html><body>" + message + "</body></html>"; + String result = "<html><body>" + message + "</body></html>"; + getUI().getInformationArea().setText(result); } @Override @@ -102,6 +166,8 @@ } }); + updateMessage(); + SwingUtilities.invokeLater( new Runnable() { @Override Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -281,14 +281,6 @@ getHandler().getPersistenceService().updateSchema(); sendMessage(_("tutti.flash.info.db.schema.updated", dbVersion, applicationVersion)); - - // reload a special databinding (dbLoaded) - AbstractTuttiUIHandler currentHandler = getHandler().getCurrentHandler(); - if (currentHandler instanceof DbManagerUIHandler) { - DbManagerUIHandler dbManagerUIHandler = (DbManagerUIHandler) currentHandler; - dbManagerUIHandler.getUI().applyDataBinding(DbManagerUI.BINDING_INFORMATION_AREA_TEXT); - - } } // ------------------------------------------------------------------ // @@ -308,6 +300,8 @@ @Override public void postSuccessAction() { + handler.reloadDbManagerText(); + super.postSuccessAction(); if (closeDb) { @@ -319,4 +313,11 @@ // make sure title is reloaded getUI().getHandler().changeTitle(); } + + @Override + public void postFailedAction(Throwable error) { + handler.reloadDbManagerText(); + super.postFailedAction(error); + } + } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/InstallDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/InstallDbAction.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/InstallDbAction.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -26,7 +26,7 @@ import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; import fr.ifremer.tutti.ui.swing.content.AbstractMainUITuttiAction; @@ -70,21 +70,7 @@ if (doAction) { // check db url is reachable - TuttiUIContext context = getContext(); - doAction = context.checkUpdateDbReachable(); - -// TuttiApplicationConfig config = context.getConfig(); -// String url = config.getUpdateDbUrl(); -// -// try { -// TuttiUIUtil.tryToConnectToUpdateUrl( -// url, -// n_("tutti.error.update.could.not.reach.url") -// ); -// } catch (TuttiBusinessException e) { -// TuttiUIContext.getErrorHelper().showWarningDialog(e.getMessage()); -// doAction = false; -// } + doAction = getContext().checkUpdateDbReachable(); } if (doAction) { @@ -118,9 +104,8 @@ File dest = new File(config.getTuttiBasedir(), "NEW"); progressionModel.increments(_("tutti.dbManager.action.upgradeDb.check")); - TuttiApplicationUpdaterCallBack callback = - new TuttiApplicationUpdaterCallBack(this, progressionModel); - callback.setTypes(TuttiApplicationUpdaterCallBack.UpdateType.DB); + TuttiDbUpdaterCallBack callback = + new TuttiDbUpdaterCallBack(this, progressionModel); ApplicationUpdater up = new ApplicationUpdater(); up.update(url, current, Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/OpenDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/OpenDbAction.java 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/OpenDbAction.java 2013-09-25 13:31:19 UTC (rev 1223) @@ -28,7 +28,9 @@ import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.TuttiPersistence; import fr.ifremer.tutti.persistence.config.TuttiPersistenceConfig; +import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiScreen; +import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; import fr.ifremer.tutti.ui.swing.content.AbstractChangeScreenAction; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; @@ -36,11 +38,14 @@ import fr.ifremer.tutti.ui.swing.util.action.TuttiUIAction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; +import org.nuiton.updater.ApplicationUpdater; import org.nuiton.util.Version; import javax.swing.JOptionPane; import java.io.File; import java.util.Date; +import java.util.Map; import static org.nuiton.i18n.I18n._; @@ -63,15 +68,23 @@ protected boolean updateSchema; + protected boolean updateReferentiel; + protected boolean closeDb; protected String jdbcUrl; + protected ApplicationInfo updateDbVersion; + public OpenDbAction(MainUIHandler handler) { super(handler, true, TuttiScreen.SELECT_CRUISE); setActionDescription(_("tutti.dbManager.action.openDb.tip")); } + public void setUpdateReferentiel(boolean updateReferentiel) { + this.updateReferentiel = updateReferentiel; + } + @Override public boolean prepareAction() throws Exception { @@ -81,6 +94,40 @@ dbVersion = applicationVersion = null; file = null; closeDb = updateSchema = false; + updateDbVersion = null; + + updateReferentiel &= getContext().checkUpdateDbReachable(); + + if (updateReferentiel) { + + // get the next db version + ApplicationUpdater up = new ApplicationUpdater(); + + // get db updates + Map<String, ApplicationInfo> dbVersions = + up.getVersions(getConfig().getUpdateDbUrl(), + getConfig().getDataDirectory()); + updateDbVersion = + dbVersions.get(TuttiDbUpdaterCallBack.DB_UPDATE_NAME); + + if (updateDbVersion != null) { + + // ask user if it wants to do the update + String htmlMessage = String.format( + AbstractTuttiUIHandler.CONFIRMATION_FORMAT, + _("tutti.dbManager.updatedb.found", updateDbVersion.newVersion), + _("tutti.common.askBeforeUpdate.help")); + int i = JOptionPane.showConfirmDialog( + getHandler().getTopestUI(), + htmlMessage, + _("tutti.dbManager.title.confirm.updatedb"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + + updateReferentiel = i == JOptionPane.OK_OPTION; + } + + } } return canContinue; } @@ -97,7 +144,7 @@ // at the beginning 3 steps (open db + check version + check db context) ProgressionModel progressionModel = new ProgressionModel(); setProgressionModel(progressionModel); - progressionModel.setTotal(3); + progressionModel.setTotal(3 + (updateReferentiel ? 1 : 0)); // ------------------------------------------------------------------ // // --- open db // @@ -140,6 +187,7 @@ log.info("Detected schema application version:" + applicationVersion); } + TuttiApplicationConfig config = getConfig(); if (dbVersion.equals(applicationVersion)) { // database schema is up to date @@ -172,7 +220,7 @@ // ask user file where to backup db file = saveFile( - getConfig().getServiceConfig().getPersistenceConfig().getDbBackupDirectory(), + config.getServiceConfig().getPersistenceConfig().getDbBackupDirectory(), "tutti-db-" + ExportDbAction.df.format(new Date()), "zip", _("tutti.dbManager.title.choose.dbBackupFile"), @@ -249,6 +297,39 @@ getHandler().getPersistenceService().updateSchema(); } + if (updateReferentiel) { + + // ------------------------------------------------------------------ // + // --- update referentiel // + // ------------------------------------------------------------------ // + + progressionModel.increments(_("tutti.openDb.step.updateReferential")); + + File current = config.getDataDirectory(); + String url = config.getUpdateDbUrl(); + + File dest = new File(config.getTuttiBasedir(), "NEW"); + + progressionModel.setMessage(_("tutti.dbManager.action.upgradeDb.check")); + TuttiDbUpdaterCallBack callback = + new TuttiDbUpdaterCallBack(this, progressionModel); + ApplicationUpdater up = new ApplicationUpdater(); + up.update(url, + current, + dest, + false, + callback, + progressionModel); + + if (callback.isDbUpdated()) { + + progressionModel.setMessage(_("tutti.dbManager.action.upgradeDb.reloading")); + + } else { + sendMessage(_("tutti.dbManager.action.upgradeDb.upToDate")); + } + } + // ------------------------------------------------------------------ // // --- check db context // // ------------------------------------------------------------------ // @@ -269,8 +350,10 @@ @Override public void postSuccessAction() { + handler.reloadDbManagerText(); + // make sure title is reloaded - getUI().getHandler().changeTitle(); + handler.changeTitle(); if (closeDb) { sendMessage(_("tutti.flash.info.db.not.opened", jdbcUrl)); @@ -284,4 +367,12 @@ sendMessage(_("tutti.flash.info.db.opened", jdbcUrl)); } } + + @Override + public void postFailedAction(Throwable error) { + + handler.reloadDbManagerText(); + + super.postFailedAction(error); + } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-09-25 13:31:19 UTC (rev 1223) @@ -25,6 +25,7 @@ tutti.applicationUpdater.synchroDB.prepare.error= tutti.applicationUpdater.synchroDB.synchro.error= tutti.applicationUpdater.synchroDB.writeVersion.error= +tutti.applicationUpdater.updateDone.deleteDirectory.caches.error= tutti.applicationUpdater.updateDone.deleteDirectory.dbConf.error= tutti.applicationUpdater.updateDone.deleteDirectory.enum.error= tutti.applicationUpdater.updateDone.deleteDirectory.i18n.error= @@ -63,6 +64,7 @@ tutti.common.askBeforeEditProtocol.help= tutti.common.askBeforeEditProtocol.title= tutti.common.askBeforeImportProtocol.help= +tutti.common.askBeforeUpdate.help= tutti.common.askCancelEditBeforeLeaving.help= tutti.common.askCancelEditBeforeLeaving.title= tutti.common.askOverwriteFile.help= @@ -294,6 +296,7 @@ tutti.dbManager.action.reinstallDb.tip= tutti.dbManager.action.upgradeDb= tutti.dbManager.action.upgradeDb.check= +tutti.dbManager.action.upgradeDb.done= tutti.dbManager.action.upgradeDb.mnemonic= tutti.dbManager.action.upgradeDb.no.backup.db.choosen= tutti.dbManager.action.upgradeDb.opening= @@ -306,6 +309,10 @@ tutti.dbManager.action.upgradeDb.schema.version.not.found= tutti.dbManager.action.upgradeDb.tip= tutti.dbManager.action.upgradeDb.upToDate= +tutti.dbManager.caracteristic.lastReferentialVersion= +tutti.dbManager.caracteristic.referentialVersion= +tutti.dbManager.caracteristic.schemaVersion= +tutti.dbManager.caracteristic.url= tutti.dbManager.info.db.loaded= tutti.dbManager.info.no.db.exist= tutti.dbManager.info.no.db.loaded= @@ -313,7 +320,9 @@ tutti.dbManager.title.choose.dbBackupFile= tutti.dbManager.title.choose.dbExportFile= tutti.dbManager.title.choose.dbImportFile= +tutti.dbManager.title.confirm.updatedb= tutti.dbManager.title.schema.toupdate= +tutti.dbManager.updatedb.found= tutti.editAccidentalBatch.action.createBatch= tutti.editAccidentalBatch.action.createBatch.mnemonic= tutti.editAccidentalBatch.action.createBatch.tip= @@ -922,6 +931,7 @@ tutti.editSpeciesBatch.action.splitBatch= tutti.editSpeciesBatch.action.splitBatch.mnemonic= tutti.editSpeciesBatch.action.splitBatch.tip= +tutti.editSpeciesBatch.error.sampleCategoryValue.notAvailable= tutti.editSpeciesBatch.field.speciesTotalInertWeight= tutti.editSpeciesBatch.field.speciesTotalInertWeight.tip= tutti.editSpeciesBatch.field.speciesTotalLivingNotItemizedWeight= @@ -951,6 +961,7 @@ tutti.editSpeciesBatch.table.header.species= tutti.editSpeciesBatch.table.header.toConfirm= tutti.editSpeciesBatch.table.header.weight= +tutti.editSpeciesBatch.title.changeSampleCategoryValue= tutti.editSpeciesFrequencies.action.cancel= tutti.editSpeciesFrequencies.action.cancel.mnemonic= tutti.editSpeciesFrequencies.action.cancel.tip= @@ -1239,6 +1250,7 @@ tutti.openDb.step.check.dbContext= tutti.openDb.step.checkSchemaVersion= tutti.openDb.step.open= +tutti.openDb.step.updateReferential= tutti.openDb.step.will.migrateSchema= tutti.option.cancel= tutti.option.cleanAndClone= @@ -1353,6 +1365,7 @@ tutti.splitSpeciesBatch.table.header.weight= tutti.splitSpeciesBatch.title= tutti.timeeditor.H= +tutti.update.= tutti.update.db= tutti.update.help= tutti.update.i18n= Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-09-25 10:48:17 UTC (rev 1222) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-09-25 13:31:19 UTC (rev 1223) @@ -25,6 +25,7 @@ tutti.applicationUpdater.synchroDB.prepare.error=Erreur lors de la préparation de la synchronisation de la base tutti.applicationUpdater.synchroDB.synchro.error=Erreur lors de la synchronisation de la base tutti.applicationUpdater.synchroDB.writeVersion.error=Erreur lors de l'écriture de la nouvelle version de la base de données dans le fichier %s +tutti.applicationUpdater.updateDone.deleteDirectory.caches.error=Erreur lors de la suppression du dossier des caches tutti.applicationUpdater.updateDone.deleteDirectory.dbConf.error=Erreur lors de la suppression du dossier de configuration de base de données tutti.applicationUpdater.updateDone.deleteDirectory.enum.error=Erreur lors de la suppression du dossier d'énumération tutti.applicationUpdater.updateDone.deleteDirectory.i18n.error=Erreur lors de la suppression du dossier d'internationalisation @@ -63,6 +64,7 @@ tutti.common.askBeforeEditProtocol.help=Que voulez-vous faire?<ul><li><strong>Annuler</strong> pour ne pas éditer le protocole</li><li><strong>Éditer</strong> pour éditer le protocole en conservant les catégories non connues (elle ne seront pas affichées)</li><li><strong>Nettoyer et Éditer</strong> pour supprimer les catégories non compatibles et éditer le protocole</li></ul> tutti.common.askBeforeEditProtocol.title=Catégories non compatibles détectées dans le protocole tutti.common.askBeforeImportProtocol.help=Que voulez-vous faire?<ul><li><strong>Annuler</strong> pour ne pas importer le protocole</li><li><strong>Importer</strong> pour importer le protocole en conservant les catégories non connues (elle ne seront pas affichées)</li><li><strong>Nettoyer et Importer</strong> pour supprimer les catégories non compatibles dans le protocole importé</li></ul> +tutti.common.askBeforeUpdate.help=Que voulez-vous faire ?<ul><li><strong>Annuler</strong> pour ne pas effectuer la mise à jour</li><li><strong>OK</strong> pour lancer la mise à jour</li></ul> tutti.common.askCancelEditBeforeLeaving.help=Que voulez-vous faire ?<ul><li><strong>Annuler</strong> pour rester sur cet écran</li><li><strong>OK</strong> pour quitter l'écran en abandonnant les modifications</li></ul> tutti.common.askCancelEditBeforeLeaving.title=Modifications non enregistrées mais invalides tutti.common.askOverwriteFile.help=Que voulez-vous faire ?<ul><li><strong>Annuler</strong> pour ne pas écraser le fichier et annuler l'opération</li><li><strong>Oui</strong> pour écraser le fichier et continuer l'opération</li></ul> @@ -293,6 +295,7 @@ tutti.dbManager.action.reinstallDb.tip=Télécharger puis ré-installer la base de données tutti.dbManager.action.upgradeDb=Mettre à jour les référentiels tutti.dbManager.action.upgradeDb.check=Recherche des mises à jour de la base +tutti.dbManager.action.upgradeDb.done=La mise à jour des référentiel en version <strong>%s</strong> est terminée. tutti.dbManager.action.upgradeDb.mnemonic=V tutti.dbManager.action.upgradeDb.no.backup.db.choosen=La base ne sera pas migrée (vous avez annulé la sauvegarde avant migration). tutti.dbManager.action.upgradeDb.opening=Ouverture de la base de données @@ -304,15 +307,21 @@ tutti.dbManager.action.upgradeDb.schema.too.high.help=Souhaitez-vous poursuivre l'import de la base de données ?<ul><li><strong>Oui</strong> pour charger la base en version plus récente</li><li><strong>Annuler</strong> pour ne pas charger la base</li></ul> tutti.dbManager.action.upgradeDb.schema.version.not.found=L'application n'a pas pu déterminer la version de la base de données à importer. L'import ne peut pas être réalisé, veuillez contacter les administrateurs de l'application. tutti.dbManager.action.upgradeDb.tip=Mettre à jour les référentiels -tutti.dbManager.action.upgradeDb.upToDate=Aucune mise à jour de base détectée -tutti.dbManager.info.db.loaded=Tutti est connecté à une base de données<hr/>Caractéristiques de cette base \:<ul><li>Url de connexion \: <strong>%s</strong></li><li>Version\: <strong>%s</strong></li></ul> +tutti.dbManager.action.upgradeDb.upToDate=<strong>Aucune mise à jour de base détectée</strong> +tutti.dbManager.caracteristic.lastReferentialVersion=Version du référentiel disponible en mis à jour +tutti.dbManager.caracteristic.referentialVersion=Version du référentiel utilisé +tutti.dbManager.caracteristic.schemaVersion=Version du schema +tutti.dbManager.caracteristic.url=Url de connexion +tutti.dbManager.info.db.loaded=Tutti est connecté à une base de données<hr/>Caractéristiques de cette base \: %s tutti.dbManager.info.no.db.exist=Aucune base détectée.<hr/>Vous pouvez installer la dernière disponible sur le réseau via l'action <strong>installer</strong>; ou bien en importer une via l'action <strong>importer</strong>. -tutti.dbManager.info.no.db.loaded=Une base a été détectée (<strong>%s</strong>).<hr/>La base n'est pas ouverte, vous pouvez l'ouvrir via l'action <strong>Ouvrir</strong>.<br/>Si l'ouverture ne fonctionne pas; veuillez bien prendre soin de quitter les applications qui pourraient utiliser cette base. +tutti.dbManager.info.no.db.loaded=Une base a été détectée.<hr/>La base n'est pas ouverte, vous pouvez l'ouvrir via l'action <strong>Ouvrir</strong>.<br/>Si l'ouverture ne fonctionne pas; veuillez bien prendre soin de quitter les applications qui pourraient utiliser cette base.<br/>Caractéristiques de cette base \: %s tutti.dbManager.title.backup.db=Sauvegarde de la base tutti.dbManager.title.choose.dbBackupFile=Sauvegarder la base de données tutti.dbManager.title.choose.dbExportFile=Exporter la base de données tutti.dbManager.title.choose.dbImportFile=Importer la base de données +tutti.dbManager.title.confirm.updatedb=Confirmer la mise à jour des réferentiels tutti.dbManager.title.schema.toupdate=Mise à jour de la base détéctée +tutti.dbManager.updatedb.found=Une mise à jour des référentiels (version <strong>%s</strong>) est disponible. tutti.editAccidentalBatch.action.createBatch=Créer une capture accidentelle tutti.editAccidentalBatch.action.createBatch.mnemonic=C tutti.editAccidentalBatch.action.createBatch.tip=Créer une capture accidentelle @@ -392,7 +401,6 @@ tutti.editBenthosBatch.action.splitBatch.mnemonic=C tutti.editBenthosBatch.action.splitBatch.tip=Catégoriser le lot courant (celui de la ligne sélectionné) tutti.editBenthosBatch.error.sampleCategoryValue.notAvailable=La valeur %s de la catégorie %s est déjà utilisée -tutti.editSpeciesBatch.error.sampleCategoryValue.notAvailable=La valeur %s de la catégorie %s est déjà utilisée tutti.editBenthosBatch.field.benthosTotalInertWeight=Poids inerte trié tutti.editBenthosBatch.field.benthosTotalInertWeight.tip=Poids de la fraction inerte restante après le tri du benthos (cailloux, vase, débris coquilliers, etc.) tutti.editBenthosBatch.field.benthosTotalLivingNotItemizedWeight=Poids vivant non détaillé trié @@ -429,7 +437,6 @@ tutti.editBenthosBatch.table.header.weight=Poids sous-échantillonné tutti.editBenthosBatch.table.header.weight.tip=Poids du lot mesuré ou dénombré tutti.editBenthosBatch.title.changeSampleCategoryValue=Changer la valeur de la catégorie %s -tutti.editSpeciesBatch.title.changeSampleCategoryValue=Changer la valeur de la catégorie %s tutti.editBenthosFrequencies.action.cancel=Annuler tutti.editBenthosFrequencies.action.cancel.mnemonic=A tutti.editBenthosFrequencies.action.cancel.tip=Annuler l'édition des mensurations @@ -925,6 +932,7 @@ tutti.editSpeciesBatch.action.splitBatch=Catégoriser le lot tutti.editSpeciesBatch.action.splitBatch.mnemonic=C tutti.editSpeciesBatch.action.splitBatch.tip=Catégoriser le lot courant (celui de la ligne sélectionné) +tutti.editSpeciesBatch.error.sampleCategoryValue.notAvailable=La valeur %s de la catégorie %s est déjà utilisée tutti.editSpeciesBatch.field.speciesTotalInertWeight=Poids inerte trié tutti.editSpeciesBatch.field.speciesTotalInertWeight.tip=Poids de la fraction inerte restante après le tri des espèces (cailloux, vase, débris coquilliers, etc.) tutti.editSpeciesBatch.field.speciesTotalLivingNotItemizedWeight=Poids vivant non détaillé trié @@ -954,6 +962,7 @@ tutti.editSpeciesBatch.table.header.species=Espèce tutti.editSpeciesBatch.table.header.toConfirm=A Confirmer tutti.editSpeciesBatch.table.header.weight=Poids sous-échantillonné +tutti.editSpeciesBatch.title.changeSampleCategoryValue=Changer la valeur de la catégorie %s tutti.editSpeciesFrequencies.action.cancel=Annuler tutti.editSpeciesFrequencies.action.cancel.mnemonic=A tutti.editSpeciesFrequencies.action.cancel.tip=Annuler l'édition des mensurations @@ -1079,6 +1088,7 @@ tutti.importDb.step.closeDb=Fermeture de la base tutti.importDb.step.openDb=Ouverture de la base de données <strong>%s</strong> tutti.importDb.step.unzipArchive=Décompression de l'archive +tutti.importDb.step.updateReferential=Mise à jour des référentiels tutti.importDb.step.will.migrateSchema=Démarrage de la mise à jour du schéma de la base depuis la version %s vers la version %s tutti.importProtocol.action.success=Protocole [%s] lu depuis le fichier. tutti.importPupitri.carrouselFile.extension=car @@ -1243,6 +1253,7 @@ tutti.openDb.step.check.dbContext=Vérification du context de saisie tutti.openDb.step.checkSchemaVersion=Vérification de la compatibilité de la base tutti.openDb.step.open=Ouverture de la base <strong>%s</strong> +tutti.openDb.step.updateReferential= tutti.openDb.step.will.migrateSchema=Démarrage de la mise à jour du schéma de la base depuis la version %s vers la version %s tutti.option.cancel=Annuler tutti.option.cleanAndClone=Nettoyer et Cloner
participants (1)
-
tchemit@users.forge.codelutin.com