mailman.cloud.codelutin.com
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

Observe-commits

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2013 -----
  • December
  • November
  • October
  • September
observe-commits@list.forge.codelutin.com

  • 7199 discussions
[Git][ultreiaio/ird-observe][master-7.x] 9 commits: [jgitflow-maven-plugin]updating poms for 7.5.1-SNAPSHOT development[skip ci]
by Tony CHEMIT 13 Apr '20

13 Apr '20
Tony CHEMIT pushed to branch master-7.x at ultreiaio / ird-observe Commits: 31b08b24 by tchemit at 2020-04-01T11:49:30+02:00 [jgitflow-maven-plugin]updating poms for 7.5.1-SNAPSHOT development[skip ci] - - - - - a16952c8 by tchemit at 2020-04-01T11:57:45+02:00 [jgitflow-maven-plugin]updating develop poms to master versions to avoid merge conflicts[skip ci] - - - - - ea1dddca by tchemit at 2020-04-01T11:57:46+02:00 [jgitflow-maven-plugin]merging 'master-7.x' into 'develop-7.x' - - - - - 59b76914 by tchemit at 2020-04-01T11:57:46+02:00 [jgitflow-maven-plugin]Updating develop poms back to pre merge state[skip ci] - - - - - 3d070135 by tchemit at 2020-04-04T16:24:52+02:00 Mise à jour simple de référentiel échoue en v7.5.0 - Closes #1461 - - - - - 5b631f82 by tchemit at 2020-04-06T15:01:48+02:00 Vérifier la présence ou ajouter un champ PS trip.homeid - Closes #1383 - - - - - ae6dc319 by tchemit at 2020-04-14T00:44:33+02:00 Accumulation de fichiers - Closes #1462 (report v7) - - - - - 2cd3fd54 by tchemit at 2020-04-14T00:54:37+02:00 [jgitflow-maven-plugin]updating poms for branch'release/7.5.1' with non-snapshot versions[skip ci] - - - - - 9d3129f4 by tchemit at 2020-04-14T01:03:32+02:00 [jgitflow-maven-plugin]merging 'release/7.5.1' into 'master-7.x' - - - - - 30 changed files: - client-configuration/pom.xml - client-configuration/src/main/config/Client.ini - client-configuration/src/main/i18n/getters/config.getter - client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java - client-core/pom.xml - client-core/src/main/i18n/getters/jaxx.getter - client-core/src/main/java/fr/ird/observe/client/ObserveRunner.java - client-core/src/main/java/fr/ird/observe/client/ObserveSwingApplicationContext.java - client-core/src/main/java/fr/ird/observe/client/db/ObserveDataSourcesManager.java - client-core/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java - client-core/src/main/java/fr/ird/observe/client/ui/actions/main/menu/config/ShowConfigAction.java - client-core/src/main/java/fr/ird/observe/client/ui/content/data/longline/TdrUI.jaxx - client-core/src/main/java/fr/ird/observe/client/ui/content/data/longline/TdrUI.jcss - client-core/src/main/java/fr/ird/observe/client/ui/content/data/longline/TdrUIHandler.java - client-core/src/main/java/fr/ird/observe/client/ui/content/data/longline/TdrUIModel.java - client-core/src/main/java/fr/ird/observe/client/ui/content/data/seine/TripSeineUI.jaxx - client-core/src/main/java/fr/ird/observe/client/ui/content/data/seine/TripSeineUI.jcss - client-runner/pom.xml - dto/pom.xml - dto/src/main/models/Observe.model - observe-i18n/pom.xml - observe-i18n/src/main/i18n/translations/observe_en_GB.properties - observe-i18n/src/main/i18n/translations/observe_es_ES.properties - observe-i18n/src/main/i18n/translations/observe_fr_FR.properties - observe/pom.xml - persistence/pom.xml - persistence/src/main/java/fr/ird/observe/binder/data/longline/TdrEntityDtoBinder.java - persistence/src/main/java/fr/ird/observe/binder/data/seine/TripSeineEntityDtoBinder.java - persistence/src/main/java/fr/ird/observe/entities/longline/TdrImpl.java - − persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaConfiguration.java The diff was not included because it is too large. View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/6f27425f4209743afbfcacaf… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/6f27425f4209743afbfcacaf… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] 5 commits: [jgitflow-maven-plugin]updating poms for branch'release/7.5.1' with non-snapshot versions[skip ci]
by Tony CHEMIT 13 Apr '20

13 Apr '20
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 2cd3fd54 by tchemit at 2020-04-14T00:54:37+02:00 [jgitflow-maven-plugin]updating poms for branch'release/7.5.1' with non-snapshot versions[skip ci] - - - - - 9d3129f4 by tchemit at 2020-04-14T01:03:32+02:00 [jgitflow-maven-plugin]merging 'release/7.5.1' into 'master-7.x' - - - - - 0710f2cf by tchemit at 2020-04-14T01:03:37+02:00 [jgitflow-maven-plugin]updating develop poms to master versions to avoid merge conflicts[skip ci] - - - - - 58c24864 by tchemit at 2020-04-14T01:03:38+02:00 [jgitflow-maven-plugin]merging 'master-7.x' into 'develop-7.x' - - - - - 48f4592c by tchemit at 2020-04-14T01:03:39+02:00 [jgitflow-maven-plugin]Updating develop poms back to pre merge state[skip ci] - - - - - 0 changed files: Changes: View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c2c626dfc4811b154f678706… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c2c626dfc4811b154f678706… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] [jgitflow-maven-plugin]updating poms for 7.5.2-SNAPSHOT development[skip ci]
by Tony CHEMIT 13 Apr '20

13 Apr '20
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: c2c626df by tchemit at 2020-04-14T00:54:13+02:00 [jgitflow-maven-plugin]updating poms for 7.5.2-SNAPSHOT development[skip ci] - - - - - 16 changed files: - client-configuration/pom.xml - client-core/pom.xml - client-runner/pom.xml - dto/pom.xml - observe-i18n/pom.xml - observe/pom.xml - persistence/pom.xml - pom.xml - server-configuration/pom.xml - server-core/pom.xml - server-runner/pom.xml - services-client/pom.xml - services-local/pom.xml - services/pom.xml - test/pom.xml - validation/pom.xml Changes: ===================================== client-configuration/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>client-configuration</artifactId> ===================================== client-core/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>client-core</artifactId> ===================================== client-runner/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>client-runner</artifactId> ===================================== dto/pom.xml ===================================== @@ -27,7 +27,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>dto</artifactId> ===================================== observe-i18n/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>observe-i18n</artifactId> ===================================== observe/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>observe</artifactId> ===================================== persistence/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>persistence</artifactId> ===================================== pom.xml ===================================== @@ -31,7 +31,7 @@ <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> <packaging>pom</packaging> <name>ObServe :: Pom</name> ===================================== server-configuration/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>server-configuration</artifactId> @@ -115,7 +115,7 @@ <dependency> <groupId>fr.ird.observe</groupId> <artifactId>services</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> <scope>compile</scope> </dependency> ===================================== server-core/pom.xml ===================================== @@ -27,7 +27,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>server-core</artifactId> ===================================== server-runner/pom.xml ===================================== @@ -27,7 +27,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>server-runner</artifactId> ===================================== services-client/pom.xml ===================================== @@ -27,7 +27,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>services-client</artifactId> ===================================== services-local/pom.xml ===================================== @@ -27,7 +27,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>services-local</artifactId> ===================================== services/pom.xml ===================================== @@ -27,7 +27,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>services</artifactId> ===================================== test/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>test</artifactId> ===================================== validation/pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>fr.ird.observe</groupId> <artifactId>ird-observe</artifactId> - <version>7.5.1-SNAPSHOT</version> + <version>7.5.2-SNAPSHOT</version> </parent> <artifactId>validation</artifactId> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/c2c626dfc4811b154f678706c… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/c2c626dfc4811b154f678706c… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe] Pushed new branch release/7.5.1
by Tony CHEMIT 13 Apr '20

13 Apr '20
Tony CHEMIT pushed new branch release/7.5.1 at ultreiaio / ird-observe -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/tree/release/7.5.1 You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Accumulation de fichiers - Closes #1462
by Tony CHEMIT 13 Apr '20

