Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 2ed5caf6 by Tony CHEMIT at 2017-06-14T09:42:16+02:00 [Report v6] problème caractères accentués, encodage changé ? (See #729) - - - - - 074c8908 by Tony CHEMIT at 2017-06-14T09:42:16+02:00 [Report v6] Correction pb timeZone sur couche http (See #769) - - - - - 332bd022 by Tony CHEMIT at 2017-06-14T09:42:16+02:00 [Report v6] Amélioration des libellés espagnols (See #775) - - - - - 991093e3 by Tony CHEMIT at 2017-06-14T09:42:16+02:00 [Report v6] Problème de restitution des dates sur une base locale lorsque la time zone change (See #783) - - - - - 15 changed files: - application-swing-decoration/src/main/resources/i18n/application-swing-decoration_es_ES.properties - application-swing-validation/src/main/resources/i18n/application-swing-validation_es_ES.properties - application-swing/src/main/java/fr/ird/observe/application/swing/RunObserve.java - application-swing/src/main/java/fr/ird/observe/application/swing/backup/BackupsManager.java - application-swing/src/main/resources/i18n/application-swing_en_GB.properties - application-swing/src/main/resources/i18n/application-swing_es_ES.properties - application-swing/src/main/resources/i18n/application-swing_fr_FR.properties - application-web-configuration/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelper.java - application-web-configuration/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelper.java - persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaApplicationContext.java - + persistence/src/test/java/fr/ird/observe/H2TimeZoneTest.java - pom.xml - services-topia/src/main/java/fr/ird/observe/services/topia/service/sql/SqlScriptProducerServiceTopia.java - services-validation/src/main/resources/i18n/services-validation_es_ES.properties - services/src/main/java/fr/ird/observe/services/gson/DateAdapter.java Changes: ===================================== application-swing-decoration/src/main/resources/i18n/application-swing-decoration_es_ES.properties ===================================== --- a/application-swing-decoration/src/main/resources/i18n/application-swing-decoration_es_ES.properties +++ b/application-swing-decoration/src/main/resources/i18n/application-swing-decoration_es_ES.properties @@ -143,7 +143,7 @@ observe.type.nonTargetCatchReleased=Faune accessoire libérée \#TODO observe.type.nonTargetCatchReleasedState=État d'une faune accessoire libérée \#TODO observe.type.nonTargetCatchReleasedStates=États d'une faune accessoire libérée \#TODO observe.type.nonTargetCatchReleaseds=Faunes accessoires libérées \#TODO -observe.type.nonTargetCatches=Faunas accesorias conservadas o descartadas +observe.type.nonTargetCatches=Fauna accesoria conservada o descartada observe.type.nonTargetLength=Longitud (cm inf.) observe.type.nonTargetLengths=Longitudes (cm inf.) observe.type.nonTargetSample=Muestreo de fauna accesoria ===================================== application-swing-validation/src/main/resources/i18n/application-swing-validation_es_ES.properties ===================================== --- a/application-swing-validation/src/main/resources/i18n/application-swing-validation_es_ES.properties +++ b/application-swing-validation/src/main/resources/i18n/application-swing-validation_es_ES.properties @@ -67,11 +67,11 @@ observe.common.gearUseFeaturesSeine=Equipamiento observe.common.gonadeWeight=Peso de las gonadas (g) observe.common.haulingBreaks=Número de cortes observe.common.haulingDirectionSameAsSetting=Sentido del arrastre idéntico a lo de la calada -observe.common.haulingEndLatitude=Arrastre Latitude +observe.common.haulingEndLatitude=Arrastre Latitud observe.common.haulingEndLongitude=Arrastre Longitud observe.common.haulingEndQuadrant=Arrastre quadrant observe.common.haulingEndTimeStamp=Timestamp de fin -observe.common.haulingStartLatitude=Arrastre Latitude +observe.common.haulingStartLatitude=Arrastre Latitud observe.common.haulingStartLongitude=Arrastre Longitud observe.common.haulingStartQuadrant=Arrastre quadrant observe.common.haulingStartTimeStamp=Timestamp del inicio @@ -148,13 +148,13 @@ observe.common.sensorBrand=Marca de sensor observe.common.sensorDataFormat=Formato de los datos del sensor observe.common.sensorSerialNo=Número de serie observe.common.sensorType=Tipo de sensor -observe.common.settingEndLatitude=Calada latitude +observe.common.settingEndLatitude=Calada Latitud observe.common.settingEndLongitude=Calada longitud observe.common.settingEndQuadrant=Calada quadrant observe.common.settingEndTimeStamp=Timestamp de fin observe.common.settingIdentifier=Calada observe.common.settingShape=Forma de la calada -observe.common.settingStartLatitude=Calada latitude +observe.common.settingStartLatitude=Calada Latitud observe.common.settingStartLongitude=Calada longitud observe.common.settingStartQuadrant=Calada quadrant observe.common.settingStartTimeStamp=Timestamp de inicio @@ -610,7 +610,7 @@ validator.ui.transmittingBuoy.null.code=El codigo de la baliza es vacío. validator.ui.transmittingBuoy.required.transmittingBuoyOperation=La selección de una opéración sobre baliza es mandatoria. validator.ui.transmittingBuoy.required.transmittingBuoyType=La selección de un tipo de baliza es mandatoria. validator.ui.trip.comment.tobig=El tamaño del comentario está limitado a 1024 caracteres. -validator.ui.trip.desactivated.captain=El capitán seleccionado está desactivado. +validator.ui.trip.desactivated.captain=El patrón seleccionado está desactivado. validator.ui.trip.desactivated.dataEntryOperator=El operador de captación seleccionado está desactivado. validator.ui.trip.desactivated.departureHarbour=El puerto de salida seleccionado está desactivado. validator.ui.trip.desactivated.landingHarbour=El puerto de llegada seleccionado está desactivado. @@ -625,13 +625,13 @@ validator.ui.trip.invalid.formsUrl=La URL del formulario no es válida. validator.ui.trip.invalid.loch=La corredera de mañana (%1$s) de la ruta %2$s debe ser superior a la de tarde (%3$s) de la ruta anterior. validator.ui.trip.invalid.reportsUrl=La URL del informe no es válida. validator.ui.trip.invalid.startDate=La fecha de comienzo de marea debe ser inferior al día de observación de cualquier ruta (la ruta %1$s es incorrecta). -validator.ui.trip.null.captain=Un capitán debe ser seleccionado. +validator.ui.trip.null.captain=Un patrón debe ser seleccionado. validator.ui.trip.null.dataEntryOperator=Un operador de captación debe ser seleccionado. validator.ui.trip.null.departureHarbour=Un puerto de salida debe ser seleccionado. validator.ui.trip.null.gearUseFeatureLongline=Usted no seleccionó un equipamiento. validator.ui.trip.null.gearUseFeatureSeine=Usted no seleccionó un equipamiento (Senne aconsejado). validator.ui.trip.null.landingHarbour=Un puerto de llegada debe ser seleccionado. -validator.ui.trip.required.comment.for.captain=Se necesita un comentario para el capitán seleccionado. +validator.ui.trip.required.comment.for.captain=Se necesita un comentario para el patrón seleccionado. validator.ui.trip.required.comment.for.dataEntryOperator=Se necesita un comentario para el operador de captación seleccionado. validator.ui.trip.required.comment.for.departureHarbour=Se necesita un comentario para el puerto de salida seleccionado. validator.ui.trip.required.comment.for.landingHarbour=Se necesita un comentario para el puerto de llegada seleccionado. ===================================== application-swing/src/main/java/fr/ird/observe/application/swing/RunObserve.java ===================================== --- a/application-swing/src/main/java/fr/ird/observe/application/swing/RunObserve.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/RunObserve.java @@ -27,6 +27,9 @@ import org.apache.commons.logging.LogFactory; import java.util.Arrays; import java.util.Date; + +import static org.nuiton.i18n.I18n.n; + /** * Pour lancer le client swing {@code ObServe} en mode administrateur. * @@ -54,4 +57,10 @@ public class RunObserve extends ObserveRunner { new RunObserve(args).launch(); } + static { + //TODO Apply this modification in jaxx project + n("jaxx.common.latitude"); + } + + } ===================================== application-swing/src/main/java/fr/ird/observe/application/swing/backup/BackupsManager.java ===================================== --- a/application-swing/src/main/java/fr/ird/observe/application/swing/backup/BackupsManager.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/backup/BackupsManager.java @@ -29,6 +29,7 @@ import fr.ird.observe.application.swing.ObserveSwingApplicationDataSourcesManage import fr.ird.observe.application.swing.ObserveSwingTechnicalException; import fr.ird.observe.application.swing.db.ObserveSwingDataSource; import fr.ird.observe.services.dto.source.DataSourceCreateConfigurationDto; +import java.nio.charset.StandardCharsets; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -123,7 +124,7 @@ public class BackupsManager implements Closeable { try { List<BackupStorage> backups; if (Files.exists(storePath)) { - try (BufferedReader reader = Files.newBufferedReader(storePath)) { + try (BufferedReader reader = Files.newBufferedReader(storePath, StandardCharsets.UTF_8)) { Type typeOfT = new TypeToken<List<BackupStorage>>() { }.getType(); backups = new Gson().fromJson(reader, typeOfT); @@ -231,7 +232,7 @@ public class BackupsManager implements Closeable { private void storeBackups() throws IOException { log.info(String.format("Store %d backups to %s", backups.size(), storePath)); - try (BufferedWriter writer = Files.newBufferedWriter(storePath)) { + try (BufferedWriter writer = Files.newBufferedWriter(storePath, StandardCharsets.UTF_8)) { new Gson().toJson(backups, writer); } } ===================================== application-swing/src/main/resources/i18n/application-swing_en_GB.properties ===================================== --- a/application-swing/src/main/resources/i18n/application-swing_en_GB.properties +++ b/application-swing/src/main/resources/i18n/application-swing_en_GB.properties @@ -31,6 +31,7 @@ observe.action.choose.sensorUsed.exportData=Export data observe.action.choose.sensorUsed.importData=Import data observe.action.choose.tdr.exportData=Export data observe.action.choose.tdr.importData=Import data +jaxx.common.latitude=Latitude observe.action.choose.tripLongline.message=Select target trip observe.action.choose.tripLongline.title=Move activities to another trip observe.action.choose.tripSeine.message=Select target trip ===================================== application-swing/src/main/resources/i18n/application-swing_es_ES.properties ===================================== --- a/application-swing/src/main/resources/i18n/application-swing_es_ES.properties +++ b/application-swing/src/main/resources/i18n/application-swing_es_ES.properties @@ -1213,7 +1213,7 @@ observe.content.setSeine.schoolType=Tipo de banco observe.content.setSeine.schoolType.not.fill=vacío observe.content.setSeine.sonarUsedAvantSet=Utilización del sonar antes del lance observe.content.setSeine.startTime=Fecha - Hora comienzo lance -observe.content.setSeine.supportVesselName=Nombre Macicero +observe.content.setSeine.supportVesselName=Nombre del macicero observe.content.setSeine.tab.general=Características generales observe.content.setSeine.tab.measurements=Parámetros observe.content.setSeine.targetDiscarded=Descarte de atún @@ -1610,6 +1610,7 @@ observe.security.role=Rol observe.security.role.tip=Número del rol de la base observe.security.technicien=Técnico observe.security.technicien.tip=El rol tiene todos los permisos sobre el referencial y los datos +jaxx.common.latitude=Latitud observe.security.unused=No utilizado observe.security.unused.tip=No usar este rol observe.security.utilisateur=Usuario @@ -1620,7 +1621,7 @@ observe.storage.action.apply=Utilizar observe.storage.action.apply.tip=Utilizar la fuente de datos configuarada observe.storage.action.cancel=Cancelar el cambio de la fuente de datos observe.storage.action.cancel.tip=Cancelar el cambio de la fuente de datos -observe.storage.activityLongline.coordinate=Coordenadas +observe.storage.activityLongline.coordinate=Coordenada observe.storage.activityLongline.fpaZone=Zona FPA observe.storage.activityLongline.message.active.found=Actividad abierta observe.storage.activityLongline.message.active.found.for.other.trip=Existe una actividad abierta en otra ruta. ===================================== application-swing/src/main/resources/i18n/application-swing_fr_FR.properties ===================================== --- a/application-swing/src/main/resources/i18n/application-swing_fr_FR.properties +++ b/application-swing/src/main/resources/i18n/application-swing_fr_FR.properties @@ -31,6 +31,7 @@ observe.action.choose.route.title=Changer la route des activités observe.action.choose.sensorUsed.exportData=Exporter le fichier de données observe.action.choose.sensorUsed.importData=Importer le fichier de données observe.action.choose.tdr.exportData=Exporter le fichier de données +jaxx.common.latitude=Latitude observe.action.choose.tdr.importData=Importer le fichier de données observe.action.choose.tripLongline.message=A quelle marée voulez-vous associer les activités sélectionnées ? observe.action.choose.tripLongline.title=Changer la marée des activités ===================================== application-web-configuration/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelper.java ===================================== --- a/application-web-configuration/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelper.java +++ b/application-web-configuration/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelper.java @@ -26,23 +26,22 @@ import com.esotericsoftware.yamlbeans.YamlConfig; import com.esotericsoftware.yamlbeans.YamlException; import com.esotericsoftware.yamlbeans.YamlReader; import com.esotericsoftware.yamlbeans.YamlWriter; -import com.google.common.base.Charsets; import com.google.common.io.Files; import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabaseBean; import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabaseRoleBean; import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabasesBean; import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabasesImmutable; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.io.BufferedWriter; import java.io.File; import java.io.Reader; import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.LinkedHashSet; import java.util.Set; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * Created on 30/08/15. @@ -68,7 +67,7 @@ public class ObserveWebDatabasesHelper { log.info("Loading databases from file: " + file); } ObserveWebDatabasesBean result; - try (Reader fileReader = Files.newReader(file, Charsets.UTF_8)) { + try (Reader fileReader = Files.newReader(file, StandardCharsets.UTF_8)) { YamlReader reader = new YamlReader(fileReader, createConfig()); result = reader.read(ObserveWebDatabasesBean.class); fileReader.close(); @@ -164,7 +163,7 @@ public class ObserveWebDatabasesHelper { log.info("Store databases to " + file); } - try (BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8)) { + try (BufferedWriter writer = Files.newWriter(file, StandardCharsets.UTF_8)) { store(databases, writer); ===================================== application-web-configuration/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelper.java ===================================== --- a/application-web-configuration/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelper.java +++ b/application-web-configuration/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelper.java @@ -26,7 +26,6 @@ import com.esotericsoftware.yamlbeans.YamlConfig; import com.esotericsoftware.yamlbeans.YamlException; import com.esotericsoftware.yamlbeans.YamlReader; import com.esotericsoftware.yamlbeans.YamlWriter; -import com.google.common.base.Charsets; import com.google.common.io.Files; import fr.ird.observe.application.web.configuration.db.ObserveWebDatabase; import fr.ird.observe.application.web.configuration.db.ObserveWebDatabaseRole; @@ -35,18 +34,18 @@ import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUserBean import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUserPermissionBean; import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUsersBean; import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUsersImmutable; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.io.BufferedWriter; import java.io.File; import java.io.Reader; import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * Created on 30/08/15. @@ -72,7 +71,7 @@ public class ObserveWebUsersHelper { log.info("Loading users from file: " + file); } ObserveWebUsersBean result; - try (Reader fileReader = Files.newReader(file, Charsets.UTF_8)) { + try (Reader fileReader = Files.newReader(file, StandardCharsets.UTF_8)) { YamlReader reader = new YamlReader(fileReader, createConfig()); result = reader.read(ObserveWebUsersBean.class); fileReader.close(); @@ -158,7 +157,7 @@ public class ObserveWebUsersHelper { log.info("Store users to " + file); } - try (BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8)) { + try (BufferedWriter writer = Files.newWriter(file, StandardCharsets.UTF_8)) { store(users, writer); ===================================== persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaApplicationContext.java ===================================== --- a/persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaApplicationContext.java +++ b/persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaApplicationContext.java @@ -24,8 +24,23 @@ package fr.ird.observe.persistence; import com.google.common.collect.ImmutableSet; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; -import fr.ird.observe.persistence.migration.ObserveMigrationConfigurationProvider; import fr.ird.observe.persistence.migration.ObserveMigrationEngine; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.EnumSet; +import java.util.LinkedHashSet; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.zip.GZIPInputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; @@ -44,17 +59,6 @@ import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTables; import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTablesFactory; import org.nuiton.util.StringUtil; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.EnumSet; -import java.util.LinkedHashSet; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.Stream; - public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicationContext implements TopiaMetadataModelSupport { /** @@ -62,9 +66,9 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat */ private static final Log log = LogFactory.getLog(ObserveTopiaApplicationContext.class); - public static final String MIGRATION_SERVICE_NAME = "migration"; + static final String MIGRATION_SERVICE_NAME = "migration"; - public static final String SQL_BATCH_SERVICE_NAME = "sqlBatch"; + static final String SQL_BATCH_SERVICE_NAME = "sqlBatch"; private static final String CREATE_SCHEMA_SCRIPT = "CREATE SCHEMA OBSERVE_COMMON;\n" @@ -79,19 +83,17 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat protected boolean open; protected final String authenticationToken; - protected final TopiaMetadataModelSupport topiaMetadataModelSupport; - protected final TopiaSqlTablesFactory topiaSqlTablesFactory; - protected final ObserveMigrationConfigurationProvider observeMigrationConfigurationProvider; - protected TopiaSqlTables tripSeineTables; - protected TopiaSqlTables tripLonglineTables; - protected TopiaSqlTables referentialTables; + private final TopiaMetadataModelSupport topiaMetadataModelSupport; + private final TopiaSqlTablesFactory topiaSqlTablesFactory; + private TopiaSqlTables tripSeineTables; + private TopiaSqlTables tripLonglineTables; + private TopiaSqlTables referentialTables; public ObserveTopiaApplicationContext(ObserveTopiaConfiguration topiaConfiguration) { super(topiaConfiguration); this.authenticationToken = UUID.randomUUID().toString(); this.topiaMetadataModelSupport = new TopiaMetadataModelSupportImpl("fr.ird.observe.persistence", "Observe"); this.topiaSqlTablesFactory = new TopiaSqlTablesFactory(getMetadataModel(), this); - this.observeMigrationConfigurationProvider = ObserveMigrationConfigurationProvider.get(); } @Override @@ -154,8 +156,8 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat try (ObserveTopiaPersistenceContext topiaPersistenceContext = newPersistenceContext()) { String sql = Stream.concat(Entities.REFERENCE_ENTITIES_LIST.stream(), Entities.DATA_ENTITIES_LIST.stream()) - .map(entity -> String.format(INSERT_LAST_UPDATE_PATTERN, entity.ordinal(), entity.getContract().getCanonicalName())) - .collect(Collectors.joining("\n")); + .map(entity -> String.format(INSERT_LAST_UPDATE_PATTERN, entity.ordinal(), entity.getContract().getCanonicalName())) + .collect(Collectors.joining("\n")); topiaPersistenceContext.getSqlSupport().executeSql(sql); topiaPersistenceContext.commit(); @@ -163,7 +165,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat } catch (HibernateException eee) { - throw new TopiaException(String.format("Could insert lastupdateDate for reason: %s", eee.getMessage()), eee); + throw new TopiaException(String.format("Could insert lastUpdateDate for reason: %s", eee.getMessage()), eee); } } @@ -178,7 +180,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat } - protected void executeSqlStatements0(byte... content) throws IOException { + private void executeSqlStatements0(byte... content) throws IOException { if (getConfiguration().isH2Configuration()) { @@ -186,7 +188,30 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat log.info(String.format("Restore script size: %s to h2 from file : %s", StringUtil.convertMemory(content.length), tempFile.toString())); try { Files.write(tempFile, content); - JdbcH2Helper jdbcH2Helper = new JdbcH2Helper(configuration); + //TODO Push this back in topia + JdbcH2Helper jdbcH2Helper = new JdbcH2Helper(configuration) { + @Override + public void restore(File file) throws FileNotFoundException { + String options = ""; + try (InputStream in = new BufferedInputStream(new FileInputStream(file))) { + in.mark(2); + // read header to see if is compressed file + int b = in.read(); + // redundant cast : int magic = ((int) in.read() << 8) | b; + int magic = in.read() << 8 | b; + in.reset(); + if (magic == GZIPInputStream.GZIP_MAGIC) { + options += " COMPRESSION GZIP"; + } + } catch (IOException e) { + throw new RuntimeException(e); + } + + options += " CHARSET 'UTF8'"; + runUpdate("RUNSCRIPT FROM '" + file.getAbsolutePath() + "'" + options); + } + }; + jdbcH2Helper.restore(tempFile.toFile()); } finally { Files.delete(tempFile); @@ -506,8 +531,8 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat private static class TripReplicateTablesPredicate implements TopiaSqlTablesFactory.TopiaSqlTablesPredicate { - protected final Set<TopiaMetadataEntity> dones = new LinkedHashSet<>(); - protected final Set<String> sectionsHolders = ImmutableSet.of( + final Set<TopiaMetadataEntity> dones = new LinkedHashSet<>(); + final Set<String> sectionsHolders = ImmutableSet.of( ObserveEntityEnum.CatchLongline.name(), ObserveEntityEnum.Tdr.name() ); ===================================== persistence/src/test/java/fr/ird/observe/H2TimeZoneTest.java ===================================== --- /dev/null +++ b/persistence/src/test/java/fr/ird/observe/H2TimeZoneTest.java @@ -0,0 +1,101 @@ +package fr.ird.observe; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.Date; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Calendar; +import java.util.TimeZone; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * Created by tchemit on 13/06/17. + * + * @author Tony Chemit - dev@tchemit.fr + */ +public class H2TimeZoneTest { + + public static final TimeZone TIME_ZONE = TimeZone.getTimeZone("Europe/Paris"); + static String JDBC_URL; + static Path path; + static java.util.Date expectedDate; + + @BeforeClass + public static void beforeClass() throws IOException, SQLException { + + Path dir = Paths.get(System.getProperty("java.io.tmpdir")); + Files.createDirectories(dir); + + path = dir.resolve("H2TimeZoneTest-" + System.nanoTime()); + Files.createDirectories(path); + JDBC_URL = String.format("jdbc:h2:file:%s/test", path.toFile().getAbsolutePath()); + + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, 2016); + calendar.set(Calendar.MONTH, 1); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + expectedDate = calendar.getTime(); + + + try (Connection connection = DriverManager.getConnection(JDBC_URL)) { + try (PreparedStatement preparedStatement = connection.prepareStatement("CREATE TABLE test (simpleDate DATE)")) { + preparedStatement.execute(); + } + + try (PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test VALUES( ? );")) { + + preparedStatement.setDate(1, new java.sql.Date(expectedDate.getTime())); + preparedStatement.execute(); + } + connection.commit(); + } + } + + @Test + public void testWithDefaultTimeZone() { + + TimeZone.setDefault(TIME_ZONE); + try (Connection connection = DriverManager.getConnection(JDBC_URL)) { + try (PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM test LIMIT 1;")) { + try (ResultSet resultSet = preparedStatement.executeQuery()) { + boolean next = resultSet.next(); + Date actualDate = resultSet.getDate(1); + Assert.assertEquals(expectedDate, actualDate); + } + } + connection.commit(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + @Test + public void testWithUtcTimeZone() { + + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + try (Connection connection = DriverManager.getConnection(JDBC_URL)) { + try (PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM test LIMIT 1;")) { + try (ResultSet resultSet = preparedStatement.executeQuery()) { + boolean next = resultSet.next(); + Date actualDate = resultSet.getDate(1); + Assert.assertEquals(expectedDate, actualDate); + } + } + connection.commit(); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} ===================================== pom.xml ===================================== --- a/pom.xml +++ b/pom.xml @@ -551,9 +551,7 @@ <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> - <!-- tc20150811 On ne pleut pas utiliser une version plus récente, le format n'est pas compatible --> - <!-- FIXME Hum je ne suis pas sur que la 176 soit ok. --> - <version>1.3.175</version> + <version>1.4.195</version> </dependency> <dependency> ===================================== services-topia/src/main/java/fr/ird/observe/services/topia/service/sql/SqlScriptProducerServiceTopia.java ===================================== --- a/services-topia/src/main/java/fr/ird/observe/services/topia/service/sql/SqlScriptProducerServiceTopia.java +++ b/services-topia/src/main/java/fr/ird/observe/services/topia/service/sql/SqlScriptProducerServiceTopia.java @@ -24,16 +24,25 @@ package fr.ird.observe.services.topia.service.sql; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ListMultimap; +import fr.ird.observe.persistence.Entities; import fr.ird.observe.persistence.ObserveEntityEnum; import fr.ird.observe.persistence.ObserveTopiaApplicationContext; -import fr.ird.observe.persistence.Entities; +import fr.ird.observe.services.dto.ObserveBlobsContainer; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.sql.AddSqlScriptProducerRequest; import fr.ird.observe.services.service.sql.AddSqlScriptProducerResult; import fr.ird.observe.services.service.sql.DeleteSqlScriptProducerRequest; -import fr.ird.observe.services.dto.ObserveBlobsContainer; import fr.ird.observe.services.service.sql.SqlScriptProducerService; import fr.ird.observe.services.topia.ObserveServiceTopia; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.zip.GZIPOutputStream; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -44,14 +53,6 @@ import org.nuiton.topia.service.sql.batch.TopiaSqlBatchService; import org.nuiton.topia.service.sql.batch.actions.BlobsContainer; import org.nuiton.topia.service.sql.batch.actions.TopiaSqlTableSelectArgument; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.zip.GZIPOutputStream; import static fr.ird.observe.persistence.Entities.IS_LONGLINE_ID; import static fr.ird.observe.persistence.Entities.IS_SEINE_ID; @@ -74,7 +75,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { ImmutableSet.Builder<ObserveBlobsContainer> observeBlobContainers = ImmutableSet.builder(); - try (Writer writer = new OutputStreamWriter(new GZIPOutputStream(out))) { + try (Writer writer = new OutputStreamWriter(new GZIPOutputStream(out), StandardCharsets.UTF_8)) { TopiaSqlBatchService sqlBatchService = serviceContext.getTopiaApplicationContext().getSqlBatchService(); SqlRequests.Builder builder = sqlBatchService.requestBuilder().to(writer); @@ -105,7 +106,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement } try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { - try (Writer writer = new OutputStreamWriter(new GZIPOutputStream(out))) { + try (Writer writer = new OutputStreamWriter(new GZIPOutputStream(out), StandardCharsets.UTF_8)) { TopiaSqlBatchService sqlBatchService = serviceContext.getTopiaApplicationContext().getSqlBatchService(); SqlRequests.Builder builder = sqlBatchService.requestBuilder().to(writer); @@ -122,7 +123,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement } } - protected SqlRequests sqlRequests(AddSqlScriptProducerRequest request, SqlRequests.Builder builder) { + private SqlRequests sqlRequests(AddSqlScriptProducerRequest request, SqlRequests.Builder builder) { if (serviceContext.getTopiaApplicationContext().getConfiguration().isShowSql()) { builder.showSql(); @@ -147,8 +148,8 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (request.isAddReferential()) { builder.replicateTablesBuilder(metadataModel) - .setTables(topiaApplicationContext.getReferentialTables()) - .flush(); + .setTables(topiaApplicationContext.getReferentialTables()) + .flush(); } @@ -162,9 +163,9 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (CollectionUtils.isNotEmpty(ids)) { builder.replicateTablesBuilder(metadataModel) - .setTables(topiaApplicationContext.getReferentialTable(entityType)) - .setSelectArgument(TopiaSqlTableSelectArgument.of(ids)) - .flush(); + .setTables(topiaApplicationContext.getReferentialTable(entityType)) + .setSelectArgument(TopiaSqlTableSelectArgument.of(ids)) + .flush(); } } @@ -177,10 +178,10 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (tripIds == null) { builder.replicateTablesBuilder(metadataModel) - .setTables(topiaApplicationContext.getTripSeineTables()) - .replicateTablesBuilder(metadataModel) - .setTables(topiaApplicationContext.getTripLonglineTables()) - .flush(); + .setTables(topiaApplicationContext.getTripSeineTables()) + .replicateTablesBuilder(metadataModel) + .setTables(topiaApplicationContext.getTripLonglineTables()) + .flush(); } else { @@ -191,9 +192,9 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (!tripIds1.isEmpty()) { builder.replicateTablesBuilder(metadataModel) - .setTables(topiaApplicationContext.getTripSeineTables()) - .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) - .flush(); + .setTables(topiaApplicationContext.getTripSeineTables()) + .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) + .flush(); } @@ -206,9 +207,9 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (!tripIds1.isEmpty()) { builder.replicateTablesBuilder(metadataModel) - .setTables(topiaApplicationContext.getTripLonglineTables()) - .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) - .flush(); + .setTables(topiaApplicationContext.getTripLonglineTables()) + .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) + .flush(); } @@ -221,7 +222,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement return builder.build(); } - protected SqlRequests sqlRequests(DeleteSqlScriptProducerRequest request, SqlRequests.Builder builder) { + private SqlRequests sqlRequests(DeleteSqlScriptProducerRequest request, SqlRequests.Builder builder) { if (serviceContext.getTopiaApplicationContext().getConfiguration().isShowSql()) { builder.showSql(); @@ -235,10 +236,10 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (tripIds == null) { builder.deleteTablesBuilder() - .setTables(topiaApplicationContext.getTripSeineTables()) - .replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) - .setTables(topiaApplicationContext.getTripLonglineTables()) - .flush(); + .setTables(topiaApplicationContext.getTripSeineTables()) + .replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) + .setTables(topiaApplicationContext.getTripLonglineTables()) + .flush(); } else { @@ -249,9 +250,9 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (!tripIds1.isEmpty()) { builder.deleteTablesBuilder() - .setTables(topiaApplicationContext.getTripSeineTables()) - .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) - .flush(); + .setTables(topiaApplicationContext.getTripSeineTables()) + .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) + .flush(); } @@ -264,9 +265,9 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (!tripIds1.isEmpty()) { builder.deleteTablesBuilder() - .setTables(topiaApplicationContext.getTripLonglineTables()) - .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) - .flush(); + .setTables(topiaApplicationContext.getTripLonglineTables()) + .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) + .flush(); } ===================================== services-validation/src/main/resources/i18n/services-validation_es_ES.properties ===================================== --- a/services-validation/src/main/resources/i18n/services-validation_es_ES.properties +++ b/services-validation/src/main/resources/i18n/services-validation_es_ES.properties @@ -169,7 +169,7 @@ observe.common.startLogValue=Corredera de mañana (millas) observe.common.startTime=Fecha - Heuro de inicio de validez observe.common.status=Estado observe.common.stomacFullness=Nivel de llenado del estomago -observe.common.supportVesselName=Nombre del supply +observe.common.supportVesselName=Nombre del macicero observe.common.surroundingActivity=Actividad circundante observe.common.swivelWeight=Peso de el destorcedor (kg) observe.common.targetCatch=Captura de atún @@ -590,12 +590,12 @@ validator.service.trip.invalid.formsUrl=La URL del formulario no es válida. validator.service.trip.invalid.loch=La corredera de mañana (%1$s) de la ruta %2$s debe ser superior a la de tarde (%3$s) de la ruta anterior. validator.service.trip.invalid.reportsUrl=La URL del informe no es válida. validator.service.trip.invalid.startDate=La fecha de comienzo de marea debe ser inferior al día de observación de cualquier ruta (la ruta %1$s es incorrecta). -validator.service.trip.null.captain=Un capitán debe ser seleccionado. +validator.service.trip.null.captain=Un patrón debe ser seleccionado. validator.service.trip.null.dataEntryOperator=Un operador de captación debe ser seleccionado. validator.service.trip.null.departureHarbour=Un puerto de salida debe ser seleccionado. validator.service.trip.null.gearUseFeatureSeine=Usted no seleccionó un equipamiento (Senne aconsejado). validator.service.trip.null.landingHarbour=Un puerto de llegada debe ser seleccionado. -validator.service.trip.required.comment.for.captain=Se necesita un comentario para el capitán seleccionado. +validator.service.trip.required.comment.for.captain=Se necesita un comentario para el patrón seleccionado. validator.service.trip.required.comment.for.dataEntryOperator=Se necesita un comentario para el operador de captación seleccionado. validator.service.trip.required.comment.for.departureHarbour=Se necesita un comentario para el puerto de salida seleccionado. validator.service.trip.required.comment.for.landingHarbour=Se necesita un comentario para el puerto de llegada seleccionado. ===================================== services/src/main/java/fr/ird/observe/services/gson/DateAdapter.java ===================================== --- a/services/src/main/java/fr/ird/observe/services/gson/DateAdapter.java +++ b/services/src/main/java/fr/ird/observe/services/gson/DateAdapter.java @@ -46,7 +46,6 @@ import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.google.gson.JsonSyntaxException; - import java.lang.reflect.Type; import java.sql.Timestamp; import java.text.DateFormat; @@ -54,7 +53,6 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Objects; -import java.util.TimeZone; /** * This type adapter supports three subclasses of date: Date, Timestamp, and @@ -68,9 +66,8 @@ public class DateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> private final DateFormat iso8601Format; - public DateAdapter() { + DateAdapter() { this.iso8601Format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); - this.iso8601Format.setTimeZone(TimeZone.getTimeZone("UTC")); } // These methods need to be synchronized since JDK DateFormat classes are not thread-safe View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/7889c7b91539804c2d4388e764c... --- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/7889c7b91539804c2d4388e764c... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT