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

April 2020

  • 1 participants
  • 54 discussions
[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
[Git][ultreiaio/ird-observe][develop-7.x] 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-7.x at ultreiaio / ird-observe Commits: 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 - - - - - 12 changed files: - 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 - dto/src/main/models/Observe.model - persistence/src/main/java/fr/ird/observe/binder/data/seine/TripSeineEntityDtoBinder.java - + persistence/src/main/java/fr/ird/observe/persistence/migration/DataSourceMigrationForVersion_7_5_1.java - persistence/src/main/models/Observe.model - pom.xml - + 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 Changes: ===================================== client-core/src/main/java/fr/ird/observe/client/ui/content/data/seine/TripSeineUI.jaxx ===================================== @@ -157,6 +157,22 @@ protected boolean canEditOcean(java.util.LinkedHashSet<RouteStubDto> routes) { </cell> </row> + <!-- homeId --> + <row> + + <cell anchor='west'> + <JLabel id='homeIdLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <JPanel layout='{new BorderLayout()}'> + <JToolBar id='homeIdToolbar' constraints='BorderLayout.WEST'> + <JButton id='resetHomeId' styleClass='resetButton'/> + </JToolBar> + <JTextField id='homeId' constraints='BorderLayout.CENTER'/> + </JPanel> + </cell> + </row> + <!-- id ers --> <row> ===================================== client-core/src/main/java/fr/ird/observe/client/ui/content/data/seine/TripSeineUI.jcss ===================================== @@ -77,6 +77,16 @@ NumberEditor { selectedItem:{bean.getLandingHarbour()}; } +#resetHomeId { + toolTipText:"observe.common.DataDto.action.reset.homeId.tip"; + _resetPropertyName: {TripSeineDto.PROPERTY_HOME_ID}; +} + +#homeId { + text:{getStringValue(bean.getHomeId())}; + _propertyName: {TripSeineDto.PROPERTY_HOME_ID}; +} + #resetErsId { toolTipText:"observe.common.DataDto.action.reset.ersId.tip"; _resetPropertyName:{TripSeineDto.PROPERTY_ERS_ID}; ===================================== dto/src/main/models/Observe.model ===================================== @@ -817,6 +817,7 @@ formsUrl + {*:1} String reportsUrl + {*:1} String historicalData + {*:1} boolean ersId + {*:1} String +homeId + {*:1} String routeCount + {*:1} int observer {*:0..1} fr.ird.observe.dto.referential.PersonReference | notNull captain {*:0..1} fr.ird.observe.dto.referential.PersonReference | mayNotNull ===================================== persistence/src/main/java/fr/ird/observe/binder/data/seine/TripSeineEntityDtoBinder.java ===================================== @@ -50,6 +50,7 @@ public class TripSeineEntityDtoBinder extends DataEntityDtoBinderSupport<TripSei entity.setFormsUrl(dto.getFormsUrl()); entity.setReportsUrl(dto.getReportsUrl()); entity.setErsId(dto.getErsId()); + entity.setHomeId(dto.getHomeId()); entity.setOcean(toEntity(dto.getOcean())); entity.setVessel(toEntity(dto.getVessel())); @@ -74,6 +75,7 @@ public class TripSeineEntityDtoBinder extends DataEntityDtoBinderSupport<TripSei dto.setFormsUrl(entity.getFormsUrl()); dto.setReportsUrl(entity.getReportsUrl()); dto.setErsId(entity.getErsId()); + dto.setHomeId(entity.getHomeId()); dto.setOcean(toReferentialReference(referentialLocale, entity.getOcean())); dto.setVessel(toReferentialReference(referentialLocale, entity.getVessel())); dto.setProgram(toReferentialReference(referentialLocale, entity.getProgram())); ===================================== persistence/src/main/java/fr/ird/observe/persistence/migration/DataSourceMigrationForVersion_7_5_1.java ===================================== @@ -0,0 +1,78 @@ +package fr.ird.observe.persistence.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/models/Observe.model ===================================== @@ -851,6 +851,7 @@ vessel {*:1} referentiel.Vessel seine.TripSeine > CommentableEntity >> Trip | entity dbName=Trip startDate + {*:1} Date | hibernateAttributeType.java.util.Date=date endDate + {*:1} Date | hibernateAttributeType.java.util.Date=date +homeId + {*:1} String checkLevel + {*:1} int formsUrl + {*:1} String reportsUrl + {*:1} String ===================================== pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2020.14</version> + <version>2020.15</version> </parent> <groupId>fr.ird.observe</groupId> @@ -149,7 +149,7 @@ <devMode>true</devMode> <!--persistence model version--> - <observe.model.version>7.5</observe.model.version> + <observe.model.version>7.5.1</observe.model.version> <!-- build timestamp configuration --> <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> ===================================== 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 View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/5b631f82d7aca107b0b637f4c… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/5b631f82d7aca107b0b637f4c… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] 3 commits: Mise à jour jaxx avec des améliorations sur les JTabbedPane
by Tony CHEMIT 06 Apr '20

06 Apr '20
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 518406b4 by tchemit at 2020-04-06T13:52:08+02:00 Mise à jour jaxx avec des améliorations sur les JTabbedPane - - - - - 512a6572 by tchemit at 2020-04-06T13:52:10+02:00 Lors d&#39;un &#39;Rechargement de la source&#39; ou d&#39;un appel aux filtres d&#39;affichage de l&#39;arbre, afficher une barre de progression - Closes #1386 - - - - - b6185ba5 by tchemit at 2020-04-06T13:52:10+02:00 Fix NPE when reload ui callback - - - - - 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/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/body/ClientConfigUI.java - client-core/src/main/java/fr/ird/observe/client/main/callback/ReloadUiCallback.java - client-core/src/main/resources/fr/ird/observe/client/ui/ObserveCommon.jcss - client-core/src/main/resources/observe-ui.properties - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminTabUI.jcss - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUI.jaxx - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUI.jcss - client-datasource-editor-api/src/main/i18n/getters/java.getter - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUI.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUI.jcss - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUI.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUI.jcss - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/ContentReferenceUI.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/ContentReferenceUI.jcss - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/actions/NavigationConfigUIToggleShowActionSupport.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/wizard/StorageUI.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/wizard/StorageUI.jcss - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/common/TripUIHandler.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 - pom.xml Changes: ===================================== client-configuration/src/main/config/Client.ini ===================================== @@ -627,6 +627,18 @@ key = ui.temperature.format type = org.nuiton.jaxx.widgets.temperature.TemperatureFormat defaultValue = "C" +[option busyStateColor] +description = observe.config.ui.busyStateColor +key = ui.busyState.color +type = java.awt.Color +defaultValue = "java.awt.Color[r=50,g=50,b=50]" + +[option blockStateColor] +description = observe.config.ui.blockStateColor +key = ui.blockState.color +type = java.awt.Color +defaultValue = "java.awt.Color[r=50,g=50,b=50]" + [option focusBorderColor] description = observe.config.ui.focusBorderColor key = ui.focusBorder.color ===================================== client-configuration/src/main/i18n/getters/config.getter ===================================== @@ -92,6 +92,8 @@ observe.config.speciesList.seine.observation.targetCatch observe.config.swingSessionFile.description observe.config.temperature.format observe.config.ui.autoPopupNumberEditor +observe.config.ui.blockStateColor +observe.config.ui.busyStateColor observe.config.ui.changeSynchroSrc observe.config.ui.dcp.error.color observe.config.ui.dcp.not.editable.color ===================================== client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java ===================================== @@ -59,6 +59,7 @@ import org.nuiton.util.StringUtil; import org.nuiton.version.Version; import org.nuiton.version.Versions; +import javax.swing.UIManager; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -681,6 +682,8 @@ public class ClientConfig extends GeneratedClientConfig implements TemplateGener loadUIConfigFile(ObserveClientResourceManager.Resource.ui_navigation_common, dir); loadUIConfigFile(ObserveClientResourceManager.Resource.ui_navigation_ps, dir); loadUIConfigFile(ObserveClientResourceManager.Resource.ui_navigation_ll, dir); + UIManager.getDefaults().put("BlockingLayerUI.busyColor", getBusyStateColor()); + UIManager.getDefaults().put("BlockingLayerUI.blockColor", getBlockStateColor()); } private void loadUIConfigFile(ObserveClientResourceManager.Resource resource, File resourceDirectory) { ===================================== client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx ===================================== @@ -47,7 +47,7 @@ <ClientConfig id='config' initializer='getContextValue(ClientConfig.class)'/> <MainUIBodyContentManager id="mainUIBodyContentManager" initializer='getContextValue(MainUIBodyContentManager.class)'/> - <ObserveBlockingLayerUI id='busyBlockLayerUI'/> + <ObserveBlockingLayerUI id='busyBlockLayerUI' styleClass="busyBlockLayerUI"/> <script><![CDATA[ ===================================== client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jcss ===================================== @@ -72,10 +72,7 @@ } #busyBlockLayerUI { - useIcon: false; - blockingColor: {UIManager.getColor("BlockingLayerUI.blockingColor")}; block: {model.isBusy()}; - acceptedComponentNames: {UIHelper.ACCEPTABLE_COMPONENTS}; } #serverMode { ===================================== client-core/src/main/java/fr/ird/observe/client/main/body/ClientConfigUI.java ===================================== @@ -170,6 +170,8 @@ public class ClientConfigUI extends JXTitledPanel { helper.addOption(ClientConfigOption.SHOW_MNEMONIC); helper.addOption(ClientConfigOption.COORDINATE_FORMAT); + helper.addOption(ClientConfigOption.BUSY_STATE_COLOR); + helper.addOption(ClientConfigOption.BLOCK_STATE_COLOR); helper.addOption(ClientConfigOption.FOCUS_BORDER_COLOR); helper.addOption(ClientConfigOption.NO_FOCUS_BORDER_COLOR); helper.addOption(ClientConfigOption.FLOATING_OBJECT_MATERIAL_ERROR_COLOR); ===================================== client-core/src/main/java/fr/ird/observe/client/main/callback/ReloadUiCallback.java ===================================== @@ -27,6 +27,7 @@ import fr.ird.observe.client.ClientUIContext; import fr.ird.observe.client.configuration.ClientConfig; import fr.ird.observe.client.configuration.WithClientConfig; import fr.ird.observe.client.main.ObserveMainUI; +import fr.ird.observe.client.main.body.ClientConfigUI; import fr.ird.observe.client.main.body.NoBodyContentComponent; import io.ultreia.java4all.application.context.ApplicationContext; import org.nuiton.jaxx.runtime.swing.SwingUtil; @@ -71,44 +72,24 @@ public class ReloadUiCallback implements ObserveUICallback, WithClientConfig { // scan main ui -// ObserveSwingDataSource mainStorage = getObserveDataSourcesManager().getMainDataSource(); - //FIXME:BodyContent, cela doit être délégué au body content concerné Class<? extends JComponent> bodyContent = NoBodyContentComponent.class; if (ui != null) { + // Keep a reference on ui instance since it will be reset in close method + // FIXME Should use a closing state in application to improve this + ObserveMainUI ui = this.ui; bodyContent = ui.getMainUIBodyContentManager().getCurrentBodyType(); + if (ClientConfigUI.class.equals(bodyContent)) { + bodyContent = NoBodyContentComponent.class; + } ui.dispose(); - ui.setVisible(false); System.runFinalization(); } -// focusBorder = null; -// noFocusBorder = null; ui = clientUIContext.initUI(rootContext, config); - //FIXME:BodyContent : We must improve this, but for the moment, we could just open main ui empty... -// if (bodyContent == null) { -// if (mainStorage == null) { -// bodyContent = NoBodyContent.NoBodyContentComponent.class; -// } else { -// throw new IllegalStateException("Can't have a loaded database, but not loaded in gui..."); -// } -// } - ui.changeBodyContent(bodyContent); - //FIXME:BodyContent this will be done in data source editor body content -// if (oldMode == ObserveUIMode.DB) { -// -// // on met à jour le modèle de navigation -// NavigationTreeModel treeModel = ui.getNavigationUI().getTree().getModel(); -// treeModel.load(config); -// treeModel.populate(mainStorage); -// -// // selection du noeud d'ouverture -// ui.getNavigationUI().getTree().selectInitialNode(); -// } - // show ui clientUIContext.setMainUIVisible(ui, true); } ===================================== client-core/src/main/resources/fr/ird/observe/client/ui/ObserveCommon.jcss ===================================== @@ -172,3 +172,14 @@ BlockingLayerUI { acceptedComponentTypes: {javax.swing.JScrollBar.class}; } +.busyBlockLayerUI { + useIcon: false; + blockingColor: {javax.swing.UIManager.getColor("BlockingLayerUI.busyColor")}; + acceptedComponentNames: {fr.ird.observe.client.util.UIHelper.ACCEPTABLE_COMPONENTS}; +} + +.blockBlockLayerUI { + useIcon: false; + blockingColor: {javax.swing.UIManager.getColor("BlockingLayerUI.blockingColor")}; + acceptedComponentNames: {fr.ird.observe.client.util.UIHelper.ACCEPTABLE_COMPONENTS}; +} ===================================== client-core/src/main/resources/observe-ui.properties ===================================== @@ -189,3 +189,4 @@ color.Table.lastRowColor=255,255,0 color.Table.emptyRowColor=255,255,0 color.Table.unvalidCellColor=255,0,0 color.BlockingLayerUI.blockingColor=50,50,50 +color.BlockingLayerUI.busyColor=50,50,50 ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminTabUI.jcss ===================================== @@ -92,7 +92,3 @@ columnHeaderView:{UIHelper.newLabel(t("observe.common.step.description") ,"information", 10)}; } -#busyBlockLayerUI{ - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; -} ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUI.jaxx ===================================== @@ -37,13 +37,13 @@ <AdminUIModel id='model' initializer='getContextValue(AdminUIModel.class)'/> <!-- le bloqueur d'ui utilisé par l'assistant --> - <ObserveBlockingLayerUI id='tabBusyBlockLayerUI'/> + <ObserveBlockingLayerUI id='tabBusyBlockLayerUI' styleClass="busyBlockLayerUI"/> <!-- le bloqueur d'ui lorsqu'une action est en cours ou annulée --> - <ObserveBlockingLayerUI id='busyBlockLayerUI'/> + <ObserveBlockingLayerUI id='busyBlockLayerUI' styleClass="busyBlockLayerUI"/> <!-- le bloqueur de changement de configuration --> - <ObserveBlockingLayerUI id='configBlockLayerUI'/> + <ObserveBlockingLayerUI id='configBlockLayerUI' styleClass="blockBlockLayerUI"/> <script><![CDATA[ ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUI.jcss ===================================== @@ -24,24 +24,12 @@ layout:{new BorderLayout()}; } -#tabBusyBlockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; - acceptedComponentNames:{UIHelper.ACCEPTABLE_COMPONENTS}; -} - #busyBlockLayerUI{ - useIcon:false; block:{WizardExtUtil.acceptStates(model.getModelState(), WizardState.CANCELED, WizardState.SUCCESSED, WizardState.FAILED)}; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; - acceptedComponentNames:{UIHelper.ACCEPTABLE_COMPONENTS}; } #configBlockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{model.isWasStarted() || WizardExtUtil.acceptStates(model.getModelState(), WizardState.CANCELED)}; - acceptedComponentNames:{UIHelper.ACCEPTABLE_COMPONENTS}; } #tabs { ===================================== client-datasource-editor-api/src/main/i18n/getters/java.getter ===================================== @@ -239,6 +239,7 @@ observe.tree.action.configure.tip observe.tree.action.expandAll.tip observe.tree.action.selectAll.tip observe.tree.action.unselectAll.tip +observe.ui.tree.navigation.loaded observe.ui.tree.referential.common observe.ui.tree.referential.ll.common observe.ui.tree.referential.ll.landing ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUI.jaxx ===================================== @@ -59,7 +59,7 @@ <String id='contentTitle' javaBean='null'/> - <ContentUIBlockingLayerUI id='blockLayerUI' constructorParams="this"/> + <ContentUIBlockingLayerUI id='blockLayerUI' constructorParams="this" styleClass="blockBlockLayerUI"/> <script><![CDATA[ public abstract ContentUIHandler getHandler(); ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUI.jcss ===================================== @@ -21,8 +21,6 @@ */ #blockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{body.isVisible() && !model.isEnabled()}; } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUI.jaxx ===================================== @@ -64,7 +64,7 @@ <ListSelectionModel id='selectionModel' initializer='getModel().getSelectionModel()' onValueChanged='getHandler().updateEditor(event)'/> <!-- le bloqueur de l'editeur d'une entrée du tableau --> - <ContentTableEditorLayerUI id='editorBlockLayerUI' constructorParams="this"/> + <ContentTableEditorLayerUI id='editorBlockLayerUI' constructorParams="this" styleClass="blockBlockLayerUI"/> <DataDto id='bean' initializer='getModel().getBean()'/> <DataDto id='tableEditBean' initializer='getModel().getTableEditBean()'/> ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUI.jcss ===================================== @@ -42,8 +42,6 @@ } #editorBlockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{!tableModel.isEditable()}; } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/ContentReferenceUI.jaxx ===================================== @@ -60,7 +60,7 @@ <java.lang.String id='pluralTypeI18nKey' initializer='t(ObserveI18nDecoratorHelper.getTypeI18nKey(bean.getClass()))'/> <java.lang.String id='typeI18nKey' initializer='t(ObserveI18nDecoratorHelper.getTypeI18nKey(bean.getClass()))'/> - <ObserveBlockingLayerUI id='editKeyTableLayerUI'/> + <ObserveBlockingLayerUI id='editKeyTableLayerUI' styleClass="blockBlockLayerUI"/> <CardLayout2Ext id='viewLayout' constructorParams='this, "body"'/> ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/ContentReferenceUI.jcss ===================================== @@ -27,8 +27,6 @@ } #editKeyTableLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{model.isUpdatingMode()}; } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/actions/NavigationConfigUIToggleShowActionSupport.java ===================================== @@ -22,6 +22,8 @@ package fr.ird.observe.client.datasource.editor.tree.navigation.actions; * #L% */ +import fr.ird.observe.client.ClientUIContext; +import fr.ird.observe.client.WithClientUIContext; import fr.ird.observe.client.configuration.NavigationTreeConfig; import fr.ird.observe.client.datasource.api.WithObserveDataSourcesManager; import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationTree; @@ -29,19 +31,23 @@ import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationTreeMod import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationUI; import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.NavigationTreeNodeSupport; import fr.ird.observe.services.ObserveServicesProvider; +import io.ultreia.java4all.lang.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.swing.Icon; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import java.awt.event.ActionEvent; +import static io.ultreia.java4all.i18n.I18n.t; + /** * Created by tchemit on 03/10/2018. * * @author Tony Chemit - dev(a)tchemit.fr */ -public abstract class NavigationConfigUIToggleShowActionSupport extends NavigationConfigUIActionSupport implements WithObserveDataSourcesManager { +public abstract class NavigationConfigUIToggleShowActionSupport extends NavigationConfigUIActionSupport implements WithObserveDataSourcesManager, WithClientUIContext { private static final Logger log = LogManager.getLogger(NavigationConfigUIToggleShowActionSupport.class); @@ -51,7 +57,17 @@ public abstract class NavigationConfigUIToggleShowActionSupport extends Navigati @Override protected void doActionPerformed(ActionEvent e, NavigationUI ui) { - tryToUpdateNavigationTree(ui); + ClientUIContext clientUIContext = getClientUIContext(); + clientUIContext.setBusy(true); + SwingUtilities.invokeLater(()->{ + try { + long t0 = System.nanoTime(); + tryToUpdateNavigationTree(ui); + clientUIContext.setUiStatus(t("observe.ui.tree.navigation.loaded", Strings.convertTime(System.nanoTime()-t0))); + } finally { + clientUIContext.setBusy(false); + } + }); } private void tryToUpdateNavigationTree(NavigationUI ui) { ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/wizard/StorageUI.jaxx ===================================== @@ -41,7 +41,7 @@ <StorageUIModel id='model' javaBean='getContextValue(StorageUIModel.class)'/> - <ObserveBlockingLayerUI id='busyBlockLayerUI'/> + <ObserveBlockingLayerUI id='busyBlockLayerUI' styleClass="busyBlockLayerUI"/> <JPanel visible="false"> <ChooseDbModeUI id='CHOOSE_DB_MODE' constructorParams='this'/> ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/wizard/StorageUI.jcss ===================================== @@ -32,11 +32,6 @@ StorageTabUI { layout:{new BorderLayout()}; } -#busyBlockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; -} - #tabs { border:{BorderFactory.createEmptyBorder(6,6,6,6)}; } ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/common/TripUIHandler.java ===================================== @@ -82,8 +82,6 @@ class TripUIHandler extends ContentOpenableUIHandler<TripDto, TripReference, Tri @Override public void afterInit(TripUI ui) { - //FIXME in jaxx (tabInfo is modified before registred in JTabbedPane...) - ui.getMainTabbedPane().setTitleAt(1, ui.getSpeciesTab().getTitle()); super.afterInit(ui); tripUIHelper = new TripUIHelper<TripUI>(ui, prefix) { ===================================== observe-i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -543,6 +543,8 @@ observe.config.speciesList.seine.observation.targetCatch=Species for target catc observe.config.swingSessionFile.description=Swing session file. observe.config.temperature.format=Default temperature format 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 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.config.ui.dcp.not.editable.color=Color to notify not editable floating object material nodes. @@ -2962,6 +2964,7 @@ observe.ui.tree.data.ps.routes=Routes observe.ui.tree.data.ps.schoolEstimate=School estimates observe.ui.tree.data.ps.set.unsaved=New set observe.ui.tree.data.ps.trip.unsaved=New trip +observe.ui.tree.navigation.loaded=Navigation tree reloaded (in %s) observe.ui.tree.referential.common=Common Referential observe.ui.tree.referential.ll.common=Longline Referential - Common observe.ui.tree.referential.ll.landing=Longline Referential - Landing ===================================== observe-i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -543,6 +543,8 @@ observe.config.speciesList.seine.observation.targetCatch=Especies par las captur observe.config.swingSessionFile.description=Copia de seguridad del estado del UI. observe.config.temperature.format=Unidad de temperatura 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.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.config.ui.dcp.not.editable.color=Color to notify not editable floating object material nodes \#TODO @@ -2962,6 +2964,7 @@ observe.ui.tree.data.ps.routes=Rutas observe.ui.tree.data.ps.schoolEstimate=Estimaciones banco observe.ui.tree.data.ps.set.unsaved=Nuevo lance observe.ui.tree.data.ps.trip.unsaved=Nueva marea +observe.ui.tree.navigation.loaded=Navigation tree reloaded (in %s) \#TODO observe.ui.tree.referential.common=Referencial commun observe.ui.tree.referential.ll.common=Referencial Palangre - Common \#TODO observe.ui.tree.referential.ll.landing=Referencial Palangre - Landing \#TODO ===================================== observe-i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -543,6 +543,8 @@ observe.config.speciesList.seine.observation.targetCatch=Espèces pour les captu observe.config.swingSessionFile.description=Fichier de sauvegarde des états des UI. observe.config.temperature.format=Unité de température 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 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 observe.config.ui.dcp.not.editable.color=Couleur pour notifier les nœuds non éditables dans l'arbre des matériaux de dcp. @@ -2962,6 +2964,7 @@ observe.ui.tree.data.ps.routes=Routes observe.ui.tree.data.ps.schoolEstimate=Estimation banc observe.ui.tree.data.ps.set.unsaved=Nouvelle calée observe.ui.tree.data.ps.trip.unsaved=Nouvelle marée +observe.ui.tree.navigation.loaded=Arbre de navigation rechargé (en %s) observe.ui.tree.referential.common=Référentiel commun observe.ui.tree.referential.ll.common=Référentiel Palangre - Commun observe.ui.tree.referential.ll.landing=Référentiel Palangre - Débarquement ===================================== pom.xml ===================================== @@ -24,7 +24,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2020.14</version> + <version>2020.15</version> </parent> <groupId>fr.ird.observe</groupId> @@ -170,7 +170,7 @@ <!-- <lib.version.java4all.topia>1.17</lib.version.java4all.topia>--> <!--<lib.version.java4all.eugene>3.0<-alpha-22</lib.version.java4all.eugene>--> - <!-- <lib.version.java4all.jaxx>3.0-alpha-64-SNAPSHOT</lib.version.java4all.jaxx>--> +<!-- <lib.version.java4all.jaxx>3.0-alpha-66-SNAPSHOT</lib.version.java4all.jaxx>--> <!--<lib.version.java4all.application-context>1.0.3-SNAPSHOT</lib.version.java4all.application-context>--> <!--<lib.version.java4all.application-template>1.0.2-SNAPSHOT</lib.version.java4all.application-template>--> <!--<lib.version.java4all.i18n>4.0-beta-3-SNAPSHOT</lib.version.java4all.i18n>--> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/4ad63b3274dea5ea4034d12d… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/4ad63b3274dea5ea4034d12d… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Fix NPE when reload ui callback
by Tony CHEMIT 06 Apr '20

06 Apr '20
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 4ad63b32 by tchemit at 2020-04-06T13:00:35+02:00 Fix NPE when reload ui callback - - - - - 1 changed file: - client-core/src/main/java/fr/ird/observe/client/main/callback/ReloadUiCallback.java Changes: ===================================== client-core/src/main/java/fr/ird/observe/client/main/callback/ReloadUiCallback.java ===================================== @@ -27,6 +27,7 @@ import fr.ird.observe.client.ClientUIContext; import fr.ird.observe.client.configuration.ClientConfig; import fr.ird.observe.client.configuration.WithClientConfig; import fr.ird.observe.client.main.ObserveMainUI; +import fr.ird.observe.client.main.body.ClientConfigUI; import fr.ird.observe.client.main.body.NoBodyContentComponent; import io.ultreia.java4all.application.context.ApplicationContext; import org.nuiton.jaxx.runtime.swing.SwingUtil; @@ -71,44 +72,24 @@ public class ReloadUiCallback implements ObserveUICallback, WithClientConfig { // scan main ui -// ObserveSwingDataSource mainStorage = getObserveDataSourcesManager().getMainDataSource(); - //FIXME:BodyContent, cela doit être délégué au body content concerné Class<? extends JComponent> bodyContent = NoBodyContentComponent.class; if (ui != null) { + // Keep a reference on ui instance since it will be reset in close method + // FIXME Should use a closing state in application to improve this + ObserveMainUI ui = this.ui; bodyContent = ui.getMainUIBodyContentManager().getCurrentBodyType(); + if (ClientConfigUI.class.equals(bodyContent)) { + bodyContent = NoBodyContentComponent.class; + } ui.dispose(); - ui.setVisible(false); System.runFinalization(); } -// focusBorder = null; -// noFocusBorder = null; ui = clientUIContext.initUI(rootContext, config); - //FIXME:BodyContent : We must improve this, but for the moment, we could just open main ui empty... -// if (bodyContent == null) { -// if (mainStorage == null) { -// bodyContent = NoBodyContent.NoBodyContentComponent.class; -// } else { -// throw new IllegalStateException("Can't have a loaded database, but not loaded in gui..."); -// } -// } - ui.changeBodyContent(bodyContent); - //FIXME:BodyContent this will be done in data source editor body content -// if (oldMode == ObserveUIMode.DB) { -// -// // on met à jour le modèle de navigation -// NavigationTreeModel treeModel = ui.getNavigationUI().getTree().getModel(); -// treeModel.load(config); -// treeModel.populate(mainStorage); -// -// // selection du noeud d'ouverture -// ui.getNavigationUI().getTree().selectInitialNode(); -// } - // show ui clientUIContext.setMainUIVisible(ui, true); } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/4ad63b3274dea5ea4034d12dd… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/4ad63b3274dea5ea4034d12dd… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] 3 commits: improve log loading and some levels
by Tony CHEMIT 06 Apr '20

06 Apr '20
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 31e88a84 by tchemit at 2020-04-05T18:20:30+02:00 improve log loading and some levels - - - - - e9165033 by tchemit at 2020-04-05T19:03:31+02:00 Mise à jour jaxx avec des améliorations sur les JTabbedPane - - - - - dee693f3 by tchemit at 2020-04-06T12:22:28+02:00 Lors d&#39;un &#39;Rechargement de la source&#39; ou d&#39;un appel aux filtres d&#39;affichage de l&#39;arbre, afficher une barre de progression - Closes #1386 - - - - - 28 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-configuration/src/main/resources/log4j2.xml - client-configuration/src/main/resources/observe-log4j2.xml - 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/body/ClientConfigUI.java - client-core/src/main/resources/fr/ird/observe/client/ui/ObserveCommon.jcss - client-core/src/main/resources/observe-ui.properties - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminTabUI.jcss - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUI.jaxx - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUI.jcss - client-datasource-editor-api/src/main/i18n/getters/java.getter - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUI.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUI.jcss - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUI.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUI.jcss - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/ContentReferenceUI.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/ContentReferenceUI.jcss - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/actions/NavigationConfigUIToggleShowActionSupport.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/wizard/StorageUI.jaxx - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/wizard/StorageUI.jcss - client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/common/TripUIHandler.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 - pom.xml Changes: ===================================== client-configuration/src/main/config/Client.ini ===================================== @@ -627,6 +627,18 @@ key = ui.temperature.format type = org.nuiton.jaxx.widgets.temperature.TemperatureFormat defaultValue = "C" +[option busyStateColor] +description = observe.config.ui.busyStateColor +key = ui.busyState.color +type = java.awt.Color +defaultValue = "java.awt.Color[r=50,g=50,b=50]" + +[option blockStateColor] +description = observe.config.ui.blockStateColor +key = ui.blockState.color +type = java.awt.Color +defaultValue = "java.awt.Color[r=50,g=50,b=50]" + [option focusBorderColor] description = observe.config.ui.focusBorderColor key = ui.focusBorder.color ===================================== client-configuration/src/main/i18n/getters/config.getter ===================================== @@ -92,6 +92,8 @@ observe.config.speciesList.seine.observation.targetCatch observe.config.swingSessionFile.description observe.config.temperature.format observe.config.ui.autoPopupNumberEditor +observe.config.ui.blockStateColor +observe.config.ui.busyStateColor observe.config.ui.changeSynchroSrc observe.config.ui.dcp.error.color observe.config.ui.dcp.not.editable.color ===================================== client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java ===================================== @@ -59,6 +59,7 @@ import org.nuiton.util.StringUtil; import org.nuiton.version.Version; import org.nuiton.version.Versions; +import javax.swing.UIManager; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -215,7 +216,11 @@ public class ClientConfig extends GeneratedClientConfig implements TemplateGener File logFile = getLogConfigurationFile(); - log.info("Chargement du fichier de de log4j depuis " + logFile); + if (isVersionSnapshot() || logFile.exists()) { + Files.deleteIfExists(logFile.toPath()); + } + + log.info(String.format("Loading user log file at %s", logFile)); ObserveUtil.loadLogConfiguration(ObserveClientResourceManager.Resource.LOG_CONFIGURATION_FILE.getUrl(), logFile.toPath(), this); @@ -677,6 +682,8 @@ public class ClientConfig extends GeneratedClientConfig implements TemplateGener loadUIConfigFile(ObserveClientResourceManager.Resource.ui_navigation_common, dir); loadUIConfigFile(ObserveClientResourceManager.Resource.ui_navigation_ps, dir); loadUIConfigFile(ObserveClientResourceManager.Resource.ui_navigation_ll, dir); + UIManager.getDefaults().put("BlockingLayerUI.busyColor", getBusyStateColor()); + UIManager.getDefaults().put("BlockingLayerUI.blockColor", getBlockStateColor()); } private void loadUIConfigFile(ObserveClientResourceManager.Resource resource, File resourceDirectory) { ===================================== client-configuration/src/main/resources/log4j2.xml ===================================== @@ -51,10 +51,6 @@ <AppenderRef ref="console"/> <AppenderRef ref="File"/> </Logger> - <Logger name="org.nuiton.jaxx.validator.swing.SwingValidator" level="error" additivity="false"> - <AppenderRef ref="console"/> - <AppenderRef ref="File"/> - </Logger> <Logger name="fr.ird.observe.client.validators" level="warn" additivity="false"> <AppenderRef ref="console"/> <AppenderRef ref="File"/> ===================================== client-configuration/src/main/resources/observe-log4j2.xml ===================================== @@ -63,10 +63,6 @@ <AppenderRef ref="console"/> <AppenderRef ref="File"/> </Logger> -<!-- <Logger name="org.nuiton.jaxx.runtime.swing.action.JAXXObjectActionSupport" level="info" additivity="false">--> -<!-- <AppenderRef ref="console"/>--> -<!-- <AppenderRef ref="File"/>--> -<!-- </Logger>--> <Logger name="org.hibernate" level="warn" additivity="false"> <AppenderRef ref="console"/> <AppenderRef ref="File"/> ===================================== client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx ===================================== @@ -47,7 +47,7 @@ <ClientConfig id='config' initializer='getContextValue(ClientConfig.class)'/> <MainUIBodyContentManager id="mainUIBodyContentManager" initializer='getContextValue(MainUIBodyContentManager.class)'/> - <ObserveBlockingLayerUI id='busyBlockLayerUI'/> + <ObserveBlockingLayerUI id='busyBlockLayerUI' styleClass="busyBlockLayerUI"/> <script><![CDATA[ ===================================== client-core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jcss ===================================== @@ -72,10 +72,7 @@ } #busyBlockLayerUI { - useIcon: false; - blockingColor: {UIManager.getColor("BlockingLayerUI.blockingColor")}; block: {model.isBusy()}; - acceptedComponentNames: {UIHelper.ACCEPTABLE_COMPONENTS}; } #serverMode { ===================================== client-core/src/main/java/fr/ird/observe/client/main/body/ClientConfigUI.java ===================================== @@ -170,6 +170,8 @@ public class ClientConfigUI extends JXTitledPanel { helper.addOption(ClientConfigOption.SHOW_MNEMONIC); helper.addOption(ClientConfigOption.COORDINATE_FORMAT); + helper.addOption(ClientConfigOption.BUSY_STATE_COLOR); + helper.addOption(ClientConfigOption.BLOCK_STATE_COLOR); helper.addOption(ClientConfigOption.FOCUS_BORDER_COLOR); helper.addOption(ClientConfigOption.NO_FOCUS_BORDER_COLOR); helper.addOption(ClientConfigOption.FLOATING_OBJECT_MATERIAL_ERROR_COLOR); ===================================== client-core/src/main/resources/fr/ird/observe/client/ui/ObserveCommon.jcss ===================================== @@ -172,3 +172,14 @@ BlockingLayerUI { acceptedComponentTypes: {javax.swing.JScrollBar.class}; } +.busyBlockLayerUI { + useIcon: false; + blockingColor: {javax.swing.UIManager.getColor("BlockingLayerUI.busyColor")}; + acceptedComponentNames: {fr.ird.observe.client.util.UIHelper.ACCEPTABLE_COMPONENTS}; +} + +.blockBlockLayerUI { + useIcon: false; + blockingColor: {javax.swing.UIManager.getColor("BlockingLayerUI.blockingColor")}; + acceptedComponentNames: {fr.ird.observe.client.util.UIHelper.ACCEPTABLE_COMPONENTS}; +} ===================================== client-core/src/main/resources/observe-ui.properties ===================================== @@ -189,3 +189,4 @@ color.Table.lastRowColor=255,255,0 color.Table.emptyRowColor=255,255,0 color.Table.unvalidCellColor=255,0,0 color.BlockingLayerUI.blockingColor=50,50,50 +color.BlockingLayerUI.busyColor=50,50,50 ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminTabUI.jcss ===================================== @@ -92,7 +92,3 @@ columnHeaderView:{UIHelper.newLabel(t("observe.common.step.description") ,"information", 10)}; } -#busyBlockLayerUI{ - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; -} ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUI.jaxx ===================================== @@ -37,13 +37,13 @@ <AdminUIModel id='model' initializer='getContextValue(AdminUIModel.class)'/> <!-- le bloqueur d'ui utilisé par l'assistant --> - <ObserveBlockingLayerUI id='tabBusyBlockLayerUI'/> + <ObserveBlockingLayerUI id='tabBusyBlockLayerUI' styleClass="busyBlockLayerUI"/> <!-- le bloqueur d'ui lorsqu'une action est en cours ou annulée --> - <ObserveBlockingLayerUI id='busyBlockLayerUI'/> + <ObserveBlockingLayerUI id='busyBlockLayerUI' styleClass="busyBlockLayerUI"/> <!-- le bloqueur de changement de configuration --> - <ObserveBlockingLayerUI id='configBlockLayerUI'/> + <ObserveBlockingLayerUI id='configBlockLayerUI' styleClass="blockBlockLayerUI"/> <script><![CDATA[ ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUI.jcss ===================================== @@ -24,24 +24,12 @@ layout:{new BorderLayout()}; } -#tabBusyBlockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; - acceptedComponentNames:{UIHelper.ACCEPTABLE_COMPONENTS}; -} - #busyBlockLayerUI{ - useIcon:false; block:{WizardExtUtil.acceptStates(model.getModelState(), WizardState.CANCELED, WizardState.SUCCESSED, WizardState.FAILED)}; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; - acceptedComponentNames:{UIHelper.ACCEPTABLE_COMPONENTS}; } #configBlockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{model.isWasStarted() || WizardExtUtil.acceptStates(model.getModelState(), WizardState.CANCELED)}; - acceptedComponentNames:{UIHelper.ACCEPTABLE_COMPONENTS}; } #tabs { ===================================== client-datasource-editor-api/src/main/i18n/getters/java.getter ===================================== @@ -239,6 +239,7 @@ observe.tree.action.configure.tip observe.tree.action.expandAll.tip observe.tree.action.selectAll.tip observe.tree.action.unselectAll.tip +observe.ui.tree.navigation.loaded observe.ui.tree.referential.common observe.ui.tree.referential.ll.common observe.ui.tree.referential.ll.landing ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUI.jaxx ===================================== @@ -59,7 +59,7 @@ <String id='contentTitle' javaBean='null'/> - <ContentUIBlockingLayerUI id='blockLayerUI' constructorParams="this"/> + <ContentUIBlockingLayerUI id='blockLayerUI' constructorParams="this" styleClass="blockBlockLayerUI"/> <script><![CDATA[ public abstract ContentUIHandler getHandler(); ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUI.jcss ===================================== @@ -21,8 +21,6 @@ */ #blockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{body.isVisible() && !model.isEnabled()}; } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUI.jaxx ===================================== @@ -64,7 +64,7 @@ <ListSelectionModel id='selectionModel' initializer='getModel().getSelectionModel()' onValueChanged='getHandler().updateEditor(event)'/> <!-- le bloqueur de l'editeur d'une entrée du tableau --> - <ContentTableEditorLayerUI id='editorBlockLayerUI' constructorParams="this"/> + <ContentTableEditorLayerUI id='editorBlockLayerUI' constructorParams="this" styleClass="blockBlockLayerUI"/> <DataDto id='bean' initializer='getModel().getBean()'/> <DataDto id='tableEditBean' initializer='getModel().getTableEditBean()'/> ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/table/ContentTableUI.jcss ===================================== @@ -42,8 +42,6 @@ } #editorBlockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{!tableModel.isEditable()}; } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/ContentReferenceUI.jaxx ===================================== @@ -60,7 +60,7 @@ <java.lang.String id='pluralTypeI18nKey' initializer='t(ObserveI18nDecoratorHelper.getTypeI18nKey(bean.getClass()))'/> <java.lang.String id='typeI18nKey' initializer='t(ObserveI18nDecoratorHelper.getTypeI18nKey(bean.getClass()))'/> - <ObserveBlockingLayerUI id='editKeyTableLayerUI'/> + <ObserveBlockingLayerUI id='editKeyTableLayerUI' styleClass="blockBlockLayerUI"/> <CardLayout2Ext id='viewLayout' constructorParams='this, "body"'/> ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/ContentReferenceUI.jcss ===================================== @@ -27,8 +27,6 @@ } #editKeyTableLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{model.isUpdatingMode()}; } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/actions/NavigationConfigUIToggleShowActionSupport.java ===================================== @@ -22,6 +22,8 @@ package fr.ird.observe.client.datasource.editor.tree.navigation.actions; * #L% */ +import fr.ird.observe.client.ClientUIContext; +import fr.ird.observe.client.WithClientUIContext; import fr.ird.observe.client.configuration.NavigationTreeConfig; import fr.ird.observe.client.datasource.api.WithObserveDataSourcesManager; import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationTree; @@ -29,19 +31,23 @@ import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationTreeMod import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationUI; import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.NavigationTreeNodeSupport; import fr.ird.observe.services.ObserveServicesProvider; +import io.ultreia.java4all.lang.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.swing.Icon; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import java.awt.event.ActionEvent; +import static io.ultreia.java4all.i18n.I18n.t; + /** * Created by tchemit on 03/10/2018. * * @author Tony Chemit - dev(a)tchemit.fr */ -public abstract class NavigationConfigUIToggleShowActionSupport extends NavigationConfigUIActionSupport implements WithObserveDataSourcesManager { +public abstract class NavigationConfigUIToggleShowActionSupport extends NavigationConfigUIActionSupport implements WithObserveDataSourcesManager, WithClientUIContext { private static final Logger log = LogManager.getLogger(NavigationConfigUIToggleShowActionSupport.class); @@ -51,7 +57,17 @@ public abstract class NavigationConfigUIToggleShowActionSupport extends Navigati @Override protected void doActionPerformed(ActionEvent e, NavigationUI ui) { - tryToUpdateNavigationTree(ui); + ClientUIContext clientUIContext = getClientUIContext(); + clientUIContext.setBusy(true); + SwingUtilities.invokeLater(()->{ + try { + long t0 = System.nanoTime(); + tryToUpdateNavigationTree(ui); + clientUIContext.setUiStatus(t("observe.ui.tree.navigation.loaded", Strings.convertTime(System.nanoTime()-t0))); + } finally { + clientUIContext.setBusy(false); + } + }); } private void tryToUpdateNavigationTree(NavigationUI ui) { ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/wizard/StorageUI.jaxx ===================================== @@ -41,7 +41,7 @@ <StorageUIModel id='model' javaBean='getContextValue(StorageUIModel.class)'/> - <ObserveBlockingLayerUI id='busyBlockLayerUI'/> + <ObserveBlockingLayerUI id='busyBlockLayerUI' styleClass="busyBlockLayerUI"/> <JPanel visible="false"> <ChooseDbModeUI id='CHOOSE_DB_MODE' constructorParams='this'/> ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/wizard/StorageUI.jcss ===================================== @@ -32,11 +32,6 @@ StorageTabUI { layout:{new BorderLayout()}; } -#busyBlockLayerUI { - useIcon:false; - blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; -} - #tabs { border:{BorderFactory.createEmptyBorder(6,6,6,6)}; } ===================================== client-datasource-editor-ll/src/main/java/fr/ird/observe/client/datasource/editor/content/data/ll/common/TripUIHandler.java ===================================== @@ -82,8 +82,6 @@ class TripUIHandler extends ContentOpenableUIHandler<TripDto, TripReference, Tri @Override public void afterInit(TripUI ui) { - //FIXME in jaxx (tabInfo is modified before registred in JTabbedPane...) - ui.getMainTabbedPane().setTitleAt(1, ui.getSpeciesTab().getTitle()); super.afterInit(ui); tripUIHelper = new TripUIHelper<TripUI>(ui, prefix) { ===================================== observe-i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -543,6 +543,8 @@ observe.config.speciesList.seine.observation.targetCatch=Species for target catc observe.config.swingSessionFile.description=Swing session file. observe.config.temperature.format=Default temperature format 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 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.config.ui.dcp.not.editable.color=Color to notify not editable floating object material nodes. @@ -2962,6 +2964,7 @@ observe.ui.tree.data.ps.routes=Routes observe.ui.tree.data.ps.schoolEstimate=School estimates observe.ui.tree.data.ps.set.unsaved=New set observe.ui.tree.data.ps.trip.unsaved=New trip +observe.ui.tree.navigation.loaded=Navigation tree reloaded (in %s) observe.ui.tree.referential.common=Common Referential observe.ui.tree.referential.ll.common=Longline Referential - Common observe.ui.tree.referential.ll.landing=Longline Referential - Landing ===================================== observe-i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -543,6 +543,8 @@ observe.config.speciesList.seine.observation.targetCatch=Especies par las captur observe.config.swingSessionFile.description=Copia de seguridad del estado del UI. observe.config.temperature.format=Unidad de temperatura 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.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.config.ui.dcp.not.editable.color=Color to notify not editable floating object material nodes \#TODO @@ -2962,6 +2964,7 @@ observe.ui.tree.data.ps.routes=Rutas observe.ui.tree.data.ps.schoolEstimate=Estimaciones banco observe.ui.tree.data.ps.set.unsaved=Nuevo lance observe.ui.tree.data.ps.trip.unsaved=Nueva marea +observe.ui.tree.navigation.loaded=Navigation tree reloaded (in %s) \#TODO observe.ui.tree.referential.common=Referencial commun observe.ui.tree.referential.ll.common=Referencial Palangre - Common \#TODO observe.ui.tree.referential.ll.landing=Referencial Palangre - Landing \#TODO ===================================== observe-i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -543,6 +543,8 @@ observe.config.speciesList.seine.observation.targetCatch=Espèces pour les captu observe.config.swingSessionFile.description=Fichier de sauvegarde des états des UI. observe.config.temperature.format=Unité de température 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 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 observe.config.ui.dcp.not.editable.color=Couleur pour notifier les nœuds non éditables dans l'arbre des matériaux de dcp. @@ -2962,6 +2964,7 @@ observe.ui.tree.data.ps.routes=Routes observe.ui.tree.data.ps.schoolEstimate=Estimation banc observe.ui.tree.data.ps.set.unsaved=Nouvelle calée observe.ui.tree.data.ps.trip.unsaved=Nouvelle marée +observe.ui.tree.navigation.loaded=Arbre de navigation rechargé (en %s) observe.ui.tree.referential.common=Référentiel commun observe.ui.tree.referential.ll.common=Référentiel Palangre - Commun observe.ui.tree.referential.ll.landing=Référentiel Palangre - Débarquement ===================================== pom.xml ===================================== @@ -24,7 +24,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2020.14</version> + <version>2020.15</version> </parent> <groupId>fr.ird.observe</groupId> @@ -170,7 +170,7 @@ <!-- <lib.version.java4all.topia>1.17</lib.version.java4all.topia>--> <!--<lib.version.java4all.eugene>3.0<-alpha-22</lib.version.java4all.eugene>--> - <!-- <lib.version.java4all.jaxx>3.0-alpha-64-SNAPSHOT</lib.version.java4all.jaxx>--> + <lib.version.java4all.jaxx>3.0-alpha-66-SNAPSHOT</lib.version.java4all.jaxx> <!--<lib.version.java4all.application-context>1.0.3-SNAPSHOT</lib.version.java4all.application-context>--> <!--<lib.version.java4all.application-template>1.0.2-SNAPSHOT</lib.version.java4all.application-template>--> <!--<lib.version.java4all.i18n>4.0-beta-3-SNAPSHOT</lib.version.java4all.i18n>--> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/4e952eea0d6d57a46d024b84… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/4e952eea0d6d57a46d024b84… You're receiving this email because of your account on gitlab.com.
1 0
0 0
  • ← Newer
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.