13 Apr '20
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 31be83c4 by tchemit at 2020-04-14T00:49:37+02:00 Accumulation de fichiers - Closes #1462 - - - - - 26 changed files: - client-configuration/src/main/config/Client.ini - client-configuration/src/main/i18n/getters/config.getter - client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java - client-core/src/main/java/fr/ird/observe/client/ClientUIContext.java - client-core/src/main/java/fr/ird/observe/client/ObserveSwingApplicationContext.java - client-core/src/main/java/fr/ird/observe/client/datasource/api/ObserveDataSourcesManager.java - client-core/src/main/java/fr/ird/observe/client/datasource/api/ObserveSwingDataSource.java - observe-i18n/src/main/i18n/translations/observe_en_GB.properties - observe-i18n/src/main/i18n/translations/observe_es_ES.properties - observe-i18n/src/main/i18n/translations/observe_fr_FR.properties - − persistence/src/main/java/fr/ird/observe/entities/AbstractObserveTopiaDao.java - − persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaConfiguration.java - − persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaConfigurationFactory.java - persistence/src/test/java/fr/ird/observe/persistence/ObserveTopiaApplicationContextTest.java → persistence/src/test/java/fr/ird/observe/entities/ObserveTopiaApplicationContextTest.java - pom.xml - server-configuration/pom.xml - server-configuration/src/main/config/Server.ini - server-configuration/src/main/i18n/getters/config.getter - server-configuration/src/main/java/fr/ird/observe/server/configuration/ServerConfig.java - server-core/src/main/java/fr/ird/observe/server/ObserveWebApplicationContext.java - services-local/src/main/java/fr/ird/observe/services/local/ObserveSecurityHelper.java - services-local/src/main/java/fr/ird/observe/services/local/ObserveTopiaApplicationContextFactory.java - services-local/src/main/java/fr/ird/observe/services/local/service/DataSourceServiceLocal.java - services-local/src/test/java/fr/ird/observe/services/local/LocalTestClassResource.java - + services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTask.java - persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaIdFactory.java → services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTaskConfiguration.java Changes: ===================================== client-configuration/src/main/config/Client.ini ===================================== @@ -146,8 +146,16 @@ defaultValue = ${dcp.presets.directory}/ps/logbook transient = true final = true +[option temporaryDirectory] +description = observe.config.temporaryDirectory.description +key = temporary.directory +type = file +defaultValue = ${data.directory}/tmp +transient = true +final = true + [option tmpDirectory] -description = observe.config.defaultTmpDirectory.description +description = observe.config.temporaryDirectory.description key = tmp.directory type = file defaultValue = ${data.directory}/tmp @@ -717,6 +725,12 @@ key = ui.seineBycatchObservedSystem type = fr.ird.observe.validation.SeineBycatchObservedSystemConfig defaultValue = {\"fr.ird.referential.common.Species#1239832684290#0.04680507324710936\": [\"fr.ird.referential.ps.observation.ObservedSystem#0#1.0\",\"fr.ird.referential.ps.observation.ObservedSystem#0#1.1\"]} +[option temporaryFilesTimeout] +description = observe.config.temporaryFilesTimeout.description +key = observe.config.temporaryFilesTimeout +type = int +defaultValue = 120 + [action help] description = observe.action.commandline.help action = "fr.ird.observe.client.ObserveCLAction#help" ===================================== client-configuration/src/main/i18n/getters/config.getter ===================================== @@ -33,7 +33,6 @@ observe.config.defaultLocalDbDirectory.description observe.config.defaultMapDirectory.description observe.config.defaultReportDirectory.description observe.config.defaultResourcesDirectory.description -observe.config.defaultTmpDirectory.description observe.config.defaultValidationReportDirectory.description observe.config.h2.can.editReferential.description observe.config.h2.can.migrate.description @@ -91,6 +90,8 @@ observe.config.speciesList.seine.observation.schoolEstimate observe.config.speciesList.seine.observation.targetCatch observe.config.swingSessionFile.description observe.config.temperature.format +observe.config.temporaryDirectory.description +observe.config.temporaryFilesTimeout.description observe.config.ui.autoPopupNumberEditor observe.config.ui.blockStateColor observe.config.ui.busyStateColor ===================================== client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java ===================================== @@ -35,6 +35,7 @@ import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.gson.ObserveDtoGsonSupplier; import fr.ird.observe.navigation.model.edit.ObserveEditModel; import fr.ird.observe.navigation.model.select.ObserveSelectModel; +import fr.ird.observe.services.service.CleanTemporaryFilesTaskConfiguration; import io.ultreia.java4all.application.context.spi.ApplicationComponentInstantiateStrategy; import io.ultreia.java4all.application.context.spi.GenerateApplicationComponent; import io.ultreia.java4all.application.template.TemplateGeneratorConfig; @@ -92,12 +93,13 @@ import static io.ultreia.java4all.i18n.I18n.t; hints = { TemplateGeneratorConfig.class, ObServeSwingSessionConfig.class, - ReferentialLocaleConfig.class}, + ReferentialLocaleConfig.class, + CleanTemporaryFilesTaskConfiguration.class}, instantiateStrategy = ApplicationComponentInstantiateStrategy.SUPPLIER, instantiateSupplier = ClientConfigFinder.class ) @GenerateTemplate(template = "about.ftl") -public class ClientConfig extends GeneratedClientConfig implements TemplateGeneratorConfig, ObServeSwingSessionConfig, ReferentialLocaleConfig, NavigationTreeConfig { +public class ClientConfig extends GeneratedClientConfig implements TemplateGeneratorConfig, ObServeSwingSessionConfig, ReferentialLocaleConfig, NavigationTreeConfig, CleanTemporaryFilesTaskConfiguration { public static final String DB_NAME = "obstuna"; public static final List<ClientConfigOption> MAP_LAYERS = ImmutableList.of( @@ -266,7 +268,7 @@ public class ClientConfig extends GeneratedClientConfig implements TemplateGener resourceManager.createDirectory(this, ClientConfigOption.TMP_DIRECTORY); // suppression du contenu du répertoire temporaire - FileUtils.cleanDirectory(this.getTmpDirectory()); + FileUtils.cleanDirectory(this.getTemporaryDirectory()); // 3 - backup directory ===================================== client-core/src/main/java/fr/ird/observe/client/ClientUIContext.java ===================================== @@ -34,6 +34,7 @@ import fr.ird.observe.dto.IdDto; import fr.ird.observe.dto.decoration.DecoratorService; import fr.ird.observe.dto.decoration.DecoratorServiceApplicationComponent; import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; +import fr.ird.observe.services.service.CleanTemporaryFilesTask; import io.ultreia.java4all.application.context.ApplicationContext; import io.ultreia.java4all.application.context.spi.GenerateApplicationComponent; import io.ultreia.java4all.i18n.I18n; @@ -57,9 +58,11 @@ import java.awt.event.ComponentEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeListener; +import java.io.Closeable; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.Timer; import static io.ultreia.java4all.i18n.I18n.t; import static javax.swing.JOptionPane.CLOSED_OPTION; @@ -71,7 +74,7 @@ import static javax.swing.JOptionPane.VALUE_PROPERTY; ObserveSwingSessionHelper.class, ActionExecutor.class }) -public class ClientUIContext { +public class ClientUIContext implements Closeable { private static final Logger log = LogManager.getLogger(ClientUIContext.class); @@ -81,7 +84,9 @@ public class ClientUIContext { private final ActionExecutor actionExecutor; private ObserveMainUI mainUI; private ObserveUICallbackManager uiCallbackManager; + private Timer deleteTemporaryFilesTimer; private final BusyModel busyModel; + public ClientUIContext(DecoratorService decoratorService, ClientConfig clientConfig, ObserveSwingSessionHelper observeSwingSessionHelper, ActionExecutor actionExecutor) { this.decoratorService = decoratorService; this.clientConfig = clientConfig; @@ -90,6 +95,13 @@ public class ClientUIContext { this.busyModel = new BusyModel(); } + public void initDeleteTemporaryFilesTimer() { + if (deleteTemporaryFilesTimer != null) { + closeDeleteTemporaryFilesTimer(); + } + deleteTemporaryFilesTimer = CleanTemporaryFilesTask.create(getClientConfig()); + } + public static void displayInfo(String text) { JFrame ui = ClientUIContextApplicationComponent.value().getMainUI(); if (ui == null) { @@ -365,7 +377,9 @@ public class ClientUIContext { return observeSwingSessionHelper; } + @Override public void close() { + closeDeleteTemporaryFilesTimer(); mainUI = null; } @@ -464,4 +478,16 @@ public class ClientUIContext { public BusyModel getBusyModel() { return busyModel; } + + + void closeDeleteTemporaryFilesTimer() { + if (deleteTemporaryFilesTimer != null) { + try { + deleteTemporaryFilesTimer.cancel(); + } catch (Exception e) { + log.error("Could not terminates delete temporary files timer...", e); + } + } + } + } ===================================== client-core/src/main/java/fr/ird/observe/client/ObserveSwingApplicationContext.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.client; import fr.ird.observe.client.configuration.ClientConfig; +import fr.ird.observe.client.configuration.ClientConfigApplicationComponent; import fr.ird.observe.services.ObserveServiceMainFactory; import fr.ird.observe.services.ObserveServiceMainFactoryApplicationComponent; import fr.ird.observe.spi.DtoModelHelper; @@ -53,9 +54,12 @@ public class ObserveSwingApplicationContext extends ApplicationContext { //FIXME Je ne comprends pas pourquoi cela ne fonctionne plus. // config.get().setOption("user.home", SystemUtils.USER_HOME); - log.debug("Init model helper: " + DtoModelHelper.class); + log.debug(String.format("Init model helper: %s", DtoModelHelper.class)); ObserveServiceMainFactory serviceMainFactory = ObserveServiceMainFactoryApplicationComponent.value(); - log.info("Initialize services factory: " + serviceMainFactory); + log.info(String.format("Initialize services factory: %s", serviceMainFactory)); + ClientUIContext clientUIContext = ClientUIContextApplicationComponent.value(); + log.info("Initialize delete temporary files task."); + clientUIContext.initDeleteTemporaryFilesTimer(); } // We put here the i18n keys from the client-runner module, otherwise we need yet another module before observe-i18n ===================================== client-core/src/main/java/fr/ird/observe/client/datasource/api/ObserveDataSourcesManager.java ===================================== @@ -126,7 +126,7 @@ public class ObserveDataSourcesManager implements Closeable { public ObserveSwingDataSource newTemporaryH2DataSource(String label) { - File tmpDirectory = config.getTmpDirectory(); + File tmpDirectory = config.getTemporaryDirectory(); File dbDirectory = new File(tmpDirectory, ClientConfig.DB_NAME + UUID.randomUUID().toString()); ===================================== client-core/src/main/java/fr/ird/observe/client/datasource/api/ObserveSwingDataSource.java ===================================== @@ -482,7 +482,7 @@ public class ObserveSwingDataSource extends ObserveServicesProviderSupport { Locale locale = config.getLocale(); - File tmpDirectory = config.getTmpDirectory(); + File tmpDirectory = config.getTemporaryDirectory(); ReferentialLocale referentialLocale = ReferentialLocale.valueOf(locale); ===================================== observe-i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -482,7 +482,6 @@ observe.config.defaultLocalDbDirectory.description=Default directory where to st observe.config.defaultMapDirectory.description=Default directory where to store map layers observe.config.defaultReportDirectory.description=Default directory where to store report definition files observe.config.defaultResourcesDirectory.description=Default user resources directory -observe.config.defaultTmpDirectory.description=Default temporary directory used by application and clean at each launch. observe.config.defaultValidationReportDirectory.description=Default validation report directory observe.config.devMode=Dev mode observe.config.floatingObjectPresets.description=Floating Objects references @@ -542,6 +541,8 @@ observe.config.speciesList.seine.observation.schoolEstimate=Species for school e observe.config.speciesList.seine.observation.targetCatch=Species for target catches observe.config.swingSessionFile.description=Swing session file. observe.config.temperature.format=Default temperature format +observe.config.temporaryDirectory.description=Default temporary directory used by application and clean at each launch. +observe.config.temporaryFilesTimeout.description=Temporary files delete (in hours) observe.config.ui.autoPopupNumberEditor=Flag sets to true when number editor show automaticly popup observe.config.ui.blockStateColor=Color of block state observe.config.ui.busyStateColor=Color of busy state @@ -3519,7 +3520,7 @@ observeweb.devMode.description=Dev mode observeweb.host.description=Application host observeweb.httpTimeout.description=Http timeout in milli seconds observeweb.log4jConfigurationFile.description=Path to log configuration file -observeweb.sessionExpirationDelay.description=Session expiration deplay (in minutes) +observeweb.sessionExpirationDelay.description=Session expiration delay (in minutes) observeweb.sessionMaximumSize.description=Session maximum size observeweb.temporaryDirectory.description=Path to temporary directory observeweb.usersConfigurationFile.description=Path to users configuration file ===================================== observe-i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -482,7 +482,6 @@ observe.config.defaultLocalDbDirectory.description=Directorio de almacenamiento observe.config.defaultMapDirectory.description=El directorio donde se ubican los mapas. observe.config.defaultReportDirectory.description=Directorio por defecto de los informes de la aplicación observe.config.defaultResourcesDirectory.description=Directorio de almacenamiento de los recursos de usuario como las traducciones o la consultas de informes -observe.config.defaultTmpDirectory.description=Directorio temporal por defecto observe.config.defaultValidationReportDirectory.description=Directorio por defecto de almacenamiento de los informes de validación observe.config.devMode=Modo desarrollador observe.config.floatingObjectPresets.description=Objetos flotantes de referencia @@ -542,6 +541,8 @@ observe.config.speciesList.seine.observation.schoolEstimate=Especies para las es observe.config.speciesList.seine.observation.targetCatch=Especies par las capturas objetivo observe.config.swingSessionFile.description=Copia de seguridad del estado del UI. observe.config.temperature.format=Unidad de temperatura +observe.config.temporaryDirectory.description=Directorio temporal por defecto +observe.config.temporaryFilesTimeout.description=Temporary files delete (in hours) \#TODO observe.config.ui.autoPopupNumberEditor=Para mostrar automáticamente el editor numérico durante la edición de un número observe.config.ui.blockStateColor=Color of block state \#TODO observe.config.ui.busyStateColor=Color of busy state \#TODO ===================================== observe-i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -482,7 +482,6 @@ observe.config.defaultLocalDbDirectory.description=Le répertoire où est stock observe.config.defaultMapDirectory.description=Le répertoire où sont stockées les cartes. observe.config.defaultReportDirectory.description=Répertoire par défaut des rapports de l'application observe.config.defaultResourcesDirectory.description=Le répertoire où sont stockées les ressources de l'utilisateur comme les traductions ou les requêtes de rapports. -observe.config.defaultTmpDirectory.description=Le répertoire temporaire par défaut observe.config.defaultValidationReportDirectory.description=Le répertoire par défaut où sont stockés les rapports de validation observe.config.devMode=Mode développeur observe.config.floatingObjectPresets.description=Objets flottants de référence @@ -542,6 +541,8 @@ observe.config.speciesList.seine.observation.schoolEstimate=Espèces pour les es observe.config.speciesList.seine.observation.targetCatch=Espèces pour les captures cible observe.config.swingSessionFile.description=Fichier de sauvegarde des états des UI. observe.config.temperature.format=Unité de température +observe.config.temporaryDirectory.description=Le répertoire temporaire par défaut +observe.config.temporaryFilesTimeout.description=Nettoyage des fichiers temporaires (en heures) observe.config.ui.autoPopupNumberEditor=Pour afficher automatiquement l'éditeur numérique lors de l'édition d'un nombre observe.config.ui.blockStateColor=Couleur lorsque l'on bloque une partie de l'application observe.config.ui.busyStateColor=Couleur lorsque l'application est occupée ===================================== persistence/src/main/java/fr/ird/observe/entities/AbstractObserveTopiaDao.java deleted ===================================== @@ -1,76 +0,0 @@ -package fr.ird.observe.entities; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.nuiton.topia.persistence.internal.AbstractTopiaDao; -import org.nuiton.topia.persistence.support.TopiaSqlQuery; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.Date; -import java.util.List; -import java.util.Map; - -public abstract class AbstractObserveTopiaDao<E extends Entity> extends AbstractTopiaDao<E> { - - private final GetLastUpdateDateSqlQuery getLastUpdateDateSqlQuery; - - protected AbstractObserveTopiaDao() { - String schemaName = getTopiaEntityEnum().dbSchemaName(); - String tableName = getTopiaEntityEnum().dbTableName(); - getLastUpdateDateSqlQuery = new GetLastUpdateDateSqlQuery(schemaName, tableName); - } - - public Date getLastUpdateDate() { - return topiaSqlSupport.findSingleResult(getLastUpdateDateSqlQuery); - } - - public <O> List<O> findAllFromHql(String hql, Map<String, Object> hqlParameters) { - return findAll(hql, hqlParameters); - } - - private static class GetLastUpdateDateSqlQuery extends TopiaSqlQuery<Timestamp> { - - protected final String sql; - - private GetLastUpdateDateSqlQuery(String schemaName, String tableName) { - this.sql = "SELECT max(" + Entity.PROPERTY_LAST_UPDATE_DATE + ") FROM " + schemaName + "." + tableName; - } - - @Override - public PreparedStatement prepareQuery(Connection connection) throws SQLException { - return connection.prepareStatement(sql); - } - - @Override - public Timestamp prepareResult(ResultSet set) throws SQLException { - return set.getTimestamp(1); - } - - } - - -} ===================================== persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaConfiguration.java deleted ===================================== @@ -1,84 +0,0 @@ -package fr.ird.observe.entities; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.nuiton.topia.persistence.BeanTopiaConfiguration; -import org.nuiton.topia.persistence.HibernateAvailableSettings; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.Properties; -import java.util.TreeMap; - -/** - * Created on 23/08/15. - * - * @author Tony Chemit - dev(a)tchemit.fr - */ -public class ObserveTopiaConfiguration extends BeanTopiaConfiguration { - - private static final long serialVersionUID = 1L; - - private final boolean h2Configuration; - protected final boolean showSql; - private static final Map<String, String> HIBERNATE_GLOBAL_PROPERTIES; - - static { - - Properties p = new Properties(); - try (InputStream stream = ObserveTopiaPersistenceContext.class.getResourceAsStream("/hibernate.properties")) { - try { - p.load(stream); - } catch (IOException e) { - throw new IllegalStateException(e); - } - } catch (IOException e) { - throw new IllegalStateException(e); - } - HIBERNATE_GLOBAL_PROPERTIES = new TreeMap<>(); - for (String s : p.stringPropertyNames()) { - HIBERNATE_GLOBAL_PROPERTIES.put(s, p.getProperty(s)); - } - - } - - public ObserveTopiaConfiguration(JdbcConfiguration jdbcConfiguration, boolean h2Configuration, boolean showSql) { - super(jdbcConfiguration); - this.h2Configuration = h2Configuration; - this.showSql = showSql; - if (showSql) { - hibernateExtraConfiguration.put(HibernateAvailableSettings.SHOW_SQL, Boolean.TRUE.toString()); - } - hibernateExtraConfiguration.putAll(HIBERNATE_GLOBAL_PROPERTIES); - } - - public boolean isH2Configuration() { - return h2Configuration; - } - - public boolean isShowSql() { - return showSql; - } -} ===================================== persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaConfigurationFactory.java deleted ===================================== @@ -1,143 +0,0 @@ -package fr.ird.observe.entities; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; -import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; -import org.nuiton.topia.service.migration.TopiaMigrationService; -import org.nuiton.topia.service.script.TopiaSqlScriptGeneratorServiceImpl; - -import java.io.File; - -/** - * Created on 23/08/15. - * - * @author Tony Chemit - dev(a)tchemit.fr - */ -public class ObserveTopiaConfigurationFactory { - - /** l'url d'acces a la base locale */ - private static final String H2_LOCAL_URL = - "jdbc:h2:file:%s;" + - // on peut aussi utiliser file, socket - "FILE_LOCK=file;" + - //1 or 2 is needed to restore avec crash - // 0: logging is disabled (faster), - // 1: logging of the data is enabled, but logging of the index - // changes is disabled (default), 2: logging of both data and index - // changes are enabled - "LOG=0;" + - // on peut aussi utiliser hsqldb, mysql ou postgresql - "MODE=postgresql;" + - //"MODE=hsqldb;" + - // Sets the default lock timeout (in milliseconds) in this - // database that is used for the new sessions. - "DEFAULT_LOCK_TIMEOUT=100;" + - // -1: the database is never closed until the close delay is set to - // some other rev or SHUTDOWN is called., 0: no delay (default; the - // database is closed if the last connection to it is closed)., n: - // the database is left open for n second after the last connection - // is closed. - "DB_CLOSE_DELAY=0;" + - // 0: no locking (should only be used for testing), - // 1: table level locking (default), - // 2: table level locking with garbage collection (if the - // application does not close all connections). - // LOCK_MODE 3 (READ_COMMITTED). Table level locking, but only when - // writing (no read locks). - "LOCK_MODE=3;" + - // Levels: 0=off, 1=error, 2=info, 3=debug. - "TRACE_LEVEL_FILE=0;" + - // on system.out: 0=off, 1=error, 2=info, 3=debug. - "TRACE_LEVEL_SYSTEM_OUT=0;" + - // maximumn cache to improve performance... - "CACHE_SIZE=65536;" + - // avoid timeout on reading tables (see http://stackoverflow.com/questions/4162557/timeout-error-trying-to-lock-tab…) - "MVCC=true"; - - private static final JdbcConfigurationBuilder JDBC_CONFIGURATION_BUILDER = new JdbcConfigurationBuilder(); - private static final Logger log = LogManager.getLogger(ObserveTopiaConfigurationFactory.class); - - public static ObserveTopiaConfiguration forPostgresqlDatabase(String jdbcUrl, - String username, - String password, - boolean initSchema, - boolean traceSql) { - - JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forPostgresqlDatabase(jdbcUrl, username, password); - - ObserveTopiaConfiguration topiaConfiguration = createTopiaConfiguration(jdbcConfiguration, - initSchema, - false, - traceSql); - - log.debug("PG topia configuration: " + topiaConfiguration); - return topiaConfiguration; - - } - - public static ObserveTopiaConfiguration forH2Database(File dbDirectory, - String dbName, - String username, - String password, - boolean initSchema, - boolean traceSql) { - - String dbPath = new File(dbDirectory, dbName).getPath(); - String jdbcUrl = String.format(H2_LOCAL_URL, dbPath); - - JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forH2Database(jdbcUrl, username, password); - - ObserveTopiaConfiguration topiaConfiguration = createTopiaConfiguration(jdbcConfiguration, - initSchema, - true, - traceSql); - - log.debug("H2 topia configuration: " + topiaConfiguration); - return topiaConfiguration; - - } - - private static ObserveTopiaConfiguration createTopiaConfiguration(JdbcConfiguration jdbcConfiguration, - boolean initSchema, - boolean h2Configuration, - boolean traceSql) { - - ObserveTopiaConfiguration topiaConfiguration = new ObserveTopiaConfiguration(jdbcConfiguration, h2Configuration, traceSql); - topiaConfiguration.setTopiaIdFactoryClass(ObserveTopiaIdFactory.class); - topiaConfiguration.setInitSchema(initSchema); - topiaConfiguration.setValidateSchema(false); - topiaConfiguration.setUseHikariForJdbcConnectionPooling(true); - - log.debug("jdbcUrl: " + topiaConfiguration.getJdbcConnectionUrl()); - - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME, TopiaMigrationService.class); - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.SQL_SCRIPT_GENERATOR_BATCH_SERVICE_NAME, TopiaSqlScriptGeneratorServiceImpl.class); - - return topiaConfiguration; - - } - -} ===================================== persistence/src/test/java/fr/ird/observe/persistence/ObserveTopiaApplicationContextTest.java → persistence/src/test/java/fr/ird/observe/entities/ObserveTopiaApplicationContextTest.java ===================================== @@ -1,4 +1,4 @@ -package fr.ird.observe.persistence; +package fr.ird.observe.entities; /*- * #%L @@ -22,9 +22,6 @@ package fr.ird.observe.persistence; * #L% */ -import fr.ird.observe.entities.ObserveTopiaApplicationContext; -import fr.ird.observe.entities.ObserveTopiaConfiguration; -import fr.ird.observe.entities.ObserveTopiaConfigurationFactory; import fr.ird.observe.test.TestHelper; import fr.ird.observe.test.TestSupportWithConfig; import org.junit.Assert; @@ -46,7 +43,7 @@ public class ObserveTopiaApplicationContextTest extends TestSupportWithConfig { File testBasedir = TestHelper.getTestBasedir(getClass()); - ObserveTopiaConfiguration observeTopiaConfiguration = ObserveTopiaConfigurationFactory.forH2Database(testBasedir, "testReplicateModel", "sa", "sa", true, false); + ObserveTopiaConfiguration observeTopiaConfiguration = ObserveTopiaConfigurationFactory.forH2Database(testBasedir, "testReplicateModel", "sa", "sa", testBasedir.toPath().resolve("temporary"), true, false); try (ObserveTopiaApplicationContext applicationContext = new ObserveTopiaApplicationContext(observeTopiaConfiguration)) { TopiaSqlTables tripLonglineTables = applicationContext.getTripLonglineTables(); Assert.assertNotNull(tripLonglineTables); ===================================== pom.xml ===================================== @@ -24,7 +24,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2020.15</version> + <version>2020.17</version> </parent> <groupId>fr.ird.observe</groupId> @@ -162,7 +162,7 @@ <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> <buildDate>${maven.build.timestamp}</buildDate> - <lib.version.toolkit>4.27</lib.version.toolkit> + <lib.version.toolkit>4.28</lib.version.toolkit> <lib.version.nuiton.validation>3.1</lib.version.nuiton.validation> <!--can't use 1.4.197 (date has changed + blob also)--> <lib.version.h2>1.4.196</lib.version.h2> @@ -176,7 +176,7 @@ <!--<lib.version.java4all.i18n>4.0-beta-3-SNAPSHOT</lib.version.java4all.i18n>--> <!--<lib.version.java4all.config>1.0.8-SNAPSHOT</lib.version.java4all.config>--> <!--<lib.version.nuiton.topia>3.4.2-SNAPSHOT</lib.version.nuiton.topia>--> - <!--<lib.version.java4all.topia>1.14</lib.version.java4all.topia>--> +<!-- <lib.version.java4all.topia>1.19-SNAPSHOT</lib.version.java4all.topia>--> <!--<lib.version.java4all.http>1.0.17-SNAPSHOT</lib.version.java4all.http>--> <!-- license header configuration --> ===================================== server-configuration/pom.xml ===================================== @@ -48,7 +48,11 @@ <version>${project.version}</version> <scope>provided</scope> </dependency> - + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>services</artifactId> + <version>${project.version}</version> + </dependency> <dependency> <groupId>io.ultreia.java4all</groupId> <artifactId>application-context</artifactId> ===================================== server-configuration/src/main/config/Server.ini ===================================== @@ -103,3 +103,9 @@ key = observeweb.httpTimeout type = int defaultValue = 30000 +[option temporaryFilesTimeout] +description = observe.config.temporaryFilesTimeout.description +key = observeweb.temporaryFilesTimeout +type = int +defaultValue = 120 + ===================================== server-configuration/src/main/i18n/getters/config.getter ===================================== @@ -1,4 +1,5 @@ ObserveWebApplicationConfig.description +observe.config.temporaryFilesTimeout.description observe.model.version observeweb.adminApiKey.description observeweb.baseDirectory.description ===================================== server-configuration/src/main/java/fr/ird/observe/server/configuration/ServerConfig.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.server.configuration; import fr.ird.observe.dto.ObserveUtil; import fr.ird.observe.dto.decoration.ReferentialLocaleConfig; +import fr.ird.observe.services.service.CleanTemporaryFilesTaskConfiguration; import io.ultreia.java4all.application.context.spi.GenerateApplicationComponent; import io.ultreia.java4all.application.template.TemplateGeneratorConfig; import io.ultreia.java4all.config.ApplicationConfig; @@ -46,8 +47,8 @@ import java.nio.file.Paths; * @author Tony Chemit - dev(a)tchemit.fr */ @GenerateApplicationComponent(name = "ObServe Web configuration", - hints = {TemplateGeneratorConfig.class, ReferentialLocaleConfig.class}) -public class ServerConfig extends GeneratedServerConfig { + hints = {TemplateGeneratorConfig.class, ReferentialLocaleConfig.class, CleanTemporaryFilesTaskConfiguration.class}) +public class ServerConfig extends GeneratedServerConfig implements CleanTemporaryFilesTaskConfiguration { private static Logger log = LogManager.getLogger(ServerConfig.class); ===================================== server-core/src/main/java/fr/ird/observe/server/ObserveWebApplicationContext.java ===================================== @@ -43,6 +43,7 @@ import fr.ird.observe.server.configuration.user.ObserveWebUsersHelperApplication import fr.ird.observe.server.configuration.user.impl.ObserveWebUsersImmutable; import fr.ird.observe.server.security.ObserveWebSecurityApplicationContext; import fr.ird.observe.server.security.ObserveWebSecurityApplicationContextApplicationComponent; +import fr.ird.observe.services.service.CleanTemporaryFilesTask; import fr.ird.observe.services.ObserveServiceFactory; import fr.ird.observe.services.ObserveServiceInitializer; import fr.ird.observe.services.ObserveServiceMainFactoryApplicationComponent; @@ -51,11 +52,14 @@ import fr.ird.observe.services.service.ObserveService; import fr.ird.observe.services.service.actions.consolidate.dcp.FloatingObjectModification; import io.ultreia.java4all.application.context.ApplicationComponent; import io.ultreia.java4all.application.context.ApplicationContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.debux.webmotion.server.call.HttpContext; import org.nuiton.version.Version; import javax.servlet.ServletContext; import java.util.Map; +import java.util.Timer; /** * @author Tony Chemit - dev(a)tchemit.fr @@ -67,6 +71,8 @@ public class ObserveWebApplicationContext extends ApplicationContext { private static final String MISSING_APPLICATION_CONTEXT = String.format("%s not found. You probably forgot to register %s in your web.xml", ObserveWebApplicationContext.class.getSimpleName(), ObserveWebApplicationListener.class.getName()); + private static final Logger log = LogManager.getLogger(ObserveWebApplicationContext.class); + private ObserveDtoGsonSupplier gsonSupplier; private ServerConfig applicationConfiguration; private ObserveServiceFactory mainServiceFactory; @@ -75,6 +81,7 @@ public class ObserveWebApplicationContext extends ApplicationContext { private ObserveWebSecurityApplicationContext securityApplicationContext; private static ServerConfig applicationConfiguration1; + private Timer deleteTemporaryFilesTimer; static ObserveWebApplicationContext getApplicationContext(HttpContext context) { @@ -153,18 +160,26 @@ public class ObserveWebApplicationContext extends ApplicationContext { } }; } + if (deleteTemporaryFilesTimer != null) { + closeDeleteTemporaryFilesTimer(); + } + deleteTemporaryFilesTimer = CleanTemporaryFilesTask.create(getApplicationConfiguration()); + } + + @Override + public void close() { + + closeDeleteTemporaryFilesTimer(); + super.close(); } -// @Override -// public void close() { -// -// // Supprimer le cache des sessions -// securityApplicationContext.close(); -// -// // Fermer l'usine de services -// mainServiceFactory.close(); -// -// } + void closeDeleteTemporaryFilesTimer() { + try { + deleteTemporaryFilesTimer.cancel(); + } catch (Exception e) { + log.error("Could not terminates delete temporary files timer...", e); + } + } public ObserveDtoGsonSupplier getGsonSupplier() { return gsonSupplier; ===================================== services-local/src/main/java/fr/ird/observe/services/local/ObserveSecurityHelper.java ===================================== @@ -27,13 +27,13 @@ import fr.ird.observe.dto.ObserveDbRole; import fr.ird.observe.dto.db.ObserveDbUserDto; import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.ObserveTopiaApplicationContext; +import fr.ird.observe.entities.ObserveTopiaConfiguration; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.topia.migration.mappings.TMSVersionHibernateDao; import org.nuiton.topia.persistence.TopiaEntityEnum; import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; import org.nuiton.topia.persistence.jdbc.JdbcPostgresHelper; import org.nuiton.topia.persistence.script.SqlScriptConsumer; import org.nuiton.topia.persistence.script.SqlScriptWriter; @@ -81,10 +81,12 @@ public class ObserveSecurityHelper { private static final String SCHEMA_PUBLIC = "public"; private static final Logger log = LogManager.getLogger(ObserveSecurityHelper.class); private final JdbcPostgresHelper jdbcHelper; + private final Path temporaryDirectory; - public ObserveSecurityHelper(JdbcConfiguration jdbcConfiguration) { + public ObserveSecurityHelper(ObserveTopiaConfiguration jdbcConfiguration) { this.jdbcHelper = new JdbcPostgresHelper(jdbcConfiguration); + this.temporaryDirectory = jdbcConfiguration.getTemporaryDirectory(); } public void applySecurity(Set<ObserveDbUserDto> users) { @@ -93,7 +95,7 @@ public class ObserveSecurityHelper { } Path scriptPath; try { - scriptPath = Files.createTempFile("topia-sql-script-", ".sql"); + scriptPath = Files.createTempFile(temporaryDirectory, "topia-sql-script-", ".sql"); } catch (IOException e) { throw new IllegalStateException("Can't create temporary path", e); } ===================================== services-local/src/main/java/fr/ird/observe/services/local/ObserveTopiaApplicationContextFactory.java ===================================== @@ -150,6 +150,7 @@ public class ObserveTopiaApplicationContextFactory { configuration.getJdbcUrl(), configuration.getUsername(), String.valueOf(configuration.getPassword()), + configuration.getTemporaryDirectory(), initSchema, configuration.isTraceSql() ); @@ -175,6 +176,7 @@ public class ObserveTopiaApplicationContextFactory { configuration.getDbName(), configuration.getUsername(), String.valueOf(configuration.getPassword()), + configuration.getTemporaryDirectory(), initSchema, configuration.isTraceSql() ); ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/DataSourceServiceLocal.java ===================================== @@ -69,6 +69,7 @@ import org.nuiton.version.Versions; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; @@ -108,6 +109,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS public ObserveDataSourceInformation checkCanConnectOrBeEmpty(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; + Path temporaryDirectory = serviceContext.getTemporaryDirectoryRoot().toPath(); ObserveDataSourceInformation dataSourceInformation; if (dataSourceConfigurationTopiaSupport.isH2Database()) { @@ -141,7 +143,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS h2DataSourceConfiguration.getDbName(), h2DataSourceConfiguration.getUsername(), new String(h2DataSourceConfiguration.getPassword()), - false, + temporaryDirectory, false, false); @@ -165,7 +167,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase(pgDataSourceConfiguration.getJdbcUrl(), pgDataSourceConfiguration.getUsername(), new String(pgDataSourceConfiguration.getPassword()), - false, + temporaryDirectory, false, false); try { @@ -188,6 +190,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; ObserveDataSourceInformation dataSourceInformation; @@ -223,6 +226,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS h2DataSourceConfiguration.getDbName(), h2DataSourceConfiguration.getUsername(), new String(h2DataSourceConfiguration.getPassword()), + temporaryDirectory, false, false); @@ -247,6 +251,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase(pgDataSourceConfiguration.getJdbcUrl(), pgDataSourceConfiguration.getUsername(), new String(pgDataSourceConfiguration.getPassword()), + temporaryDirectory, false, false); @@ -266,13 +271,22 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS } + Path getTemporaryDirectory(ObserveDataSourceConfiguration dataSourceConfiguration) { + Path temporaryDirectory = dataSourceConfiguration.getTemporaryDirectory(); + if (temporaryDirectory == null) { + temporaryDirectory = serviceContext.getTemporaryDirectoryRoot().toPath(); + dataSourceConfiguration.setTemporaryDirectory(temporaryDirectory); + } + return temporaryDirectory; + } + @Override public ObserveDataSourceConnectionTopia create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, BabModelVersionException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { dataSourceCreateConfiguration.validateConfiguration(); - + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); boolean initSchema = !dataSourceCreateConfiguration.isImportDatabase(); ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, initSchema); @@ -291,10 +305,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS } else { // base postgres // on realise les import dans un base H2 temporaire - // FIXME il faut obtenir le repertoit temporaire d'observe plutot que celui du système File tmpDir; try { - tmpDir = Files.createTempDirectory("obstuna").toFile(); + tmpDir = Files.createTempDirectory(temporaryDirectory, "obstuna").toFile(); } catch (IOException e) { throw new IllegalStateException("could not create temporary directory ", e); } @@ -455,7 +468,8 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { - + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); ObserveDataSourceInformation dataSourceInformation = checkCanConnect(dataSourceConfiguration); Version dbVersion = dataSourceInformation.getVersion(); @@ -557,6 +571,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public void applySecurity(ObserveDataSourceConfiguration dataSourceConfiguration, ImmutableSet<ObserveDbUserDto> users) { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); + // pas de securité pour les bases autres que postgresql if (dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaPG) { @@ -575,6 +592,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public void migrateData(ObserveDataSourceConfiguration dataSourceConfiguration) { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); topiaApplicationContext.getMigrationService().runSchemaMigration(); } ===================================== services-local/src/test/java/fr/ird/observe/services/local/LocalTestClassResource.java ===================================== @@ -90,7 +90,6 @@ public class LocalTestClassResource extends TestClassResourceSupport { public ObserveDataSourceConfigurationTopiaH2 createDataSourceConfiguration(Version dbVersion, String dbName, File targetPath, String login, char[] password) throws DataSourceCreateWithNoReferentialImportException, IOException, IncompatibleDataSourceCreateConfigurationException, DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { ObserveDataSourceConfigurationTopiaH2 sharedDatabaseConfiguration = dataSourcesForTestManager.createSharedDataSourceConfigurationH2(dbVersion, dbName, login, password); - File sharedDatabaseFile = sharedDatabaseConfiguration.getDatabaseFile(); ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration; @@ -101,6 +100,7 @@ public class LocalTestClassResource extends TestClassResourceSupport { if (log.isInfoEnabled()) { log.info("Create shared database: " + dbVersion.toString() + "/" + dbName + " to " + sharedDatabaseFile); } + sharedDatabaseConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); try (DataSourceService dataSourceService = newService(sharedDatabaseConfiguration, DataSourceService.class)) { DataSourceCreateConfigurationDto createConfiguration = new DataSourceCreateConfigurationDto(); @@ -135,12 +135,14 @@ public class LocalTestClassResource extends TestClassResourceSupport { } dataSourceConfiguration.setModelVersion(ObserveTestConfiguration.getModelVersion()); + dataSourceConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); return dataSourceConfiguration; } public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + dataSourceConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); ObserveServiceInitializer observeServiceInitializer = ObserveServiceInitializer.create( Locale.FRANCE, ReferentialLocale.FR, ===================================== services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTask.java ===================================== @@ -0,0 +1,120 @@ +package fr.ird.observe.services.service; + +/*- + * #%L + * ObServe :: Services API + * %% + * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io + * %% + * 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 io.ultreia.java4all.util.Dates; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Calendar; +import java.util.Date; +import java.util.Objects; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.TimeUnit; + +/** + * To clean temporaries files. + * + * @author Tony Chemit - dev(a)tchemit.fr + * @since 8.0 + */ + +public class CleanTemporaryFilesTask extends TimerTask { + + private static final Logger log = LogManager.getLogger(CleanTemporaryFilesTask.class); + + private final CleanTemporaryFilesTaskConfiguration configuration; + + public static Timer create(CleanTemporaryFilesTaskConfiguration configuration) { + Timer result = new Timer("Delete temporary files daemon", true); + result.scheduleAtFixedRate(new CleanTemporaryFilesTask(configuration), new Date(), TimeUnit.HOURS.toMillis(1)); + return result; + } + + public CleanTemporaryFilesTask(CleanTemporaryFilesTaskConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public void run() { + + Path temporaryDirectory = configuration.getTemporaryDirectory().toPath(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.HOUR_OF_DAY, -configuration.getTemporaryFilesTimeout()); + Date deleteBefore = calendar.getTime(); + long deleteBeforeTime = deleteBefore.getTime(); + + log.info(String.format("Delete temporary files in directory %s before %s", temporaryDirectory, deleteBefore)); + delete(temporaryDirectory, deleteBeforeTime); + } + + private boolean delete(Path path, long deleteBeforeTime) { + try { + Files.walk(path).forEach(p -> { + if (Objects.equals(path, p)) { + return; + } + if (Files.isDirectory(p)) { + boolean deleted = delete(p, deleteBeforeTime); + if (deleted) { + delete0(p, deleteBeforeTime); + } + } + if (Files.isRegularFile(p)) { + delete0(p, deleteBeforeTime); + } + }); + if (Files.isRegularFile(path)) { + return Files.notExists(path); + } + if (Files.isDirectory(path)) { + return isDirEmpty(path); + } + return false; + } catch (IOException e) { + throw new RuntimeException(String.format("Could not walk through temporary directory: %s", path), e); + } + } + + private static boolean isDirEmpty(final Path directory) throws IOException { + try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) { + return !dirStream.iterator().hasNext(); + } + } + private void delete0(Path p, long deleteBeforeTime) { + try { + if (Files.getLastModifiedTime(p).toMillis() < deleteBeforeTime) { + log.info("Delete temporary file: " + p); + Files.delete(p); + } + } catch (IOException e) { + log.error("Something wrong while process file: " + p, e); + } + } +} ===================================== persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaIdFactory.java → services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTaskConfiguration.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.entities; +package fr.ird.observe.services.service; -/* +/*- * #%L - * ObServe :: Persistence + * ObServe :: Services API * %% * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io * %% @@ -22,17 +22,19 @@ package fr.ird.observe.entities; * #L% */ +import java.io.File; + /** - * Created on 21/08/15. - * * @author Tony Chemit - dev(a)tchemit.fr + * @since 8.0 */ -public class ObserveTopiaIdFactory extends ObserveTopiaIdFactorySupport { +public interface CleanTemporaryFilesTaskConfiguration { + + File getTemporaryDirectory(); - private static final long serialVersionUID = 1L; + void setTemporaryDirectory(File temporaryDirectory); - public ObserveTopiaIdFactory() { - super("fr.ird.observe.entities."); - } + int getTemporaryFilesTimeout(); + void setTemporaryFilesTimeout(int temporaryFilesTimeout); } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/31be83c4c1554f685caa5ee47… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/31be83c4c1554f685caa5ee47… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] Accumulation de fichiers - Closes #1462 (report v7)
by Tony CHEMIT 13 Apr '20

