branch develop updated (472392e -> 1922f47)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository tutti. See http://git.codelutin.com/tutti.git from 472392e fixes #6569 [ERGONOMIE] amélioration de la visibilité et du déclanchement des .csv et .pdf sur les traits new f2701dc ajout d'une configuration pour les modules new ff89982 description de toutes les mises à jour possibles dans le module updater (pour réutiliser ce code dans le module d'ui) new 95b8dcb remove unsued method new 1922f47 refactor des mises à jour The 4 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 1922f4774fc467bca5187e4dfff9cdebf1416bd7 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jan 28 14:02:01 2015 +0100 refactor des mises à jour commit 95b8dcbc0e6d0cebb7c6d435b86a7a7b4799a730 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jan 28 14:01:19 2015 +0100 remove unsued method commit ff89982658fda3037bf111c8d8ed8de7b4f116ac Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jan 28 10:03:58 2015 +0100 description de toutes les mises à jour possibles dans le module updater (pour réutiliser ce code dans le module d'ui) commit f2701dc1607d8dfadc8715fef7fdb0f72500ab08 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jan 28 10:03:02 2015 +0100 ajout d'une configuration pour les modules Summary of changes: .../fr/ifremer/tutti/service/TuttiDataContext.java | 1 + .../updater/{Module.java => UpdateModule.java} | 50 ++-- .../swing/updater/UpdateModuleConfiguration.java | 55 ++++ .../fr/ifremer/tutti/ui/swing/updater/Updater.java | 53 ++-- .../ui/swing/updater/UpdaterFileSystemPathes.java | 40 +-- tutti-ui-swing/pom.xml | 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 +- 32 files changed, 1303 insertions(+), 861 deletions(-) rename tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/{Module.java => UpdateModule.java} (50%) create mode 100644 tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModuleConfiguration.java delete mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java delete mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiReportUpdaterCallBack.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/ApplicationUpdateException.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiApplicationUpdaterCallBack.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiDbUpdaterCallBack.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiReportUpdaterCallBack.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/TuttiUpdaterCallBackSupport.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/Updates.java rename tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/{TuttiDbUpdaterCallBack.java => update/module/DbModuleUpdater.java} (56%) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/HelpModuleUpdater.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/I18NModuleUpdater.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/IchtyometerModuleUpdater.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/JreModuleUpdater.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/LauncherModuleUpdater.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/ModuleUpdaterSupport.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/ReportModuleUpdater.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/module/TuttiModuleUpdater.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 f2701dc1607d8dfadc8715fef7fdb0f72500ab08 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jan 28 10:03:02 2015 +0100 ajout d'une configuration pour les modules --- .../swing/updater/UpdateModuleConfiguration.java | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModuleConfiguration.java b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModuleConfiguration.java new file mode 100644 index 0000000..d8cd65c --- /dev/null +++ b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModuleConfiguration.java @@ -0,0 +1,55 @@ +package fr.ifremer.tutti.ui.swing.updater; + +import java.io.Serializable; + +/** + * Created on 1/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.12.1 + */ +public class UpdateModuleConfiguration implements Serializable { + + private static final long serialVersionUID = 1L; + + public static UpdateModuleConfiguration applicationAndRuntime() { + return new UpdateModuleConfiguration(true, true, true); + } + + public static UpdateModuleConfiguration applicationAndNotRuntime() { + return new UpdateModuleConfiguration(false, true, true); + } + + public static UpdateModuleConfiguration data(boolean manageByUpdater) { + return new UpdateModuleConfiguration(false, false, manageByUpdater); + } + + private final boolean runtime; + + private final boolean application; + + private final boolean manageByUpdater; + + private UpdateModuleConfiguration(boolean runtime, boolean application, boolean manageByUpdater) { + this.runtime = runtime; + this.application = application; + this.manageByUpdater = manageByUpdater; + } + + public boolean isRuntime() { + return runtime; + } + + public boolean isApplication() { + return application; + } + + public boolean isData() { + return !isApplication(); + } + + public boolean isManageByUpdater() { + return manageByUpdater; + } + +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 ff89982658fda3037bf111c8d8ed8de7b4f116ac Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jan 28 10:03:58 2015 +0100 description de toutes les mises à jour possibles dans le module updater (pour réutiliser ce code dans le module d'ui) --- .../fr/ifremer/tutti/ui/swing/updater/Module.java | 58 ----------------- .../tutti/ui/swing/updater/UpdateModule.java | 76 ++++++++++++++++++++++ .../fr/ifremer/tutti/ui/swing/updater/Updater.java | 53 ++++++++------- .../ui/swing/updater/UpdaterFileSystemPathes.java | 40 ++++++------ tutti-ui-swing/pom.xml | 1 - 5 files changed, 124 insertions(+), 104 deletions(-) diff --git a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/Module.java b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/Module.java deleted file mode 100644 index 45a4384..0000000 --- a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/Module.java +++ /dev/null @@ -1,58 +0,0 @@ -package fr.ifremer.tutti.ui.swing.updater; - -/* - * #%L - * Tutti :: UI Updater - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2012 - 2015 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% - */ - -/** -* Created on 1/26/15. -* -* @author Tony Chemit - chemit@codelutin.com -* @since 3.12 -*/ -public enum Module { - - launcher(true), - jre(true), - - tutti(false), - i18n(false), - help(false), - report(false), - ichtyometer(false); - - private final boolean runtimeModule; - - Module(boolean runtimeModule) { - this.runtimeModule = runtimeModule; - } - - public boolean isRuntimeModule() { - return runtimeModule; - } - - public String getModuleLoggerName() { - String moduleNameStr = String.format("[Module %1$-20s]", name()); - return moduleNameStr; - } -} diff --git a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModule.java b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModule.java new file mode 100644 index 0000000..9a028aa --- /dev/null +++ b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModule.java @@ -0,0 +1,76 @@ +package fr.ifremer.tutti.ui.swing.updater; + +/* + * #%L + * Tutti :: UI Updater + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2012 - 2015 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 java.util.HashSet; +import java.util.Set; + +/** + * Created on 1/26/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.12 + */ +public enum UpdateModule { + + // Application - runtime + launcher(UpdateModuleConfiguration.applicationAndRuntime()), + jre(UpdateModuleConfiguration.applicationAndRuntime()), + + // Application - not runtime + tutti(UpdateModuleConfiguration.applicationAndNotRuntime()), + i18n(UpdateModuleConfiguration.applicationAndNotRuntime()), + help(UpdateModuleConfiguration.applicationAndNotRuntime()), + ichtyometer(UpdateModuleConfiguration.applicationAndNotRuntime()), + + // Data + report(UpdateModuleConfiguration.data(true)), + db(UpdateModuleConfiguration.data(false)); + + private final UpdateModuleConfiguration moduleConfiguration; + + UpdateModule(UpdateModuleConfiguration moduleConfiguration) { + this.moduleConfiguration = moduleConfiguration; + } + + public UpdateModuleConfiguration getModuleConfiguration() { + return moduleConfiguration; + } + + public String getModuleLoggerName() { + String moduleNameStr = String.format("[Module %1$-20s]", name()); + return moduleNameStr; + } + + public static UpdateModule[] getApplicationModules() { + Set<UpdateModule> result = new HashSet<>(); + for (UpdateModule updateModule : values()) { + if (updateModule.getModuleConfiguration().isApplication()) { + result.add(updateModule); + } + } + return result.toArray(new UpdateModule[result.size()]); + } +} diff --git a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/Updater.java b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/Updater.java index 4b8d75f..253acdb 100644 --- a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/Updater.java +++ b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/Updater.java @@ -92,7 +92,7 @@ public class Updater { } else { // update application modules - updateApplicationModules(); + updateNoneRuntimeModules(); // clean files cleanFiles(); @@ -125,11 +125,12 @@ public class Updater { boolean mustUpdateRuntime = false; - for (Module module : Module.values()) { + for (UpdateModule updateModule : UpdateModule.values()) { - if (module.isRuntimeModule()) { + UpdateModuleConfiguration moduleConfiguration = updateModule.getModuleConfiguration(); + if (moduleConfiguration.isManageByUpdater() && moduleConfiguration.isRuntime()) { - boolean updateFound = updateRuntimeModule(module); + boolean updateFound = updateRuntimeModule(updateModule); if (updateFound) { mustUpdateRuntime = true; @@ -163,38 +164,40 @@ public class Updater { } - protected void updateApplicationModules() throws IOException { + protected void updateNoneRuntimeModules() throws IOException { - for (Module module : Module.values()) { + for (UpdateModule updateModule : UpdateModule.values()) { - if (!module.isRuntimeModule()) { + UpdateModuleConfiguration moduleConfiguration = updateModule.getModuleConfiguration(); - updateApplicationModule(module); + if (moduleConfiguration.isManageByUpdater() && !moduleConfiguration.isRuntime()) { + + updateNoneRuntimeModule(updateModule); } } } - protected boolean updateRuntimeModule(Module module) throws IOException { + protected boolean updateRuntimeModule(UpdateModule updateModule) throws IOException { - boolean moduleExist = pathHelper.isModuleExists(module); - boolean updateModuleExist = pathHelper.isUpdateModuleExists(module); + boolean moduleExist = pathHelper.isModuleExists(updateModule); + boolean updateModuleExist = pathHelper.isUpdateModuleExists(updateModule); - String oldVersion = moduleExist ? pathHelper.getModuleVersion(module) : "None"; + String oldVersion = moduleExist ? pathHelper.getModuleVersion(updateModule) : "None"; - String moduleNameStr = module.getModuleLoggerName(); + String moduleNameStr = updateModule.getModuleLoggerName(); System.out.println(String.format("%s Current version: %s", moduleNameStr, oldVersion)); if (updateModuleExist) { - String newVersion = pathHelper.getUpdateModuleVersion(module); + String newVersion = pathHelper.getUpdateModuleVersion(updateModule); System.out.println(String.format("%s New version detected %s", moduleNameStr, newVersion)); // Remove older backup - pathHelper.removeOlderBackup(module); + pathHelper.removeOlderBackup(updateModule); } else { @@ -206,37 +209,37 @@ public class Updater { } - protected void updateApplicationModule(Module module) throws IOException { + protected void updateNoneRuntimeModule(UpdateModule updateModule) throws IOException { - boolean moduleExist = pathHelper.isModuleExists(module); - boolean updateModuleExist = pathHelper.isUpdateModuleExists(module); + boolean moduleExist = pathHelper.isModuleExists(updateModule); + boolean updateModuleExist = pathHelper.isUpdateModuleExists(updateModule); - String oldVersion = moduleExist ? pathHelper.getModuleVersion(module) : "None"; + String oldVersion = moduleExist ? pathHelper.getModuleVersion(updateModule) : "None"; - String moduleNameStr = module.getModuleLoggerName(); + String moduleNameStr = updateModule.getModuleLoggerName(); System.out.println(String.format("%s Current version: %s", moduleNameStr, oldVersion)); if (updateModuleExist) { - String newVersion = pathHelper.getUpdateModuleVersion(module); + String newVersion = pathHelper.getUpdateModuleVersion(updateModule); System.out.println(String.format("%s New version detected %s", moduleNameStr, newVersion)); - pathHelper.removeOlderBackup(module); + pathHelper.removeOlderBackup(updateModule); - Path modulePath = pathHelper.getModulePath(module); + Path modulePath = pathHelper.getModulePath(updateModule); if (moduleExist) { // Backup existing module - pathHelper.backupModule(module, oldVersion); + pathHelper.backupModule(updateModule, oldVersion); } // Installing new module System.out.println(String.format("%s Install new version %s", moduleNameStr, newVersion)); - Path moduleNewPath = pathHelper.getUpdateModulePath(module); + Path moduleNewPath = pathHelper.getUpdateModulePath(updateModule); Files.move(moduleNewPath, modulePath, StandardCopyOption.REPLACE_EXISTING); } else { diff --git a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdaterFileSystemPathes.java b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdaterFileSystemPathes.java index 82f2772..25eafd0 100644 --- a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdaterFileSystemPathes.java +++ b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdaterFileSystemPathes.java @@ -55,43 +55,43 @@ public class UpdaterFileSystemPathes { return updateDirectory; } - public Path getUpdateModulePath(Module module) { - Path modulePath = getUpdateDirectory().resolve(module.name()); + public Path getUpdateModulePath(UpdateModule updateModule) { + Path modulePath = getUpdateDirectory().resolve(updateModule.name()); return modulePath; } - public boolean isUpdateModuleExists(Module module) { + public boolean isUpdateModuleExists(UpdateModule updateModule) { - Path updateModulePath = getUpdateModulePath(module); + Path updateModulePath = getUpdateModulePath(updateModule); boolean isDirectory = Files.isDirectory(updateModulePath); return isDirectory; } - public String getUpdateModuleVersion(Module module) throws IOException { + public String getUpdateModuleVersion(UpdateModule updateModule) throws IOException { - Path updateModulePath = getUpdateModulePath(module); + Path updateModulePath = getUpdateModulePath(updateModule); String version = getVersion(updateModulePath); return version; } - public Path getModulePath(Module module) { - Path modulePath = baseDir.resolve(module.name()); + public Path getModulePath(UpdateModule updateModule) { + Path modulePath = baseDir.resolve(updateModule.name()); return modulePath; } - public boolean isModuleExists(Module module) { + public boolean isModuleExists(UpdateModule updateModule) { - Path modulePath = getModulePath(module); + Path modulePath = getModulePath(updateModule); boolean isDirectory = Files.isDirectory(modulePath); return isDirectory; } - public String getModuleVersion(Module module) throws IOException { + public String getModuleVersion(UpdateModule updateModule) throws IOException { - Path modulePath = getModulePath(module); + Path modulePath = getModulePath(updateModule); String version = getVersion(modulePath); return version; @@ -107,7 +107,7 @@ public class UpdaterFileSystemPathes { public void cleanObsoleteFiles() throws IOException { - Path applicationDirectoryPath = getModulePath(Module.tutti); + Path applicationDirectoryPath = getModulePath(UpdateModule.tutti); if (windowsOS) { @@ -154,29 +154,29 @@ public class UpdaterFileSystemPathes { } - public void removeOlderBackup(Module module) throws IOException { + public void removeOlderBackup(UpdateModule updateModule) throws IOException { - String moduleName = module.name(); + String moduleName = updateModule.name(); Path backupDirectory = getBackupDirectory(); // Remove older backup - System.out.println(String.format("%s Clean backup directory %s", module.getModuleLoggerName(), backupDirectory + File.separator + moduleName + "-*")); + System.out.println(String.format("%s Clean backup directory %s", updateModule.getModuleLoggerName(), backupDirectory + File.separator + moduleName + "-*")); DeleteHelper.deleteDirectories(backupDirectory, moduleName + "-*"); } - public void backupModule(Module module, String version) throws IOException { + public void backupModule(UpdateModule updateModule, String version) throws IOException { - Path modulePath = getModulePath(module); + Path modulePath = getModulePath(updateModule); - String moduleName = module.name(); + String moduleName = updateModule.name(); Path backupDirectory = getBackupDirectory(); Path backupModulePath = backupDirectory.resolve(String.format("%s-%s-%s", moduleName, version, backupDate)); - System.out.println(String.format("%s Backup old version %s to %s", module.getModuleLoggerName(), version, backupModulePath)); + System.out.println(String.format("%s Backup old version %s to %s", updateModule.getModuleLoggerName(), version, backupModulePath)); Files.move(modulePath, backupModulePath); } diff --git a/tutti-ui-swing/pom.xml b/tutti-ui-swing/pom.xml index 0e33be5..cf70c53 100644 --- a/tutti-ui-swing/pom.xml +++ b/tutti-ui-swing/pom.xml @@ -114,7 +114,6 @@ <groupId>${project.groupId}</groupId> <artifactId>tutti-ui-swing-updater</artifactId> <version>${project.version}</version> - <scope>runtime</scope> </dependency> <!-- Adagio --> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 95b8dcbc0e6d0cebb7c6d435b86a7a7b4799a730 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jan 28 14:01:19 2015 +0100 remove unsued method --- .../java/fr/ifremer/tutti/ui/swing/updater/UpdateModule.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModule.java b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModule.java index 9a028aa..32518e6 100644 --- a/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModule.java +++ b/tutti-ui-swing-updater/src/main/java/fr/ifremer/tutti/ui/swing/updater/UpdateModule.java @@ -24,9 +24,6 @@ package fr.ifremer.tutti.ui.swing.updater; * #L% */ -import java.util.HashSet; -import java.util.Set; - /** * Created on 1/26/15. * @@ -64,13 +61,4 @@ public enum UpdateModule { return moduleNameStr; } - public static UpdateModule[] getApplicationModules() { - Set<UpdateModule> result = new HashSet<>(); - for (UpdateModule updateModule : values()) { - if (updateModule.getModuleConfiguration().isApplication()) { - result.add(updateModule); - } - } - return result.toArray(new UpdateModule[result.size()]); - } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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>.
participants (1)
-
codelutin.com scm