This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 1922f4774fc467bca5187e4dfff9cdebf1416bd7 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jan 28 14:02:01 2015 +0100 refactor des mises à jour --- .../fr/ifremer/tutti/service/TuttiDataContext.java | 1 + .../ui/swing/TuttiApplicationUpdaterCallBack.java | 298 --------------------- .../tutti/ui/swing/TuttiReportUpdaterCallBack.java | 161 ----------- .../tutti/ui/swing/action/InstallDbAction.java | 17 +- .../tutti/ui/swing/action/OpenDbAction.java | 29 +- .../tutti/ui/swing/action/ShowAboutAction.java | 222 +++++++++------ .../ui/swing/action/UpdateApplicationAction.java | 31 +-- .../tutti/ui/swing/action/UpdateDbAction.java | 39 ++- .../tutti/ui/swing/action/UpdateReportAction.java | 25 +- .../ui/swing/content/db/DbManagerUIHandler.java | 16 +- .../swing/update/ApplicationUpdateException.java | 26 ++ .../update/TuttiApplicationUpdaterCallBack.java | 59 ++++ .../ui/swing/update/TuttiDbUpdaterCallBack.java | 76 ++++++ .../swing/update/TuttiReportUpdaterCallBack.java | 53 ++++ .../swing/update/TuttiUpdaterCallBackSupport.java | 150 +++++++++++ .../fr/ifremer/tutti/ui/swing/update/Updates.java | 61 +++++ .../module/DbModuleUpdater.java} | 187 +++---------- .../ui/swing/update/module/HelpModuleUpdater.java | 51 ++++ .../ui/swing/update/module/I18NModuleUpdater.java | 52 ++++ .../update/module/IchtyometerModuleUpdater.java | 52 ++++ .../ui/swing/update/module/JreModuleUpdater.java | 52 ++++ .../swing/update/module/LauncherModuleUpdater.java | 52 ++++ .../swing/update/module/ModuleUpdaterSupport.java | 102 +++++++ .../swing/update/module/ReportModuleUpdater.java | 51 ++++ .../ui/swing/update/module/TuttiModuleUpdater.java | 81 ++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 6 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 15 +- 27 files changed, 1172 insertions(+), 793 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java index 8263c4a..3fc6ca6 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java @@ -837,6 +837,7 @@ public class TuttiDataContext extends AbstractBean implements Closeable { } public void loadSampleCategoryModel(SampleCategoryModel sampleCategoryModel) { + Preconditions.checkNotNull(sampleCategoryModel,"Can't get a null sampleCategoryModel"); this.sampleCategoryModel = sampleCategoryModel; sampleCategoryModel.load(service); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java deleted file mode 100644 index 6ccef48..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java +++ /dev/null @@ -1,298 +0,0 @@ -package fr.ifremer.tutti.ui.swing; - -/* - * #%L - * Tutti :: UI - * %% - * Copyright (C) 2012 - 2014 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.Lists; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.LabelAware; -import fr.ifremer.tutti.TuttiConfiguration; -import fr.ifremer.tutti.TuttiConfigurationOption; -import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.ui.swing.action.AbstractTuttiAction; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.ApplicationIOUtil; -import org.nuiton.jaxx.application.ApplicationTechnicalException; -import org.nuiton.jaxx.application.swing.action.ApplicationActionException; -import org.nuiton.updater.ApplicationInfo; -import org.nuiton.updater.ApplicationUpdaterCallback; -import org.nuiton.util.version.Version; -import org.nuiton.util.version.Versions; - -import java.io.File; -import java.util.List; -import java.util.Map; - -import static org.nuiton.i18n.I18n.n; -import static org.nuiton.i18n.I18n.t; - -/** - * CallBack to update jre, application, i18n. - * - * @author tchemit <chemit@codelutin.com> - * @since 1.0 - */ -public class TuttiApplicationUpdaterCallBack implements ApplicationUpdaterCallback { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(TuttiApplicationUpdaterCallBack.class); - - public enum UpdateType implements LabelAware { - JRE(n("tutti.update.jre")), - TUTTI(n("tutti.update.tutti")), - I18N(n("tutti.update.i18n")), - HELP(n("tutti.update.help")); - - private final String i18nKey; - - private UpdateType(String i18nKey) { - this.i18nKey = i18nKey; - } - - @Override - public String getLabel() { - return t(i18nKey); - } - } - - protected final TuttiUIContext context; - - protected List<UpdateType> types; - - protected ProgressionModel progressionModel; - - protected boolean applicationUpdated; - - protected final AbstractTuttiAction action; - - public TuttiApplicationUpdaterCallBack(AbstractTuttiAction action, - ProgressionModel progressionModel) { - this.action = action; - this.context = action.getContext(); - this.progressionModel = progressionModel; - } - - public void setTypes(UpdateType... types) { - this.types = Lists.newArrayList(types); - } - - public boolean isApplicationUpdated() { - return applicationUpdated; - } - - @Override - public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) { - Map<String, ApplicationInfo> result = Maps.newHashMap(); - - for (UpdateType type : types) { - ApplicationInfo info = getInfo(type, appToUpdate); - if (info != null) { - result.put(info.name, info); - } - } - return result; - } - - @Override - public void startUpdate(ApplicationInfo info) { - if (UpdateType.JRE.name().toLowerCase().equals(info.name)) { - progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.jre", info.newVersion)); - } - - if (UpdateType.TUTTI.name().toLowerCase().equals(info.name)) { - progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.tutti", info.newVersion)); - } - - if (UpdateType.I18N.name().toLowerCase().equals(info.name)) { - progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.i18n", info.newVersion)); - } - if (UpdateType.HELP.name().toLowerCase().equals(info.name)) { - progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.help", info.newVersion)); - } - } - - @Override - public void updateDone(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - - boolean updateJRE = updateDoneJre(appToUpdate, appUpdateError); - boolean updateTutti = updateDoneTutti(appToUpdate, appUpdateError); - boolean updateI18n = updateDoneI18n(appToUpdate, appUpdateError); - boolean updateHelp = updateDoneHelp(appToUpdate, appUpdateError); - - boolean doRestart = updateJRE || updateTutti || updateI18n || updateHelp; - - if (doRestart) { - - applicationUpdated = true; - } - } - - @Override - public void aborted(String propertiesURL, Exception eee) { - if (log.isErrorEnabled()) { - log.error("Could not update from " + propertiesURL, eee); - } - throw ApplicationActionException.propagateError(action, eee); - } - - protected boolean updateDoneJre(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - boolean doRestart = false; - Exception error = getError(UpdateType.JRE, appUpdateError); - if (error != null) { - - // something bad while updating jre - throw ApplicationActionException.propagateError( - action, new ApplicationTechnicalException(t("tutti.applicationUpdater.jre.error"), error)); - } else { - ApplicationInfo info = getInfo(UpdateType.JRE, appToUpdate); - if (info != null) { - - if (log.isInfoEnabled()) { - log.info(String.format( - "A jre update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", - info.oldVersion, info.newVersion)); - } - doRestart = true; - } - } - return doRestart; - } - - protected boolean updateDoneTutti(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - boolean doRestart = false; - Exception error = getError(UpdateType.TUTTI, appUpdateError); - if (error != null) { - - // something bad while updating application - throw ApplicationActionException.propagateError( - action, new ApplicationTechnicalException(t("tutti.applicationUpdater.tutti.error"), error)); - } else { - ApplicationInfo info = getInfo(UpdateType.TUTTI, appToUpdate); - if (info != null) { - - if (log.isInfoEnabled()) { - log.info(String.format( - "A tutti update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", - info.oldVersion, info.newVersion)); - } - doRestart = true; - - TuttiConfiguration config = context.getConfig(); - - // must remove db cache directory - File cacheDirectory = config.getCacheDirectory(); - ApplicationIOUtil.forceDeleteOnExit( - cacheDirectory, - t("tutti.applicationUpdater.updateDone.deleteDirectory.caches.error", cacheDirectory) - ); - - Version oldVersion = Versions.valueOf(info.oldVersion); - - if (oldVersion.before(Versions.valueOf("3.7.1"))) { - - // clean application data source (only if coming from before a 3.7.1 version) - if (log.isInfoEnabled()) { - log.info("Remove from configuration tutti.update.application.url: " + config.getUpdateApplicationUrl()); - } - config.getApplicationConfig().setOption(TuttiConfigurationOption.UPDATE_APPLICATION_URL.getKey(), ""); - config.save(); - - } - - } - } - return doRestart; - } - - protected boolean updateDoneI18n(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - boolean doRestart = false; - Exception error = getError(UpdateType.I18N, appUpdateError); - if (error != null) { - - // something bad while updating i18n - throw ApplicationActionException.propagateError( - action, new ApplicationTechnicalException(t("tutti.applicationUpdater.i18n.error"), error)); - } else { - ApplicationInfo info = getInfo(UpdateType.I18N, appToUpdate); - if (info != null) { - - if (log.isInfoEnabled()) { - log.info(String.format( - "A i18n update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", - info.oldVersion, info.newVersion)); - } - doRestart = true; - } - } - return doRestart; - } - - protected boolean updateDoneHelp(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - boolean doRestart = false; - Exception error = getError(UpdateType.HELP, appUpdateError); - if (error != null) { - - // something bad while updating help - throw ApplicationActionException.propagateError( - action, new ApplicationTechnicalException(t("tutti.applicationUpdater.help.error"), error)); - } else { - ApplicationInfo info = getInfo(UpdateType.HELP, appToUpdate); - if (info != null) { - - if (log.isInfoEnabled()) { - log.info(String.format( - "A help update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", - info.oldVersion, info.newVersion)); - } - doRestart = true; - } - } - return doRestart; - } - - protected ApplicationInfo getInfo(UpdateType type, - Map<String, ApplicationInfo> appToUpdate) { - return appToUpdate.get(type.name().toLowerCase()); - } - - protected Exception getError(UpdateType type, - Map<String, Exception> appUpdateError) { - return appUpdateError.get(type.name().toLowerCase()); - } - - 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; - } -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiReportUpdaterCallBack.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiReportUpdaterCallBack.java deleted file mode 100644 index 1c550a7..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiReportUpdaterCallBack.java +++ /dev/null @@ -1,161 +0,0 @@ -package fr.ifremer.tutti.ui.swing; - -/* - * #%L - * Tutti :: UI - * %% - * Copyright (C) 2012 - 2014 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.collect.Maps; -import org.nuiton.jaxx.application.ApplicationTechnicalException; -import org.nuiton.jaxx.application.swing.action.ApplicationActionException; -import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.ui.swing.action.AbstractTuttiAction; -import fr.ifremer.tutti.ui.swing.util.auth.AuthenticationInfo; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.updater.ApplicationInfo; -import org.nuiton.updater.ApplicationUpdaterCallback; - -import java.util.Map; - -import static org.nuiton.i18n.I18n.t; -import static org.nuiton.i18n.I18n.n; - -/** - * CallBack to update db. - * - * @author tchemit <chemit@codelutin.com> - * @since 2.6 - */ -public class TuttiReportUpdaterCallBack implements ApplicationUpdaterCallback { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(TuttiReportUpdaterCallBack.class); - - public static final String REPORT_UPDATE_NAME = "report"; - - static { - n("tutti.update.report"); - } - - protected final TuttiUIContext context; - - protected ProgressionModel progressionModel; - - protected boolean reportUpdated; - - protected final AbstractTuttiAction action; - - public TuttiReportUpdaterCallBack(AbstractTuttiAction action, - ProgressionModel progressionModel) { - this.action = action; - this.context = action.getContext(); - this.progressionModel = progressionModel; - } - - public boolean isReportUpdated() { - return reportUpdated; - } - - @Override - public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) { - Map<String, ApplicationInfo> result = Maps.newHashMap(); - - ApplicationInfo info = appToUpdate.get(REPORT_UPDATE_NAME); - if (info != null) { - result.put(info.name, info); - - if (info.needAuthentication) { - // ask auth - AuthenticationInfo authenticationInfo = context.getAuthenticationInfo(info.url); - if (authenticationInfo != null) { - info.setAuthentication(authenticationInfo.getLogin(), authenticationInfo.getPassword()); - } - } - } - - return result; - } - - @Override - public void startUpdate(ApplicationInfo info) { - - progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.report", info.newVersion)); - } - - @Override - public void updateDone(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - - boolean doRestart = updateDoneReport(appToUpdate, appUpdateError); - - if (doRestart) { - - reportUpdated = true; - } - } - - @Override - public void aborted(String propertiesURL, Exception eee) { - if (log.isErrorEnabled()) { - log.error("Could not update from " + propertiesURL, eee); - } - throw ApplicationActionException.propagateError(action, eee); - } - - protected boolean updateDoneReport(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - boolean doRestart = false; - ApplicationInfo info = getInfo(REPORT_UPDATE_NAME, appToUpdate); - Exception error = getError(REPORT_UPDATE_NAME, appUpdateError); - if (error != null) { - - // something bad while updating jre - String errorMessage; - if (info != null && info.needAuthentication) { - errorMessage = t("tutti.updateReport.error.with.auth"); - } else { - errorMessage = t("tutti.updateReport.error.with.noauth"); - } - throw ApplicationActionException.propagateError( - action, new ApplicationTechnicalException(errorMessage, error)); - } else if (info != null) { - - if (log.isInfoEnabled()) { - log.info(String.format( - "A report update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", - info.oldVersion, info.newVersion)); - } - doRestart = true; - } - return doRestart; - } - - protected Exception getError(String type, - Map<String, Exception> appUpdateError) { - return appUpdateError.get(type.toLowerCase()); - } - - protected ApplicationInfo getInfo(String type, - Map<String, ApplicationInfo> appToUpdate) { - return appToUpdate.get(type.toLowerCase()); - } -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/InstallDbAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/InstallDbAction.java index 5108c10..7434fbd 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/InstallDbAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/InstallDbAction.java @@ -25,11 +25,11 @@ package fr.ifremer.tutti.ui.swing.action; import com.google.common.base.Preconditions; import fr.ifremer.tutti.TuttiConfiguration; import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; +import fr.ifremer.tutti.ui.swing.update.TuttiDbUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.update.Updates; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.updater.ApplicationUpdater; import java.io.File; @@ -95,18 +95,9 @@ public class InstallDbAction extends AbstractMainUITuttiAction { log.info(String.format("Try to install / update db (current data location: %s), using update url: %s", current, url)); } - File dest = new File(config.getBasedir(), "NEW"); - progressionModel.increments(t("tutti.dbManager.action.upgradeDb.check")); - TuttiDbUpdaterCallBack callback = - new TuttiDbUpdaterCallBack(this, progressionModel); - ApplicationUpdater up = new ApplicationUpdater(); - up.update(url, - current, - dest, - false, - callback, - progressionModel); + TuttiDbUpdaterCallBack callback = new TuttiDbUpdaterCallBack(url, this, progressionModel); + Updates.doUpdate(config, callback, current); Preconditions.checkState(callback.isDbInstalled()); 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 e5f003f..01241ef 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 @@ -26,22 +26,21 @@ 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; +import fr.ifremer.tutti.ui.swing.update.TuttiDbUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.update.Updates; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.application.ApplicationBusinessException; import org.nuiton.jaxx.application.swing.action.ApplicationUIAction; import org.nuiton.updater.ApplicationInfo; -import org.nuiton.updater.ApplicationUpdater; import org.nuiton.util.version.Version; import javax.swing.JOptionPane; import java.io.File; import java.util.Date; -import java.util.Map; import static org.nuiton.i18n.I18n.t; @@ -88,13 +87,7 @@ public class OpenDbAction extends AbstractChangeScreenAction { if (updateReferentiel) { // get the next db version - ApplicationUpdater up = new ApplicationUpdater(); - - // get db updates - Map<String, ApplicationInfo> dbVersions = - up.getVersions(getConfig().getUpdateDataUrl(), - getConfig().getDataDirectory()); - updateDbVersion = dbVersions.get(TuttiDbUpdaterCallBack.DB_UPDATE_NAME); + updateDbVersion = Updates.getDatabaseUpdateVersion(getConfig()); if (updateDbVersion != null && updateDbVersion.newVersion != null) { @@ -328,21 +321,13 @@ public class OpenDbAction extends AbstractChangeScreenAction { progressionModel.increments(t("tutti.openDb.step.updateReferential")); + progressionModel.setMessage(t("tutti.dbManager.action.upgradeDb.check")); + File current = config.getDataDirectory(); String url = config.getUpdateDataUrl(); + TuttiDbUpdaterCallBack callback = new TuttiDbUpdaterCallBack(url, this, progressionModel); - File dest = new File(config.getBasedir(), "NEW"); - - progressionModel.setMessage(t("tutti.dbManager.action.upgradeDb.check")); - TuttiDbUpdaterCallBack callback = - new TuttiDbUpdaterCallBack(this, progressionModel); - ApplicationUpdater up = new ApplicationUpdater(); - up.update(url, - current, - dest, - false, - callback, - progressionModel); + Updates.doUpdate(config, callback, current); if (callback.isDbUpdated()) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ShowAboutAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ShowAboutAction.java index f92894a..07ef9d9 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ShowAboutAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ShowAboutAction.java @@ -26,11 +26,9 @@ import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ifremer.tutti.TuttiConfiguration; -import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; -import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; -import fr.ifremer.tutti.ui.swing.TuttiReportUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import jaxx.runtime.swing.AboutPanel; import org.apache.commons.logging.Log; @@ -43,6 +41,7 @@ import javax.swing.JScrollPane; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import java.io.File; +import java.net.MalformedURLException; import java.net.URL; import java.util.Calendar; import java.util.List; @@ -134,6 +133,22 @@ public class ShowAboutAction extends AbstractMainUITuttiAction { // translate tab // + addTranslatePane(config); + + if (canUpdateApplication || canUpdateData) { + + // + // update tab + // + + addUpdateTab(config); + + } + about.init(); + } + + protected void addTranslatePane(TuttiConfiguration config) throws MalformedURLException { + JScrollPane translatePane = new JScrollPane(); JEditorPane translateArea = new JEditorPane(); translateArea.setContentType("text/html"); @@ -162,56 +177,30 @@ public class ShowAboutAction extends AbstractMainUITuttiAction { about.getTabs().add(t("tutti.about.translate.title"), translatePane); - if (canUpdateApplication || canUpdateData) { + } - // - // update tab - // + protected void addUpdate(String url, UpdateModule type, + Map<String, ApplicationInfo> source, + Map<UpdateModule, ApplicationInfo> target) { - addUpdateTab(config); + ApplicationInfo info = source.get(type.name().toLowerCase()); + if (info == null) { - } - about.init(); - } + if (log.isWarnEnabled()) { + log.warn("Can not find information about module " + type + " by update provider " + url); + } + } else { - protected void addUpdate(Map<String, ApplicationInfo> source, - Map<String, ApplicationInfo> target, - String type) { - ApplicationInfo info = source.get(type.toLowerCase()); - target.put(type, info); + target.put(type, info); + } + } protected void addUpdateTab(TuttiConfiguration config) { - File current = config.getBasedir(); - String urlApplication = config.getUpdateApplicationUrl(); - String urlData = config.getUpdateDataUrl(); - - ApplicationUpdater up = new ApplicationUpdater(); // create final update map - final Map<String, ApplicationInfo> versions = Maps.newLinkedHashMap(); - - if (canUpdateApplication) { - - // get application updates - Map<String, ApplicationInfo> applicationVersions = up.getVersions(urlApplication, current); - - 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()); - } - - if (canUpdateData) { + Map<UpdateModule, ApplicationInfo> versions = getModules(config); - // get report updates - Map<String, ApplicationInfo> reportVersions = up.getVersions(urlData, current); - addUpdate(reportVersions, versions, TuttiReportUpdaterCallBack.REPORT_UPDATE_NAME); - - // get db updates - Map<String, ApplicationInfo> dbVersions = up.getVersions(urlData, config.getDataDirectory()); - addUpdate(dbVersions, versions, TuttiDbUpdaterCallBack.DB_UPDATE_NAME); - } JScrollPane updatePane = new JScrollPane(); JEditorPane updateArea = new JEditorPane(); updateArea.setContentType("text/html"); @@ -222,29 +211,34 @@ public class ShowAboutAction extends AbstractMainUITuttiAction { updateArea.setBorder(null); List<String> params = Lists.newArrayList(); - for (Map.Entry<String, ApplicationInfo> entry : versions.entrySet()) { - String appName = entry.getKey(); + for (Map.Entry<UpdateModule, ApplicationInfo> entry : versions.entrySet()) { + UpdateModule appName = entry.getKey(); ApplicationInfo info = entry.getValue(); String oldVersion = info.oldVersion; String newVersion = info.newVersion; - String i18nKey = "tutti.update." + appName.toLowerCase(); - String appLabel = t(i18nKey); + String appLabel = getModuleLabel(appName); - if (log.isInfoEnabled()) { - log.info(String.format( - "Module %s, version courante %s, nouvelle version %s", - appLabel, oldVersion, newVersion)); - } + String message; if (newVersion == null) { // no update - params.add(t("tutti.about.update.app.noup.detail", appLabel, oldVersion)); + message = t("tutti.about.update.app.noup.detail", appLabel, oldVersion); + params.add(message); } else { // update exists - params.add(t("tutti.about.update.app.up.detail", appLabel, oldVersion, newVersion, appName)); + + message = t("tutti.about.update.app.up.detail", appLabel, oldVersion, newVersion, appName); + params.add(message); + + } + if (log.isInfoEnabled()) { + log.info(message); } } + String urlApplication = config.getUpdateApplicationUrl(); + String urlData = config.getUpdateDataUrl(); + String updateText = t("tutti.about.update.content", urlApplication, urlData, Joiner.on("\n").join(params)); updateArea.setText(updateText); updatePane.getViewport().add(updateArea); @@ -253,51 +247,111 @@ public class ShowAboutAction extends AbstractMainUITuttiAction { public void hyperlinkUpdate(HyperlinkEvent e) { if (HyperlinkEvent.EventType.ACTIVATED == e.getEventType()) { URL url = e.getURL(); + if (url != null) { + TuttiUIUtil.openLink(url); } else { String appType = e.getDescription(); + onUpdateLinkClicked(appType); + } + } + } + }); + about.getTabs().add(t("tutti.about.update.title"), updatePane); + } + + protected Map<UpdateModule, ApplicationInfo> getModules(TuttiConfiguration config) { + + File current = config.getBasedir(); + String urlApplication = config.getUpdateApplicationUrl(); + String urlData = config.getUpdateDataUrl(); + + ApplicationUpdater up = new ApplicationUpdater(); - if (log.isInfoEnabled()) { - log.info("Open url: " + appType); - } - AbstractTuttiAction action; + Map<UpdateModule, ApplicationInfo> versions = Maps.newLinkedHashMap(); - if (TuttiDbUpdaterCallBack.DB_UPDATE_NAME.equals(appType)) { - UpdateDbAction logicAction = getContext().getActionFactory().createLogicAction(getHandler(), UpdateDbAction.class); - action = logicAction; - if (!getContext().isDbExist()) { + if (canUpdateApplication) { - // install db - action.setActionDescription( - t("tutti.dbManager.action.installDb.tip")); - } - } else if (TuttiReportUpdaterCallBack.REPORT_UPDATE_NAME.equals(appType)) { - UpdateReportAction logicAction = getContext().getActionFactory().createLogicAction(getHandler(), UpdateReportAction.class); - action = logicAction; - } else { + // get application updates + Map<String, ApplicationInfo> applicationVersions = up.getVersions(urlApplication, current); - TuttiApplicationUpdaterCallBack.UpdateType updateType = - TuttiApplicationUpdaterCallBack.UpdateType.valueOf(appType.toUpperCase()); + addUpdate(urlApplication, UpdateModule.jre, applicationVersions, versions); + addUpdate(urlApplication, UpdateModule.launcher, applicationVersions, versions); + addUpdate(urlApplication, UpdateModule.tutti, applicationVersions, versions); + addUpdate(urlApplication, UpdateModule.i18n, applicationVersions, versions); + addUpdate(urlApplication, UpdateModule.help, applicationVersions, versions); + addUpdate(urlApplication, UpdateModule.ichtyometer, applicationVersions, versions); + } - UpdateApplicationAction logicAction = getContext().getActionFactory().createLogicAction(getHandler(), UpdateApplicationAction.class); - logicAction.setTypes(updateType); - logicAction.setActionDescription(t("tutti.main.action.updateSpecificApplication.tip", updateType.getLabel())); - action = logicAction; - } + if (canUpdateData) { - // close this dialog - getActionEngine().runAction(about.getClose()); + // get report updates + Map<String, ApplicationInfo> reportVersions = up.getVersions(urlData, current); + addUpdate(urlData, UpdateModule.report, reportVersions, versions); - // do update - getActionEngine().runAction(action); - } + // get db updates + Map<String, ApplicationInfo> dbVersions = up.getVersions(urlData, config.getDataDirectory()); + addUpdate(urlData, UpdateModule.db, dbVersions, versions); + } + return versions; + + } + + protected void onUpdateLinkClicked(String appType) { + + if (log.isInfoEnabled()) { + log.info("Open update url for module: " + appType); + } + + UpdateModule updateModuleToUpdate = UpdateModule.valueOf(appType); + + AbstractTuttiAction action; + + switch (updateModuleToUpdate) { + + case db: { + UpdateDbAction logicAction = getContext().getActionFactory().createLogicAction(getHandler(), UpdateDbAction.class); + action = logicAction; + if (!getContext().isDbExist()) { + + // install db + action.setActionDescription(t("tutti.dbManager.action.installDb.tip")); } } - }); - about.getTabs().add(t("tutti.about.update.title"), updatePane); + break; + + case report: { + UpdateReportAction logicAction = getContext().getActionFactory().createLogicAction(getHandler(), UpdateReportAction.class); + action = logicAction; + } + break; + + + default: { + UpdateApplicationAction logicAction = getContext().getActionFactory().createLogicAction(getHandler(), UpdateApplicationAction.class); + logicAction.setModulesToUpdate(updateModuleToUpdate); + String label = getModuleLabel(updateModuleToUpdate); + logicAction.setActionDescription(t("tutti.main.action.updateSpecificApplication.tip", label)); + action = logicAction; + } + + } + + // close this dialog + getActionEngine().runAction(about.getClose()); + + // do update + getActionEngine().runAction(action); + + } + + protected String getModuleLabel(UpdateModule moduleName) { + String i18nKey = "tutti.update." + moduleName.name().toLowerCase(); + String appLabel = t(i18nKey); + return appLabel; } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateApplicationAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateApplicationAction.java index 06b2ef6..ba956de 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateApplicationAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateApplicationAction.java @@ -25,10 +25,12 @@ package fr.ifremer.tutti.ui.swing.action; import fr.ifremer.tutti.TuttiConfiguration; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.ui.swing.RunTutti; -import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.MainUI; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; +import fr.ifremer.tutti.ui.swing.update.TuttiApplicationUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.update.Updates; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.updater.ApplicationUpdater; @@ -46,16 +48,15 @@ import static org.nuiton.i18n.I18n.t; public class UpdateApplicationAction extends AbstractTuttiAction<TuttiUIContext, MainUI, MainUIHandler> { /** Logger. */ - private static final Log log = - LogFactory.getLog(UpdateApplicationAction.class); + private static final Log log = LogFactory.getLog(UpdateApplicationAction.class); public UpdateApplicationAction(MainUIHandler handler) { super(handler, true); setActionDescription(t("tutti.main.action.updateApplication.tip")); - types = TuttiApplicationUpdaterCallBack.UpdateType.values(); + modulesToUpdate = Updates.getApplicationModules(); } - protected TuttiApplicationUpdaterCallBack.UpdateType[] types; + protected UpdateModule[] modulesToUpdate; protected boolean reload; @@ -74,7 +75,7 @@ public class UpdateApplicationAction extends AbstractTuttiAction<TuttiUIContext, @Override public void releaseAction() { super.releaseAction(); - types = TuttiApplicationUpdaterCallBack.UpdateType.values(); + modulesToUpdate = Updates.getApplicationModules(); } @Override @@ -95,7 +96,6 @@ public class UpdateApplicationAction extends AbstractTuttiAction<TuttiUIContext, } else { String url = config.getUpdateApplicationUrl(); - File dest = new File(config.getBasedir(), "NEW"); if (log.isInfoEnabled()) { log.info(String.format("Try to update jre, i18N, help or tutti (current application location: %s), using update url: %s", current, url)); @@ -105,18 +105,11 @@ public class UpdateApplicationAction extends AbstractTuttiAction<TuttiUIContext, context.getActionUI().getModel().setProgressionModel(progressionModel); progressionModel.setMessage(t("tutti.updateApplication.checkUpdates")); - TuttiApplicationUpdaterCallBack callback = - new TuttiApplicationUpdaterCallBack(this, progressionModel); + TuttiApplicationUpdaterCallBack callback = new TuttiApplicationUpdaterCallBack(url, this, progressionModel); - callback.setTypes(types); + callback.setModulesToUpdate(modulesToUpdate); - ApplicationUpdater up = new ApplicationUpdater(); - up.update(url, - current, - dest, - false, - callback, - progressionModel); + Updates.doUpdate(config, callback, current); if (callback.isApplicationUpdated()) { @@ -129,8 +122,8 @@ public class UpdateApplicationAction extends AbstractTuttiAction<TuttiUIContext, } } - public void setTypes(TuttiApplicationUpdaterCallBack.UpdateType... types) { - this.types = types; + public void setModulesToUpdate(UpdateModule... modulesToUpdate) { + this.modulesToUpdate = modulesToUpdate; } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateDbAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateDbAction.java index 1c032b0..03df125 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateDbAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateDbAction.java @@ -24,18 +24,17 @@ package fr.ifremer.tutti.ui.swing.action; import fr.ifremer.tutti.TuttiConfiguration; import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; +import fr.ifremer.tutti.ui.swing.update.TuttiDbUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.update.Updates; 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.t; @@ -71,14 +70,7 @@ public class UpdateDbAction extends AbstractMainUITuttiAction { if (doAction) { // get the next db version - ApplicationUpdater up = new ApplicationUpdater(); - - // get db updates - Map<String, ApplicationInfo> dbVersions = - up.getVersions(getConfig().getUpdateDataUrl(), - getConfig().getDataDirectory()); - updateDbVersion = - dbVersions.get(TuttiDbUpdaterCallBack.DB_UPDATE_NAME); + updateDbVersion = Updates.getDatabaseUpdateVersion(getConfig()); if (getContext().isDbExist() && updateDbVersion != null && @@ -114,20 +106,23 @@ public class UpdateDbAction extends AbstractMainUITuttiAction { log.info(String.format("Try to install / update db (current data location: %s), using update url: %s", current, url)); } - File dest = new File(config.getBasedir(), "NEW"); +// File dest = new File(config.getBasedir(), "NEW"); ProgressionModel progressionModel = new ProgressionModel(); context.getActionUI().getModel().setProgressionModel(progressionModel); progressionModel.setMessage(t("tutti.dbManager.action.upgradeDb.check")); - TuttiDbUpdaterCallBack callback = - new TuttiDbUpdaterCallBack(this, progressionModel); - ApplicationUpdater up = new ApplicationUpdater(); - - up.update(url, - current, - dest, - false, - callback, - progressionModel); + + TuttiDbUpdaterCallBack callback = new TuttiDbUpdaterCallBack(url, this, progressionModel); + + Updates.doUpdate(config, callback, current); + +// ApplicationUpdater up = new ApplicationUpdater(); +// +// up.update(url, +// current, +// dest, +// false, +// callback, +// progressionModel); if (callback.isDbUpdated()) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateReportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateReportAction.java index ceafb10..c3ffc2a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateReportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/UpdateReportAction.java @@ -25,10 +25,11 @@ package fr.ifremer.tutti.ui.swing.action; import fr.ifremer.tutti.TuttiConfiguration; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.ui.swing.RunTutti; -import fr.ifremer.tutti.ui.swing.TuttiReportUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.MainUI; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; +import fr.ifremer.tutti.ui.swing.update.TuttiReportUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.update.Updates; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.updater.ApplicationUpdater; @@ -86,7 +87,7 @@ public class UpdateReportAction extends AbstractTuttiAction<TuttiUIContext, Main } else { String url = config.getUpdateDataUrl(); - File dest = new File(config.getBasedir(), "NEW"); +// File dest = new File(config.getBasedir(), "NEW"); if (log.isInfoEnabled()) { log.info(String.format("Try to update repport (current application location: %s), using update url: %s", current, url)); @@ -97,17 +98,19 @@ public class UpdateReportAction extends AbstractTuttiAction<TuttiUIContext, Main progressionModel.setMessage(t("tutti.updateApplication.checkUpdates")); TuttiReportUpdaterCallBack callback = - new TuttiReportUpdaterCallBack(this, progressionModel); + new TuttiReportUpdaterCallBack(url, this, progressionModel); - ApplicationUpdater up = new ApplicationUpdater(); - up.update(url, - current, - dest, - false, - callback, - progressionModel); + Updates.doUpdate(config, callback, current); - if (callback.isReportUpdated()) { +// ApplicationUpdater up = new ApplicationUpdater(); +// up.update(url, +// current, +// dest, +// false, +// callback, +// progressionModel); + + if (callback.isApplicationUpdated()) { reload = true; 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 5ab3367..ea1e567 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 @@ -24,15 +24,14 @@ package fr.ifremer.tutti.ui.swing.content.db; import com.google.common.collect.Maps; import fr.ifremer.tutti.TuttiConfiguration; -import fr.ifremer.tutti.ui.swing.TuttiDbUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.update.Updates; 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.Version; import javax.swing.JComponent; @@ -41,8 +40,8 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Map; -import static org.nuiton.i18n.I18n.t; import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.t; /** * @author tchemit <chemit@codelutin.com> @@ -60,8 +59,7 @@ public class DbManagerUIHandler extends AbstractTuttiUIHandler<TuttiUIContext, D if (log.isInfoEnabled()) { - log.info("Rebuild information text... (dbExist?" + dbExist + - "/ dbLoaded?" + dbLoaded + ")"); + log.info("Rebuild information text... (dbExist?" + dbExist + "/ dbLoaded?" + dbLoaded + ")"); } String message; @@ -96,13 +94,9 @@ public class DbManagerUIHandler extends AbstractTuttiUIHandler<TuttiUIContext, D // get referential version if (getContext().checkUpdateDataReachable(false)) { - String urlDb = config.getUpdateDataUrl(); - - ApplicationUpdater up = new ApplicationUpdater(); - Map<String, ApplicationInfo> dbVersions = up.getVersions(urlDb, config.getDataDirectory()); +// String urlDb = config.getUpdateDataUrl(); - ApplicationInfo updateDbVersion = - dbVersions.get(TuttiDbUpdaterCallBack.DB_UPDATE_NAME); + ApplicationInfo updateDbVersion = Updates.getDatabaseUpdateVersion(getConfig()); String currentReferentialVersion = updateDbVersion.oldVersion; String newReferentialVersion = updateDbVersion.newVersion; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/ApplicationUpdateException.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/ApplicationUpdateException.java new file mode 100644 index 0000000..e5f2f86 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/ApplicationUpdateException.java @@ -0,0 +1,26 @@ +package fr.ifremer.tutti.ui.swing.update; + +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.nuiton.jaxx.application.ApplicationTechnicalException; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.12.1 + */ +public class ApplicationUpdateException extends ApplicationTechnicalException { + + private static final long serialVersionUID = 1L; + + private final UpdateModule updateModule; + + public ApplicationUpdateException(UpdateModule updateModule, String message, Throwable cause) { + super(message, cause); + this.updateModule = updateModule; + } + + public UpdateModule getUpdateModule() { + return updateModule; + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiApplicationUpdaterCallBack.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiApplicationUpdaterCallBack.java new file mode 100644 index 0000000..34b0cd8 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiApplicationUpdaterCallBack.java @@ -0,0 +1,59 @@ +package fr.ifremer.tutti.ui.swing.update; + +/* + * #%L + * Tutti :: UI + * %% + * Copyright (C) 2012 - 2014 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.collect.ImmutableMap; +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.ui.swing.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.update.module.HelpModuleUpdater; +import fr.ifremer.tutti.ui.swing.update.module.I18NModuleUpdater; +import fr.ifremer.tutti.ui.swing.update.module.IchtyometerModuleUpdater; +import fr.ifremer.tutti.ui.swing.update.module.JreModuleUpdater; +import fr.ifremer.tutti.ui.swing.update.module.LauncherModuleUpdater; +import fr.ifremer.tutti.ui.swing.update.module.ModuleUpdaterSupport; +import fr.ifremer.tutti.ui.swing.update.module.TuttiModuleUpdater; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; + +/** + * CallBack to update all application modules. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 1.0 + */ +public class TuttiApplicationUpdaterCallBack extends TuttiUpdaterCallBackSupport { + + public TuttiApplicationUpdaterCallBack(String url, AbstractTuttiAction action, ProgressionModel progressionModel) { + super(url, + ImmutableMap.<UpdateModule, ModuleUpdaterSupport>builder() + .put(UpdateModule.launcher, new LauncherModuleUpdater()) + .put(UpdateModule.jre, new JreModuleUpdater()) + .put(UpdateModule.tutti, new TuttiModuleUpdater()) + .put(UpdateModule.i18n, new I18NModuleUpdater()) + .put(UpdateModule.help, new HelpModuleUpdater()) + .put(UpdateModule.ichtyometer, new IchtyometerModuleUpdater()) + .build(), + action, + progressionModel); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiDbUpdaterCallBack.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiDbUpdaterCallBack.java new file mode 100644 index 0000000..2ddf55d --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiDbUpdaterCallBack.java @@ -0,0 +1,76 @@ +package fr.ifremer.tutti.ui.swing.update; + +/* + * #%L + * Tutti :: UI + * %% + * Copyright (C) 2012 - 2014 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.collect.ImmutableMap; +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.ui.swing.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.update.module.DbModuleUpdater; +import fr.ifremer.tutti.ui.swing.update.module.ModuleUpdaterSupport; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.nuiton.updater.ApplicationInfo; + +import static org.nuiton.i18n.I18n.t; + +/** + * CallBack to update db. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.6 + */ +public class TuttiDbUpdaterCallBack extends TuttiUpdaterCallBackSupport { + + public TuttiDbUpdaterCallBack(String url, AbstractTuttiAction action, ProgressionModel progressionModel) { + super(url, + ImmutableMap.<UpdateModule, ModuleUpdaterSupport>of(UpdateModule.db, new DbModuleUpdater()), + action, + progressionModel); + super.setModulesToUpdate(UpdateModule.db); + } + + @Override + public void setModulesToUpdate(UpdateModule... modulesToUpdate) { + throw new IllegalStateException("You are not allowed to use this method on " + this); + } + + public boolean isDbUpdated() { + DbModuleUpdater moduleUpdater = (DbModuleUpdater) getModuleUpdater(UpdateModule.db); + return moduleUpdater.isDbUpdated(); + } + + public boolean isDbInstalled() { + DbModuleUpdater moduleUpdater = (DbModuleUpdater) getModuleUpdater(UpdateModule.db); + return moduleUpdater.isDbInstalled(); + } + + @Override + public void startUpdate(ApplicationInfo info) { + + if (isDbInstalled()) { + progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.db.installation", info.newVersion)); + } else if (isDbUpdated()) { + progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.db.update", info.newVersion)); + } + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiReportUpdaterCallBack.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiReportUpdaterCallBack.java new file mode 100644 index 0000000..b9f126d --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiReportUpdaterCallBack.java @@ -0,0 +1,53 @@ +package fr.ifremer.tutti.ui.swing.update; + +/* + * #%L + * Tutti :: UI + * %% + * Copyright (C) 2012 - 2014 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.collect.ImmutableMap; +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.ui.swing.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.update.module.ModuleUpdaterSupport; +import fr.ifremer.tutti.ui.swing.update.module.ReportModuleUpdater; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; + +/** + * CallBack to update reports. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.6 + */ +public class TuttiReportUpdaterCallBack extends TuttiUpdaterCallBackSupport { + + public TuttiReportUpdaterCallBack(String url, AbstractTuttiAction action, ProgressionModel progressionModel) { + super(url, + ImmutableMap.<UpdateModule, ModuleUpdaterSupport>of(UpdateModule.report, new ReportModuleUpdater()), + action, + progressionModel); + super.setModulesToUpdate(UpdateModule.report); + } + + @Override + public void setModulesToUpdate(UpdateModule... modulesToUpdate) { + throw new IllegalStateException("You are not allowed to use this method on " + this); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiUpdaterCallBackSupport.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiUpdaterCallBackSupport.java new file mode 100644 index 0000000..60a86de --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiUpdaterCallBackSupport.java @@ -0,0 +1,150 @@ +package fr.ifremer.tutti.ui.swing.update; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.update.module.ModuleUpdaterSupport; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.application.swing.action.ApplicationActionException; +import org.nuiton.updater.ApplicationInfo; +import org.nuiton.updater.ApplicationUpdaterCallback; + +import java.util.Map; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.12.1 + */ +public abstract class TuttiUpdaterCallBackSupport implements ApplicationUpdaterCallback { + + /** Logger. */ + private static final Log log = LogFactory.getLog(TuttiReportUpdaterCallBack.class); + + protected final TuttiUIContext context; + + protected ProgressionModel progressionModel; + + protected final AbstractTuttiAction action; + + protected final String url; + + protected final Map<UpdateModule, ModuleUpdaterSupport> allUpdaters; + + /** + * Modules to update. + */ + protected Set<UpdateModule> modulesToUpdate; + + protected boolean applicationUpdated; + + public TuttiUpdaterCallBackSupport(String url, Map<UpdateModule, ModuleUpdaterSupport> allUpdaters, AbstractTuttiAction action, + ProgressionModel progressionModel) { + this.url = url; + this.action = action; + this.allUpdaters = allUpdaters; + this.context = action.getContext(); + this.progressionModel = progressionModel; + } + + public void setModulesToUpdate(UpdateModule... modulesToUpdate) { + this.modulesToUpdate = Sets.newHashSet(modulesToUpdate); + } + + public boolean isApplicationUpdated() { + return applicationUpdated; + } + + public String getUrl() { + return url; + } + + public ProgressionModel getProgressionModel() { + return progressionModel; + } + + @Override + public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) { + + Map<String, ApplicationInfo> result = Maps.newHashMap(); + + for (UpdateModule updateModule : modulesToUpdate) { + ModuleUpdaterSupport moduleUpdaterSupport = getModuleUpdater(updateModule); + ApplicationInfo info = moduleUpdaterSupport.updateToDo(context, appToUpdate); + if (info != null) { + result.put(info.name, info); + } + } + + return result; + + } + + @Override + public void startUpdate(ApplicationInfo info) { + + for (UpdateModule updateModule : modulesToUpdate) { + + ModuleUpdaterSupport moduleUpdaterSupport = getModuleUpdater(updateModule); + if (moduleUpdaterSupport.matchUpdate(info)) { + + String moduleLabel = moduleUpdaterSupport.getLabel(); + String message = t("tutti.applicationUpdater.startUpdate", moduleLabel, info.newVersion); + if (log.isInfoEnabled()) { + log.info(message); + } + progressionModel.setMessage(message); + + } + + } + + } + + @Override + public void updateDone(Map<String, ApplicationInfo> appToUpdate, Map<String, Exception> appUpdateError) { + + boolean doRestart = false; + for (UpdateModule updateModule : modulesToUpdate) { + + ModuleUpdaterSupport moduleUpdaterSupport = getModuleUpdater(updateModule); + try { + + boolean updateDone = moduleUpdaterSupport.updateDone(context, appToUpdate, appUpdateError); + if (updateDone) { + doRestart = true; + } + + } catch (ApplicationUpdateException e) { + throw ApplicationActionException.propagateError(action, e); + } + } + + if (doRestart) { + + applicationUpdated = true; + } + + } + + @Override + public void aborted(String propertiesURL, Exception eee) { + if (log.isErrorEnabled()) { + log.error("Could not update from " + propertiesURL, eee); + } + throw ApplicationActionException.propagateError(action, eee); + } + + protected ModuleUpdaterSupport getModuleUpdater(UpdateModule updateModule) { + return allUpdaters.get(updateModule); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/Updates.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/Updates.java new file mode 100644 index 0000000..1390ef4 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/Updates.java @@ -0,0 +1,61 @@ +package fr.ifremer.tutti.ui.swing.update; + +import fr.ifremer.tutti.TuttiConfiguration; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.nuiton.updater.ApplicationInfo; +import org.nuiton.updater.ApplicationUpdater; + +import java.io.File; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.12.1 + */ +public class Updates { + + + public static ApplicationInfo getDatabaseUpdateVersion(TuttiConfiguration config) { + + ApplicationUpdater up = new ApplicationUpdater(); + + String updateDataUrl = config.getUpdateDataUrl(); + File dataDirectory = config.getDataDirectory(); + Map<String, ApplicationInfo> dbVersions = up.getVersions(updateDataUrl, dataDirectory); + ApplicationInfo applicationInfo = dbVersions.get(UpdateModule.db.name()); + + return applicationInfo; + + } + + public static <C extends TuttiUpdaterCallBackSupport> void doUpdate(TuttiConfiguration config, C callback, File current) { + + File dest = new File(config.getBasedir(), "NEW"); + + ApplicationUpdater up = new ApplicationUpdater(); + + String url = callback.getUrl(); + + up.update(url, + current, + dest, + false, + callback, + callback.getProgressionModel()); + + } + + public static UpdateModule[] getApplicationModules() { + Set<UpdateModule> result = new HashSet<>(); + for (UpdateModule updateModule : UpdateModule.values()) { + if (updateModule.getModuleConfiguration().isApplication()) { + result.add(updateModule); + } + } + return result.toArray(new UpdateModule[result.size()]); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDbUpdaterCallBack.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/DbModuleUpdater.java similarity index 56% rename from tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDbUpdaterCallBack.java rename to tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/DbModuleUpdater.java index 7289204..85bf376 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiDbUpdaterCallBack.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/DbModuleUpdater.java @@ -1,119 +1,66 @@ -package fr.ifremer.tutti.ui.swing; - -/* - * #%L - * Tutti :: UI - * %% - * Copyright (C) 2012 - 2014 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% - */ +package fr.ifremer.tutti.ui.swing.update.module; import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; import fr.ifremer.adagio.core.service.technical.synchro.ReferentialSynchroContext; import fr.ifremer.adagio.core.service.technical.synchro.ReferentialSynchroResult; -import fr.ifremer.tutti.TuttiConfiguration; -import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.referential.TuttiReferentialSynchronizeService; -import fr.ifremer.tutti.ui.swing.action.AbstractTuttiAction; -import fr.ifremer.tutti.ui.swing.util.auth.AuthenticationInfo; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.application.ApplicationTechnicalException; -import org.nuiton.jaxx.application.swing.action.ApplicationActionException; import org.nuiton.jaxx.application.swing.action.ApplicationActionUI; import org.nuiton.jaxx.application.type.ApplicationProgressionModel; import org.nuiton.updater.ApplicationInfo; import org.nuiton.updater.ApplicationUpdater; -import org.nuiton.updater.ApplicationUpdaterCallback; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; -import java.util.Map; -import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; /** - * CallBack to update db. + * Created on 1/28/15. * - * @author tchemit <chemit@codelutin.com> - * @since 2.6 + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 */ -public class TuttiDbUpdaterCallBack implements ApplicationUpdaterCallback { +public class DbModuleUpdater extends ModuleUpdaterSupport { /** 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; + private static final Log log = LogFactory.getLog(DbModuleUpdater.class); protected boolean dbInstalled; protected boolean dbUpdated; - protected final AbstractTuttiAction action; + public DbModuleUpdater() { + super(UpdateModule.db); + } - public TuttiDbUpdaterCallBack(AbstractTuttiAction action, - ProgressionModel progressionModel) { - this.action = action; - this.context = action.getContext(); - this.progressionModel = progressionModel; + public boolean isDbInstalled() { + return dbInstalled; } 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(); + protected void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) { - ApplicationInfo info = appToUpdate.get(DB_UPDATE_NAME); if (info == null) { dbInstalled = false; dbUpdated = false; } else { - result.put(info.name, info); - - if (info.needAuthentication) { - // ask auth - AuthenticationInfo authenticationInfo = context.getAuthenticationInfo(info.url); - if (authenticationInfo != null) { - info.setAuthentication(authenticationInfo.getLogin(), authenticationInfo.getPassword()); - } + if (log.isInfoEnabled()) { + log.info("Find a updatable module : " + updateModule); } if (context.isDbExist()) { @@ -127,93 +74,37 @@ public class TuttiDbUpdaterCallBack implements ApplicationUpdaterCallback { } } - return result; } @Override - public void startUpdate(ApplicationInfo info) { + public void onUpdateDone(TuttiUIContext context, ApplicationInfo info) { - if (dbInstalled) { - progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.db.installation", info.newVersion)); - } else if (dbUpdated) { - progressionModel.setMessage(t("tutti.applicationUpdater.startUpdate.db.update", info.newVersion)); + if (log.isInfoEnabled()) { + log.info(String.format( + "A db update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", + info.oldVersion, info.newVersion)); } - } - - @Override - public void updateDone(Map<String, ApplicationInfo> appToUpdate, - Map<String, Exception> appUpdateError) { - - ApplicationInfo info = appToUpdate.get(DB_UPDATE_NAME); - 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); - } - String errorMessage; - if (info != null && info.needAuthentication) { - errorMessage = t("tutti.updateDb.error.with.auth"); - } else { - errorMessage = t("tutti.updateDb.error.with.noauth"); - } - throw ApplicationActionException.propagateError( - action, new ApplicationTechnicalException(errorMessage, error)); - } else 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 -// -// TuttiConfiguration configuration = regenerateDbConf(); -// -// configuration.generateExternalDbFiles(true); - - if (dbInstalled) { + if (dbInstalled) { - // first database, just copy it to correct directory + // first database, just copy it to correct directory + prepareFirstDatabase(context, info); - prepareFirstDatabase(info); - } else if (dbUpdated) { + } else if (dbUpdated) { - // launch a referential synchronize operation - synchronizetDatabase(info); - } - } - } + // launch a referential synchronize operation + synchronizetDatabase(context, info); - @Override - public void aborted(String propertiesURL, Exception eee) { - if (log.isErrorEnabled()) { - log.error("Could not update from " + propertiesURL, eee); } - throw ApplicationActionException.propagateError(action, eee); - } - protected TuttiConfiguration regenerateDbConf() { - - TuttiConfiguration config = context.getConfig(); - - context.showInformationMessage( - "Regénérer les fichiers de configuration de la base"); - return config; } - 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; + @Override + public String getLabel() { + return t("tutti.update.db"); } - protected void prepareFirstDatabase(ApplicationInfo info) { + protected void prepareFirstDatabase(TuttiUIContext context, ApplicationInfo info) { if (log.isInfoEnabled()) { log.info("First time database was downloaded at version: " + info.newVersion); } @@ -234,10 +125,12 @@ public class TuttiDbUpdaterCallBack implements ApplicationUpdaterCallback { } } - protected void synchronizetDatabase(ApplicationInfo info) { + protected void synchronizetDatabase(TuttiUIContext context, 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(); File dbDirectory = getDbDirectory(info); @@ -270,8 +163,7 @@ public class TuttiDbUpdaterCallBack implements ApplicationUpdaterCallback { if (log.isInfoEnabled()) { log.info("Clean data context."); } - SampleCategoryModel sampleCategoryModel = - context.getDataContext().getSampleCategoryModel(); + SampleCategoryModel sampleCategoryModel = context.getDataContext().getSampleCategoryModel(); context.getDataContext().clearContext(); context.getDataContext().loadSampleCategoryModel(sampleCategoryModel); @@ -289,6 +181,14 @@ public class TuttiDbUpdaterCallBack implements ApplicationUpdaterCallback { } } + protected File getDbDirectory(ApplicationInfo info) { + File[] sources = info.destDir.listFiles(); + Preconditions.checkNotNull(sources, "Downloaded db must have at least on directory, see " + info.destDir); + Preconditions.checkState(sources.length == 1, "Downloaded db should contains one directory at " + info.destDir); + File result = sources[0]; + return result; + } + private static class DelegateProgressionModel extends ApplicationProgressionModel { private static final long serialVersionUID = 1L; @@ -361,5 +261,4 @@ public class TuttiDbUpdaterCallBack implements ApplicationUpdaterCallback { return progressionModel.getTotal(); } } - } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/HelpModuleUpdater.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/HelpModuleUpdater.java new file mode 100644 index 0000000..33fa3f8 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/HelpModuleUpdater.java @@ -0,0 +1,51 @@ +package fr.ifremer.tutti.ui.swing.update.module; + +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 + */ +public class HelpModuleUpdater extends ModuleUpdaterSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(HelpModuleUpdater.class); + + public HelpModuleUpdater() { + super(UpdateModule.help); + } + + @Override + protected void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) { + + if (info != null) { + if (log.isInfoEnabled()) { + log.info("Find a updatable module : " + updateModule); + } + } + } + + @Override + public void onUpdateDone(TuttiUIContext context, ApplicationInfo info) { + + if (log.isInfoEnabled()) { + log.info(String.format( + "A help update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", + info.oldVersion, info.newVersion)); + } + + } + + @Override + public String getLabel() { + return t("tutti.update.help"); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/I18NModuleUpdater.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/I18NModuleUpdater.java new file mode 100644 index 0000000..d4857d6 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/I18NModuleUpdater.java @@ -0,0 +1,52 @@ +package fr.ifremer.tutti.ui.swing.update.module; + +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 + */ +public class I18NModuleUpdater extends ModuleUpdaterSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(I18NModuleUpdater.class); + + public I18NModuleUpdater() { + super(UpdateModule.i18n); + } + + @Override + protected void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) { + + if (info != null) { + if (log.isInfoEnabled()) { + log.info("Find a updatable module : " + updateModule); + } + } + } + + @Override + public void onUpdateDone(TuttiUIContext context, ApplicationInfo info) { + + if (log.isInfoEnabled()) { + log.info(String.format( + "A i18n update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", + info.oldVersion, info.newVersion)); + } + + } + + @Override + public String getLabel() { + return t("tutti.update.i18n"); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/IchtyometerModuleUpdater.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/IchtyometerModuleUpdater.java new file mode 100644 index 0000000..b2d642f --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/IchtyometerModuleUpdater.java @@ -0,0 +1,52 @@ +package fr.ifremer.tutti.ui.swing.update.module; + +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 + */ +public class IchtyometerModuleUpdater extends ModuleUpdaterSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(IchtyometerModuleUpdater.class); + + public IchtyometerModuleUpdater() { + super(UpdateModule.ichtyometer); + } + + @Override + protected void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) { + + if (info != null) { + if (log.isInfoEnabled()) { + log.info("Find a updatable module : " + updateModule); + } + } + } + + @Override + public void onUpdateDone(TuttiUIContext context, ApplicationInfo info) { + + if (log.isInfoEnabled()) { + log.info(String.format( + "A ichtyometer update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", + info.oldVersion, info.newVersion)); + } + + } + + @Override + public String getLabel() { + return t("tutti.update.ichtyometer"); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/JreModuleUpdater.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/JreModuleUpdater.java new file mode 100644 index 0000000..e54ae86 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/JreModuleUpdater.java @@ -0,0 +1,52 @@ +package fr.ifremer.tutti.ui.swing.update.module; + +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 + */ +public class JreModuleUpdater extends ModuleUpdaterSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(JreModuleUpdater.class); + + public JreModuleUpdater() { + super(UpdateModule.jre); + } + + @Override + protected void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) { + + if (info != null) { + if (log.isInfoEnabled()) { + log.info("Find a updatable module : " + updateModule); + } + } + } + + @Override + public void onUpdateDone(TuttiUIContext context, ApplicationInfo info) { + + if (log.isInfoEnabled()) { + log.info(String.format( + "A jre update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", + info.oldVersion, info.newVersion)); + } + + } + + @Override + public String getLabel() { + return t("tutti.update.jre"); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/LauncherModuleUpdater.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/LauncherModuleUpdater.java new file mode 100644 index 0000000..dd17409 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/LauncherModuleUpdater.java @@ -0,0 +1,52 @@ +package fr.ifremer.tutti.ui.swing.update.module; + +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 + */ +public class LauncherModuleUpdater extends ModuleUpdaterSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(LauncherModuleUpdater.class); + + public LauncherModuleUpdater() { + super(UpdateModule.launcher); + } + + @Override + protected void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) { + + if (info != null) { + if (log.isInfoEnabled()) { + log.info("Find a updatable module : " + updateModule); + } + } + } + + @Override + public void onUpdateDone(TuttiUIContext context, ApplicationInfo info) { + + if (log.isInfoEnabled()) { + log.info(String.format( + "A launcher update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", + info.oldVersion, info.newVersion)); + } + + } + + @Override + public String getLabel() { + return t("tutti.update.launcher"); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/ModuleUpdaterSupport.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/ModuleUpdaterSupport.java new file mode 100644 index 0000000..be78ab1 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/ModuleUpdaterSupport.java @@ -0,0 +1,102 @@ +package fr.ifremer.tutti.ui.swing.update.module; + +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.update.ApplicationUpdateException; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import fr.ifremer.tutti.ui.swing.util.auth.AuthenticationInfo; +import org.nuiton.updater.ApplicationInfo; + +import java.util.Map; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 + */ +public abstract class ModuleUpdaterSupport { + + protected final UpdateModule updateModule; + + public ModuleUpdaterSupport(UpdateModule updateModule) { + this.updateModule = updateModule; + } + + public UpdateModule getUpdateModule() { + return updateModule; + } + + public boolean matchUpdate(ApplicationInfo info) { + return updateModule.name().toLowerCase().equals(info.name); + } + + public ApplicationInfo updateToDo(TuttiUIContext context, Map<String, ApplicationInfo> appToUpdate) { + + ApplicationInfo info = getInfo(appToUpdate); + + if (info != null) { + + if (info.needAuthentication) { + // ask auth + AuthenticationInfo authenticationInfo = context.getAuthenticationInfo(info.url); + if (authenticationInfo != null) { + info.setAuthentication(authenticationInfo.getLogin(), authenticationInfo.getPassword()); + } + } + } + + onUpdateToDo(context, info); + + return info; + + } + + public boolean updateDone(TuttiUIContext context, + Map<String, ApplicationInfo> appToUpdate, + Map<String, Exception> appUpdateError) throws ApplicationUpdateException { + + ApplicationInfo info = getInfo(appToUpdate); + + Exception error = getError(appUpdateError); + + if (error != null) { + + String errorMessage; + if (info != null && info.needAuthentication) { + errorMessage = t("tutti.update.error.with.auth", getLabel()); + } else { + errorMessage = t("tutti.update.error.with.noauth", getLabel()); + } + + // something bad while updating application + throw new ApplicationUpdateException(updateModule, errorMessage, error); + + } + + boolean doRestart = false; + if (info != null) { + + doRestart = true; + + onUpdateDone(context, info); + + } + return doRestart; + } + + protected abstract void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) ; + + protected abstract void onUpdateDone(TuttiUIContext context, ApplicationInfo info); + + public abstract String getLabel(); + + protected ApplicationInfo getInfo(Map<String, ApplicationInfo> appToUpdate) { + return appToUpdate.get(updateModule.name().toLowerCase()); + } + + protected Exception getError(Map<String, Exception> appUpdateError) { + return appUpdateError.get(updateModule.name().toLowerCase()); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/ReportModuleUpdater.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/ReportModuleUpdater.java new file mode 100644 index 0000000..30e076c --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/ReportModuleUpdater.java @@ -0,0 +1,51 @@ +package fr.ifremer.tutti.ui.swing.update.module; + +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.updater.ApplicationInfo; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 + */ +public class ReportModuleUpdater extends ModuleUpdaterSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ReportModuleUpdater.class); + + public ReportModuleUpdater() { + super(UpdateModule.report); + } + + @Override + protected void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) { + + if (info != null) { + if (log.isInfoEnabled()) { + log.info("Find a updatable module : " + updateModule); + } + } + } + + @Override + public void onUpdateDone(TuttiUIContext context, ApplicationInfo info) { + + if (log.isInfoEnabled()) { + log.info(String.format( + "A report update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", + info.oldVersion, info.newVersion)); + } + + } + + @Override + public String getLabel() { + return t("tutti.update.report"); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/TuttiModuleUpdater.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/TuttiModuleUpdater.java new file mode 100644 index 0000000..39339a9 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/TuttiModuleUpdater.java @@ -0,0 +1,81 @@ +package fr.ifremer.tutti.ui.swing.update.module; + +import fr.ifremer.tutti.TuttiConfiguration; +import fr.ifremer.tutti.TuttiConfigurationOption; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.updater.UpdateModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.application.ApplicationIOUtil; +import org.nuiton.updater.ApplicationInfo; +import org.nuiton.util.version.Version; +import org.nuiton.util.version.Versions; + +import java.io.File; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.13 + */ +public class TuttiModuleUpdater extends ModuleUpdaterSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(TuttiModuleUpdater.class); + + public TuttiModuleUpdater() { + super(UpdateModule.tutti); + } + + @Override + protected void onUpdateToDo(TuttiUIContext context, ApplicationInfo info) { + + if (info != null) { + if (log.isInfoEnabled()) { + log.info("Find a updatable module : " + updateModule); + } + } + } + + @Override + public void onUpdateDone(TuttiUIContext context, ApplicationInfo info) { + + if (log.isInfoEnabled()) { + log.info(String.format( + "A tutti update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it", + info.oldVersion, info.newVersion)); + } + + TuttiConfiguration config = context.getConfig(); + + // must remove db cache directory + File cacheDirectory = config.getCacheDirectory(); + ApplicationIOUtil.forceDeleteOnExit( + cacheDirectory, + t("tutti.applicationUpdater.updateDone.deleteDirectory.caches.error", cacheDirectory) + ); + + Version oldVersion = Versions.valueOf(info.oldVersion); + + if (config.isFullLaunchMode() && oldVersion.before(Versions.valueOf("3.7.1"))) { + + // clean application data source (only if coming from before a 3.7.1 version) + if (log.isInfoEnabled()) { + log.info("Remove from configuration tutti.update.application.url: " + config.getUpdateApplicationUrl()); + } + config.getApplicationConfig().setOption(TuttiConfigurationOption.UPDATE_APPLICATION_URL.getKey(), ""); + config.save(); + + } + + } + + @Override + public String getLabel() { + return t("tutti.update.tutti"); + } + +} diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 3d7bad5..fe16052 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -12,11 +12,13 @@ tutti.about.update.content= tutti.about.update.title= tutti.addSampleCategoryBenthosBatch.title= tutti.addSampleCategorySpeciesBatch.title= +tutti.applicationUpdater.error= tutti.applicationUpdater.help.error= tutti.applicationUpdater.i18n.error= tutti.applicationUpdater.jre.error= tutti.applicationUpdater.prepareFirstDB.copyDirectory.error= tutti.applicationUpdater.prepareFirstDB.deleteDirectory.error= +tutti.applicationUpdater.startUpdate= tutti.applicationUpdater.startUpdate.db.installation= tutti.applicationUpdater.startUpdate.db.update= tutti.applicationUpdater.startUpdate.help= @@ -1841,9 +1843,13 @@ tutti.title.openReplaceTemporaryVesselUI.noSource= tutti.title.openReplaceTemporaryVesselUI.noTarget= tutti.ui.change.species.decorator= tutti.update.db= +tutti.update.error.with.auth= +tutti.update.error.with.noauth= tutti.update.help= tutti.update.i18n= +tutti.update.ichtyometer= tutti.update.jre= +tutti.update.launcher= tutti.update.report= tutti.update.tutti= tutti.updateApplication.checkUpdates= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index b016b28..d65e066 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -12,18 +12,13 @@ tutti.about.update.content=<h2>Mises à jour d'Allegro Campagne</h2><p>Fichier d tutti.about.update.title=Mises à jour tutti.addSampleCategoryBenthosBatch.title=Catégorisation du lot (ajout) tutti.addSampleCategorySpeciesBatch.title=Catégorisation du lot (ajout) -tutti.applicationUpdater.help.error=Impossible de télécharger la mise à jour de l'aide.<br/>Si le problème persiste, veuillez consulter l'administrateur. -tutti.applicationUpdater.i18n.error=Impossible de télécharger la mise à jour des traductions.<br/>Si le problème persiste, veuillez consulter l'administrateur. -tutti.applicationUpdater.jre.error=Impossible de télécharger la mise à jour de l'environnement java.<br/>Si le problème persiste, veuillez consulter l'administrateur. +tutti.applicationUpdater.error=Impossible de télécharger la mise à jour du module <strong>%s</strong>.<br/>Si le problème persiste, veuillez consulter l'administrateur. tutti.applicationUpdater.prepareFirstDB.copyDirectory.error=Erreur lors de la copie du contenu du dossier %1s vers %2s tutti.applicationUpdater.prepareFirstDB.deleteDirectory.error=Erreur lors de la suppression du dossier %s +tutti.applicationUpdater.startUpdate=Téléchargement et installation d'une nouvelle version du module <strong>%s</strong> (version %s) tutti.applicationUpdater.startUpdate.db.installation=Téléchargement et installation de la base (version %s) tutti.applicationUpdater.startUpdate.db.update=Téléchargement et mise à jour de la base (version %s) -tutti.applicationUpdater.startUpdate.help=Téléchargement et installation d'une nouvelle version de l'aide (version %s) -tutti.applicationUpdater.startUpdate.i18n=Téléchargement et installation d'une nouvelle version des traductions (version %s) -tutti.applicationUpdater.startUpdate.jre=Téléchargement et installation d'une nouvelle JRE (version %s) -tutti.applicationUpdater.startUpdate.report=Téléchargement et installation d'une nouvelle version des rapport (version %s) -tutti.applicationUpdater.startUpdate.tutti=Téléchargement et installation d'une nouvelle version de l'application (version %s) +tutti.applicationUpdater.startUpdate.report= 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 @@ -1740,9 +1735,13 @@ tutti.title.openReplaceTemporaryUI.noSource=Pas de référentiel temporaire de t tutti.title.openReplaceTemporaryUI.noTarget=Pas de référentiel officiel de type %s dans la base tutti.ui.change.species.decorator=Changer la décoration tutti.update.db=Base de données +tutti.update.error.with.auth=Impossible de télécharger la mise à jour du module <strong>%s</strong>.<br/>Le login / mot de passe que vous avez saisis n'étaient peut-être pas corrects.<br/>Si le problème persiste, veuillez consulter l'administrateur. +tutti.update.error.with.noauth=Impossible de télécharger la mise à jour du module <strong>%s</strong>.<br/>Si le problème persiste, veuillez consulter l'administrateur. tutti.update.help=Aide en ligne tutti.update.i18n=Traductions +tutti.update.ichtyometer=Ichtyometre tutti.update.jre=Java +tutti.update.launcher=Lanceur d'application tutti.update.report=Rapports tutti.update.tutti=Allegro Campagne tutti.updateApplication.checkUpdates=Recherche de mises à jour -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.