13 Apr '20
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: ae6dc319 by tchemit at 2020-04-14T00:44:33+02:00 Accumulation de fichiers - Closes #1462 (report v7) - - - - - 27 changed files: - client-configuration/src/main/config/Client.ini - client-configuration/src/main/i18n/getters/config.getter - client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java - client-core/src/main/java/fr/ird/observe/client/ObserveRunner.java - client-core/src/main/java/fr/ird/observe/client/ObserveSwingApplicationContext.java - client-core/src/main/java/fr/ird/observe/client/db/ObserveDataSourcesManager.java - client-core/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java - client-core/src/main/java/fr/ird/observe/client/ui/actions/main/menu/config/ShowConfigAction.java - observe-i18n/src/main/i18n/translations/observe_en_GB.properties - observe-i18n/src/main/i18n/translations/observe_es_ES.properties - observe-i18n/src/main/i18n/translations/observe_fr_FR.properties - − persistence/src/main/java/fr/ird/observe/persistence/AbstractObserveTopiaDao.java - − persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaConfiguration.java - − persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaConfigurationFactory.java - − persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaIdFactory.java - pom.xml - server-configuration/pom.xml - server-configuration/src/main/config/Server.ini - server-configuration/src/main/i18n/getters/config.getter - server-configuration/src/main/java/fr/ird/observe/server/configuration/ServerConfig.java - server-core/src/main/java/fr/ird/observe/server/ObserveWebApplicationContext.java - services-local/src/main/java/fr/ird/observe/services/local/ObserveSecurityHelper.java - services-local/src/main/java/fr/ird/observe/services/local/ObserveTopiaApplicationContextFactory.java - services-local/src/main/java/fr/ird/observe/services/local/service/DataSourceServiceLocal.java - services-local/src/test/java/fr/ird/observe/services/local/LocalTestClassResource.java - + services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTask.java - + services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTaskConfiguration.java Changes: ===================================== client-configuration/src/main/config/Client.ini ===================================== @@ -130,8 +130,8 @@ defaultValue = ${data.directory}/validation-report transient = true final = true -[option tmpDirectory] -description = observe.config.defaultTmpDirectory.description +[option temporaryDirectory] +description = observe.config.temporaryDirectory.description key = tmp.directory type = file defaultValue = ${data.directory}/tmp @@ -599,6 +599,12 @@ key = ui.seineBycatchObservedSystem type = fr.ird.observe.validation.SeineBycatchObservedSystemConfig defaultValue = {\"fr.ird.observe.entities.referentiel.Species#1239832684290#0.04680507324710936\": [\"fr.ird.observe.entities.referentiel.seine.ObservedSystem#0#1.0\",\"fr.ird.observe.entities.referentiel.seine.ObservedSystem#0#1.1\"]} +[option temporaryFilesTimeout] +description = observe.config.temporaryFilesTimeout.description +key = observe.config.temporaryFilesTimeout +type = int +defaultValue = 120 + [action help] description = observe.action.commandline.help action = "fr.ird.observe.client.ObserveCLAction#help" ===================================== client-configuration/src/main/i18n/getters/config.getter ===================================== @@ -30,7 +30,6 @@ observe.config.defaultLocalDbDirectory.description observe.config.defaultMapDirectory.description observe.config.defaultReportDirectory.description observe.config.defaultResourcesDirectory.description -observe.config.defaultTmpDirectory.description observe.config.defaultValidationReportDirectory.description observe.config.devMode observe.config.floatingObjectPresets.description @@ -78,6 +77,8 @@ observe.config.speciesList.seine.schoolEstimate observe.config.speciesList.seine.targetCatch observe.config.swingSessionFile.description observe.config.temperature.format +observe.config.temporaryDirectory.description +observe.config.temporaryFilesTimeout.description observe.config.ui.autoPopupNumberEditor observe.config.ui.changeSynchroSrc observe.config.ui.dcp.error.color ===================================== client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java ===================================== @@ -30,6 +30,7 @@ import fr.ird.observe.client.constants.DbMode; import fr.ird.observe.dto.FloatingObjectPreset; import fr.ird.observe.dto.presets.RemoteDataSourceConfiguration; import fr.ird.observe.dto.presets.ServerDataSourceConfiguration; +import fr.ird.observe.services.service.CleanTemporaryFilesTaskConfiguration; import io.ultreia.java4all.config.ApplicationConfig; import io.ultreia.java4all.config.ApplicationConfigInit; import io.ultreia.java4all.config.ApplicationConfigScope; @@ -66,7 +67,7 @@ import static io.ultreia.java4all.i18n.I18n.t; * @author Tony Chemit - dev(a)tchemit.fr * @since 1.0 */ -public class ClientConfig extends GeneratedClientConfig implements NavigationTreeConfig { +public class ClientConfig extends GeneratedClientConfig implements NavigationTreeConfig, CleanTemporaryFilesTaskConfiguration { public static final String DB_NAME = "obstuna"; public static final List<ClientConfigOption> MAP_LAYERS = ImmutableList.of( ===================================== client-core/src/main/java/fr/ird/observe/client/ObserveRunner.java ===================================== @@ -37,7 +37,6 @@ import io.ultreia.java4all.i18n.runtime.boot.UserI18nBootLoader; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter; import org.apache.commons.beanutils.converters.DateConverter; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -71,7 +70,7 @@ import static fr.ird.observe.client.configuration.ClientConfigOption.INITIAL_DB_ import static fr.ird.observe.client.configuration.ClientConfigOption.MAP_DIRECTORY; import static fr.ird.observe.client.configuration.ClientConfigOption.REPORT_DIRECTORY; import static fr.ird.observe.client.configuration.ClientConfigOption.RESOURCES_DIRECTORY; -import static fr.ird.observe.client.configuration.ClientConfigOption.TMP_DIRECTORY; +import static fr.ird.observe.client.configuration.ClientConfigOption.TEMPORARY_DIRECTORY; import static fr.ird.observe.client.configuration.ClientConfigOption.VALIDATION_REPORT_DIRECTORY; import static io.ultreia.java4all.i18n.I18n.t; @@ -402,10 +401,7 @@ public abstract class ObserveRunner extends ApplicationRunner { // 2 - tmp directory - resourceManager.createDirectory(config, TMP_DIRECTORY); - - // suppression du contenu du répertoire temporaire - FileUtils.cleanDirectory(config.getTmpDirectory()); + resourceManager.createDirectory(config, TEMPORARY_DIRECTORY); // 3 - backup directory ===================================== client-core/src/main/java/fr/ird/observe/client/ObserveSwingApplicationContext.java ===================================== @@ -36,6 +36,7 @@ import fr.ird.observe.dto.decoration.DecoratorService; import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.services.ObserveDataSourceConfigurationMainFactory; import fr.ird.observe.services.ObserveServiceMainFactory; +import fr.ird.observe.services.service.CleanTemporaryFilesTask; import fr.ird.observe.spi.DtoModelHelper; import fr.ird.observe.validation.ValidatorDto; import fr.ird.observe.validation.ValidatorsManager; @@ -53,6 +54,7 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Objects; +import java.util.Timer; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -65,6 +67,7 @@ import static fr.ird.observe.client.ObserveSwingApplicationContext.Entries.DATA_ import static fr.ird.observe.client.ObserveSwingApplicationContext.Entries.DATA_SOURCES_MANAGER; import static fr.ird.observe.client.ObserveSwingApplicationContext.Entries.DATA_SOURCE_CONFIGURATION_FACTORY; import static fr.ird.observe.client.ObserveSwingApplicationContext.Entries.DECORATOR_SERVICE; +import static fr.ird.observe.client.ObserveSwingApplicationContext.Entries.DELETE_TEMPORARY_FILES_TASK; import static fr.ird.observe.client.ObserveSwingApplicationContext.Entries.FLOATING_OBJECT_REFERENCES_MANAGER; import static fr.ird.observe.client.ObserveSwingApplicationContext.Entries.H2_SERVER; import static fr.ird.observe.client.ObserveSwingApplicationContext.Entries.H2_SERVER_MODE; @@ -130,7 +133,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im BACKUP_MANAGER.set(new BackupsManager(config.getBackupDirectory().toPath(), config.getBackupsFile().toPath())); LOCAL_DATABASE_BACKUP_TIMER.set(new ScheduledThreadPoolExecutor(1)); OBSERVE_SWING_SESSION_HELPER.set(new ObserveSwingSessionHelper(config.getSwingSessionFile())); - + DELETE_TEMPORARY_FILES_TASK.set(CleanTemporaryFilesTask.create(config)); lock = new Object(); } @@ -174,6 +177,10 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im return DATA_SOURCES_MANAGER.get(); } + public Timer getCleanTemporaryFilesTask() { + return DELETE_TEMPORARY_FILES_TASK.get(); + } + public DecoratorService getDecoratorService() { return DECORATOR_SERVICE.get(); } @@ -319,7 +326,6 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im toClose.add(OBSERVE_SWING_SESSION_HELPER); toClose.add(BACKUP_MANAGER); toClose.add(DATA_SOURCES_MANAGER); - for (Entries closeable : toClose) { try { log.info("Closing " + closeable.objectName); @@ -329,7 +335,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im } } ObserveServiceMainFactory.get().close(); - + closeDeleteTemporaryFilesTimer(); // fermeture du context principal clear(); @@ -347,6 +353,13 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im super.finalize(); } + void closeDeleteTemporaryFilesTimer() { + try { + getCleanTemporaryFilesTask().cancel(); + } catch (Exception e) { + log.error("Could not terminates delete temporary files timer...", e); + } + } enum Entries { CONFIG("Config", ClientConfig.class), @@ -359,6 +372,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im DATA_SOURCES_MANAGER("Data sources manager", ObserveDataSourcesManager.class), FLOATING_OBJECT_REFERENCES_MANAGER("Floating object referenfences manager", FloatingObjectPresetsManager.class), OBSERVE_SWING_SESSION_HELPER("Swing session Helper", ObserveSwingSessionHelper.class), + DELETE_TEMPORARY_FILES_TASK(" Delete temporary files task", Timer.class), VALIDATION_CONTEXT("Validation context", ClientValidationContext.class), MAIN_UI("Main UI", ObserveMainUI.class), ACTIONS("Command line Actions", ObserveCLAction.class), ===================================== client-core/src/main/java/fr/ird/observe/client/db/ObserveDataSourcesManager.java ===================================== @@ -171,7 +171,7 @@ public class ObserveDataSourcesManager implements Closeable { ClientConfig config = applicationContext.getConfig(); ObserveDataSourceConfigurationMainFactory configurationMainFactory = applicationContext.getObserveDataSourceConfigurationMainFactory(); - File tmpDirectory = config.getTmpDirectory(); + File tmpDirectory = config.getTemporaryDirectory(); File dbDirectory = new File(tmpDirectory, ClientConfig.DB_NAME + UUID.randomUUID().toString()); ===================================== client-core/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java ===================================== @@ -477,7 +477,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements Locale locale = config.getLocale(); - File tmpDirectory = config.getTmpDirectory(); + File tmpDirectory = config.getTemporaryDirectory(); ReferentialLocale referentialLocale = ReferentialLocale.valueOf(locale); ===================================== client-core/src/main/java/fr/ird/observe/client/ui/actions/main/menu/config/ShowConfigAction.java ===================================== @@ -291,7 +291,7 @@ public class ShowConfigAction extends MenuActionSupport { helper.addOption(ClientConfigOption.DB_DIRECTORY); helper.addOption(ClientConfigOption.BACKUP_DIRECTORY); helper.addOption(ClientConfigOption.IMPORT_DIRECTORY); - helper.addOption(ClientConfigOption.TMP_DIRECTORY); + helper.addOption(ClientConfigOption.TEMPORARY_DIRECTORY); helper.addOption(ClientConfigOption.VALIDATION_REPORT_DIRECTORY); helper.addOption(ClientConfigOption.RESOURCES_DIRECTORY); helper.addOption(ClientConfigOption.SWING_SESSION_FILE); ===================================== observe-i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -1738,7 +1738,6 @@ observe.config.defaultLocalDbDirectory.description=Default directory where to st observe.config.defaultMapDirectory.description=Default directory where to store map layers observe.config.defaultReportDirectory.description=Default directory where to store report definition files observe.config.defaultResourcesDirectory.description=Default user resources directory -observe.config.defaultTmpDirectory.description=Default temporary directory used by application and clean at each launch. observe.config.defaultValidationReportDirectory.description=Default validation report directory observe.config.devMode=Dev mode observe.config.floatingObjectPresets.description=Floating Objects references @@ -1786,6 +1785,8 @@ observe.config.speciesList.seine.schoolEstimate=Species for school esitmates observe.config.speciesList.seine.targetCatch=Species for target catches observe.config.swingSessionFile.description=Swing session file. observe.config.temperature.format=Default temperature format +observe.config.temporaryDirectory.description=Default temporary directory used by application and clean at each launch. +observe.config.temporaryFilesTimeout.description=Temporary files delete (in hours) observe.config.ui.autoPopupNumberEditor=Flag sets to true when number editor show automaticly popup observe.config.ui.changeSynchroSrc=Flag sets to true if you can change local source in admin tasks observe.config.ui.dcp.error.color=Color to notify errors while validating floating object materials. ===================================== observe-i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -1738,7 +1738,6 @@ observe.config.defaultLocalDbDirectory.description=Directorio de almacenamiento observe.config.defaultMapDirectory.description=El directorio donde se ubican los mapas. observe.config.defaultReportDirectory.description=Directorio por defecto de los informes de la aplicación observe.config.defaultResourcesDirectory.description=Directorio de almacenamiento de los recursos de usuario como las traducciones o la consultas de informes -observe.config.defaultTmpDirectory.description=Directorio temporal por defecto observe.config.defaultValidationReportDirectory.description=Directorio por defecto de almacenamiento de los informes de validación observe.config.devMode=Modo desarrollador observe.config.floatingObjectPresets.description=Objetos flotantes de referencia @@ -1786,6 +1785,8 @@ observe.config.speciesList.seine.schoolEstimate=Especies para las estimaciones observe.config.speciesList.seine.targetCatch=Especies par las capturas objetivo observe.config.swingSessionFile.description=Copia de seguridad del estado del UI. observe.config.temperature.format=Unidad de temperatura +observe.config.temporaryDirectory.description=Directorio temporal por defecto +observe.config.temporaryFilesTimeout.description=Temporary files delete (in hours) \#TODO observe.config.ui.autoPopupNumberEditor=Para mostrar automáticamente el editor numérico durante la edición de un número observe.config.ui.changeSynchroSrc=Para autorizar la seleción de la base fuente durante las operaciones sobre la base observe.config.ui.dcp.error.color=Color para notificar los errores sobre la composición de dcps ===================================== observe-i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -1738,7 +1738,6 @@ observe.config.defaultLocalDbDirectory.description=Le répertoire où est stock observe.config.defaultMapDirectory.description=Le répertoire où sont stockées les cartes. observe.config.defaultReportDirectory.description=Répertoire par défaut des rapports de l'application observe.config.defaultResourcesDirectory.description=Le répertoire où sont stockées les ressources de l'utilisateur comme les traductions ou les requêtes de rapports. -observe.config.defaultTmpDirectory.description=Le répertoire temporaire par défaut observe.config.defaultValidationReportDirectory.description=Le répertoire par défaut où sont stockés les rapports de validation observe.config.devMode=Mode développeur observe.config.floatingObjectPresets.description=Objets flottants de référence @@ -1786,6 +1785,8 @@ observe.config.speciesList.seine.schoolEstimate=Espèces pour les estimations observe.config.speciesList.seine.targetCatch=Espèces pour les captures cible observe.config.swingSessionFile.description=Fichier de sauvegarde des états des UI. observe.config.temperature.format=Unité de température +observe.config.temporaryDirectory.description=Le répertoire temporaire par défaut +observe.config.temporaryFilesTimeout.description=Nettoyage des fichiers temporaires (en heures) observe.config.ui.autoPopupNumberEditor=Pour afficher automatiquement l'éditeur numérique lors de l'édition d'un nombre observe.config.ui.changeSynchroSrc=Pour autoriser la sélection de la base source dans les opérations sur base observe.config.ui.dcp.error.color=Couleur pour notifier les erreurs sur la composition des dcps ===================================== persistence/src/main/java/fr/ird/observe/persistence/AbstractObserveTopiaDao.java deleted ===================================== @@ -1,77 +0,0 @@ -package fr.ird.observe.persistence; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 fr.ird.observe.entities.ObserveEntity; -import org.nuiton.topia.persistence.internal.AbstractTopiaDao; -import org.nuiton.topia.persistence.support.TopiaSqlQuery; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.Date; -import java.util.List; -import java.util.Map; - -public abstract class AbstractObserveTopiaDao<E extends ObserveEntity> extends AbstractTopiaDao<E> { - - private final GetLastupdateDateSqlQuery getLastUpdateDateSqlQuery; - - protected AbstractObserveTopiaDao() { - String schemaName = getTopiaEntityEnum().dbSchemaName(); - String tableName = getTopiaEntityEnum().dbTableName(); - getLastUpdateDateSqlQuery = new GetLastupdateDateSqlQuery(schemaName, tableName); - } - - public Date getLastUpdateDate() { - return topiaSqlSupport.findSingleResult(getLastUpdateDateSqlQuery); - } - - public <O> List<O> findAllFromHql(String hql, Map<String, Object> hqlParameters) { - return findAll(hql, hqlParameters); - } - - private static class GetLastupdateDateSqlQuery extends TopiaSqlQuery<Timestamp> { - - protected final String sql; - - private GetLastupdateDateSqlQuery(String schemaName, String tableName) { - this.sql = "SELECT max(" + ObserveEntity.PROPERTY_LAST_UPDATE_DATE + ") FROM " + schemaName + "." + tableName; - } - - @Override - public PreparedStatement prepareQuery(Connection connection) throws SQLException { - return connection.prepareStatement(sql); - } - - @Override - public Timestamp prepareResult(ResultSet set) throws SQLException { - return set.getTimestamp(1); - } - - } - - -} ===================================== persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaConfiguration.java deleted ===================================== @@ -1,84 +0,0 @@ -package fr.ird.observe.persistence; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.nuiton.topia.persistence.BeanTopiaConfiguration; -import org.nuiton.topia.persistence.HibernateAvailableSettings; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.Properties; -import java.util.TreeMap; - -/** - * Created on 23/08/15. - * - * @author Tony Chemit - dev(a)tchemit.fr - */ -public class ObserveTopiaConfiguration extends BeanTopiaConfiguration { - - private static final long serialVersionUID = 1L; - - private final boolean h2Configuration; - protected final boolean showSql; - private static final Map<String, String> HIBERNATE_GLOBAL_PROPERTIES; - - static { - - Properties p = new Properties(); - try (InputStream stream = ObserveTopiaPersistenceContext.class.getResourceAsStream("/hibernate.properties")) { - try { - p.load(stream); - } catch (IOException e) { - throw new IllegalStateException(e); - } - } catch (IOException e) { - throw new IllegalStateException(e); - } - HIBERNATE_GLOBAL_PROPERTIES = new TreeMap<>(); - for (String s : p.stringPropertyNames()) { - HIBERNATE_GLOBAL_PROPERTIES.put(s, p.getProperty(s)); - } - - } - - public ObserveTopiaConfiguration(JdbcConfiguration jdbcConfiguration, boolean h2Configuration, boolean showSql) { - super(jdbcConfiguration); - this.h2Configuration = h2Configuration; - this.showSql = showSql; - if (showSql) { - hibernateExtraConfiguration.put(HibernateAvailableSettings.SHOW_SQL, Boolean.TRUE.toString()); - } - hibernateExtraConfiguration.putAll(HIBERNATE_GLOBAL_PROPERTIES); - } - - public boolean isH2Configuration() { - return h2Configuration; - } - - public boolean isShowSql() { - return showSql; - } -} ===================================== persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaConfigurationFactory.java deleted ===================================== @@ -1,143 +0,0 @@ -package fr.ird.observe.persistence; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; -import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; -import org.nuiton.topia.service.migration.TopiaMigrationService; -import org.nuiton.topia.service.script.TopiaSqlScriptGeneratorServiceImpl; - -import java.io.File; - -/** - * Created on 23/08/15. - * - * @author Tony Chemit - dev(a)tchemit.fr - */ -public class ObserveTopiaConfigurationFactory { - - /** l'url d'acces a la base locale */ - private static final String H2_LOCAL_URL = - "jdbc:h2:file:%s;" + - // on peut aussi utiliser file, socket - "FILE_LOCK=file;" + - //1 or 2 is needed to restore avec crash - // 0: logging is disabled (faster), - // 1: logging of the data is enabled, but logging of the index - // changes is disabled (default), 2: logging of both data and index - // changes are enabled - "LOG=0;" + - // on peut aussi utiliser hsqldb, mysql ou postgresql - "MODE=postgresql;" + - //"MODE=hsqldb;" + - // Sets the default lock timeout (in milliseconds) in this - // database that is used for the new sessions. - "DEFAULT_LOCK_TIMEOUT=100;" + - // -1: the database is never closed until the close delay is set to - // some other rev or SHUTDOWN is called., 0: no delay (default; the - // database is closed if the last connection to it is closed)., n: - // the database is left open for n second after the last connection - // is closed. - "DB_CLOSE_DELAY=0;" + - // 0: no locking (should only be used for testing), - // 1: table level locking (default), - // 2: table level locking with garbage collection (if the - // application does not close all connections). - // LOCK_MODE 3 (READ_COMMITTED). Table level locking, but only when - // writing (no read locks). - "LOCK_MODE=3;" + - // Levels: 0=off, 1=error, 2=info, 3=debug. - "TRACE_LEVEL_FILE=0;" + - // on system.out: 0=off, 1=error, 2=info, 3=debug. - "TRACE_LEVEL_SYSTEM_OUT=0;" + - // maximumn cache to improve performance... - "CACHE_SIZE=65536;" + - // avoid timeout on reading tables (see http://stackoverflow.com/questions/4162557/timeout-error-trying-to-lock-tab…) - "MVCC=true"; - - private static final JdbcConfigurationBuilder JDBC_CONFIGURATION_BUILDER = new JdbcConfigurationBuilder(); - private static final Logger log = LogManager.getLogger(ObserveTopiaConfigurationFactory.class); - - public static ObserveTopiaConfiguration forPostgresqlDatabase(String jdbcUrl, - String username, - String password, - boolean initSchema, - boolean traceSql) { - - JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forPostgresqlDatabase(jdbcUrl, username, password); - - ObserveTopiaConfiguration topiaConfiguration = createTopiaConfiguration(jdbcConfiguration, - initSchema, - false, - traceSql); - - log.debug("PG topia configuration: " + topiaConfiguration); - return topiaConfiguration; - - } - - public static ObserveTopiaConfiguration forH2Database(File dbDirectory, - String dbName, - String username, - String password, - boolean initSchema, - boolean traceSql) { - - String dbPath = new File(dbDirectory, dbName).getPath(); - String jdbcUrl = String.format(H2_LOCAL_URL, dbPath); - - JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forH2Database(jdbcUrl, username, password); - - ObserveTopiaConfiguration topiaConfiguration = createTopiaConfiguration(jdbcConfiguration, - initSchema, - true, - traceSql); - - log.debug("H2 topia configuration: " + topiaConfiguration); - return topiaConfiguration; - - } - - private static ObserveTopiaConfiguration createTopiaConfiguration(JdbcConfiguration jdbcConfiguration, - boolean initSchema, - boolean h2Configuration, - boolean traceSql) { - - ObserveTopiaConfiguration topiaConfiguration = new ObserveTopiaConfiguration(jdbcConfiguration, h2Configuration, traceSql); - topiaConfiguration.setTopiaIdFactoryClass(ObserveTopiaIdFactory.class); - topiaConfiguration.setInitSchema(initSchema); - topiaConfiguration.setValidateSchema(false); - topiaConfiguration.setUseHikariForJdbcConnectionPooling(true); - - log.debug("jdbcUrl: " + topiaConfiguration.getJdbcConnectionUrl()); - - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME, TopiaMigrationService.class); - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.SQL_SCRIPT_GENERATOR_BATCH_SERVICE_NAME, TopiaSqlScriptGeneratorServiceImpl.class); - - return topiaConfiguration; - - } - -} ===================================== persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaIdFactory.java deleted ===================================== @@ -1,90 +0,0 @@ -package fr.ird.observe.persistence; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.internal.LegacyTopiaIdFactory; - -/** - * Created on 21/08/15. - * - * @author Tony Chemit - dev(a)tchemit.fr - */ -public class ObserveTopiaIdFactory extends LegacyTopiaIdFactory { - - private static final Logger log = LogManager.getLogger(ObserveTopiaIdFactory.class); - - private static final long serialVersionUID = 1L; - - public <E extends TopiaEntity> String newTopiaId(Class<E> entityType) { - - double random = Math.random(); - while (Double.toString(random).contains("E-")) { - random = Math.random(); - } - return newTopiaId(entityType, random + ""); - } - - public <E extends TopiaEntity> boolean isTopiaId(Class<E> entityClass, String str) { - boolean isTopiaId = false; - if (str != null && !str.endsWith(getSeparator())) { - String[] split = str.split(getSeparator()); - if (split.length == 3) { - String className = split[0]; - isTopiaId = entityClass.getName().equals(className); - for (int index = 1; index < split.length; index++) { - isTopiaId &= StringUtils.isNumeric(split[index]); - } - } - } - return isTopiaId; - } - - @Override - public boolean isTopiaId(String str) { - boolean isTopiaId = false; - if (str != null && !str.endsWith(getSeparator())) { - String[] split = str.split(getSeparator()); - if (split.length == 3) { - String className = split[0]; - try { - Class.forName(className); - isTopiaId = true; - for (int index = 1; index < split.length; index++) { - isTopiaId &= StringUtils.isNumeric(split[index]); - } - } catch (ClassNotFoundException eee) { - // nothing to do, just return false - if (log.isDebugEnabled()) { - log.debug(eee); - } - } - } - } - return isTopiaId; - } - -} ===================================== pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2020.15</version> + <version>2020.17</version> </parent> <groupId>fr.ird.observe</groupId> @@ -155,7 +155,7 @@ <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> <buildDate>${maven.build.timestamp}</buildDate> - <observeToolkitVersion>3.7.27</observeToolkitVersion> + <observeToolkitVersion>3.7.28</observeToolkitVersion> <!--<lib.version.java4all.http>1.0.13</lib.version.java4all.http>--> <lib.version.nuiton.validation>3.1</lib.version.nuiton.validation> <!--<lib.version.java4all.config>1.0.3</lib.version.java4all.config>--> @@ -165,7 +165,7 @@ <lib.version.java4all.eugene>3.0-alpha-26</lib.version.java4all.eugene> <!-- <lib.version.java4all.jaxx>3.0-alpha-56</lib.version.java4all.jaxx>--> <!--<lib.version.java4all.i18n>4.0-beta-8-SNAPSHOT</lib.version.java4all.i18n>--> - <lib.version.java4all.topia>1.1.16</lib.version.java4all.topia> + <lib.version.java4all.topia>1.1.17</lib.version.java4all.topia> <lib.version.nuiton.utils>3.0</lib.version.nuiton.utils> <!--<lib.version.nuiton.topia>3.6-SNAPSHOT</lib.version.nuiton.topia>--> <!--<lib.version.java4all.eugene>3.0-alpha-21</lib.version.java4all.eugene>--> ===================================== server-configuration/pom.xml ===================================== @@ -112,6 +112,12 @@ <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> + <dependency> + <groupId>fr.ird.observe</groupId> + <artifactId>services</artifactId> + <version>7.5.1-SNAPSHOT</version> + <scope>compile</scope> + </dependency> </dependencies> ===================================== server-configuration/src/main/config/Server.ini ===================================== @@ -117,3 +117,9 @@ key = observeweb.httpTimeout type = int defaultValue = 30000 +[option temporaryFilesTimeout] +description = observe.config.temporaryFilesTimeout.description +key = observeweb.temporaryFilesTimeout +type = int +defaultValue = 120 + ===================================== server-configuration/src/main/i18n/getters/config.getter ===================================== @@ -1,4 +1,5 @@ ObserveWebApplicationConfig.description +observe.config.temporaryFilesTimeout.description observe.model.version observeweb.adminApiKey.description observeweb.apiUrl.description ===================================== server-configuration/src/main/java/fr/ird/observe/server/configuration/ServerConfig.java ===================================== @@ -25,6 +25,7 @@ package fr.ird.observe.server.configuration; import com.google.common.io.CharSource; import com.google.common.io.Resources; import fr.ird.observe.dto.ObserveUtil; +import fr.ird.observe.services.service.CleanTemporaryFilesTaskConfiguration; import io.ultreia.java4all.config.ApplicationConfig; import io.ultreia.java4all.config.ArgumentsParserException; import org.apache.logging.log4j.LogManager; @@ -44,7 +45,7 @@ import java.nio.file.Paths; * * @author Tony Chemit - dev(a)tchemit.fr */ -public class ServerConfig extends GeneratedServerConfig { +public class ServerConfig extends GeneratedServerConfig implements CleanTemporaryFilesTaskConfiguration { private static final String DEFAULT_OBSERVE_WEB_CONFIGURATION_FILENAME = "observe-server.conf"; /** Logger. */ ===================================== server-core/src/main/java/fr/ird/observe/server/ObserveWebApplicationContext.java ===================================== @@ -42,20 +42,26 @@ import fr.ird.observe.services.ObserveServiceFactory; import fr.ird.observe.services.ObserveServiceInitializer; import fr.ird.observe.services.ObserveServiceMainFactory; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.service.CleanTemporaryFilesTask; import fr.ird.observe.services.service.ObserveService; import fr.ird.observe.services.service.actions.consolidate.dcp.FloatingObjectModification; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.debux.webmotion.server.call.HttpContext; import org.nuiton.version.Version; import javax.servlet.ServletContext; import java.io.Closeable; import java.io.IOException; +import java.util.Timer; /** * @author Tony Chemit - dev(a)tchemit.fr */ public class ObserveWebApplicationContext implements Closeable { + private static final Logger log = LogManager.getLogger(ObserveWebApplicationContext.class); + public static final String APPLICATION_CONTEXT_PARAMETER = ObserveWebApplicationContext.class.getName(); public static final String MISSING_APPLICATION_CONTEXT = @@ -74,6 +80,8 @@ public class ObserveWebApplicationContext implements Closeable { protected ObserveWebSecurityApplicationContext securityApplicationContext; + private Timer deleteTemporaryFilesTimer; + public static ObserveWebApplicationContext getApplicationContext(HttpContext context) { ServletContext servletContext = context.getServletContext(); @@ -125,6 +133,10 @@ public class ObserveWebApplicationContext implements Closeable { } }; + if (deleteTemporaryFilesTimer != null) { + closeDeleteTemporaryFilesTimer(); + } + deleteTemporaryFilesTimer = CleanTemporaryFilesTask.create(getApplicationConfiguration()); } @@ -147,6 +159,8 @@ public class ObserveWebApplicationContext implements Closeable { @Override public void close() throws IOException { + closeDeleteTemporaryFilesTimer(); + // Supprimer le cache des sessions securityApplicationContext.close(); @@ -154,6 +168,13 @@ public class ObserveWebApplicationContext implements Closeable { mainServiceFactory.close(); } + void closeDeleteTemporaryFilesTimer() { + try { + deleteTemporaryFilesTimer.cancel(); + } catch (Exception e) { + log.error("Could not terminates delete temporary files timer...", e); + } + } public ObserveDtoGsonSupplier getGsonSupplier() { return gsonSupplier; ===================================== services-local/src/main/java/fr/ird/observe/services/local/ObserveSecurityHelper.java ===================================== @@ -27,6 +27,7 @@ import com.google.common.collect.Sets; import fr.ird.observe.dto.ObserveDbRole; import fr.ird.observe.dto.db.ObserveDbUserDto; import fr.ird.observe.persistence.Entities; +import fr.ird.observe.persistence.ObserveTopiaConfiguration; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; @@ -86,20 +87,21 @@ public class ObserveSecurityHelper { OBSERVE_LONGLINE_SCHEMA_NAME); private static final Logger log = LogManager.getLogger(ObserveSecurityHelper.class); private final JdbcPostgresHelper jdbcHelper; + private final Path temporaryDirectory; - public ObserveSecurityHelper(JdbcConfiguration jdbcConfiguration) { + public ObserveSecurityHelper(ObserveTopiaConfiguration jdbcConfiguration) { this.jdbcHelper = new JdbcPostgresHelper(jdbcConfiguration); + this.temporaryDirectory = jdbcConfiguration.getTemporaryDirectory(); } public void applySecurity(Set<ObserveDbUserDto> users) { if (users == null) { throw new NullPointerException("users can not be null"); } - Path scriptPath; try { - scriptPath = Files.createTempFile("topia-sql-script-", ".sql"); + scriptPath = Files.createTempFile(temporaryDirectory, "topia-sql-script-", ".sql"); } catch (IOException e) { throw new IllegalStateException("Can't create temporary path", e); } ===================================== services-local/src/main/java/fr/ird/observe/services/local/ObserveTopiaApplicationContextFactory.java ===================================== @@ -149,6 +149,7 @@ public class ObserveTopiaApplicationContextFactory { configuration.getJdbcUrl(), configuration.getUsername(), String.valueOf(configuration.getPassword()), + configuration.getTemporaryDirectory(), initSchema, configuration.isTraceSql() ); @@ -174,6 +175,7 @@ public class ObserveTopiaApplicationContextFactory { configuration.getDbName(), configuration.getUsername(), String.valueOf(configuration.getPassword()), + configuration.getTemporaryDirectory(), initSchema, configuration.isTraceSql() ); ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/DataSourceServiceLocal.java ===================================== @@ -70,6 +70,7 @@ import org.nuiton.version.Versions; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; @@ -110,6 +111,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS Preconditions.checkState(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport); ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; + Path temporaryDirectory = serviceContext.getTemporaryDirectoryRoot().toPath(); ObserveDataSourceInformation dataSourceInformation; if (dataSourceConfigurationTopiaSupport.isH2Database()) { @@ -143,7 +145,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS h2DataSourceConfiguration.getDbName(), h2DataSourceConfiguration.getUsername(), new String(h2DataSourceConfiguration.getPassword()), - false, + temporaryDirectory, false, false); @@ -167,7 +169,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase(pgDataSourceConfiguration.getJdbcUrl(), pgDataSourceConfiguration.getUsername(), new String(pgDataSourceConfiguration.getPassword()), - false, + temporaryDirectory, false, false); try { @@ -190,6 +192,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); Preconditions.checkState(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport); ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; @@ -226,6 +229,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS h2DataSourceConfiguration.getDbName(), h2DataSourceConfiguration.getUsername(), new String(h2DataSourceConfiguration.getPassword()), + temporaryDirectory, false, false); @@ -250,6 +254,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase(pgDataSourceConfiguration.getJdbcUrl(), pgDataSourceConfiguration.getUsername(), new String(pgDataSourceConfiguration.getPassword()), + temporaryDirectory, false, false); @@ -269,13 +274,22 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS } + Path getTemporaryDirectory(ObserveDataSourceConfiguration dataSourceConfiguration) { + Path temporaryDirectory = dataSourceConfiguration.getTemporaryDirectory(); + if (temporaryDirectory == null) { + temporaryDirectory = serviceContext.getTemporaryDirectoryRoot().toPath(); + dataSourceConfiguration.setTemporaryDirectory(temporaryDirectory); + } + return temporaryDirectory; + } + @Override public ObserveDataSourceConnectionTopia create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, BabModelVersionException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { dataSourceCreateConfiguration.validateConfiguration(); - + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); boolean initSchema = !dataSourceCreateConfiguration.isImportDatabase(); ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, initSchema); @@ -294,10 +308,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS } else { // base postgres // on realise les import dans un base H2 temporaire - // FIXME il faut obtenir le repertoit temporaire d'observe plutot que celui du système File tmpDir; try { - tmpDir = Files.createTempDirectory("obstuna").toFile(); + tmpDir = Files.createTempDirectory(temporaryDirectory, "obstuna").toFile(); } catch (IOException e) { throw new IllegalStateException("could not create temporary directory ", e); } @@ -322,8 +335,6 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS if (!databaseFile.delete()) { throw new IllegalStateException("could not delete " + databaseFile); } - - } } else { @@ -429,7 +440,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS dataSourceService.close(); } } - log.info(String.format("Import data%s", request.isAddReferential() ? " and referential." : ".")); + log.info("Import data" + (request.isAddReferential() ? " and referential." : ".")); topiaApplicationContext.executeSqlStatements(dataDump); } @@ -460,7 +471,8 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { - + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); ObserveDataSourceInformation dataSourceInformation = checkCanConnect(dataSourceConfiguration); Version dbVersion = dataSourceInformation.getVersion(); @@ -562,6 +574,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public void applySecurity(ObserveDataSourceConfiguration dataSourceConfiguration, ImmutableSet<ObserveDbUserDto> users) { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); + // pas de securité pour les bases autres que postgresql if (dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaPG) { @@ -580,6 +595,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public void migrateData(ObserveDataSourceConfiguration dataSourceConfiguration) { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); topiaApplicationContext.getMigrationService().runSchemaMigration(); } ===================================== services-local/src/test/java/fr/ird/observe/services/local/LocalTestClassResource.java ===================================== @@ -105,6 +105,7 @@ public class LocalTestClassResource extends TestClassResourceSupport { if (log.isInfoEnabled()) { log.info("Create shared database: " + dbVersion.toString() + "/" + dbName + " to " + sharedDatabaseFile); } + sharedDatabaseConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); try (DataSourceService dataSourceService = newService(sharedDatabaseConfiguration, DataSourceService.class)) { DataSourceCreateConfigurationDto createConfiguration = new DataSourceCreateConfigurationDto(); @@ -139,12 +140,14 @@ public class LocalTestClassResource extends TestClassResourceSupport { } dataSourceConfiguration.setModelVersion(ObserveTestConfiguration.getModelVersion()); + dataSourceConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); return dataSourceConfiguration; } public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + dataSourceConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); ObserveServiceInitializer observeServiceInitializer = ObserveServiceInitializer.create( Locale.FRANCE, ReferentialLocale.FR, ===================================== services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTask.java ===================================== @@ -0,0 +1,119 @@ +package fr.ird.observe.services.service; + +/*- + * #%L + * ObServe :: Services API + * %% + * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io + * %% + * 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 org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Calendar; +import java.util.Date; +import java.util.Objects; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.TimeUnit; + +/** + * To clean temporaries files. + * + * @author Tony Chemit - dev(a)tchemit.fr + * @since 8.0 + */ + +public class CleanTemporaryFilesTask extends TimerTask { + + private static final Logger log = LogManager.getLogger(CleanTemporaryFilesTask.class); + + private final CleanTemporaryFilesTaskConfiguration configuration; + + public static Timer create(CleanTemporaryFilesTaskConfiguration configuration) { + Timer result = new Timer("Delete temporary files daemon", true); + result.scheduleAtFixedRate(new CleanTemporaryFilesTask(configuration), new Date(), TimeUnit.HOURS.toMillis(1)); + return result; + } + + public CleanTemporaryFilesTask(CleanTemporaryFilesTaskConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public void run() { + + Path temporaryDirectory = configuration.getTemporaryDirectory().toPath(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.HOUR_OF_DAY, -configuration.getTemporaryFilesTimeout()); + Date deleteBefore = calendar.getTime(); + long deleteBeforeTime = deleteBefore.getTime(); + + log.info(String.format("Delete temporary files in directory %s before %s", temporaryDirectory, deleteBefore)); + delete(temporaryDirectory, deleteBeforeTime); + } + + private boolean delete(Path path, long deleteBeforeTime) { + try { + Files.walk(path).forEach(p -> { + if (Objects.equals(path, p)) { + return; + } + if (Files.isDirectory(p)) { + boolean deleted = delete(p, deleteBeforeTime); + if (deleted) { + delete0(p, deleteBeforeTime); + } + } + if (Files.isRegularFile(p)) { + delete0(p, deleteBeforeTime); + } + }); + if (Files.isRegularFile(path)) { + return Files.notExists(path); + } + if (Files.isDirectory(path)) { + return isDirEmpty(path); + } + return false; + } catch (IOException e) { + throw new RuntimeException(String.format("Could not walk through temporary directory: %s", path), e); + } + } + + private static boolean isDirEmpty(final Path directory) throws IOException { + try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) { + return !dirStream.iterator().hasNext(); + } + } + private void delete0(Path p, long deleteBeforeTime) { + try { + if (Files.getLastModifiedTime(p).toMillis() < deleteBeforeTime) { + log.info("Delete temporary file: " + p); + Files.delete(p); + } + } catch (IOException e) { + log.error("Something wrong while process file: " + p, e); + } + } +} ===================================== services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTaskConfiguration.java ===================================== @@ -0,0 +1,40 @@ +package fr.ird.observe.services.service; + +/*- + * #%L + * ObServe :: Services API + * %% + * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io + * %% + * 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.io.File; + +/** + * @author Tony Chemit - dev(a)tchemit.fr + * @since 7.5.1 + */ +public interface CleanTemporaryFilesTaskConfiguration { + + File getTemporaryDirectory(); + + void setTemporaryDirectory(File temporaryDirectory); + + int getTemporaryFilesTimeout(); + + void setTemporaryFilesTimeout(int temporaryFilesTimeout); +} View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/ae6dc3197bb87eab35ec106cb… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/ae6dc3197bb87eab35ec106cb… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Accumulation de fichiers - Closes #1462
by Tony CHEMIT 13 Apr '20

13 Apr '20
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 1364f2fe by tchemit at 2020-04-13T21:21:43+02:00 Accumulation de fichiers - Closes #1462 - - - - - 26 changed files: - client-configuration/src/main/config/Client.ini - client-configuration/src/main/i18n/getters/config.getter - client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java - client-core/src/main/java/fr/ird/observe/client/ClientUIContext.java - client-core/src/main/java/fr/ird/observe/client/ObserveSwingApplicationContext.java - client-core/src/main/java/fr/ird/observe/client/datasource/api/ObserveDataSourcesManager.java - client-core/src/main/java/fr/ird/observe/client/datasource/api/ObserveSwingDataSource.java - observe-i18n/src/main/i18n/translations/observe_en_GB.properties - observe-i18n/src/main/i18n/translations/observe_es_ES.properties - observe-i18n/src/main/i18n/translations/observe_fr_FR.properties - − persistence/src/main/java/fr/ird/observe/entities/AbstractObserveTopiaDao.java - − persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaConfiguration.java - − persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaConfigurationFactory.java - persistence/src/test/java/fr/ird/observe/persistence/ObserveTopiaApplicationContextTest.java → persistence/src/test/java/fr/ird/observe/entities/ObserveTopiaApplicationContextTest.java - pom.xml - server-configuration/pom.xml - server-configuration/src/main/config/Server.ini - server-configuration/src/main/i18n/getters/config.getter - server-configuration/src/main/java/fr/ird/observe/server/configuration/ServerConfig.java - server-core/src/main/java/fr/ird/observe/server/ObserveWebApplicationContext.java - services-local/src/main/java/fr/ird/observe/services/local/ObserveSecurityHelper.java - services-local/src/main/java/fr/ird/observe/services/local/ObserveTopiaApplicationContextFactory.java - services-local/src/main/java/fr/ird/observe/services/local/service/DataSourceServiceLocal.java - services-local/src/test/java/fr/ird/observe/services/local/LocalTestClassResource.java - + services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTask.java - persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaIdFactory.java → services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTaskConfiguration.java Changes: ===================================== client-configuration/src/main/config/Client.ini ===================================== @@ -146,8 +146,16 @@ defaultValue = ${dcp.presets.directory}/ps/logbook transient = true final = true +[option temporaryDirectory] +description = observe.config.temporaryDirectory.description +key = temporary.directory +type = file +defaultValue = ${data.directory}/tmp +transient = true +final = true + [option tmpDirectory] -description = observe.config.defaultTmpDirectory.description +description = observe.config.temporaryDirectory.description key = tmp.directory type = file defaultValue = ${data.directory}/tmp @@ -717,6 +725,12 @@ key = ui.seineBycatchObservedSystem type = fr.ird.observe.validation.SeineBycatchObservedSystemConfig defaultValue = {\"fr.ird.referential.common.Species#1239832684290#0.04680507324710936\": [\"fr.ird.referential.ps.observation.ObservedSystem#0#1.0\",\"fr.ird.referential.ps.observation.ObservedSystem#0#1.1\"]} +[option temporaryFilesTimeout] +description = observe.config.temporaryFilesTimeout.description +key = observeweb.temporaryFilesTimeout +type = int +defaultValue = 120 + [action help] description = observe.action.commandline.help action = "fr.ird.observe.client.ObserveCLAction#help" ===================================== client-configuration/src/main/i18n/getters/config.getter ===================================== @@ -33,7 +33,6 @@ observe.config.defaultLocalDbDirectory.description observe.config.defaultMapDirectory.description observe.config.defaultReportDirectory.description observe.config.defaultResourcesDirectory.description -observe.config.defaultTmpDirectory.description observe.config.defaultValidationReportDirectory.description observe.config.h2.can.editReferential.description observe.config.h2.can.migrate.description @@ -91,6 +90,8 @@ observe.config.speciesList.seine.observation.schoolEstimate observe.config.speciesList.seine.observation.targetCatch observe.config.swingSessionFile.description observe.config.temperature.format +observe.config.temporaryDirectory.description +observe.config.temporaryFilesTimeout.description observe.config.ui.autoPopupNumberEditor observe.config.ui.blockStateColor observe.config.ui.busyStateColor ===================================== client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java ===================================== @@ -35,6 +35,7 @@ import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.gson.ObserveDtoGsonSupplier; import fr.ird.observe.navigation.model.edit.ObserveEditModel; import fr.ird.observe.navigation.model.select.ObserveSelectModel; +import fr.ird.observe.services.service.CleanTemporaryFilesTaskConfiguration; import io.ultreia.java4all.application.context.spi.ApplicationComponentInstantiateStrategy; import io.ultreia.java4all.application.context.spi.GenerateApplicationComponent; import io.ultreia.java4all.application.template.TemplateGeneratorConfig; @@ -92,12 +93,13 @@ import static io.ultreia.java4all.i18n.I18n.t; hints = { TemplateGeneratorConfig.class, ObServeSwingSessionConfig.class, - ReferentialLocaleConfig.class}, + ReferentialLocaleConfig.class, + CleanTemporaryFilesTaskConfiguration.class}, instantiateStrategy = ApplicationComponentInstantiateStrategy.SUPPLIER, instantiateSupplier = ClientConfigFinder.class ) @GenerateTemplate(template = "about.ftl") -public class ClientConfig extends GeneratedClientConfig implements TemplateGeneratorConfig, ObServeSwingSessionConfig, ReferentialLocaleConfig, NavigationTreeConfig { +public class ClientConfig extends GeneratedClientConfig implements TemplateGeneratorConfig, ObServeSwingSessionConfig, ReferentialLocaleConfig, NavigationTreeConfig, CleanTemporaryFilesTaskConfiguration { public static final String DB_NAME = "obstuna"; public static final List<ClientConfigOption> MAP_LAYERS = ImmutableList.of( @@ -266,7 +268,7 @@ public class ClientConfig extends GeneratedClientConfig implements TemplateGener resourceManager.createDirectory(this, ClientConfigOption.TMP_DIRECTORY); // suppression du contenu du répertoire temporaire - FileUtils.cleanDirectory(this.getTmpDirectory()); + FileUtils.cleanDirectory(this.getTemporaryDirectory()); // 3 - backup directory ===================================== client-core/src/main/java/fr/ird/observe/client/ClientUIContext.java ===================================== @@ -34,6 +34,7 @@ import fr.ird.observe.dto.IdDto; import fr.ird.observe.dto.decoration.DecoratorService; import fr.ird.observe.dto.decoration.DecoratorServiceApplicationComponent; import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; +import fr.ird.observe.services.service.CleanTemporaryFilesTask; import io.ultreia.java4all.application.context.ApplicationContext; import io.ultreia.java4all.application.context.spi.GenerateApplicationComponent; import io.ultreia.java4all.i18n.I18n; @@ -57,9 +58,11 @@ import java.awt.event.ComponentEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeListener; +import java.io.Closeable; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.Timer; import static io.ultreia.java4all.i18n.I18n.t; import static javax.swing.JOptionPane.CLOSED_OPTION; @@ -71,7 +74,7 @@ import static javax.swing.JOptionPane.VALUE_PROPERTY; ObserveSwingSessionHelper.class, ActionExecutor.class }) -public class ClientUIContext { +public class ClientUIContext implements Closeable { private static final Logger log = LogManager.getLogger(ClientUIContext.class); @@ -81,7 +84,9 @@ public class ClientUIContext { private final ActionExecutor actionExecutor; private ObserveMainUI mainUI; private ObserveUICallbackManager uiCallbackManager; + private Timer deleteTemporaryFilesTimer; private final BusyModel busyModel; + public ClientUIContext(DecoratorService decoratorService, ClientConfig clientConfig, ObserveSwingSessionHelper observeSwingSessionHelper, ActionExecutor actionExecutor) { this.decoratorService = decoratorService; this.clientConfig = clientConfig; @@ -90,6 +95,13 @@ public class ClientUIContext { this.busyModel = new BusyModel(); } + public void initDeleteTemporaryFilesTimer() { + if (deleteTemporaryFilesTimer != null) { + closeDeleteTemporaryFilesTimer(); + } + deleteTemporaryFilesTimer = CleanTemporaryFilesTask.create(getClientConfig()); + } + public static void displayInfo(String text) { JFrame ui = ClientUIContextApplicationComponent.value().getMainUI(); if (ui == null) { @@ -365,7 +377,9 @@ public class ClientUIContext { return observeSwingSessionHelper; } + @Override public void close() { + closeDeleteTemporaryFilesTimer(); mainUI = null; } @@ -464,4 +478,16 @@ public class ClientUIContext { public BusyModel getBusyModel() { return busyModel; } + + + void closeDeleteTemporaryFilesTimer() { + if (deleteTemporaryFilesTimer != null) { + try { + deleteTemporaryFilesTimer.cancel(); + } catch (Exception e) { + log.error("Could not terminates delete temporary files timer...", e); + } + } + } + } ===================================== client-core/src/main/java/fr/ird/observe/client/ObserveSwingApplicationContext.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.client; import fr.ird.observe.client.configuration.ClientConfig; +import fr.ird.observe.client.configuration.ClientConfigApplicationComponent; import fr.ird.observe.services.ObserveServiceMainFactory; import fr.ird.observe.services.ObserveServiceMainFactoryApplicationComponent; import fr.ird.observe.spi.DtoModelHelper; @@ -53,9 +54,12 @@ public class ObserveSwingApplicationContext extends ApplicationContext { //FIXME Je ne comprends pas pourquoi cela ne fonctionne plus. // config.get().setOption("user.home", SystemUtils.USER_HOME); - log.debug("Init model helper: " + DtoModelHelper.class); + log.debug(String.format("Init model helper: %s", DtoModelHelper.class)); ObserveServiceMainFactory serviceMainFactory = ObserveServiceMainFactoryApplicationComponent.value(); - log.info("Initialize services factory: " + serviceMainFactory); + log.info(String.format("Initialize services factory: %s", serviceMainFactory)); + ClientUIContext clientUIContext = ClientUIContextApplicationComponent.value(); + log.info("Initialize delete temporary files task."); + clientUIContext.initDeleteTemporaryFilesTimer(); } // We put here the i18n keys from the client-runner module, otherwise we need yet another module before observe-i18n ===================================== client-core/src/main/java/fr/ird/observe/client/datasource/api/ObserveDataSourcesManager.java ===================================== @@ -126,7 +126,7 @@ public class ObserveDataSourcesManager implements Closeable { public ObserveSwingDataSource newTemporaryH2DataSource(String label) { - File tmpDirectory = config.getTmpDirectory(); + File tmpDirectory = config.getTemporaryDirectory(); File dbDirectory = new File(tmpDirectory, ClientConfig.DB_NAME + UUID.randomUUID().toString()); ===================================== client-core/src/main/java/fr/ird/observe/client/datasource/api/ObserveSwingDataSource.java ===================================== @@ -482,7 +482,7 @@ public class ObserveSwingDataSource extends ObserveServicesProviderSupport { Locale locale = config.getLocale(); - File tmpDirectory = config.getTmpDirectory(); + File tmpDirectory = config.getTemporaryDirectory(); ReferentialLocale referentialLocale = ReferentialLocale.valueOf(locale); ===================================== observe-i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -482,7 +482,6 @@ observe.config.defaultLocalDbDirectory.description=Default directory where to st observe.config.defaultMapDirectory.description=Default directory where to store map layers observe.config.defaultReportDirectory.description=Default directory where to store report definition files observe.config.defaultResourcesDirectory.description=Default user resources directory -observe.config.defaultTmpDirectory.description=Default temporary directory used by application and clean at each launch. observe.config.defaultValidationReportDirectory.description=Default validation report directory observe.config.devMode=Dev mode observe.config.floatingObjectPresets.description=Floating Objects references @@ -542,6 +541,8 @@ observe.config.speciesList.seine.observation.schoolEstimate=Species for school e observe.config.speciesList.seine.observation.targetCatch=Species for target catches observe.config.swingSessionFile.description=Swing session file. observe.config.temperature.format=Default temperature format +observe.config.temporaryDirectory.description=Default temporary directory used by application and clean at each launch. +observe.config.temporaryFilesTimeout.description=Temporary files delete (in hours) observe.config.ui.autoPopupNumberEditor=Flag sets to true when number editor show automaticly popup observe.config.ui.blockStateColor=Color of block state observe.config.ui.busyStateColor=Color of busy state @@ -3519,7 +3520,7 @@ observeweb.devMode.description=Dev mode observeweb.host.description=Application host observeweb.httpTimeout.description=Http timeout in milli seconds observeweb.log4jConfigurationFile.description=Path to log configuration file -observeweb.sessionExpirationDelay.description=Session expiration deplay (in minutes) +observeweb.sessionExpirationDelay.description=Session expiration delay (in minutes) observeweb.sessionMaximumSize.description=Session maximum size observeweb.temporaryDirectory.description=Path to temporary directory observeweb.usersConfigurationFile.description=Path to users configuration file ===================================== observe-i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -482,7 +482,6 @@ observe.config.defaultLocalDbDirectory.description=Directorio de almacenamiento observe.config.defaultMapDirectory.description=El directorio donde se ubican los mapas. observe.config.defaultReportDirectory.description=Directorio por defecto de los informes de la aplicación observe.config.defaultResourcesDirectory.description=Directorio de almacenamiento de los recursos de usuario como las traducciones o la consultas de informes -observe.config.defaultTmpDirectory.description=Directorio temporal por defecto observe.config.defaultValidationReportDirectory.description=Directorio por defecto de almacenamiento de los informes de validación observe.config.devMode=Modo desarrollador observe.config.floatingObjectPresets.description=Objetos flotantes de referencia @@ -542,6 +541,8 @@ observe.config.speciesList.seine.observation.schoolEstimate=Especies para las es observe.config.speciesList.seine.observation.targetCatch=Especies par las capturas objetivo observe.config.swingSessionFile.description=Copia de seguridad del estado del UI. observe.config.temperature.format=Unidad de temperatura +observe.config.temporaryDirectory.description=Directorio temporal por defecto +observe.config.temporaryFilesTimeout.description=Temporary files delete (in hours) \#TODO observe.config.ui.autoPopupNumberEditor=Para mostrar automáticamente el editor numérico durante la edición de un número observe.config.ui.blockStateColor=Color of block state \#TODO observe.config.ui.busyStateColor=Color of busy state \#TODO ===================================== observe-i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -482,7 +482,6 @@ observe.config.defaultLocalDbDirectory.description=Le répertoire où est stock observe.config.defaultMapDirectory.description=Le répertoire où sont stockées les cartes. observe.config.defaultReportDirectory.description=Répertoire par défaut des rapports de l'application observe.config.defaultResourcesDirectory.description=Le répertoire où sont stockées les ressources de l'utilisateur comme les traductions ou les requêtes de rapports. -observe.config.defaultTmpDirectory.description=Le répertoire temporaire par défaut observe.config.defaultValidationReportDirectory.description=Le répertoire par défaut où sont stockés les rapports de validation observe.config.devMode=Mode développeur observe.config.floatingObjectPresets.description=Objets flottants de référence @@ -542,6 +541,8 @@ observe.config.speciesList.seine.observation.schoolEstimate=Espèces pour les es observe.config.speciesList.seine.observation.targetCatch=Espèces pour les captures cible observe.config.swingSessionFile.description=Fichier de sauvegarde des états des UI. observe.config.temperature.format=Unité de température +observe.config.temporaryDirectory.description=Le répertoire temporaire par défaut +observe.config.temporaryFilesTimeout.description=Nettoyage des fichiers temporaires (en heures) observe.config.ui.autoPopupNumberEditor=Pour afficher automatiquement l'éditeur numérique lors de l'édition d'un nombre observe.config.ui.blockStateColor=Couleur lorsque l'on bloque une partie de l'application observe.config.ui.busyStateColor=Couleur lorsque l'application est occupée ===================================== persistence/src/main/java/fr/ird/observe/entities/AbstractObserveTopiaDao.java deleted ===================================== @@ -1,76 +0,0 @@ -package fr.ird.observe.entities; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.nuiton.topia.persistence.internal.AbstractTopiaDao; -import org.nuiton.topia.persistence.support.TopiaSqlQuery; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.Date; -import java.util.List; -import java.util.Map; - -public abstract class AbstractObserveTopiaDao<E extends Entity> extends AbstractTopiaDao<E> { - - private final GetLastUpdateDateSqlQuery getLastUpdateDateSqlQuery; - - protected AbstractObserveTopiaDao() { - String schemaName = getTopiaEntityEnum().dbSchemaName(); - String tableName = getTopiaEntityEnum().dbTableName(); - getLastUpdateDateSqlQuery = new GetLastUpdateDateSqlQuery(schemaName, tableName); - } - - public Date getLastUpdateDate() { - return topiaSqlSupport.findSingleResult(getLastUpdateDateSqlQuery); - } - - public <O> List<O> findAllFromHql(String hql, Map<String, Object> hqlParameters) { - return findAll(hql, hqlParameters); - } - - private static class GetLastUpdateDateSqlQuery extends TopiaSqlQuery<Timestamp> { - - protected final String sql; - - private GetLastUpdateDateSqlQuery(String schemaName, String tableName) { - this.sql = "SELECT max(" + Entity.PROPERTY_LAST_UPDATE_DATE + ") FROM " + schemaName + "." + tableName; - } - - @Override - public PreparedStatement prepareQuery(Connection connection) throws SQLException { - return connection.prepareStatement(sql); - } - - @Override - public Timestamp prepareResult(ResultSet set) throws SQLException { - return set.getTimestamp(1); - } - - } - - -} ===================================== persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaConfiguration.java deleted ===================================== @@ -1,84 +0,0 @@ -package fr.ird.observe.entities; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.nuiton.topia.persistence.BeanTopiaConfiguration; -import org.nuiton.topia.persistence.HibernateAvailableSettings; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.Properties; -import java.util.TreeMap; - -/** - * Created on 23/08/15. - * - * @author Tony Chemit - dev(a)tchemit.fr - */ -public class ObserveTopiaConfiguration extends BeanTopiaConfiguration { - - private static final long serialVersionUID = 1L; - - private final boolean h2Configuration; - protected final boolean showSql; - private static final Map<String, String> HIBERNATE_GLOBAL_PROPERTIES; - - static { - - Properties p = new Properties(); - try (InputStream stream = ObserveTopiaPersistenceContext.class.getResourceAsStream("/hibernate.properties")) { - try { - p.load(stream); - } catch (IOException e) { - throw new IllegalStateException(e); - } - } catch (IOException e) { - throw new IllegalStateException(e); - } - HIBERNATE_GLOBAL_PROPERTIES = new TreeMap<>(); - for (String s : p.stringPropertyNames()) { - HIBERNATE_GLOBAL_PROPERTIES.put(s, p.getProperty(s)); - } - - } - - public ObserveTopiaConfiguration(JdbcConfiguration jdbcConfiguration, boolean h2Configuration, boolean showSql) { - super(jdbcConfiguration); - this.h2Configuration = h2Configuration; - this.showSql = showSql; - if (showSql) { - hibernateExtraConfiguration.put(HibernateAvailableSettings.SHOW_SQL, Boolean.TRUE.toString()); - } - hibernateExtraConfiguration.putAll(HIBERNATE_GLOBAL_PROPERTIES); - } - - public boolean isH2Configuration() { - return h2Configuration; - } - - public boolean isShowSql() { - return showSql; - } -} ===================================== persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaConfigurationFactory.java deleted ===================================== @@ -1,143 +0,0 @@ -package fr.ird.observe.entities; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * 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 org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; -import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; -import org.nuiton.topia.service.migration.TopiaMigrationService; -import org.nuiton.topia.service.script.TopiaSqlScriptGeneratorServiceImpl; - -import java.io.File; - -/** - * Created on 23/08/15. - * - * @author Tony Chemit - dev(a)tchemit.fr - */ -public class ObserveTopiaConfigurationFactory { - - /** l'url d'acces a la base locale */ - private static final String H2_LOCAL_URL = - "jdbc:h2:file:%s;" + - // on peut aussi utiliser file, socket - "FILE_LOCK=file;" + - //1 or 2 is needed to restore avec crash - // 0: logging is disabled (faster), - // 1: logging of the data is enabled, but logging of the index - // changes is disabled (default), 2: logging of both data and index - // changes are enabled - "LOG=0;" + - // on peut aussi utiliser hsqldb, mysql ou postgresql - "MODE=postgresql;" + - //"MODE=hsqldb;" + - // Sets the default lock timeout (in milliseconds) in this - // database that is used for the new sessions. - "DEFAULT_LOCK_TIMEOUT=100;" + - // -1: the database is never closed until the close delay is set to - // some other rev or SHUTDOWN is called., 0: no delay (default; the - // database is closed if the last connection to it is closed)., n: - // the database is left open for n second after the last connection - // is closed. - "DB_CLOSE_DELAY=0;" + - // 0: no locking (should only be used for testing), - // 1: table level locking (default), - // 2: table level locking with garbage collection (if the - // application does not close all connections). - // LOCK_MODE 3 (READ_COMMITTED). Table level locking, but only when - // writing (no read locks). - "LOCK_MODE=3;" + - // Levels: 0=off, 1=error, 2=info, 3=debug. - "TRACE_LEVEL_FILE=0;" + - // on system.out: 0=off, 1=error, 2=info, 3=debug. - "TRACE_LEVEL_SYSTEM_OUT=0;" + - // maximumn cache to improve performance... - "CACHE_SIZE=65536;" + - // avoid timeout on reading tables (see http://stackoverflow.com/questions/4162557/timeout-error-trying-to-lock-tab…) - "MVCC=true"; - - private static final JdbcConfigurationBuilder JDBC_CONFIGURATION_BUILDER = new JdbcConfigurationBuilder(); - private static final Logger log = LogManager.getLogger(ObserveTopiaConfigurationFactory.class); - - public static ObserveTopiaConfiguration forPostgresqlDatabase(String jdbcUrl, - String username, - String password, - boolean initSchema, - boolean traceSql) { - - JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forPostgresqlDatabase(jdbcUrl, username, password); - - ObserveTopiaConfiguration topiaConfiguration = createTopiaConfiguration(jdbcConfiguration, - initSchema, - false, - traceSql); - - log.debug("PG topia configuration: " + topiaConfiguration); - return topiaConfiguration; - - } - - public static ObserveTopiaConfiguration forH2Database(File dbDirectory, - String dbName, - String username, - String password, - boolean initSchema, - boolean traceSql) { - - String dbPath = new File(dbDirectory, dbName).getPath(); - String jdbcUrl = String.format(H2_LOCAL_URL, dbPath); - - JdbcConfiguration jdbcConfiguration = JDBC_CONFIGURATION_BUILDER.forH2Database(jdbcUrl, username, password); - - ObserveTopiaConfiguration topiaConfiguration = createTopiaConfiguration(jdbcConfiguration, - initSchema, - true, - traceSql); - - log.debug("H2 topia configuration: " + topiaConfiguration); - return topiaConfiguration; - - } - - private static ObserveTopiaConfiguration createTopiaConfiguration(JdbcConfiguration jdbcConfiguration, - boolean initSchema, - boolean h2Configuration, - boolean traceSql) { - - ObserveTopiaConfiguration topiaConfiguration = new ObserveTopiaConfiguration(jdbcConfiguration, h2Configuration, traceSql); - topiaConfiguration.setTopiaIdFactoryClass(ObserveTopiaIdFactory.class); - topiaConfiguration.setInitSchema(initSchema); - topiaConfiguration.setValidateSchema(false); - topiaConfiguration.setUseHikariForJdbcConnectionPooling(true); - - log.debug("jdbcUrl: " + topiaConfiguration.getJdbcConnectionUrl()); - - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.MIGRATION_SERVICE_NAME, TopiaMigrationService.class); - topiaConfiguration.addDeclaredService(ObserveTopiaApplicationContext.SQL_SCRIPT_GENERATOR_BATCH_SERVICE_NAME, TopiaSqlScriptGeneratorServiceImpl.class); - - return topiaConfiguration; - - } - -} ===================================== persistence/src/test/java/fr/ird/observe/persistence/ObserveTopiaApplicationContextTest.java → persistence/src/test/java/fr/ird/observe/entities/ObserveTopiaApplicationContextTest.java ===================================== @@ -1,4 +1,4 @@ -package fr.ird.observe.persistence; +package fr.ird.observe.entities; /*- * #%L @@ -22,9 +22,6 @@ package fr.ird.observe.persistence; * #L% */ -import fr.ird.observe.entities.ObserveTopiaApplicationContext; -import fr.ird.observe.entities.ObserveTopiaConfiguration; -import fr.ird.observe.entities.ObserveTopiaConfigurationFactory; import fr.ird.observe.test.TestHelper; import fr.ird.observe.test.TestSupportWithConfig; import org.junit.Assert; @@ -46,7 +43,7 @@ public class ObserveTopiaApplicationContextTest extends TestSupportWithConfig { File testBasedir = TestHelper.getTestBasedir(getClass()); - ObserveTopiaConfiguration observeTopiaConfiguration = ObserveTopiaConfigurationFactory.forH2Database(testBasedir, "testReplicateModel", "sa", "sa", true, false); + ObserveTopiaConfiguration observeTopiaConfiguration = ObserveTopiaConfigurationFactory.forH2Database(testBasedir, "testReplicateModel", "sa", "sa", testBasedir.toPath().resolve("temporary"), true, false); try (ObserveTopiaApplicationContext applicationContext = new ObserveTopiaApplicationContext(observeTopiaConfiguration)) { TopiaSqlTables tripLonglineTables = applicationContext.getTripLonglineTables(); Assert.assertNotNull(tripLonglineTables); ===================================== pom.xml ===================================== @@ -24,7 +24,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2020.15</version> + <version>2020.17</version> </parent> <groupId>fr.ird.observe</groupId> @@ -162,7 +162,7 @@ <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> <buildDate>${maven.build.timestamp}</buildDate> - <lib.version.toolkit>4.27</lib.version.toolkit> + <lib.version.toolkit>4.28</lib.version.toolkit> <lib.version.nuiton.validation>3.1</lib.version.nuiton.validation> <!--can't use 1.4.197 (date has changed + blob also)--> <lib.version.h2>1.4.196</lib.version.h2> @@ -176,7 +176,7 @@ <!--<lib.version.java4all.i18n>4.0-beta-3-SNAPSHOT</lib.version.java4all.i18n>--> <!--<lib.version.java4all.config>1.0.8-SNAPSHOT</lib.version.java4all.config>--> <!--<lib.version.nuiton.topia>3.4.2-SNAPSHOT</lib.version.nuiton.topia>--> - <!--<lib.version.java4all.topia>1.14</lib.version.java4all.topia>--> +<!-- <lib.version.java4all.topia>1.19-SNAPSHOT</lib.version.java4all.topia>--> <!--<lib.version.java4all.http>1.0.17-SNAPSHOT</lib.version.java4all.http>--> <!-- license header configuration --> ===================================== server-configuration/pom.xml ===================================== @@ -48,7 +48,11 @@ <version>${project.version}</version> <scope>provided</scope> </dependency> - + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>services</artifactId> + <version>${project.version}</version> + </dependency> <dependency> <groupId>io.ultreia.java4all</groupId> <artifactId>application-context</artifactId> ===================================== server-configuration/src/main/config/Server.ini ===================================== @@ -103,3 +103,9 @@ key = observeweb.httpTimeout type = int defaultValue = 30000 +[option temporaryFilesTimeout] +description = observe.config.temporaryFilesTimeout.description +key = observeweb.temporaryFilesTimeout +type = int +defaultValue = 120 + ===================================== server-configuration/src/main/i18n/getters/config.getter ===================================== @@ -1,4 +1,5 @@ ObserveWebApplicationConfig.description +observe.config.temporaryFilesTimeout.description observe.model.version observeweb.adminApiKey.description observeweb.baseDirectory.description ===================================== server-configuration/src/main/java/fr/ird/observe/server/configuration/ServerConfig.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.server.configuration; import fr.ird.observe.dto.ObserveUtil; import fr.ird.observe.dto.decoration.ReferentialLocaleConfig; +import fr.ird.observe.services.service.CleanTemporaryFilesTaskConfiguration; import io.ultreia.java4all.application.context.spi.GenerateApplicationComponent; import io.ultreia.java4all.application.template.TemplateGeneratorConfig; import io.ultreia.java4all.config.ApplicationConfig; @@ -46,8 +47,8 @@ import java.nio.file.Paths; * @author Tony Chemit - dev(a)tchemit.fr */ @GenerateApplicationComponent(name = "ObServe Web configuration", - hints = {TemplateGeneratorConfig.class, ReferentialLocaleConfig.class}) -public class ServerConfig extends GeneratedServerConfig { + hints = {TemplateGeneratorConfig.class, ReferentialLocaleConfig.class, CleanTemporaryFilesTaskConfiguration.class}) +public class ServerConfig extends GeneratedServerConfig implements CleanTemporaryFilesTaskConfiguration { private static Logger log = LogManager.getLogger(ServerConfig.class); ===================================== server-core/src/main/java/fr/ird/observe/server/ObserveWebApplicationContext.java ===================================== @@ -43,6 +43,7 @@ import fr.ird.observe.server.configuration.user.ObserveWebUsersHelperApplication import fr.ird.observe.server.configuration.user.impl.ObserveWebUsersImmutable; import fr.ird.observe.server.security.ObserveWebSecurityApplicationContext; import fr.ird.observe.server.security.ObserveWebSecurityApplicationContextApplicationComponent; +import fr.ird.observe.services.service.CleanTemporaryFilesTask; import fr.ird.observe.services.ObserveServiceFactory; import fr.ird.observe.services.ObserveServiceInitializer; import fr.ird.observe.services.ObserveServiceMainFactoryApplicationComponent; @@ -51,11 +52,14 @@ import fr.ird.observe.services.service.ObserveService; import fr.ird.observe.services.service.actions.consolidate.dcp.FloatingObjectModification; import io.ultreia.java4all.application.context.ApplicationComponent; import io.ultreia.java4all.application.context.ApplicationContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.debux.webmotion.server.call.HttpContext; import org.nuiton.version.Version; import javax.servlet.ServletContext; import java.util.Map; +import java.util.Timer; /** * @author Tony Chemit - dev(a)tchemit.fr @@ -67,6 +71,8 @@ public class ObserveWebApplicationContext extends ApplicationContext { private static final String MISSING_APPLICATION_CONTEXT = String.format("%s not found. You probably forgot to register %s in your web.xml", ObserveWebApplicationContext.class.getSimpleName(), ObserveWebApplicationListener.class.getName()); + private static final Logger log = LogManager.getLogger(ObserveWebApplicationContext.class); + private ObserveDtoGsonSupplier gsonSupplier; private ServerConfig applicationConfiguration; private ObserveServiceFactory mainServiceFactory; @@ -75,6 +81,7 @@ public class ObserveWebApplicationContext extends ApplicationContext { private ObserveWebSecurityApplicationContext securityApplicationContext; private static ServerConfig applicationConfiguration1; + private Timer deleteTemporaryFilesTimer; static ObserveWebApplicationContext getApplicationContext(HttpContext context) { @@ -153,18 +160,26 @@ public class ObserveWebApplicationContext extends ApplicationContext { } }; } + if (deleteTemporaryFilesTimer != null) { + closeDeleteTemporaryFilesTimer(); + } + deleteTemporaryFilesTimer = CleanTemporaryFilesTask.create(getApplicationConfiguration()); + } + + @Override + public void close() { + + closeDeleteTemporaryFilesTimer(); + super.close(); } -// @Override -// public void close() { -// -// // Supprimer le cache des sessions -// securityApplicationContext.close(); -// -// // Fermer l'usine de services -// mainServiceFactory.close(); -// -// } + void closeDeleteTemporaryFilesTimer() { + try { + deleteTemporaryFilesTimer.cancel(); + } catch (Exception e) { + log.error("Could not terminates delete temporary files timer...", e); + } + } public ObserveDtoGsonSupplier getGsonSupplier() { return gsonSupplier; ===================================== services-local/src/main/java/fr/ird/observe/services/local/ObserveSecurityHelper.java ===================================== @@ -27,13 +27,13 @@ import fr.ird.observe.dto.ObserveDbRole; import fr.ird.observe.dto.db.ObserveDbUserDto; import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.ObserveTopiaApplicationContext; +import fr.ird.observe.entities.ObserveTopiaConfiguration; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.topia.migration.mappings.TMSVersionHibernateDao; import org.nuiton.topia.persistence.TopiaEntityEnum; import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; import org.nuiton.topia.persistence.jdbc.JdbcPostgresHelper; import org.nuiton.topia.persistence.script.SqlScriptConsumer; import org.nuiton.topia.persistence.script.SqlScriptWriter; @@ -81,10 +81,12 @@ public class ObserveSecurityHelper { private static final String SCHEMA_PUBLIC = "public"; private static final Logger log = LogManager.getLogger(ObserveSecurityHelper.class); private final JdbcPostgresHelper jdbcHelper; + private final Path temporaryDirectory; - public ObserveSecurityHelper(JdbcConfiguration jdbcConfiguration) { + public ObserveSecurityHelper(ObserveTopiaConfiguration jdbcConfiguration) { this.jdbcHelper = new JdbcPostgresHelper(jdbcConfiguration); + this.temporaryDirectory = jdbcConfiguration.getTemporaryDirectory(); } public void applySecurity(Set<ObserveDbUserDto> users) { @@ -93,7 +95,7 @@ public class ObserveSecurityHelper { } Path scriptPath; try { - scriptPath = Files.createTempFile("topia-sql-script-", ".sql"); + scriptPath = Files.createTempFile(temporaryDirectory, "topia-sql-script-", ".sql"); } catch (IOException e) { throw new IllegalStateException("Can't create temporary path", e); } ===================================== services-local/src/main/java/fr/ird/observe/services/local/ObserveTopiaApplicationContextFactory.java ===================================== @@ -150,6 +150,7 @@ public class ObserveTopiaApplicationContextFactory { configuration.getJdbcUrl(), configuration.getUsername(), String.valueOf(configuration.getPassword()), + configuration.getTemporaryDirectory(), initSchema, configuration.isTraceSql() ); @@ -175,6 +176,7 @@ public class ObserveTopiaApplicationContextFactory { configuration.getDbName(), configuration.getUsername(), String.valueOf(configuration.getPassword()), + configuration.getTemporaryDirectory(), initSchema, configuration.isTraceSql() ); ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/DataSourceServiceLocal.java ===================================== @@ -69,6 +69,7 @@ import org.nuiton.version.Versions; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; @@ -108,6 +109,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS public ObserveDataSourceInformation checkCanConnectOrBeEmpty(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; + Path temporaryDirectory = serviceContext.getTemporaryDirectoryRoot().toPath(); ObserveDataSourceInformation dataSourceInformation; if (dataSourceConfigurationTopiaSupport.isH2Database()) { @@ -141,7 +143,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS h2DataSourceConfiguration.getDbName(), h2DataSourceConfiguration.getUsername(), new String(h2DataSourceConfiguration.getPassword()), - false, + temporaryDirectory, false, false); @@ -165,7 +167,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase(pgDataSourceConfiguration.getJdbcUrl(), pgDataSourceConfiguration.getUsername(), new String(pgDataSourceConfiguration.getPassword()), - false, + temporaryDirectory, false, false); try { @@ -188,6 +190,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public ObserveDataSourceInformation checkCanConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; ObserveDataSourceInformation dataSourceInformation; @@ -223,6 +226,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS h2DataSourceConfiguration.getDbName(), h2DataSourceConfiguration.getUsername(), new String(h2DataSourceConfiguration.getPassword()), + temporaryDirectory, false, false); @@ -247,6 +251,7 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase(pgDataSourceConfiguration.getJdbcUrl(), pgDataSourceConfiguration.getUsername(), new String(pgDataSourceConfiguration.getPassword()), + temporaryDirectory, false, false); @@ -266,13 +271,22 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS } + Path getTemporaryDirectory(ObserveDataSourceConfiguration dataSourceConfiguration) { + Path temporaryDirectory = dataSourceConfiguration.getTemporaryDirectory(); + if (temporaryDirectory == null) { + temporaryDirectory = serviceContext.getTemporaryDirectoryRoot().toPath(); + dataSourceConfiguration.setTemporaryDirectory(temporaryDirectory); + } + return temporaryDirectory; + } + @Override public ObserveDataSourceConnectionTopia create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, BabModelVersionException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { dataSourceCreateConfiguration.validateConfiguration(); - + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); boolean initSchema = !dataSourceCreateConfiguration.isImportDatabase(); ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, initSchema); @@ -291,10 +305,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS } else { // base postgres // on realise les import dans un base H2 temporaire - // FIXME il faut obtenir le repertoit temporaire d'observe plutot que celui du système File tmpDir; try { - tmpDir = Files.createTempDirectory("obstuna").toFile(); + tmpDir = Files.createTempDirectory(temporaryDirectory, "obstuna").toFile(); } catch (IOException e) { throw new IllegalStateException("could not create temporary directory ", e); } @@ -455,7 +468,8 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { - + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); ObserveDataSourceInformation dataSourceInformation = checkCanConnect(dataSourceConfiguration); Version dbVersion = dataSourceInformation.getVersion(); @@ -557,6 +571,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public void applySecurity(ObserveDataSourceConfiguration dataSourceConfiguration, ImmutableSet<ObserveDbUserDto> users) { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); + // pas de securité pour les bases autres que postgresql if (dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaPG) { @@ -575,6 +592,9 @@ public class DataSourceServiceLocal extends ObserveServiceLocal implements DataS @Override public void migrateData(ObserveDataSourceConfiguration dataSourceConfiguration) { + Path temporaryDirectory = getTemporaryDirectory(dataSourceConfiguration); + log.debug("Will use temporary directory: " + temporaryDirectory); + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); topiaApplicationContext.getMigrationService().runSchemaMigration(); } ===================================== services-local/src/test/java/fr/ird/observe/services/local/LocalTestClassResource.java ===================================== @@ -90,7 +90,6 @@ public class LocalTestClassResource extends TestClassResourceSupport { public ObserveDataSourceConfigurationTopiaH2 createDataSourceConfiguration(Version dbVersion, String dbName, File targetPath, String login, char[] password) throws DataSourceCreateWithNoReferentialImportException, IOException, IncompatibleDataSourceCreateConfigurationException, DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { ObserveDataSourceConfigurationTopiaH2 sharedDatabaseConfiguration = dataSourcesForTestManager.createSharedDataSourceConfigurationH2(dbVersion, dbName, login, password); - File sharedDatabaseFile = sharedDatabaseConfiguration.getDatabaseFile(); ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration; @@ -101,6 +100,7 @@ public class LocalTestClassResource extends TestClassResourceSupport { if (log.isInfoEnabled()) { log.info("Create shared database: " + dbVersion.toString() + "/" + dbName + " to " + sharedDatabaseFile); } + sharedDatabaseConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); try (DataSourceService dataSourceService = newService(sharedDatabaseConfiguration, DataSourceService.class)) { DataSourceCreateConfigurationDto createConfiguration = new DataSourceCreateConfigurationDto(); @@ -135,12 +135,14 @@ public class LocalTestClassResource extends TestClassResourceSupport { } dataSourceConfiguration.setModelVersion(ObserveTestConfiguration.getModelVersion()); + dataSourceConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); return dataSourceConfiguration; } public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + dataSourceConfiguration.setTemporaryDirectory(getTemporaryDirectoryRoot()); ObserveServiceInitializer observeServiceInitializer = ObserveServiceInitializer.create( Locale.FRANCE, ReferentialLocale.FR, ===================================== services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTask.java ===================================== @@ -0,0 +1,120 @@ +package fr.ird.observe.services.service; + +/*- + * #%L + * ObServe :: Services API + * %% + * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io + * %% + * 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 io.ultreia.java4all.util.Dates; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Calendar; +import java.util.Date; +import java.util.Objects; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.TimeUnit; + +/** + * To clean temporaries files. + * + * @author Tony Chemit - dev(a)tchemit.fr + * @since 8.0 + */ + +public class CleanTemporaryFilesTask extends TimerTask { + + private static final Logger log = LogManager.getLogger(CleanTemporaryFilesTask.class); + + private final CleanTemporaryFilesTaskConfiguration configuration; + + public static Timer create(CleanTemporaryFilesTaskConfiguration configuration) { + Timer result = new Timer("Delete temporary files daemon", true); + result.scheduleAtFixedRate(new CleanTemporaryFilesTask(configuration), new Date(), TimeUnit.HOURS.toMillis(1)); + return result; + } + + public CleanTemporaryFilesTask(CleanTemporaryFilesTaskConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public void run() { + + Path temporaryDirectory = configuration.getTemporaryDirectory().toPath(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.HOUR_OF_DAY, -configuration.getTemporaryFilesTimeout()); + Date deleteBefore = calendar.getTime(); + long deleteBeforeTime = deleteBefore.getTime(); + + log.info(String.format("Delete temporary files in directory %s before %s", temporaryDirectory, deleteBefore)); + delete(temporaryDirectory, deleteBeforeTime); + } + + private boolean delete(Path path, long deleteBeforeTime) { + try { + Files.walk(path).forEach(p -> { + if (Objects.equals(path, p)) { + return; + } + if (Files.isDirectory(p)) { + boolean deleted = delete(p, deleteBeforeTime); + if (deleted) { + delete0(p, deleteBeforeTime); + } + } + if (Files.isRegularFile(p)) { + delete0(p, deleteBeforeTime); + } + }); + if (Files.isRegularFile(path)) { + return Files.notExists(path); + } + if (Files.isDirectory(path)) { + return isDirEmpty(path); + } + return false; + } catch (IOException e) { + throw new RuntimeException(String.format("Could not walk through temporary directory: %s", path), e); + } + } + + private static boolean isDirEmpty(final Path directory) throws IOException { + try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) { + return !dirStream.iterator().hasNext(); + } + } + private void delete0(Path p, long deleteBeforeTime) { + try { + if (Files.getLastModifiedTime(p).toMillis() < deleteBeforeTime) { + log.info("Delete temporary file: " + p); + Files.delete(p); + } + } catch (IOException e) { + log.error("Something wrong while process file: " + p, e); + } + } +} ===================================== persistence/src/main/java/fr/ird/observe/entities/ObserveTopiaIdFactory.java → services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTaskConfiguration.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.entities; +package fr.ird.observe.services.service; -/* +/*- * #%L - * ObServe :: Persistence + * ObServe :: Services API * %% * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io * %% @@ -22,17 +22,19 @@ package fr.ird.observe.entities; * #L% */ +import java.io.File; + /** - * Created on 21/08/15. - * * @author Tony Chemit - dev(a)tchemit.fr + * @since 8.0 */ -public class ObserveTopiaIdFactory extends ObserveTopiaIdFactorySupport { +public interface CleanTemporaryFilesTaskConfiguration { + + File getTemporaryDirectory(); - private static final long serialVersionUID = 1L; + void setTemporaryDirectory(File temporaryDirectory); - public ObserveTopiaIdFactory() { - super("fr.ird.observe.entities."); - } + int getTemporaryFilesTimeout(); + void setTemporaryFilesTimeout(int temporaryFilesTimeout); } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/1364f2fed1b5d6ed6bb325160… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/1364f2fed1b5d6ed6bb325160… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] [V8] Problèmes d'affichage de formulaires - Closes #1420
by Tony CHEMIT 11 Apr '20

