This is an automated email from the git hooks/post-receive script. New commit to branch feature/8180 in repository echobase. See https://gitlab.nuiton.org/codelutin/echobase.git commit 3a36842921147bdd918f043fbf4a6fa8e1308310 Author: Julien Ruchaud <julien.ruchaud@debux.org> Date: Fri Jun 17 16:33:48 2016 +0200 Create mooring import service --- .../fr/ifremer/echobase/entities/ImportType.java | 12 ++- .../i18n/echobase-domain_en_GB.properties | 2 + .../i18n/echobase-domain_fr_FR.properties | 2 + .../echobase/services/csv/EchoBaseCsvUtil.java | 10 ++ .../services/service/UserDbPersistenceService.java | 6 ++ .../importdata/DuplicatedMooringException.java | 37 +++---- .../service/importdata/ImportDataService.java | 13 +++ .../MooringCommonsImportDataActionSupport.java | 35 +++---- .../actions/MooringCommonsMooringImportAction.java | 108 +++++++++++++++++++++ .../MooringAcousticsImportConfiguration.java | 2 +- .../MooringCommonsImportConfiguration.java | 39 ++++---- .../contexts/ImportDataContextSupport.java | 10 ++ .../contexts/MooringCommonsImportDataContext.java | 41 ++++++++ .../MooringCommonsMooringImportExportModel.java | 93 ++++++++++++++++++ .../service/removedata/RemoveDataService.java | 8 +- .../i18n/echobase-services_en_GB.properties | 2 + .../i18n/echobase-services_fr_FR.properties | 2 + .../actions/importData/ConfigureMooringImport.java | 62 ++++++++++++ .../ui/actions/importData/ImportMooringMode.java | 5 +- .../ui/actions/importData/SelectImportType.java | 2 +- .../resources/i18n/echobase-ui_en_GB.properties | 1 + .../resources/i18n/echobase-ui_fr_FR.properties | 1 + .../jsp/importData/configureMooringImport.jsp | 60 ++++++++++++ 23 files changed, 478 insertions(+), 75 deletions(-) diff --git a/echobase-domain/src/main/java/fr/ifremer/echobase/entities/ImportType.java b/echobase-domain/src/main/java/fr/ifremer/echobase/entities/ImportType.java index c341564..03c6063 100644 --- a/echobase-domain/src/main/java/fr/ifremer/echobase/entities/ImportType.java +++ b/echobase-domain/src/main/java/fr/ifremer/echobase/entities/ImportType.java @@ -65,6 +65,10 @@ public enum ImportType implements I18nAble { ACOUSTIC(n("echobase.common.importType.acoustic"), n("echobase.common.importType.acoustic.short")), + /** Import accoustic data (Cells ESDU and Elementary). */ + MOORING_ACOUSTIC(n("echobase.common.importType.acoustic"), + n("echobase.common.importType.acoustic.short")), + /** Import results at voyage level. */ RESULT_VOYAGE(n("echobase.common.importType.resultsVoyage"), n("echobase.common.importType.resultsVoyage.short")), @@ -79,12 +83,16 @@ public enum ImportType implements I18nAble { /** Import cells Map Fish. */ RESULT_MAP_FISH(n("echobase.common.importType.resultsMapFish"), - n("echobase.common.importType.resultsMapFish.short")), + n("echobase.common.importType.resultsMapFish.short")), /** Import cells Map Other. */ RESULT_MAP_OTHER(n("echobase.common.importType.resultsMapOther"), - n("echobase.common.importType.resultsMapOther.short")); + n("echobase.common.importType.resultsMapOther.short")), + /** Import mooring data. */ + MOORING(n("echobase.common.importType.mooring"), + n("echobase.common.importType.mooring.short")); + /** * All common import types. * diff --git a/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties b/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties index 0c80451..1529209 100644 --- a/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties +++ b/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties @@ -12,6 +12,8 @@ echobase.common.importType.commonDataTransit=Transits import echobase.common.importType.commonDataTransit.short=Transit echobase.common.importType.commonDataVoyage=Voyage import echobase.common.importType.commonDataVoyage.short=Voyage +echobase.common.importType.mooring= +echobase.common.importType.mooring.short= echobase.common.importType.operation=Operations data import echobase.common.importType.operation.short=Operation echobase.common.importType.resultsEsdu=Import the “ESDU” cells results diff --git a/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties b/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties index 6d0debd..6933fa1 100644 --- a/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties +++ b/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties @@ -12,6 +12,8 @@ echobase.common.importType.commonDataTransit=Import Transits echobase.common.importType.commonDataTransit.short=Transits echobase.common.importType.commonDataVoyage=Import Voyage echobase.common.importType.commonDataVoyage.short=Voyage +echobase.common.importType.mooring= +echobase.common.importType.mooring.short= echobase.common.importType.operation=Import des opérations echobase.common.importType.operation.short=Opérations echobase.common.importType.resultsEsdu=Import des résultats des cellules de type "ESDU" diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EchoBaseCsvUtil.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EchoBaseCsvUtil.java index a4a5792..c6fdb54 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EchoBaseCsvUtil.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EchoBaseCsvUtil.java @@ -34,6 +34,7 @@ import fr.ifremer.echobase.entities.references.DataQuality; import fr.ifremer.echobase.entities.references.DepthStratum; import fr.ifremer.echobase.entities.references.Gear; import fr.ifremer.echobase.entities.references.GearMetadata; +import fr.ifremer.echobase.entities.references.Mission; import fr.ifremer.echobase.entities.references.OperationMetadata; import fr.ifremer.echobase.entities.references.Port; import fr.ifremer.echobase.entities.references.SampleDataType; @@ -245,6 +246,15 @@ public class EchoBaseCsvUtil extends TopiaCsvCommons { } ); + public static final ValueFormatter<Mission> MISSION_FORMATTER = newValueFormatterByFunction( + new Function<Mission, String>() { + @Override + public String apply(Mission input) { + return input.getName(); + } + } + ); + public static <E> ValueFormatter<E> newValueFormatterByFunction(Function<E, String> function) { return new ValueFormatterByFunction<>(function); } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java index 3dc2c43..0a09691 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java @@ -1056,6 +1056,12 @@ public class UserDbPersistenceService extends EchoBaseServiceSupport { .exists(); } + public boolean containsMooringByCode(String mooringCode) { + return persistenceContext.getMooringDao() + .forCodeEquals(mooringCode) + .exists(); + } + //------------------------------------------------------------------------// //--- Transversal --------------------------------------------------------// //------------------------------------------------------------------------// diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedMooringException.java similarity index 50% copy from echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java copy to echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedMooringException.java index dbd772e..da0dded 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedMooringException.java @@ -1,8 +1,10 @@ +package fr.ifremer.echobase.services.service.importdata; + /* * #%L - * EchoBase :: UI + * EchoBase :: Services * %% - * Copyright (C) 2011 Ifremer, Codelutin + * Copyright (C) 2011 - 2015 Ifremer, Codelutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -18,35 +20,24 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ -package fr.ifremer.echobase.ui.actions.importData; -import fr.ifremer.echobase.I18nAble; -import fr.ifremer.echobase.entities.ImportType; +import org.nuiton.csv.ImportRuntimeException; + +import java.util.Locale; -import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.l; /** - * To define the mode of import data for mooring (says files to be imported). + * Created on 5/09/16. * * @author Julien Ruchaud - ruchaud@codelutin.com - * @since 0.3 + * @since 4.0 */ -public enum ImportMooringMode implements I18nAble { - - /** Import accoustic data (Cells ESDU and Elementary). */ - MooringAcoustic(ImportType.ACOUSTIC.getI18nKey()), +public class DuplicatedMooringException extends ImportRuntimeException { - /** Import results. */ - MooringResults(n("echobase.common.importType.results")); - - private final String i18nKey; - - ImportMooringMode(String i18nKey) { - this.i18nKey = i18nKey; - } + private static final long serialVersionUID = 1L; - @Override - public String getI18nKey() { - return i18nKey; + public DuplicatedMooringException(Locale locale, int rowNumber, String voyageName) { + super(l(locale, "echobase.importError.duplicate.mooring", rowNumber, voyageName)); } } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/ImportDataService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/ImportDataService.java index fa56373..ecadd50 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/ImportDataService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/ImportDataService.java @@ -31,6 +31,7 @@ import fr.ifremer.echobase.services.EchoBaseServiceSupport; import fr.ifremer.echobase.services.service.UserDbPersistenceService; import fr.ifremer.echobase.services.service.importdata.actions.ImportDataActionSupport; import fr.ifremer.echobase.services.service.importdata.actions.MooringAcousticsImportAction; +import fr.ifremer.echobase.services.service.importdata.actions.MooringCommonsMooringImportAction; import fr.ifremer.echobase.services.service.importdata.actions.VoyageAcousticsImportAction; import fr.ifremer.echobase.services.service.importdata.actions.VoyageCatchesBiometrySampleImportAction; import fr.ifremer.echobase.services.service.importdata.actions.VoyageCatchesSubSampleImportAction; @@ -55,6 +56,7 @@ import fr.ifremer.echobase.services.service.importdata.actions.VoyageResultsVoya import fr.ifremer.echobase.services.service.importdata.actions.VoyageResultsVoyageLengthWeightKeyImportAction; import fr.ifremer.echobase.services.service.importdata.configurations.ImportDataConfigurationSupport; import fr.ifremer.echobase.services.service.importdata.configurations.MooringAcousticsImportConfiguration; +import fr.ifremer.echobase.services.service.importdata.configurations.MooringCommonsImportConfiguration; import fr.ifremer.echobase.services.service.importdata.configurations.VoyageAcousticsImportConfiguration; import fr.ifremer.echobase.services.service.importdata.configurations.VoyageCatchesImportConfiguration; import fr.ifremer.echobase.services.service.importdata.configurations.VoyageCommonsImportConfiguration; @@ -62,6 +64,7 @@ import fr.ifremer.echobase.services.service.importdata.configurations.VoyageOper import fr.ifremer.echobase.services.service.importdata.configurations.VoyageResultsImportConfiguration; import fr.ifremer.echobase.services.service.importdata.contexts.ImportDataContextSupport; import fr.ifremer.echobase.services.service.importdata.contexts.MooringAcousticsImportDataContext; +import fr.ifremer.echobase.services.service.importdata.contexts.MooringCommonsImportDataContext; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageAcousticsImportDataContext; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageCatchesImportDataContext; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageCommonsImportDataContext; @@ -181,6 +184,12 @@ public class ImportDataService extends EchoBaseServiceSupport { return doImport(importDataContext, importActions); } + + public ImportDataResult<MooringCommonsImportConfiguration> doImportMooring(MooringCommonsImportConfiguration configuration, EchoBaseUser user) throws ImportException { + MooringCommonsImportDataContext importDataContext = newMooringCommonsImportContext(configuration, user); + Set<MooringCommonsMooringImportAction> importActions = Collections.singleton(new MooringCommonsMooringImportAction(importDataContext)); + return doImport(importDataContext, importActions); + } public ImportDataResult<MooringAcousticsImportConfiguration> doImportMooringAcoustics(MooringAcousticsImportConfiguration configuration, EchoBaseUser user) throws ImportException { @@ -303,6 +312,10 @@ public class ImportDataService extends EchoBaseServiceSupport { return new VoyageAcousticsImportDataContext(persistenceService, getLocale(), getCsvSeparator(), configuration, user, newDate()); } + private MooringCommonsImportDataContext newMooringCommonsImportContext(MooringCommonsImportConfiguration configuration, EchoBaseUser user) { + return new MooringCommonsImportDataContext(persistenceService, getLocale(), getCsvSeparator(), configuration, user, newDate()); + } + private MooringAcousticsImportDataContext newMooringAcousticsImportContext(MooringAcousticsImportConfiguration configuration, EchoBaseUser user) { return new MooringAcousticsImportDataContext(persistenceService, getLocale(), getCsvSeparator(), configuration, user, newDate()); } diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/MooringCommonsImportDataActionSupport.java similarity index 50% copy from echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java copy to echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/MooringCommonsImportDataActionSupport.java index dbd772e..65ef1ac 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/MooringCommonsImportDataActionSupport.java @@ -1,8 +1,10 @@ +package fr.ifremer.echobase.services.service.importdata.actions; + /* * #%L - * EchoBase :: UI + * EchoBase :: Services * %% - * Copyright (C) 2011 Ifremer, Codelutin + * Copyright (C) 2011 - 2016 Ifremer, Codelutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -18,35 +20,20 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ -package fr.ifremer.echobase.ui.actions.importData; - -import fr.ifremer.echobase.I18nAble; -import fr.ifremer.echobase.entities.ImportType; -import static org.nuiton.i18n.I18n.n; +import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.configurations.MooringCommonsImportConfiguration; +import fr.ifremer.echobase.services.service.importdata.contexts.MooringCommonsImportDataContext; /** - * To define the mode of import data for mooring (says files to be imported). + * Created on 30/03/16. * * @author Julien Ruchaud - ruchaud@codelutin.com - * @since 0.3 */ -public enum ImportMooringMode implements I18nAble { - - /** Import accoustic data (Cells ESDU and Elementary). */ - MooringAcoustic(ImportType.ACOUSTIC.getI18nKey()), +public abstract class MooringCommonsImportDataActionSupport<E> extends ImportDataActionSupport<MooringCommonsImportConfiguration, MooringCommonsImportDataContext, E> { - /** Import results. */ - MooringResults(n("echobase.common.importType.results")); - - private final String i18nKey; - - ImportMooringMode(String i18nKey) { - this.i18nKey = i18nKey; + protected MooringCommonsImportDataActionSupport(MooringCommonsImportDataContext importDataContext, InputFile inputFile) { + super(importDataContext, inputFile); } - @Override - public String getI18nKey() { - return i18nKey; - } } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/MooringCommonsMooringImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/MooringCommonsMooringImportAction.java new file mode 100644 index 0000000..3aea32e --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/MooringCommonsMooringImportAction.java @@ -0,0 +1,108 @@ +package fr.ifremer.echobase.services.service.importdata.actions; + +/* + * #%L + * EchoBase :: Services + * %% + * Copyright (C) 2011 - 2016 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import fr.ifremer.echobase.entities.EchoBaseUserEntityEnum; +import fr.ifremer.echobase.entities.data.Mooring; +import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.DuplicatedMooringException; +import fr.ifremer.echobase.services.service.importdata.ImportDataFileResult; +import fr.ifremer.echobase.services.service.importdata.contexts.MooringCommonsImportDataContext; +import fr.ifremer.echobase.services.service.importdata.csv.MooringCommonsMooringImportExportModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.Import; + +import java.util.Locale; + +/** + * Created on 25/03/16. + * + * @author Julien Ruchaud - ruchaud@codelutin.com + * @since 4.0 + */ +public class MooringCommonsMooringImportAction extends MooringCommonsImportDataActionSupport<Mooring> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(MooringCommonsMooringImportAction.class); + + public MooringCommonsMooringImportAction(MooringCommonsImportDataContext importDataContext) { + super(importDataContext, importDataContext.getConfiguration().getMooringFile()); + } + + @Override + protected MooringCommonsMooringImportExportModel createCsvImportModel(MooringCommonsImportDataContext importDataContext) { + return MooringCommonsMooringImportExportModel.forImport(importDataContext); + } + + @Override + protected MooringCommonsMooringImportExportModel createCsvExportModel(MooringCommonsImportDataContext importDataContext) { + return MooringCommonsMooringImportExportModel.forExport(importDataContext); + } + + @Override + public void performImport(MooringCommonsImportDataContext importDataContext, InputFile inputFile, ImportDataFileResult result) { + + + if (log.isInfoEnabled()) { + log.info("Starts import of mooring from file " + inputFile.getFileName()); + } + + Locale locale = getLocale(); + + try (Import<Mooring> importer = open()) { + + incrementsProgress(); + + int rowNumber = 0; + + for (Mooring mooring : importer) { + + doFlushTransaction(++rowNumber); + + if (persistenceService.containsMooringByCode(mooring.getCode())) { + throw new DuplicatedMooringException(locale, rowNumber, mooring.getCode()); + } + + Mooring createdMooring = persistenceService.createMooring(mooring); + addId(result, EchoBaseUserEntityEnum.Mooring, createdMooring, rowNumber); + + addProcessedRow(result, createdMooring); + } + } + } + + @Override + protected void computeImportedExport(MooringCommonsImportDataContext importDataContext, ImportDataFileResult result) { + + for (Mooring mooring : getImportedEntities(Mooring.class, result)) { + + String mooringId = mooring.getTopiaId(); + if (log.isInfoEnabled()) { + log.info("Adding mooring: " + mooringId + " to imported export."); + } + + addImportedRow(result, mooring); + } + } + +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringAcousticsImportConfiguration.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringAcousticsImportConfiguration.java index 6033166..75707d3 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringAcousticsImportConfiguration.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringAcousticsImportConfiguration.java @@ -78,7 +78,7 @@ public class MooringAcousticsImportConfiguration extends ImportDataConfiguration public MooringAcousticsImportConfiguration(Locale locale) { moviesFile = InputFile.newFile(l(locale, "echobase.common.moviesFile")); - importType = ImportType.ACOUSTIC; + importType = ImportType.MOORING_ACOUSTIC; } public String getMooringId() { diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringCommonsImportConfiguration.java similarity index 50% copy from echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java copy to echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringCommonsImportConfiguration.java index dbd772e..87907db 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringCommonsImportConfiguration.java @@ -1,8 +1,8 @@ /* * #%L - * EchoBase :: UI + * EchoBase :: Services * %% - * Copyright (C) 2011 Ifremer, Codelutin + * Copyright (C) 2011 - 2012 Ifremer, Codelutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -18,35 +18,36 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ -package fr.ifremer.echobase.ui.actions.importData; +package fr.ifremer.echobase.services.service.importdata.configurations; -import fr.ifremer.echobase.I18nAble; import fr.ifremer.echobase.entities.ImportType; - -import static org.nuiton.i18n.I18n.n; +import fr.ifremer.echobase.io.InputFile; +import java.util.Locale; +import static org.nuiton.i18n.I18n.l; /** - * To define the mode of import data for mooring (says files to be imported). + * Configuration mooring import. * * @author Julien Ruchaud - ruchaud@codelutin.com - * @since 0.3 + * @since 0.4 */ -public enum ImportMooringMode implements I18nAble { - - /** Import accoustic data (Cells ESDU and Elementary). */ - MooringAcoustic(ImportType.ACOUSTIC.getI18nKey()), +public class MooringCommonsImportConfiguration extends ImportDataConfigurationSupport { - /** Import results. */ - MooringResults(n("echobase.common.importType.results")); + private static final long serialVersionUID = 1L; + + protected final InputFile mooringFile; - private final String i18nKey; + public MooringCommonsImportConfiguration(Locale locale) { + mooringFile = InputFile.newFile(l(locale, "echobase.common.mooringFile")); + importType = ImportType.MOORING; + } - ImportMooringMode(String i18nKey) { - this.i18nKey = i18nKey; + public InputFile getMooringFile() { + return mooringFile; } @Override - public String getI18nKey() { - return i18nKey; + public InputFile[] getInputFiles() { + return new InputFile[]{mooringFile}; } } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/contexts/ImportDataContextSupport.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/contexts/ImportDataContextSupport.java index a24b12e..64ad8e7 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/contexts/ImportDataContextSupport.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/contexts/ImportDataContextSupport.java @@ -39,6 +39,8 @@ import fr.ifremer.echobase.entities.references.DepthStratums; import fr.ifremer.echobase.entities.references.Gear; import fr.ifremer.echobase.entities.references.GearMetadata; import fr.ifremer.echobase.entities.references.GearMetadatas; +import fr.ifremer.echobase.entities.references.Mission; +import fr.ifremer.echobase.entities.references.Missions; import fr.ifremer.echobase.entities.references.OperationMetadata; import fr.ifremer.echobase.entities.references.OperationMetadatas; import fr.ifremer.echobase.entities.references.Port; @@ -98,6 +100,7 @@ public abstract class ImportDataContextSupport<C extends ImportDataConfiguration private Map<String, CellType> regionCellTypesById; private Map<String, AgeCategory> ageCategoriesByName; private Map<String, Port> portsByCode; + private Map<String, Mission> missionByName; private CellType esduCellType; private CellType elementaryCellType; @@ -247,6 +250,13 @@ public abstract class ImportDataContextSupport<C extends ImportDataConfiguration } return portsByCode; } + + public Map<String, Mission> getMissionByName() { + if (missionByName == null) { + missionByName = persistenceService.getEntitiesMap(Mission.class, Missions.MISSION_NAME); + } + return missionByName; + } public final Map<String, DataMetadata> getDataMetadatasByName() { if (dataMetadatasByName == null) { diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/contexts/MooringCommonsImportDataContext.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/contexts/MooringCommonsImportDataContext.java new file mode 100644 index 0000000..a63cee1 --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/contexts/MooringCommonsImportDataContext.java @@ -0,0 +1,41 @@ +package fr.ifremer.echobase.services.service.importdata.contexts; + +/* + * #%L + * EchoBase :: Services + * %% + * Copyright (C) 2011 - 2016 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import fr.ifremer.echobase.entities.EchoBaseUser; +import fr.ifremer.echobase.services.service.UserDbPersistenceService; +import fr.ifremer.echobase.services.service.importdata.configurations.MooringCommonsImportConfiguration; + +import java.util.Date; +import java.util.Locale; + +/** + * @author Julien Ruchaud - ruchaud@codelutin.com + * @since 0.4 + */ +public class MooringCommonsImportDataContext extends ImportDataContextSupport<MooringCommonsImportConfiguration> { + + public MooringCommonsImportDataContext(UserDbPersistenceService persistenceService, Locale locale, char csvSeparator, MooringCommonsImportConfiguration configuration, EchoBaseUser user, Date importDate) { + super(persistenceService, locale, csvSeparator, configuration, user, importDate); + } + +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/csv/MooringCommonsMooringImportExportModel.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/csv/MooringCommonsMooringImportExportModel.java new file mode 100644 index 0000000..ea148d3 --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/csv/MooringCommonsMooringImportExportModel.java @@ -0,0 +1,93 @@ +/* + * #%L + * EchoBase :: Services + * %% + * Copyright (C) 2011 - 2012 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.echobase.services.service.importdata.csv; + +import fr.ifremer.echobase.entities.data.Mooring; +import fr.ifremer.echobase.entities.data.MooringImpl; +import fr.ifremer.echobase.entities.references.Mission; +import fr.ifremer.echobase.services.csv.EchoBaseCsvUtil; +import fr.ifremer.echobase.services.service.importdata.contexts.MooringCommonsImportDataContext; + +/** + * Model to import Mooring. + * + * @author Julien Ruchaud - ruchaud@codelutin.com + * @since 0.4 + */ +public class MooringCommonsMooringImportExportModel extends EchoBaseImportExportModelSupport<Mooring> { + + private MooringCommonsMooringImportExportModel(char separator) { + super(separator); + } + + public static MooringCommonsMooringImportExportModel forImport(MooringCommonsImportDataContext importDataContext) { + MooringCommonsMooringImportExportModel model = new MooringCommonsMooringImportExportModel(importDataContext.getCsvSeparator()); + + model.newForeignKeyColumn(Mooring.PROPERTY_MISSION, Mooring.PROPERTY_MISSION, Mission.class, Mission.PROPERTY_NAME, importDataContext.getMissionByName()); + model.newMandatoryColumn(Mooring.PROPERTY_CODE); + model.newMandatoryColumn(Mooring.PROPERTY_DESCRIPTION); + model.newMandatoryColumn(Mooring.PROPERTY_DEPTH, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newMandatoryColumn(Mooring.PROPERTY_NORTH_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newMandatoryColumn(Mooring.PROPERTY_EAST_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newMandatoryColumn(Mooring.PROPERTY_SOUTH_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newMandatoryColumn(Mooring.PROPERTY_UP_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newMandatoryColumn(Mooring.PROPERTY_DOWN_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newMandatoryColumn(Mooring.PROPERTY_UNITS); + model.newMandatoryColumn(Mooring.PROPERTY_ZUNITS); + model.newMandatoryColumn(Mooring.PROPERTY_PROJECTION); + model.newMandatoryColumn(Mooring.PROPERTY_DEPLOYMENT_DATE, EchoBaseCsvUtil.IMPORT_DAY_TIME_ECHOBASE); + model.newMandatoryColumn(Mooring.PROPERTY_RETRIEVAL_DATE, EchoBaseCsvUtil.IMPORT_DAY_TIME_ECHOBASE); + model.newMandatoryColumn(Mooring.PROPERTY_SITE_NAME); + model.newMandatoryColumn(Mooring.PROPERTY_OPERATOR); + model.newMandatoryColumn(Mooring.PROPERTY_COMMENTS); + + return model; + } + + public static MooringCommonsMooringImportExportModel forExport(MooringCommonsImportDataContext importDataContext) { + MooringCommonsMooringImportExportModel model = new MooringCommonsMooringImportExportModel(importDataContext.getCsvSeparator()); + + model.newColumnForExport(Mooring.PROPERTY_MISSION, Mooring.PROPERTY_MISSION, EchoBaseCsvUtil.MISSION_FORMATTER); + model.newColumnForExport(Mooring.PROPERTY_CODE); + model.newColumnForExport(Mooring.PROPERTY_DESCRIPTION); + model.newColumnForExport(Mooring.PROPERTY_DEPTH, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newColumnForExport(Mooring.PROPERTY_NORTH_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newColumnForExport(Mooring.PROPERTY_EAST_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newColumnForExport(Mooring.PROPERTY_SOUTH_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newColumnForExport(Mooring.PROPERTY_UP_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newColumnForExport(Mooring.PROPERTY_DOWN_LIMIT, EchoBaseCsvUtil.PRIMITIVE_FLOAT); + model.newColumnForExport(Mooring.PROPERTY_UNITS); + model.newColumnForExport(Mooring.PROPERTY_ZUNITS); + model.newColumnForExport(Mooring.PROPERTY_PROJECTION); + model.newColumnForExport(Mooring.PROPERTY_DEPLOYMENT_DATE, EchoBaseCsvUtil.IMPORT_DAY_TIME_ECHOBASE); + model.newColumnForExport(Mooring.PROPERTY_RETRIEVAL_DATE, EchoBaseCsvUtil.IMPORT_DAY_TIME_ECHOBASE); + model.newColumnForExport(Mooring.PROPERTY_SITE_NAME); + model.newColumnForExport(Mooring.PROPERTY_OPERATOR); + model.newColumnForExport(Mooring.PROPERTY_COMMENTS); + + return model; + } + + @Override + public Mooring newEmptyInstance() { + return new MooringImpl(); + } +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/RemoveDataService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/RemoveDataService.java index 64dbf15..fbcd454 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/RemoveDataService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/RemoveDataService.java @@ -124,8 +124,7 @@ public class RemoveDataService extends EchoBaseServiceSupport { // and compute nb steps int nbSteps = 0; - Map<ImportLog, ImportContext> toTreat = - Maps.newTreeMap(IMPORT_LOG_COMPARATOR); + Map<ImportLog, ImportContext> toTreat = Maps.newTreeMap(IMPORT_LOG_COMPARATOR); for (String id : model.getImportLogIds()) { Optional<ImportLog> optionalImportLog = persistenceService.getOptionalImportLog(id); @@ -283,6 +282,8 @@ public class RemoveDataService extends EchoBaseServiceSupport { strategies.put(ImportType.RESULT_MAP_FISH, ResultMapFishRemoveDataStrategy.class); strategies.put(ImportType.RESULT_MAP_OTHER, ResultMapOtherRemoveDataStrategy.class); strategies.put(ImportType.RESULT_REGION, ResultRegionRemoveDataStrategy.class); + strategies.put(ImportType.MOORING, LegacyVoyageRemoveDataStrategy.class); + strategies.put(ImportType.MOORING_ACOUSTIC, AcousticRemoveDataStrategy.class); Preconditions.checkState( ImportType.values().length == strategies.size(), "It miss some remove data strategies..."); @@ -294,8 +295,7 @@ public class RemoveDataService extends EchoBaseServiceSupport { List<ImportLog> obsoleteImportLogs, EchoBaseUser user) { - Decorator<ImportLog> decorator = decoratorService. - getDecorator(ImportLog.class, null); + Decorator<ImportLog> decorator = decoratorService.getDecorator(ImportLog.class, null); StringBuilder buffer = new StringBuilder(); buffer.append("Suppression import "); diff --git a/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties b/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties index ada9863..3340ecc 100644 --- a/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties +++ b/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties @@ -21,6 +21,7 @@ echobase.common.importDbMode.free=Free import echobase.common.importDbMode.referential=Referential import echobase.common.lengthAgeKeyFile=Size-age equations file echobase.common.lengthWeightKeyFile=Size-weight equations file +echobase.common.mooringFile=Mooring file echobase.common.moviesFile=Acoustic data file echobase.common.operationFile=Operation data file echobase.common.operationMetadataFile=Operation metadata file @@ -37,6 +38,7 @@ echobase.importError.duplicate.elementaryCell=Line %s - Elementary cell named « echobase.importError.duplicate.esduCell=Line %s - ESDU cell named «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.gearMetataValue=Line %s - A gear meta data (type «%s») value on engin «%s» for operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.mapCell=Line %s - Map cell named «%s» on voyage «%s» already exists in database. +echobase.importError.duplicate.mooring= echobase.importError.duplicate.operation=Line %s - An operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.operationMetataValue=Line %s - An operation meta data (type «%s») value for operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.regionCell=Line %s - Region cell named «%s» (of type «%s») on voyage «%s» already exists in database. diff --git a/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties b/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties index 2a579b3..7dae792 100644 --- a/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties +++ b/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties @@ -21,6 +21,7 @@ echobase.common.importDbMode.free=Import libre echobase.common.importDbMode.referential=Import Référentiel echobase.common.lengthAgeKeyFile=Fichier des relations taille-âge echobase.common.lengthWeightKeyFile=Fichier des relations taille-poids +echobase.common.mooringFile=Fichier des données bouées echobase.common.moviesFile=Fichier des données acoustiques echobase.common.operationFile=Fichier des données opérations echobase.common.operationMetadataFile=Fichier des méta-données d'opérations @@ -37,6 +38,7 @@ echobase.importError.duplicate.elementaryCell=Ligne %s - La cellule élémentair echobase.importError.duplicate.esduCell=Ligne %s - La cellule ESDU d'identifiant «%s» sur la marée nommée «%s» existe déjà en base. echobase.importError.duplicate.gearMetataValue=Ligne %s - La mise en œuvre (type %s) de l'engin «%s» (opération d'identifiant «%s» sur la strate «%s» - navire «%s» et sur la marée nommée «%s») existe déjà dans la base. echobase.importError.duplicate.mapCell=Ligne %s - La cellule de type Carte d'identifiant «%s» sur la marée nommée «%s» existe déjà en base. +echobase.importError.duplicate.mooring= echobase.importError.duplicate.operation=Ligne %s - L'opération d'identifiant «%s» sur la strate «%s» - navire «%s» et sur la marée nommée «%s» existe déjà dans la base. echobase.importError.duplicate.operationMetataValue=Ligne %s - La donnée (type %s) (opération d'identifiant «%s» sur la strate «%s» - navire «%s» et sur la marée nommée «%s») existe déjà dans la base. echobase.importError.duplicate.regionCell=Ligne %s - La cellule de type Région d'identifiant «%s» et de type «%s» sur la marée nommée «%s» existe déjà en base. diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ConfigureMooringImport.java b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ConfigureMooringImport.java new file mode 100644 index 0000000..b2d91e1 --- /dev/null +++ b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ConfigureMooringImport.java @@ -0,0 +1,62 @@ +/* + * #%L + * EchoBase :: UI + * %% + * Copyright (C) 2011 - 2012 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.echobase.ui.actions.importData; + +import fr.ifremer.echobase.services.service.importdata.configurations.MooringCommonsImportConfiguration; + +import java.io.File; + +/** + * Configure a data import for mooring. + * + * @author Julien Ruchaud - ruchaud@codelutin.com + * @since 0.4 + */ +public class ConfigureMooringImport extends AbstractConfigureImport<MooringCommonsImportConfiguration> { + + private static final long serialVersionUID = 1L; + + + public ConfigureMooringImport() { + super(MooringCommonsImportConfiguration.class); + } + + @Override + protected MooringCommonsImportConfiguration createModel() { + return new MooringCommonsImportConfiguration(getLocale()); + } + + @Override + protected void prepareInputAction(MooringCommonsImportConfiguration model) { + } + + public void setMooringFile(File file) { + getModel().getMooringFile().setFile(file); + } + + public void setMooringFileContentType(String contentType) { + getModel().getMooringFile().setContentType(contentType); + } + + public void setMooringFileFileName(String fileName) { + getModel().getMooringFile().setFileName(fileName); + } +} diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java index dbd772e..8ff5506 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java +++ b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ImportMooringMode.java @@ -29,10 +29,13 @@ import static org.nuiton.i18n.I18n.n; * To define the mode of import data for mooring (says files to be imported). * * @author Julien Ruchaud - ruchaud@codelutin.com - * @since 0.3 + * @since 0.4 */ public enum ImportMooringMode implements I18nAble { + /** Import mooring **/ + Mooring(n("echobase.common.importType.mooring")), + /** Import accoustic data (Cells ESDU and Elementary). */ MooringAcoustic(ImportType.ACOUSTIC.getI18nKey()), diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/SelectImportType.java b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/SelectImportType.java index f88d748..4e94e0e 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/SelectImportType.java +++ b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/SelectImportType.java @@ -76,7 +76,7 @@ public class SelectImportType extends EchoBaseActionSupport { voyageMode = ImportVoyageMode.Common; } if (mooringMode == null) { - mooringMode = ImportMooringMode.MooringAcoustic; + mooringMode = ImportMooringMode.Mooring; } return INPUT; } diff --git a/echobase-ui/src/main/resources/i18n/echobase-ui_en_GB.properties b/echobase-ui/src/main/resources/i18n/echobase-ui_en_GB.properties index ff9d18a..209c3e8 100644 --- a/echobase-ui/src/main/resources/i18n/echobase-ui_en_GB.properties +++ b/echobase-ui/src/main/resources/i18n/echobase-ui_en_GB.properties @@ -138,6 +138,7 @@ echobase.common.modificationDate=Last modified date echobase.common.modificationText=Last modification echobase.common.modificationUser=User echobase.common.mooring=Mooring +echobase.common.mooringFile= echobase.common.moviesFile= echobase.common.name=Name echobase.common.northLimit=North limit diff --git a/echobase-ui/src/main/resources/i18n/echobase-ui_fr_FR.properties b/echobase-ui/src/main/resources/i18n/echobase-ui_fr_FR.properties index 21aa861..9a22b88 100644 --- a/echobase-ui/src/main/resources/i18n/echobase-ui_fr_FR.properties +++ b/echobase-ui/src/main/resources/i18n/echobase-ui_fr_FR.properties @@ -138,6 +138,7 @@ echobase.common.modificationDate=Date de modification echobase.common.modificationText=Modification echobase.common.modificationUser=Utilisateur echobase.common.mooring=Bouée +echobase.common.mooringFile= echobase.common.moviesFile= echobase.common.name=Nom echobase.common.northLimit=Limite Nord diff --git a/echobase-ui/src/main/webapp/WEB-INF/jsp/importData/configureMooringImport.jsp b/echobase-ui/src/main/webapp/WEB-INF/jsp/importData/configureMooringImport.jsp new file mode 100644 index 0000000..63e6e4e --- /dev/null +++ b/echobase-ui/src/main/webapp/WEB-INF/jsp/importData/configureMooringImport.jsp @@ -0,0 +1,60 @@ +<%-- + #%L + EchoBase :: UI + %% + Copyright (C) 2011 Ifremer, Codelutin + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero 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 Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + #L% + --%> +<%@page contentType="text/html" pageEncoding="UTF-8" %> +<%@ taglib prefix="s" uri="/struts-tags" %> +<%@ taglib prefix="sj" uri="/struts-jquery-tags" %> +<title> + Configuration <s:text name="echobase.common.importType.mooring"/> +</title> + +<script type="text/javascript" + src="<s:url value='/js/gridHelper.js' />"></script> + +<script type="text/javascript"> + + jQuery(document).ready(function () { + $.addCheckFileSize(<s:property value="uploadFileMaxLength"/>); + }); +</script> + +<s:form namespace="/importData" method="POST" enctype="multipart/form-data"> + + <fieldset> + <legend> + <s:text name="echobase.legend.importData.configure"/> + </legend> + + <div class="cleanBoth help"> + <s:a href="%{getDocumentation('importData.html', null)}" target="doc"> + <s:text name="echobase.action.show.import.documentation"/> + </s:a> + </div> + <br/> + + <s:file key="moviesFile" requiredLabel="true" + label='%{getText("echobase.common.mooringFile")}'/> + + </fieldset> + <br/> + <s:submit action="configureMooring-execute" key='echobase.action.import'/> + +</s:form> + -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.