11 Apr '20
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: f8948144 by tchemit at 2020-04-11T10:08:44+02:00 [V8] Problèmes d&#39;affichage de formulaires - Closes #1420 - - - - - 15 changed files: - client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx - client-datasource-editor-ll/src/main/i18n/getters/jaxx.getter - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/common/TripUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/landing/LandingUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/landing/LandingUI.jcss - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/ActivitySampleUI.jcss - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/SetGlobalCompositionUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/SetUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/TripSampleUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/TripSampleUI.jcss - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/ActivityUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/BranchlineUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/SetGlobalCompositionUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/SetUI.jaxx - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/TdrUI.jaxx Changes: ===================================== client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx ===================================== @@ -18,7 +18,7 @@ #L% --> -<JFrame id='mainFrame' preferredSize="{new Dimension(1280,1024)}" onWindowClosing='CloseApplicationAction.run(this, CloseApplicationAction.class)'> +<JFrame id='mainFrame' preferredSize="{new Dimension(1680, 1050)}" minimumSize="{new Dimension(1366, 768)}" onWindowClosing='CloseApplicationAction.run(this, CloseApplicationAction.class)'> <import> fr.ird.observe.client.util.JMenuWithAccelerator ===================================== client-datasource-editor-ll/src/main/i18n/getters/jaxx.getter ===================================== @@ -81,7 +81,6 @@ observe.data.ll.landing.TripLonglineLanding.action.goToSelected.tip observe.data.ll.landing.TripLonglineLanding.action.reopen.tip observe.data.ll.landing.TripLonglineLanding.action.reopenSelected observe.data.ll.landing.TripLonglineLanding.action.reopenSelected.tip -observe.data.ll.landing.TripLonglineLanding.comment observe.data.ll.landing.TripLonglineLanding.list observe.data.ll.landing.TripLonglineLanding.list.message.none observe.data.ll.landing.TripLonglineLanding.titles @@ -218,7 +217,6 @@ observe.data.ll.logbook.TripSampleList.action.goToSelected.tip observe.data.ll.logbook.TripSampleList.action.reopen.tip observe.data.ll.logbook.TripSampleList.action.reopenSelected observe.data.ll.logbook.TripSampleList.action.reopenSelected.tip -observe.data.ll.logbook.TripSampleList.comment observe.data.ll.logbook.TripSampleList.list observe.data.ll.logbook.TripSampleList.list.message.none observe.data.ll.logbook.TripSampleList.titles ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/common/TripUI.jaxx ===================================== @@ -237,6 +237,7 @@ </JPanel> </tab> <tab id='observationsTab' i18nProperty=""> + <JScrollPane id="observationsTabScrollPane"> <Table fill="both"> <!-- observationMethod --> @@ -286,9 +287,11 @@ </cell> </row> </Table> + </JScrollPane> </tab> <tab id='logbookTab' i18nProperty=""> + <JScrollPane id="logbookTabScrollPane"> <Table fill="both"> <!-- logbookDataEntryOperator --> @@ -318,6 +321,7 @@ </cell> </row> </Table> + </JScrollPane> </tab> <tab id="mapTab" i18nProperty=""> <TripMapUI id="tripMap"/> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/landing/LandingUI.jaxx ===================================== @@ -70,9 +70,8 @@ <JTabbedPane id='mainTabbedPane'> <tab id='caracteristicsTab' i18nProperty=""> - - <JPanel layout='{new BorderLayout()}'> - <Table fill='both' constraints='BorderLayout.NORTH' insets="0"> + <JScrollPane id="caracteristicsTabScrollPane"> + <Table fill='both' insets="0"> <!-- dataSource --> <row> @@ -152,7 +151,7 @@ </cell> </row> </Table> - </JPanel> + </JScrollPane> </tab> <tab id='landingPartTab' i18nProperty=""> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/landing/LandingUI.jcss ===================================== @@ -44,10 +44,6 @@ _tab:{"landingPartTab"}; } -#comment { - title:"observe.data.ll.landing.TripLonglineLanding.comment"; -} - #open { _toolTipText:{t("observe.data.ll.landing.TripLonglineLanding.action.reopen.tip")}; } ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/ActivitySampleUI.jcss ===================================== @@ -29,10 +29,6 @@ visible:{!model.isReadingMode()}; } -#comment { - title:"observe.data.ll.logbook.TripSampleList.comment"; -} - #move { enabled:{model.isUpdatingMode() && !model.isModified()}; } ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/SetGlobalCompositionUI.jaxx ===================================== @@ -104,7 +104,7 @@ <!-- mitigationType --> <JPanel layout='{new BorderLayout()}'> - <Table fill='both' constraints='BorderLayout.NORTH'> + <Table fill='both' constraints='BorderLayout.CENTER'> <row> <cell weighty="1" weightx="1"> <FilterableDoubleList id='mitigationType' genericType='MitigationTypeReference'/> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/SetUI.jaxx ===================================== @@ -84,10 +84,11 @@ <Table insets="0" fill="both" constraints='BorderLayout.CENTER'> <row> - <cell anchor="north"> + <cell anchor="north" weighty="1"> <JTabbedPane id='mainTabbedPane'> <tab id='settingTab' i18nProperty=""> - <JPanel layout='{new BorderLayout()}'> + <JScrollPane id="settingTabScrollPane"> + <JPanel layout='{new BorderLayout()}'> <Table fill='both' constraints='BorderLayout.NORTH'> <!-- homeId --> @@ -151,11 +152,12 @@ </cell> </row> </Table> - </JPanel> - + </JPanel> + </JScrollPane> </tab> <tab id='settingCaracteristicsTab' i18nProperty=""> + <JScrollPane id="settingCaracteristicsTabScrollPane"> <Table fill='both'> <!-- setting vessel speed --> @@ -310,10 +312,12 @@ </cell> </row> </Table> + </JScrollPane> </tab> <tab id='lightsticksTab' i18nProperty=""> - <JPanel layout='{new BorderLayout()}'> + <JScrollPane id="lightsticksTabScrollPane"> + <JPanel layout='{new BorderLayout()}'> <Table fill='both' constraints='BorderLayout.NORTH'> <!-- lightsticksUsed --> <row> @@ -349,12 +353,13 @@ </cell> </row> </Table> - </JPanel> + </JPanel> + </JScrollPane> </tab> <tab id='haulingTab' i18nProperty=""> - - <JPanel layout='{new BorderLayout()}'> + <JScrollPane id="haulingTabScrollPane"> + <JPanel layout='{new BorderLayout()}'> <Table fill='both' constraints='BorderLayout.NORTH'> <!-- hauling same direction as setting --> @@ -405,14 +410,15 @@ </cell> </row> </Table> - </JPanel> + </JPanel> + </JScrollPane> </tab> </JTabbedPane> </cell> </row> <row> - <cell fill="both" weighty="1" weightx="1"> + <cell fill="both" weightx="1"> <BigTextEditor id="comment"/> </cell> </row> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/TripSampleUI.jaxx ===================================== @@ -70,9 +70,8 @@ <JTabbedPane id='mainTabbedPane'> <tab id='caracteristicsTab' i18nProperty=""> - - <JPanel layout='{new BorderLayout()}'> - <Table fill='both' constraints='BorderLayout.NORTH' insets="0"> + <JScrollPane id="caracteristicsTabScrollPane"> + <Table fill='both' insets="0"> <!-- timeStamp --> <row> @@ -93,7 +92,7 @@ </cell> </row> </Table> - </JPanel> + </JScrollPane> </tab> <tab id='samplePartTab' i18nProperty=""> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/logbook/TripSampleUI.jcss ===================================== @@ -48,10 +48,6 @@ _tab:{"samplePartTab"}; } -#comment { - title:"observe.data.ll.logbook.TripSampleList.comment"; -} - #open { _toolTipText:{t("observe.data.ll.logbook.TripSampleList.action.reopen.tip")}; } ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/ActivityUI.jaxx ===================================== @@ -72,7 +72,8 @@ <!-- formulaire --> <JPanel id="body"> - <Table fill='both' constraints="BorderLayout.CENTER"> + <JScrollPane id="bodyScrollPane" constraints="BorderLayout.CENTER"> + <Table fill='both'> <!-- date - time --> <row> @@ -135,6 +136,7 @@ </cell> </row> </Table> + </JScrollPane> </JPanel> <!-- surcharge des actions (pour appliquer la css specifique) --> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/BranchlineUI.jaxx ===================================== @@ -69,12 +69,13 @@ public void edit(BranchlineDto branchline) { getHandler().edit(branchline); } <Table insets="0" fill="both" constraints='BorderLayout.CENTER'> <row> - <cell anchor="north" weightx="1"> + <cell anchor="north" weightx="1" weighty="1"> <JTabbedPane id='subTabbedPane'> <tab id='generalTab' i18nProperty=""> - <JPanel layout='{new BorderLayout()}'> - <Table fill="both" constraints='BorderLayout.CENTER'> + <JScrollPane id="generalTabScrollPane"> + + <Table fill="both"> <!-- topType --> <row> @@ -156,12 +157,13 @@ public void edit(BranchlineDto branchline) { getHandler().edit(branchline); } </row> </Table> - </JPanel> + </JScrollPane> </tab> <tab id='hookAndBaitTab' i18nProperty=""> - <JPanel layout='{new BorderLayout()}'> - <Table fill="both" constraints='BorderLayout.CENTER'> + <JScrollPane id="hookAndBaitTabScrollPane"> + <JPanel layout='{new BorderLayout()}'> + <Table fill="both" constraints='BorderLayout.CENTER'> <!-- HookType --> <row> @@ -224,13 +226,14 @@ public void edit(BranchlineDto branchline) { getHandler().edit(branchline); } </row> </Table> - </JPanel> + </JPanel> + </JScrollPane> </tab> </JTabbedPane> </cell> </row> <row> - <cell weighty="1"> + <cell> <BigTextEditor id="comment"/> </cell> </row> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/SetGlobalCompositionUI.jaxx ===================================== @@ -106,7 +106,7 @@ <!-- mitigationType --> <JPanel layout='{new BorderLayout()}'> - <Table fill='both' constraints='BorderLayout.NORTH'> + <Table fill='both' constraints='BorderLayout.CENTER'> <row> <cell weighty="1" weightx="1"> <FilterableDoubleList id='mitigationType' genericType='MitigationTypeReference'/> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/SetUI.jaxx ===================================== @@ -83,10 +83,11 @@ <Table insets="0" fill="both" constraints='BorderLayout.CENTER'> <row> - <cell anchor="north"> + <cell anchor="north" weighty="1" fill="both"> <JTabbedPane id='mainTabbedPane'> <tab id='settingTab' i18nProperty=""> - <JPanel layout='{new BorderLayout()}'> + <JScrollPane id="settingTabScrollPane"> + <JPanel layout='{new BorderLayout()}'> <Table fill='both' constraints='BorderLayout.NORTH'> <!-- homeId --> @@ -141,13 +142,14 @@ </Table> </cell> </row> - </Table> - </JPanel> + </JPanel> + </JScrollPane> </tab> <tab id='settingCaracteristicsTab' i18nProperty=""> + <JScrollPane id="settingCaracteristicTabScrollPane"> <Table fill='both'> <!-- setting shape --> @@ -310,11 +312,12 @@ </cell> </row> </Table> + </JScrollPane> </tab> <tab id='haulingTab' i18nProperty=""> - - <JPanel layout='{new BorderLayout()}'> + <JScrollPane id="haulingTabScrollPane"> + <JPanel layout='{new BorderLayout()}'> <Table fill='both' constraints='BorderLayout.NORTH'> <!-- hauling same direction as setting --> @@ -365,14 +368,15 @@ </cell> </row> </Table> - </JPanel> + </JPanel> + </JScrollPane> </tab> </JTabbedPane> </cell> </row> <row> - <cell fill="both" weighty="1" weightx="1"> + <cell fill="both" weightx="1"> <BigTextEditor id="comment"/> </cell> </row> ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/TdrUI.jaxx ===================================== @@ -354,7 +354,7 @@ <!-- species --> <JPanel layout='{new BorderLayout()}'> - <Table fill='both' constraints='BorderLayout.NORTH'> + <Table fill='both' constraints='BorderLayout.CENTER'> <row> <cell weighty="1" weightx="1"> <FilterableDoubleList id='species' genericType='SpeciesReference'/> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/f8948144066823a14eac38728… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/f8948144066823a14eac38728… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] 2 commits: Compute GoUp and GoDown items lazily
by Tony CHEMIT 11 Apr '20

11 Apr '20
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: e99f559c by tchemit at 2020-04-10T10:03:29+02:00 Compute GoUp and GoDown items lazily - - - - - 2be69ee9 by tchemit at 2020-04-11T06:05:23+02:00 Introduce BusyModel (See #1386) - - - - - 30 changed files: - client-core/src/main/java/fr/ird/observe/client/ClientUIContext.java - client-core/src/main/java/fr/ird/observe/client/datasource/h2/backup/LocalDatabaseBackupTaskSupport.java - client-core/src/main/java/fr/ird/observe/client/main/MainUIModel.java - client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx - client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jcss - client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUIHandler.java - + client-core/src/main/java/fr/ird/observe/client/util/busy/BusyLayerUI.java - + client-core/src/main/java/fr/ird/observe/client/util/busy/BusyModel.java - + client-core/src/main/resources/icons/busy.gif - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUIHandler.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/DataSourceEditorBodyContent.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/DataSourceEditorHandler.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/DataSourceEditorLayerUI.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/actions/GoDown.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/actions/GoUp.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/list/actions/DeleteActionSupport.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUIHandler.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/menu/DataSourceEditorMenu.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/menu/DataSourceEditorMenu.jcss - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/menu/DataSourceEditorMenuModel.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/menu/DataSourceEditorNavigationMenuModel.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/menu/actions/CloseStorageAction.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/menu/actions/ReloadStorageAction.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/NavigationTreeModel.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/actions/NavigationConfigUIToggleShowActionSupport.java - client-datasource-editor-common/src/main/java/fr/ird/observe/client/datasource/editor/content/data/TripUIHelper.java - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/observation/SetDetailCompositionUIHandler.java - client-datasource-editor-ps/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ps/observation/actions/FloatingObjectUICopyFloatingObjectPartToLeft.java - client-datasource-editor-ps/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ps/observation/actions/FloatingObjectUICopyFloatingObjectPartToRight.java - client-runner/src/main/java/fr/ird/observe/client/ObserveActionExecutor.java The diff was not included because it is too large. View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/ab651f885af30e83ce64b5bc… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/ab651f885af30e83ce64b5bc… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Vérifier la présence ou ajouter un champ PS trip.homeid - Closes #1383
by Tony CHEMIT 06 Apr '20

06 Apr '20
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: ab651f88 by tchemit at 2020-04-06T17:09:56+02:00 Vérifier la présence ou ajouter un champ PS trip.homeid - Closes #1383 - - - - - 13 changed files: - client-datasource-editor-ps/src/main/i18n/getters/jaxx.getter - client-datasource-editor-ps/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ps/common/TripUI.jaxx - + persistence/src/main/java/fr/ird/observe/entities/migration/DataSourceMigrationForVersion_7_5_1.java - persistence/src/main/resources/db/migration/8.0/102_create_ps_common_schema-common.sql - persistence/src/main/resources/db/migration/8.0/110_add_home_id-common.sql - + test/src/main/resources/db/7.5.1/dataForTestLongline.sql.gz - + test/src/main/resources/db/7.5.1/dataForTestSeine.sql.gz - + test/src/main/resources/db/7.5.1/empty_h2.sql.gz - + test/src/main/resources/db/7.5.1/empty_pg.sql.gz - + test/src/main/resources/db/7.5.1/referentiel.sql.gz - test/src/main/resources/db/8.0/dataForTestLongline.sql.gz - test/src/main/resources/db/8.0/dataForTestSeine.sql.gz - test/src/main/resources/db/8.0/referentiel.sql.gz Changes: ===================================== client-datasource-editor-ps/src/main/i18n/getters/jaxx.getter ===================================== @@ -1,5 +1,6 @@ observe.Id.comment observe.Id.country +observe.Id.homeId observe.Id.ocean observe.Id.sex observe.Id.sizeMeasureType ===================================== client-datasource-editor-ps/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ps/common/TripUI.jaxx ===================================== @@ -148,6 +148,15 @@ <BeanFilterableComboBox id='landingHarbour' genericType='HarbourReference' constructorParams='this'/> </cell> </row> + <!-- homeId --> + <row> + <cell anchor='west'> + <JLabel id='homeIdLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <NormalTextEditor id='homeId'/> + </cell> + </row> <!-- id ers --> <row> ===================================== persistence/src/main/java/fr/ird/observe/entities/migration/DataSourceMigrationForVersion_7_5_1.java ===================================== @@ -0,0 +1,78 @@ +package fr.ird.observe.entities.migration; + +/*- + * #%L + * ObServe :: Persistence + * %% + * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io + * %% + * 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.auto.service.AutoService; +import org.apache.commons.lang3.tuple.Pair; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; +import org.nuiton.topia.service.migration.resources.MigrationVersionResource; +import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExecutor; +import org.nuiton.version.Versions; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Set; + +/** + * @author Tony Chemit - dev(a)tchemit.fr + * @since 7.5.1 + */ +(a)AutoService(MigrationVersionResource.class) +public class DataSourceMigrationForVersion_7_5_1 extends MigrationVersionResource { + + public DataSourceMigrationForVersion_7_5_1() { + super(Versions.valueOf("7.5.1")); + } + + @Override + public void generateSqlScript(MigrationVersionResourceExecutor executor) { + Set<Pair<String, String>> tripIdAndComment = executor.findMultipleResultAstSet(new TopiaSqlQuery<Pair<String, String>>() { + @SuppressWarnings("SqlDialectInspection") + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + return connection.prepareStatement("SELECT topiaId, comment FROM observe_seine.trip WHERE comment LIKE '#%#%'"); + } + + @Override + public Pair<String, String> prepareResult(ResultSet set) throws SQLException { + return Pair.of(set.getString(1), set.getString(2)); + } + }); + + executor.writeSql("ALTER TABLE observe_seine.trip ADD COLUMN homeId VARCHAR(255)"); + + for (Pair<String, String> pair : tripIdAndComment) { + String tripId = pair.getKey(); + String comment = pair.getValue().trim(); + + int endIndex = comment.indexOf('#', 1); + String homeId = comment.substring(1, endIndex - 1); + String newComment = endIndex + 1 == comment.length() ? "NULL" : (String.format("'%s'", comment.substring(endIndex + 1).trim().replaceAll("'","''"))); + executor.writeSql(String.format("UPDATE observe_seine.trip t SET comment = %s, homeId = '%s', topiaVersion = topiaVersion + 1, lastUpdateDate = CURRENT_TIMESTAMP WHERE t.topiaId = '%s';", newComment, homeId, tripId)); + } + } + +} + ===================================== persistence/src/main/resources/db/migration/8.0/102_create_ps_common_schema-common.sql ===================================== @@ -27,7 +27,7 @@ CREATE TABLE ps_common.transmittingbuoyoperation(topiaid VARCHAR(255) NOT NULL C CREATE TABLE ps_common.transmittingbuoytype(topiaid VARCHAR(255) NOT NULL CONSTRAINT pk_ps_observation_transmittingbuoytype PRIMARY KEY, topiaversion BIGINT NOT NULL, topiacreatedate TIMESTAMP NOT NULL, code VARCHAR(255), needcomment BOOLEAN, uri VARCHAR(255), status INTEGER DEFAULT 1, label1 VARCHAR(255), label2 VARCHAR(255), label3 VARCHAR(255), label4 VARCHAR(255), label5 VARCHAR(255), label6 VARCHAR(255), label7 VARCHAR(255), label8 VARCHAR(255), lastupdatedate TIMESTAMP DEFAULT now() NOT NULL, technology VARCHAR(1024)); CREATE TABLE ps_common.vesselactivity(topiaid VARCHAR(255) NOT NULL CONSTRAINT pk_ps_observation_vesselactivity PRIMARY KEY, topiaversion BIGINT NOT NULL, topiacreatedate TIMESTAMP NOT NULL, code VARCHAR(255), uri VARCHAR(255), needcomment BOOLEAN, status INTEGER DEFAULT 1, label1 VARCHAR(255), label2 VARCHAR(255), label3 VARCHAR(255), label4 VARCHAR(255), label5 VARCHAR(255), label6 VARCHAR(255), label7 VARCHAR(255), label8 VARCHAR(255), lastupdatedate TIMESTAMP DEFAULT now() NOT NULL, allowfad BOOLEAN DEFAULT FALSE NOT NULL); -CREATE TABLE ps_common.trip( topiaid varchar(255) not null constraint pk_trip primary key, topiaversion BIGINT not null, topiacreatedate TIMESTAMP NOT NULL, startdate DATE, enddate DATE, comment VARCHAR(1025), checklevel INTEGER, formsurl varchar(255), reportsurl varchar(255), historicaldata BOOLEAN, ersid varchar(255), ocean varchar(255), observer varchar(255), vessel varchar(255), program varchar(255), captain varchar(255), dataentryoperator varchar(255), departureharbour varchar(255), landingharbour varchar(255), lastupdatedate TIMESTAMP default now() not null, dataquality varchar(255)); +CREATE TABLE ps_common.trip( topiaid varchar(255) not null constraint pk_trip primary key, topiaversion BIGINT not null, topiacreatedate TIMESTAMP NOT NULL, startdate DATE, enddate DATE, comment VARCHAR(1025), checklevel INTEGER, formsurl varchar(255), reportsurl varchar(255), historicaldata BOOLEAN, homeId varchar(255), ersid varchar(255), ocean varchar(255), observer varchar(255), vessel varchar(255), program varchar(255), captain varchar(255), dataentryoperator varchar(255), departureharbour varchar(255), landingharbour varchar(255), lastupdatedate TIMESTAMP default now() not null, dataquality varchar(255)); CREATE TABLE ps_common.gearusefeatures( topiaid varchar(255) not null constraint pk_gearusefeatures primary key, topiaversion BIGINT not null, topiacreatedate DATE, trip varchar(255), gear varchar(255) not null, number INTEGER not null, comment VARCHAR(1025), usedintrip BOOLEAN, lastupdatedate TIMESTAMP default now() not null ); CREATE TABLE ps_common.gearusefeaturesmeasurement( topiaid varchar(255) not null constraint pk_gearusefeaturesmeasurement primary key, topiaversion BIGINT not null, topiacreatedate DATE, gearcaracteristic varchar(255) not null, gearusefeatures varchar(255), measurementvalue varchar(255) not null, lastupdatedate TIMESTAMP default now() not null ); @@ -35,7 +35,7 @@ INSERT INTO ps_common.speciesfate(topiaid, topiaversion, topiacreatedate, code, INSERT INTO ps_common.transmittingbuoyoperation(topiaid, topiaversion, topiacreatedate, code, uri, status, label1, label2, label3, label4, label5, label6, label7, label8, needcomment, lastupdatedate) SELECT topiaid, topiaversion, topiacreatedate, code, uri, status, label1, label2, label3, label4, label5, label6, label7, label8, needcomment, lastupdatedate FROM observe_seine.transmittingbuoyoperation; INSERT INTO ps_common.transmittingbuoytype(topiaid, topiaversion, topiacreatedate, code, needcomment, uri, status, label1, label2, label3, label4, label5, label6, label7, label8, lastupdatedate, technology) SELECT topiaid, topiaversion, topiacreatedate, code, needcomment, uri, status, label1, label2, label3, label4, label5, label6, label7, label8, lastupdatedate, technology FROM observe_seine.transmittingbuoytype; INSERT INTO ps_common.vesselactivity(topiaid, topiaversion, topiacreatedate, code, uri, needcomment, status, label1, label2, label3, label4, label5, label6, label7, label8, lastupdatedate, allowfad) SELECT topiaid, topiaversion, topiacreatedate, code, uri, needcomment, status, label1, label2, label3, label4, label5, label6, label7, label8, lastupdatedate, allowfad FROM observe_seine.vesselactivity; -INSERT INTO ps_common.trip( topiaid, topiaversion, topiacreatedate, startdate , enddate, comment , checklevel, formsurl , reportsurl , historicaldata , ersid , ocean , observer , vessel , program , captain , dataentryoperator , departureharbour , landingharbour , lastupdatedate , dataquality ) SELECT topiaid, topiaversion, topiacreatedate, startdate , enddate, comment , checklevel, formsurl , reportsurl , historicaldata , ersid , ocean , observer , vessel , program , captain , dataentryoperator , departureharbour , landingharbour , lastupdatedate , dataquality FROM observe_seine.trip; +INSERT INTO ps_common.trip( topiaid, topiaversion, topiacreatedate, startdate , enddate, comment , checklevel, formsurl , reportsurl , historicaldata , homeId, ersid , ocean , observer , vessel , program , captain , dataentryoperator , departureharbour , landingharbour , lastupdatedate , dataquality ) SELECT topiaid, topiaversion, topiacreatedate, startdate , enddate, comment , checklevel, formsurl , reportsurl , historicaldata , homeId, ersid , ocean , observer , vessel , program , captain , dataentryoperator , departureharbour , landingharbour , lastupdatedate , dataquality FROM observe_seine.trip; INSERT INTO ps_common.gearusefeatures( topiaid, topiaversion, topiacreatedate, trip, gear , number , comment , usedintrip , lastupdatedate ) SELECT topiaid, topiaversion, topiacreatedate, trip, gear , number , comment , usedintrip , lastupdatedate FROM observe_seine.gearusefeatures; INSERT INTO ps_common.gearusefeaturesmeasurement( topiaid, topiaversion, topiacreatedate, gearcaracteristic , gearusefeatures , measurementvalue , lastupdatedate ) SELECT topiaid, topiaversion, topiacreatedate, gearcaracteristic , gearusefeatures , measurementvalue , lastupdatedate FROM observe_seine.gearusefeaturesmeasurement; ===================================== persistence/src/main/resources/db/migration/8.0/110_add_home_id-common.sql ===================================== @@ -106,7 +106,6 @@ ALTER TABLE ps_common.gearusefeaturesmeasurement ADD COLUMN homeId VARCHAR(255); ALTER TABLE ps_common.speciesfate ADD COLUMN homeId VARCHAR(255); ALTER TABLE ps_common.transmittingbuoyoperation ADD COLUMN homeId VARCHAR(255); ALTER TABLE ps_common.transmittingbuoytype ADD COLUMN homeId VARCHAR(255); -ALTER TABLE ps_common.trip ADD COLUMN homeId VARCHAR(255); ALTER TABLE ps_common.vesselactivity ADD COLUMN homeId VARCHAR(255); ALTER TABLE ps_observation.activity ADD COLUMN homeId VARCHAR(255); ALTER TABLE ps_observation.detectionmode ADD COLUMN homeId VARCHAR(255); ===================================== test/src/main/resources/db/7.5.1/dataForTestLongline.sql.gz ===================================== Binary files /dev/null and b/test/src/main/resources/db/7.5.1/dataForTestLongline.sql.gz differ ===================================== test/src/main/resources/db/7.5.1/dataForTestSeine.sql.gz ===================================== Binary files /dev/null and b/test/src/main/resources/db/7.5.1/dataForTestSeine.sql.gz differ ===================================== test/src/main/resources/db/7.5.1/empty_h2.sql.gz ===================================== Binary files /dev/null and b/test/src/main/resources/db/7.5.1/empty_h2.sql.gz differ ===================================== test/src/main/resources/db/7.5.1/empty_pg.sql.gz ===================================== Binary files /dev/null and b/test/src/main/resources/db/7.5.1/empty_pg.sql.gz differ ===================================== test/src/main/resources/db/7.5.1/referentiel.sql.gz ===================================== Binary files /dev/null and b/test/src/main/resources/db/7.5.1/referentiel.sql.gz differ ===================================== test/src/main/resources/db/8.0/dataForTestLongline.sql.gz ===================================== Binary files a/test/src/main/resources/db/8.0/dataForTestLongline.sql.gz and b/test/src/main/resources/db/8.0/dataForTestLongline.sql.gz differ ===================================== test/src/main/resources/db/8.0/dataForTestSeine.sql.gz ===================================== Binary files a/test/src/main/resources/db/8.0/dataForTestSeine.sql.gz and b/test/src/main/resources/db/8.0/dataForTestSeine.sql.gz differ ===================================== test/src/main/resources/db/8.0/referentiel.sql.gz ===================================== Binary files a/test/src/main/resources/db/8.0/referentiel.sql.gz and b/test/src/main/resources/db/8.0/referentiel.sql.gz differ View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/ab651f885af30e83ce64b5bc4… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/ab651f885af30e83ce64b5bc4… You're receiving this email because of your account on gitlab.com.
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • ...
  • 720
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.