branch develop updated (d4d4bac -> c4d6063)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository tutti. See http://git.codelutin.com/tutti.git from d4d4bac fixes #6882: [IMPORT GENERIQUE] On ne peut pas ouvrir les rapports d'import new 29dd28c introduction d'une configuration pour l'export et utilisation dans les exports existants new 057b4a8 introduce DataModel API in persistence module new 80c5987 improve CSVProducer API new c5240d3 can now export partial data new 148837e impact Export API in Report service new a95fae1 impact Export API in legacy export actions new bf8a93c add new export screen new c4d6063 generic format import action only from menu + improve select popup open (add a timer for this) The 8 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit c4d6063d677074ff2885e35357909766f5d64fd1 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 16:02:00 2015 +0200 generic format import action only from menu + improve select popup open (add a timer for this) commit bf8a93c34480c6529baf9c75591bac53274f0665 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 16:00:01 2015 +0200 add new export screen commit a95fae176fdaafcfad2d248bee0f6d2ebe503d92 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:59:08 2015 +0200 impact Export API in legacy export actions commit 148837e7b87a045a9be17dec2e747f95e60f5f93 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:58:27 2015 +0200 impact Export API in Report service commit c5240d364bb3b772a72a5db55ba31f5aa207138a Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:57:29 2015 +0200 can now export partial data commit 80c598757d13db246fbc89423907fb24f0db23ee Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:56:32 2015 +0200 improve CSVProducer API commit 057b4a84db2f8602ffbad0c10f8610729fd08185 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:55:47 2015 +0200 introduce DataModel API in persistence module commit 29dd28c4a8c7deec091479d471bd85de87229768 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 28 19:07:49 2015 +0100 introduction d'une configuration pour l'export et utilisation dans les exports existants Summary of changes: .../tutti/persistence/TuttiPersistence.java | 33 ++ .../tutti/persistence/TuttiPersistenceImpl.java | 78 +++- .../persistence/TuttiPersistenceNoDbImpl.java | 16 + .../tutti/persistence/model/CruiseDataModel.java | 39 ++ .../tutti/persistence/model/DataModelSupport.java | 47 +++ .../persistence/model/OperationDataModel.java | 33 ++ .../tutti/persistence/model/ProgramDataModel.java | 39 ++ .../ifremer/tutti/service/PersistenceService.java | 18 +- .../fr/ifremer/tutti/service/csv/CsvProducer.java | 37 +- ...ort.java => GenericFormatCheckDataService.java} | 122 ++++--- .../GenericFormatExportActionEngine.java | 52 ++- .../GenericFormatExportConfiguration.java | 122 +++++++ .../genericformat/GenericFormatExportContext.java | 207 +++++++---- .../GenericFormatExportCruiseContext.java | 44 +++ .../genericformat/GenericFormatExportRequest.java | 77 ++++ .../genericformat/GenericFormatExportResult.java | 45 +++ .../genericformat/GenericFormatExportService.java | 392 ++++++--------------- .../genericformat/GenericFormatImportService.java | 50 ++- .../service/genericformat/csv/CatchModel.java | 2 +- .../tutti/service/genericformat/csv/CatchRow.java | 6 +- .../service/genericformat/csv/OperationRow.java | 186 +++++++--- .../exportactions/CheckDataAction.java | 45 +++ .../CreateAccidentalCatchRowsAction.java | 13 +- .../exportactions/CreateCatchBatchRowsAction.java | 86 ++++- .../CreateIndividualObservationRowsAction.java | 15 +- .../CreateMarineLitterRowsAction.java | 13 +- .../exportactions/CreateOperationRowsAction.java | 21 +- .../exportactions/CreateParameterRowsAction.java | 5 + .../ExportFishingOperationActionSupport.java | 3 + .../exportactions/ExportProtocolAction.java | 2 +- .../exportactions/ExportSurveyAction.java | 28 +- .../exportactions/FinalizeExportAction.java | 44 +-- .../exportactions/FlushOperationAction.java | 5 + .../exportactions/GenerateExportArchiveAction.java | 26 ++ .../exportactions/LoadDataAction.java | 52 +++ .../importactions/DoCheckWeightAction.java | 10 +- .../producer/CsvProducerForCatch.java | 32 ++ .../producer/CsvProducerForOperation.java | 1 - .../service/report/ReportGenerationRequest.java | 13 + .../service/report/ReportGenerationService.java | 24 +- .../resources/i18n/tutti-service_en_GB.properties | 3 + .../resources/i18n/tutti-service_fr_FR.properties | 3 + .../GenericFormatExportServiceAno5804Test.java | 11 +- .../GenericFormatExportServiceTest.java | 378 ++++++++++---------- .../filtered-resources/tutti-help-fr.properties | 39 +- .../fr/ifremer/tutti/ui/swing/TuttiScreen.java | 6 + .../fr/ifremer/tutti/ui/swing/content/MainUI.css | 13 +- .../fr/ifremer/tutti/ui/swing/content/MainUI.jaxx | 2 + .../tutti/ui/swing/content/MainUIHandler.java | 8 + .../actions/OpenGenericFormatExportScreen.java | 41 +++ .../actions/OpenGenericFormatImportScreen.java | 3 +- .../genericformat/GenericFormatExportUI.css | 169 +++++++++ .../genericformat/GenericFormatExportUI.jaxx | 121 +++++++ .../GenericFormatExportUIHandler.java | 154 ++++++++ .../genericformat/GenericFormatExportUIModel.java | 156 ++++++++ .../genericformat/actions/FoldAllDataAction.java | 41 +++ .../actions/GenericFormatExportAction.java | 113 ++++++ .../genericformat/actions/SelectAllDataAction.java | 35 ++ .../genericformat/actions/UnfoldAllDataAction.java | 39 ++ .../actions/UnselectAllDataAction.java | 35 ++ .../genericformat/tree/CruiseSelectTreeNode.java | 121 +++++++ .../tree/DataSelectTreeCellEditor.java | 65 ++++ .../tree/DataSelectTreeCellRenderer.java | 112 ++++++ .../tree/DataSelectTreeNodeSupport.java | 49 +++ .../tree/OperationSelectTreeNode.java | 51 +++ .../genericformat/tree/ProgramSelectTreeNode.java | 64 ++++ .../tutti/ui/swing/content/home/SelectCruiseUI.css | 10 +- .../ui/swing/content/home/SelectCruiseUI.jaxx | 26 +- .../swing/content/home/SelectCruiseUIHandler.java | 56 +-- .../actions/ExportGenericFormatCruiseAction.java | 41 ++- .../ExportGenericFormatProgramCruisesAction.java | 34 +- .../ImportGenericFormatProgramCruisesAction.java | 138 -------- .../ui/swing/content/report/ReportUIHandler.java | 4 + .../ui/swing/content/report/ReportUIModel.java | 10 + .../report/actions/GenerateReportAction.java | 17 +- .../ifremer/tutti/ui/swing/util/TuttiUIUtil.java | 33 -- .../resources/i18n/tutti-ui-swing_en_GB.properties | 58 +++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 63 +++- .../src/main/resources/icons/action-collapse.png | Bin 0 -> 372 bytes .../src/main/resources/icons/action-expand.png | Bin 0 -> 371 bytes .../src/main/resources/icons/action-select.png | Bin 0 -> 392 bytes .../src/main/resources/icons/action-unselect.png | Bin 0 -> 311 bytes 82 files changed, 3396 insertions(+), 1009 deletions(-) create mode 100644 tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/CruiseDataModel.java create mode 100644 tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/DataModelSupport.java create mode 100644 tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/OperationDataModel.java create mode 100644 tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/ProgramDataModel.java rename tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/{GenericFormatServiceSupport.java => GenericFormatCheckDataService.java} (63%) create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportConfiguration.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportCruiseContext.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportRequest.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportResult.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CheckDataAction.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/GenerateExportArchiveAction.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/LoadDataAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/OpenGenericFormatExportScreen.java rename tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/{home => }/actions/OpenGenericFormatImportScreen.java (94%) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUI.css create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUI.jaxx create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUIHandler.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUIModel.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/FoldAllDataAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/GenericFormatExportAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/SelectAllDataAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/UnfoldAllDataAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/UnselectAllDataAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/CruiseSelectTreeNode.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeCellEditor.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeCellRenderer.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeNodeSupport.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/OperationSelectTreeNode.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/ProgramSelectTreeNode.java delete mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ImportGenericFormatProgramCruisesAction.java create mode 100644 tutti-ui-swing/src/main/resources/icons/action-collapse.png create mode 100644 tutti-ui-swing/src/main/resources/icons/action-expand.png create mode 100644 tutti-ui-swing/src/main/resources/icons/action-select.png create mode 100644 tutti-ui-swing/src/main/resources/icons/action-unselect.png -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 29dd28c4a8c7deec091479d471bd85de87229768 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 28 19:07:49 2015 +0100 introduction d'une configuration pour l'export et utilisation dans les exports existants --- ...ort.java => GenericFormatCheckDataService.java} | 122 ++++--- .../GenericFormatExportActionEngine.java | 33 +- .../GenericFormatExportConfiguration.java | 56 +++ .../genericformat/GenericFormatExportContext.java | 84 +++-- .../GenericFormatExportCruiseContext.java | 44 +++ .../genericformat/GenericFormatExportRequest.java | 77 +++++ .../genericformat/GenericFormatExportResult.java | 41 +++ .../genericformat/GenericFormatExportService.java | 371 +++++++------------- .../genericformat/GenericFormatImportService.java | 50 ++- .../exportactions/CheckDataAction.java | 45 +++ .../CreateAccidentalCatchRowsAction.java | 8 +- .../exportactions/CreateCatchBatchRowsAction.java | 34 +- .../CreateIndividualObservationRowsAction.java | 8 +- .../CreateMarineLitterRowsAction.java | 8 +- .../exportactions/CreateOperationRowsAction.java | 8 +- .../exportactions/ExportProtocolAction.java | 2 +- .../exportactions/ExportSurveyAction.java | 28 +- .../exportactions/FinalizeExportAction.java | 71 +++- .../exportactions/GenerateExportArchiveAction.java | 26 ++ .../exportactions/LoadDataAction.java | 58 ++++ .../importactions/DoCheckWeightAction.java | 10 +- .../service/report/ReportGenerationService.java | 23 +- .../resources/i18n/tutti-service_en_GB.properties | 2 + .../resources/i18n/tutti-service_fr_FR.properties | 2 + .../GenericFormatExportServiceAno5804Test.java | 10 +- .../GenericFormatExportServiceTest.java | 377 +++++++++++---------- .../actions/ExportGenericFormatCruiseAction.java | 8 +- .../ExportGenericFormatProgramCruisesAction.java | 6 +- .../report/actions/GenerateReportAction.java | 17 +- .../resources/i18n/tutti-ui-swing_fr_FR.properties | 3 +- 30 files changed, 1037 insertions(+), 595 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatServiceSupport.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatCheckDataService.java similarity index 63% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatServiceSupport.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatCheckDataService.java index 4e806f9..4e744d4 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatServiceSupport.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatCheckDataService.java @@ -1,29 +1,7 @@ package fr.ifremer.tutti.service.genericformat; -/* - * #%L - * Tutti :: Service - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2012 - 2015 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.BatchContainer; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; @@ -36,44 +14,33 @@ import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiServiceContext; import fr.ifremer.tutti.service.catches.WeightComputingService; -import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryGearService; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryPersonService; -import fr.ifremer.tutti.service.referential.ReferentialTemporarySpeciesService; -import fr.ifremer.tutti.service.referential.ReferentialTemporaryVesselService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationBusinessException; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.Map; import java.util.Set; +import static org.nuiton.i18n.I18n.t; + /** - * Created on 2/22/15. + * Created on 3/28/15. * * @author Tony Chemit - chemit@codelutin.com - * @since 3.14 + * @since 3.14.3 */ -public abstract class GenericFormatServiceSupport extends AbstractTuttiService { +public class GenericFormatCheckDataService extends AbstractTuttiService { /** Logger. */ - private static final Log log = LogFactory.getLog(GenericFormatServiceSupport.class); + private static final Log log = LogFactory.getLog(GenericFormatCheckDataService.class); protected PersistenceService persistenceService; protected WeightComputingService weightComputingService; - protected ReferentialTemporaryGearService referentialTemporaryGearService; - - protected ReferentialTemporaryPersonService referentialTemporaryPersonService; - - protected ReferentialTemporarySpeciesService referentialTemporarySpeciesService; - - protected ReferentialTemporaryVesselService referentialTemporaryVesselService; - - protected ProtocolImportExportService protocolImportExportService; - protected Decorator<FishingOperation> fishingOperationDecorator; protected Decorator<Cruise> cruiseDecorator; @@ -84,11 +51,6 @@ public abstract class GenericFormatServiceSupport extends AbstractTuttiService { super.setServiceContext(context); persistenceService = getService(PersistenceService.class); weightComputingService = getService(WeightComputingService.class); - referentialTemporaryGearService = getService(ReferentialTemporaryGearService.class); - referentialTemporaryPersonService = getService(ReferentialTemporaryPersonService.class); - referentialTemporarySpeciesService = getService(ReferentialTemporarySpeciesService.class); - referentialTemporaryVesselService = getService(ReferentialTemporaryVesselService.class); - protocolImportExportService = getService(ProtocolImportExportService.class); DecoratorService decoratorService = getService(DecoratorService.class); cruiseDecorator = decoratorService.getDecoratorByType(Cruise.class); @@ -96,6 +58,70 @@ public abstract class GenericFormatServiceSupport extends AbstractTuttiService { } + public String getCruiseErrors(Cruise cruise, Set<FishingOperation> operations, ProgressionModel progressionModel) { + + Map<String, String> errors = getFishingOperationsErrors(cruise, operations, progressionModel); + + String result; + + if (!errors.isEmpty()) { + + StringBuilder errorMessageBuilder = new StringBuilder(); + + for (String error : errors.values()) { + errorMessageBuilder.append("<li>").append(error).append("</li>"); + } + + String cruiseStr = cruiseDecorator.toString(cruise); + result = t("tutti.service.genericFormat.invalid.cruise", cruiseStr, errorMessageBuilder.toString()); + + } else { + + result = null; + + } + + return result; + + } + + protected Map<String, String> getFishingOperationsErrors(Cruise cruise, + Set<FishingOperation> operations, + ProgressionModel progressionModel) { + + Preconditions.checkNotNull(cruise); + Preconditions.checkNotNull(progressionModel); + + progressionModel.increments(t("tutti.service.genericFormat.checkCruise", cruise.getName())); + + Map<String, String> errors = new LinkedHashMap<>(); + + for (FishingOperation fishingOperation : operations) { + + String fishingOperationId = fishingOperation.getId(); + + progressionModel.increments(t("tutti.service.genericFormat.checkCruiseFishingOperation", cruise.getName(), fishingOperationDecorator.toString(fishingOperation))); + + Set<String> errorsForOperation = checkFishingOperation(fishingOperationId); + if (!errorsForOperation.isEmpty()) { + + String fishingOperationStr = fishingOperationDecorator.toString(fishingOperation); + + StringBuilder sb = new StringBuilder(); + for (String error : errorsForOperation) { + sb.append("<li>").append(error).append("</li>"); + } + String errorMessage = t("tutti.service.genericFormat.invalid.fishingOperation", fishingOperationStr, sb.toString()); + errors.put(fishingOperationId, errorMessage); + + } + + } + + return errors; + + } + public Set<String> checkFishingOperation(String fishingOperationId) { if (log.isDebugEnabled()) { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportActionEngine.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportActionEngine.java index ac3799e..be3d49b 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportActionEngine.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportActionEngine.java @@ -3,6 +3,7 @@ package fr.ifremer.tutti.service.genericformat; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.genericformat.exportactions.CheckDataAction; import fr.ifremer.tutti.service.genericformat.exportactions.CreateAccidentalCatchRowsAction; import fr.ifremer.tutti.service.genericformat.exportactions.CreateCatchBatchRowsAction; import fr.ifremer.tutti.service.genericformat.exportactions.CreateIndividualObservationRowsAction; @@ -23,6 +24,8 @@ import fr.ifremer.tutti.service.genericformat.exportactions.ExportSurveyAction; import fr.ifremer.tutti.service.genericformat.exportactions.ExportTechnicalActionSupport; import fr.ifremer.tutti.service.genericformat.exportactions.FinalizeExportAction; import fr.ifremer.tutti.service.genericformat.exportactions.FlushOperationAction; +import fr.ifremer.tutti.service.genericformat.exportactions.GenerateExportArchiveAction; +import fr.ifremer.tutti.service.genericformat.exportactions.LoadDataAction; import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; import fr.ifremer.tutti.service.referential.ReferentialTemporaryGearService; import fr.ifremer.tutti.service.referential.ReferentialTemporaryPersonService; @@ -49,16 +52,33 @@ public class GenericFormatExportActionEngine { private final List<ExportFishingOperationActionSupport> fishingOperationsActions; + private final List<ExportTechnicalActionSupport> loadActions; + private final List<ExportTechnicalActionSupport> technicalActions; public GenericFormatExportActionEngine(TuttiServiceContext serviceContext) { + this.loadActions = createLoadActions(serviceContext); this.cruiseActions = createCruiseActions(serviceContext); this.fishingOperationsActions = createFishingOperationActions(serviceContext); this.technicalActions = createTechnicalActions(serviceContext); } + public void executeLoadActions(GenericFormatExportContext exportContext) { + + for (ExportTechnicalActionSupport action : loadActions) { + + if (log.isInfoEnabled()) { + log.info("Execute " + action.getClass().getSimpleName()); + } + + action.execute(exportContext); + + } + + } + public void executeCruiseActions(GenericFormatExportContext exportContext, Cruise cruise) { exportContext.setCruiseExported(true); @@ -103,13 +123,18 @@ public class GenericFormatExportActionEngine { } - public void executeSampleCategoryModelAction(GenericFormatExportContext exportContext) { + private List<ExportTechnicalActionSupport> createLoadActions(TuttiServiceContext serviceContext) { + + List<ExportTechnicalActionSupport> actions = new ArrayList<>(); - ExportSampleCategoryModelAction action = new ExportSampleCategoryModelAction(); - action.execute(exportContext); + actions.add(new LoadDataAction(serviceContext.getService(PersistenceService.class))); + actions.add(new CheckDataAction(serviceContext.getService(GenericFormatCheckDataService.class))); + + return actions; } + private List<ExportCruiseActionSupport> createCruiseActions(TuttiServiceContext serviceContext) { PersistenceService persistenceService = serviceContext.getService(PersistenceService.class); @@ -154,9 +179,9 @@ public class GenericFormatExportActionEngine { actions.add(new ExportReferentialSpeciesAction(serviceContext.getService(ReferentialTemporarySpeciesService.class))); actions.add(new ExportReferentialVesselAction(serviceContext.getService(ReferentialTemporaryVesselService.class))); actions.add(new FinalizeExportAction()); + actions.add(new GenerateExportArchiveAction()); return actions; } - } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportConfiguration.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportConfiguration.java new file mode 100644 index 0000000..724c472 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportConfiguration.java @@ -0,0 +1,56 @@ +package fr.ifremer.tutti.service.genericformat; + +import com.google.common.collect.Multimap; + +import java.io.File; +import java.io.Serializable; + +/** + * Created on 3/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class GenericFormatExportConfiguration implements Serializable { + + private static final long serialVersionUID = -6500054741804757627L; + + /** + * Ids of cruise (keys) and fishing operations to export. + */ + private Multimap<String, String> cruiseAndFishingOperationIds; + + /** + * Should we export attachments ? + */ + private boolean exportAttachments; + + /** + * Archive file to produce. + */ + private File exportFile; + + public Multimap<String, String> getCruiseAndFishingOperationIds() { + return cruiseAndFishingOperationIds; + } + + public void setCruiseAndFishingOperationIds(Multimap<String, String> cruiseAndFishingOperationIds) { + this.cruiseAndFishingOperationIds = cruiseAndFishingOperationIds; + } + + public boolean isExportAttachments() { + return exportAttachments; + } + + public void setExportAttachments(boolean exportAttachments) { + this.exportAttachments = exportAttachments; + } + + public File getExportFile() { + return exportFile; + } + + public void setExportFile(File exportFile) { + this.exportFile = exportFile; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java index 9f8bcee..df7d922 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java @@ -25,6 +25,7 @@ package fr.ifremer.tutti.service.genericformat; */ import com.google.common.base.Preconditions; +import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; @@ -65,10 +66,12 @@ import org.nuiton.decorator.Decorator; import java.io.Closeable; import java.io.File; -import java.io.IOException; import java.nio.file.Path; +import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; /** * Created on 2/5/15. @@ -76,15 +79,9 @@ import java.util.Map; * @author Tony Chemit - chemit@codelutin.com * @since 3.13 */ -public class GenericFormatExportContext implements Closeable { +public class GenericFormatExportContext implements Closeable, Iterable<GenericFormatExportCruiseContext> { - private final SampleCategoryModel sampleCategoryModel; - - private final TuttiProtocol tuttiProtocol; - - private final String countryId; - - private final GenericFormatArchive archive; + private final GenericFormatExportRequest exportRequest; private final Decorator<FishingOperation> fishingOperationDecorator; @@ -132,33 +129,37 @@ public class GenericFormatExportContext implements Closeable { private boolean operationExported; + private final Set<GenericFormatExportCruiseContext> cruiseContexts; + GenericFormatExportContext(ProgressionModel progressionModel, - GenericFormatArchive archive, - char csvSeparator, + GenericFormatExportRequest exportRequest, PersistenceService persistenceService, - Decorator<FishingOperation> fishingOperationDecorator, - SampleCategoryModel sampleCategoryModel, - TuttiProtocol tuttiProtocol, - String countryId, - Path attachmentSourcePath) { + Decorator<FishingOperation> fishingOperationDecorator) { Preconditions.checkNotNull(progressionModel); this.progressionModel = progressionModel; - this.archive = archive; + Preconditions.checkNotNull(exportRequest); + this.exportRequest = exportRequest; this.fishingOperationDecorator = fishingOperationDecorator; - this.sampleCategoryModel = sampleCategoryModel; - this.tuttiProtocol = tuttiProtocol; - this.countryId = countryId; this.weightMeasuredCaracteristic = persistenceService.getWeightMeasuredCaracteristic(); this.pmfmIdCaracteristic = persistenceService.getPmfmIdCaracteristic(); this.deadOrAliveCaracteristic = persistenceService.getDeadOrAliveCaracteristic(); this.genderCaracteristic = persistenceService.getSexCaracteristic(); + this.cruiseContexts = new LinkedHashSet<>(); List<Species> allReferentSpecies = persistenceService.getAllReferentSpecies(); Map<String, Species> speciesByReferenceTaxonId = Speciess.splitReferenceSpeciesByReferenceTaxonId(allReferentSpecies); + GenericFormatArchive archive = exportRequest.getArchive(); + + char csvSeparator = exportRequest.getCsvSeparator(); + + SampleCategoryModel sampleCategoryModel = exportRequest.getSampleCategoryModel(); + + Path attachmentsSourcePath = exportRequest.getAttachmentsSourcePath(); + this.producerForSurvey = new CsvProducerForSurvey(archive.getSurveyPath(), SurveyModel.forExport(csvSeparator)); this.producerForGearCaracteristics = new CsvProducerForGearCaracteristics(archive.getGearCaracteristicsPath(), GearCaracteristicModel.forExport(csvSeparator)); this.producerForOperation = new CsvProducerForOperation(archive.getOperationPath(), OperationModel.forExport(csvSeparator)); @@ -169,7 +170,7 @@ public class GenericFormatExportContext implements Closeable { this.producerForParameter = new CsvProducerForParameter(archive.getParameterPath(), ParameterModel.forExport(csvSeparator)); this.producerForMarineLitter = new CsvProducerForMarineLitter(archive.getMarineLitterPath(), MarineLitterModel.forExport(csvSeparator)); this.producerForSampleCategory = new CsvProducerForSampleCategory(archive.getSampleCategoryModelPath(), fr.ifremer.tutti.service.genericformat.csv.SampleCategoryModel.forExport(csvSeparator)); - this.producerForAttachment = new CsvProducerForAttachment(archive.getAttachmentFilePath(), AttachmentModel.forExport(csvSeparator), attachmentSourcePath, archive.getAttachmentDataPath()); + this.producerForAttachment = new CsvProducerForAttachment(archive.getAttachmentFilePath(), AttachmentModel.forExport(csvSeparator), attachmentsSourcePath, archive.getAttachmentDataPath()); this.producerForTemporaryGear = new CsvProducerForTemporaryGear(archive.getTemporaryReferentialGearsPath(), csvSeparator); this.producerForTemporaryPerson = new CsvProducerForTemporaryPerson(archive.getTemporaryReferentialPersonsPath(), csvSeparator); @@ -178,12 +179,16 @@ public class GenericFormatExportContext implements Closeable { } - public TuttiProtocol getTuttiProtocol() { - return tuttiProtocol; + public TuttiProtocol getProtocol() { + return exportRequest.getProtocol(); } - public String getCountryId() { - return countryId; + public File getExportFile() { + return exportRequest.getExportConfiguration().getExportFile(); + } + + public Multimap<String, String> getDataIdsToExport() { + return exportRequest.getExportConfiguration().getCruiseAndFishingOperationIds(); } public GenericFormatExportOperationContext newOperationContext(PersistenceService persistenceService, @@ -196,7 +201,7 @@ public class GenericFormatExportContext implements Closeable { operationLabel, persistenceService, weightComputingService, - sampleCategoryModel, + getSampleCategoryModel(), weightMeasuredCaracteristic, pmfmIdCaracteristic, deadOrAliveCaracteristic, @@ -206,7 +211,7 @@ public class GenericFormatExportContext implements Closeable { } @Override - public void close() throws IOException { + public void close() { IOUtils.closeQuietly(producerForSurvey); IOUtils.closeQuietly(producerForSpecies); @@ -226,6 +231,10 @@ public class GenericFormatExportContext implements Closeable { } + public ProgressionModel getProgressionModel() { + return progressionModel; + } + public CsvProducerForSurvey getProducerForSurvey() { return producerForSurvey; } @@ -286,12 +295,20 @@ public class GenericFormatExportContext implements Closeable { return producerForAttachment; } + public boolean isExportAttachments() { + return exportRequest.getExportConfiguration().isExportAttachments(); + } + + public GenericFormatArchive getArchive() { + return exportRequest.getArchive(); + } + public File getProtocolFile() { - return archive.getProtocolPath().toFile(); + return getArchive().getProtocolPath().toFile(); } public SampleCategoryModel getSampleCategoryModel() { - return sampleCategoryModel; + return exportRequest.getSampleCategoryModel(); } public void increments(String message) { @@ -314,4 +331,13 @@ public class GenericFormatExportContext implements Closeable { return operationExported; } + public void addCruiseContext(GenericFormatExportCruiseContext cruiseContext) { + cruiseContexts.add(cruiseContext); + } + + @Override + public Iterator<GenericFormatExportCruiseContext> iterator() { + return cruiseContexts.iterator(); + } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportCruiseContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportCruiseContext.java new file mode 100644 index 0000000..2a0ee5c --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportCruiseContext.java @@ -0,0 +1,44 @@ +package fr.ifremer.tutti.service.genericformat; + +import com.google.common.collect.ImmutableSet; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; + +import java.util.Set; + +/** + * Created on 3/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class GenericFormatExportCruiseContext { + + private String checkErrors; + + private final Cruise cruise; + + private final Set<FishingOperation> operations; + + public GenericFormatExportCruiseContext(Cruise cruise, Set<FishingOperation> operations) { + this.cruise = cruise; + this.operations = ImmutableSet.copyOf(operations); + } + + public Cruise getCruise() { + return cruise; + } + + public Set<FishingOperation> getOperations() { + return operations; + } + + public String getCheckErrors() { + return checkErrors; + } + + public void setCheckErrors(String checkErrors) { + this.checkErrors = checkErrors; + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportRequest.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportRequest.java new file mode 100644 index 0000000..a2c6a39 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportRequest.java @@ -0,0 +1,77 @@ +package fr.ifremer.tutti.service.genericformat; + +import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; + +import java.io.Serializable; +import java.nio.file.Path; + +/** + * Created on 3/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class GenericFormatExportRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + private final GenericFormatExportConfiguration exportConfiguration; + + private final GenericFormatArchive archive; + + private final char csvSeparator; + + private final SampleCategoryModel sampleCategoryModel; + + private final TuttiProtocol protocol; + + private final String countryId; + + private final Path attachmentsSourcePath; + + public GenericFormatExportRequest(GenericFormatExportConfiguration exportConfiguration, + GenericFormatArchive archive, + char csvSeparator, + SampleCategoryModel sampleCategoryModel, + TuttiProtocol protocol, + String countryId, + Path attachmentsSourcePath) { + this.exportConfiguration = exportConfiguration; + this.archive = archive; + this.csvSeparator = csvSeparator; + this.sampleCategoryModel = sampleCategoryModel; + this.protocol = protocol; + this.countryId = countryId; + this.attachmentsSourcePath = attachmentsSourcePath; + } + + public GenericFormatExportConfiguration getExportConfiguration() { + return exportConfiguration; + } + + public GenericFormatArchive getArchive() { + return archive; + } + + public char getCsvSeparator() { + return csvSeparator; + } + + public SampleCategoryModel getSampleCategoryModel() { + return sampleCategoryModel; + } + + public TuttiProtocol getProtocol() { + return protocol; + } + + public String getCountryId() { + return countryId; + } + + public Path getAttachmentsSourcePath() { + return attachmentsSourcePath; + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportResult.java new file mode 100644 index 0000000..5330b7d --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportResult.java @@ -0,0 +1,41 @@ +package fr.ifremer.tutti.service.genericformat; + +import java.io.Serializable; +import java.util.List; + +/** + * Created on 3/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class GenericFormatExportResult implements Serializable { + + private static final long serialVersionUID = 1L; + + private final GenericFormatExportConfiguration exportConfiguration; + + private final GenericFormatArchive archive; + + private final List<String> errorsByCruise; + + public GenericFormatExportResult(GenericFormatExportRequest exportRequest, + List<String> errorsByCruise) { + this.errorsByCruise = errorsByCruise; + this.archive = exportRequest.getArchive(); + this.exportConfiguration = exportRequest.getExportConfiguration(); + + } + + public GenericFormatExportConfiguration getExportConfiguration() { + return exportConfiguration; + } + + public GenericFormatArchive getArchive() { + return archive; + } + + public List<String> getErrorsByCruise() { + return errorsByCruise; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java index 4d086f0..3347457 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java @@ -22,18 +22,25 @@ package fr.ifremer.tutti.service.genericformat; * #L% */ -import com.google.common.base.Joiner; import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.catches.WeightComputingService; +import fr.ifremer.tutti.service.genericformat.csv.SampleCategoryModel; +import fr.ifremer.tutti.service.genericformat.csv.SampleCategoryRow; +import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForSampleCategory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.ApplicationBusinessException; +import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.File; @@ -42,10 +49,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; +import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -58,49 +63,33 @@ import static org.nuiton.i18n.I18n.t; * @author tchemit <chemit@codelutin.com> * @since 1.3 */ -public class GenericFormatExportService extends GenericFormatServiceSupport { +public class GenericFormatExportService extends AbstractTuttiService { private static final Log log = LogFactory.getLog(GenericFormatExportService.class); + private PersistenceService persistenceService; + + private WeightComputingService weightComputingService; + private GenericFormatExportActionEngine actionEngine; + private Decorator<FishingOperation> fishingOperationDecorator; + @Override public void setServiceContext(TuttiServiceContext context) { super.setServiceContext(context); + this.persistenceService = getService(PersistenceService.class); + this.weightComputingService = getService(WeightComputingService.class); this.actionEngine = new GenericFormatExportActionEngine(context); - } - - public int getExportProgramNbSteps(String programId) { - - // nbCruise * (check cruise / export cruise / gear caracteristics / operation / parameter / catches / individual observation / accidental catches / marine litters) + - // (species + sampleCategoryModel + protocol + temporary gear + temporary person + temporar species + temporary vessel + zip) - - List<Cruise> allCruise = persistenceService.getAllCruise(programId); - - int result = 8; - - for (Cruise cruise : allCruise) { - result += getCruiseNbStep(cruise.getId()); // check + export cruise - } - return result; - - } - - public int getExportCruiseNbSteps(String cruiseId) { - - int result = getCruiseNbStep(cruiseId) // check + export cruise - + 8; // export species + sampleCategoryModel + protocol + temporary gear + temporary person + temporar species + temporary vessel + zip - return result; + DecoratorService decoratorService = getService(DecoratorService.class); + this.fishingOperationDecorator = decoratorService.getDecoratorByType(FishingOperation.class); } - public void exportProgram(String programId, File exportFile, ProgressionModel progressionModel) { - - Preconditions.checkNotNull(programId); - Preconditions.checkNotNull(exportFile); + public GenericFormatExportConfiguration createExportConfigurationForProgram(String programId, File exportFile) { Program program = persistenceService.getProgram(programId); Preconditions.checkNotNull(program); @@ -109,160 +98,120 @@ public class GenericFormatExportService extends GenericFormatServiceSupport { log.debug("Will export program: " + programId); } - List<Cruise> allCruise = persistenceService.getAllCruise(programId); - - ApplicationBusinessException checkError = null; - try { - checkProgramCruises(progressionModel, allCruise); - } catch (ApplicationBusinessException e) { - // error while checking cruise - if (log.isDebugEnabled()) { - log.debug("Got a check cruise error", e); - } - checkError = e; + List<String> allCruiseIds = persistenceService.getAllCruiseId(programId); + Multimap<String, String> idsToExport = ArrayListMultimap.create(); + for (String cruiseId : allCruiseIds) { + List<String> operations = persistenceService.getAllFishingOperationIds(cruiseId); + idsToExport.putAll(cruiseId, operations); } - GenericFormatArchive genericFormatArchive = GenericFormatArchive.forExport(exportFile, context.getConfig().getTmpDirectory()); + GenericFormatExportConfiguration configuration = new GenericFormatExportConfiguration(); + configuration.setExportFile(exportFile); + configuration.setExportAttachments(true); + configuration.setCruiseAndFishingOperationIds(idsToExport); + return configuration; - try (GenericFormatExportContext exportContext = createExportContext(progressionModel, genericFormatArchive)) { - - for (Cruise cruise : allCruise) { - - // load full cruise - cruise = persistenceService.getCruise(cruise.getId()); - - List<FishingOperation> operations = persistenceService.getAllFishingOperation(cruise.getId()); + } - exportCruise(exportContext, cruise,operations); + public GenericFormatExportConfiguration createExportConfigurationForCruise(String cruiseId, File exportFile) { - } + Preconditions.checkNotNull(cruiseId); + Preconditions.checkNotNull(exportFile); - actionEngine.executeTechnicalActions(exportContext); + Cruise cruise = persistenceService.getCruise(cruiseId); + Preconditions.checkNotNull(cruise); - } catch (IOException e) { - throw new ApplicationTechnicalException("Could not create program export", e); + if (log.isDebugEnabled()) { + log.debug("Will export cruise: " + cruiseId); } - genericFormatArchive.createZip(progressionModel); + Multimap<String, String> idsToExport = ArrayListMultimap.create(); + List<String> operations = persistenceService.getAllFishingOperationIds(cruiseId); + idsToExport.putAll(cruiseId, operations); - if (checkError != null) { - throw checkError; - } + GenericFormatExportConfiguration configuration = new GenericFormatExportConfiguration(); + configuration.setExportFile(exportFile); + configuration.setExportAttachments(true); + configuration.setCruiseAndFishingOperationIds(idsToExport); + return configuration; } - public void exportCruise(String cruiseId, File exportFile, ProgressionModel progressionModel) { + public GenericFormatExportConfiguration createExportConfigurationForFishingOperation(String cruiseId, String fishingOperationId, File exportFile) { Preconditions.checkNotNull(cruiseId); - Preconditions.checkNotNull(exportFile); + Preconditions.checkNotNull(fishingOperationId); Cruise cruise = persistenceService.getCruise(cruiseId); Preconditions.checkNotNull(cruise); if (log.isDebugEnabled()) { - log.debug("Will export cruise: " + cruiseId); + log.debug("Will export fishing operation: " + fishingOperationId); } + FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); + Preconditions.checkNotNull(fishingOperation); - // check cruise fishing operations - ApplicationBusinessException checkError = null; - try { - - List<String> fishingOperationIds = persistenceService.getAllFishingOperationIds(cruise.getId()); - String error = getCruiseErrors(cruise, fishingOperationIds, progressionModel); - if (error != null) { - throw new ApplicationBusinessException(error); - } + Multimap<String, String> idsToExport = ArrayListMultimap.create(); + idsToExport.putAll(cruiseId, Collections.singletonList(fishingOperationId)); - } catch (ApplicationBusinessException e) { - // error while checking cruise - if (log.isDebugEnabled()) { - log.debug("Got a check cruise error", e); - } - checkError = e; - } + GenericFormatExportConfiguration configuration = new GenericFormatExportConfiguration(); + configuration.setExportFile(exportFile); + configuration.setExportAttachments(true); + configuration.setCruiseAndFishingOperationIds(idsToExport); + return configuration; - GenericFormatArchive genericFormatArchive = GenericFormatArchive.forExport(exportFile, context.getConfig().getTmpDirectory()); - try (GenericFormatExportContext exportContext = createExportContext(progressionModel, genericFormatArchive)) { + } - List<FishingOperation> operations = persistenceService.getAllFishingOperation(cruise.getId()); - exportCruise(exportContext, cruise, operations); + public int getExportNbSteps(GenericFormatExportConfiguration configuration) { - actionEngine.executeTechnicalActions(exportContext); + Multimap<String, String> cruiseAndFishingOperationIds = configuration.getCruiseAndFishingOperationIds(); - } catch (IOException e) { - throw new ApplicationTechnicalException("Could not create cruise export", e); + int result = 8; // export species + sampleCategoryModel + protocol + temporary gear + temporary person + temporar species + temporary vessel + zip + for (String cruiseId : cruiseAndFishingOperationIds.keySet()) { + result += getCruiseNbStep(cruiseId, cruiseAndFishingOperationIds.get(cruiseId).size()); } - genericFormatArchive.createZip(progressionModel); - - if (checkError != null) { - throw checkError; - } + return result; } - /** - * Export the given fishing operation of a cruise to file system in a temporary directory. - * - * @param cruiseId id of the cruise to export - * @param fishingOperationId id of the fishing operation to export - * @return the directory containing the export files - * @since 3.0-rc-2 - */ - public File exportFishingOperation(String cruiseId, String fishingOperationId) { - - Preconditions.checkNotNull(cruiseId); + public GenericFormatExportResult export(GenericFormatExportConfiguration configuration, ProgressionModel progressionModel) { - ProgressionModel progressionModel = new ProgressionModel(); - progressionModel.setTotal(1000); + Preconditions.checkNotNull(configuration); + Preconditions.checkNotNull(progressionModel); - Cruise cruise = persistenceService.getCruise(cruiseId); - Preconditions.checkNotNull(cruise); + GenericFormatExportRequest exportRequest = createExportRequest(configuration); - if (log.isDebugEnabled()) { - log.debug("Will export cruise: " + cruiseId); - } + List<String> errors = new ArrayList<>(); - // check cruise fishing operations - ApplicationBusinessException checkError = null; - try { + try (GenericFormatExportContext exportContext = createExportContext(exportRequest, progressionModel)) { - String error = getCruiseErrors(cruise, Lists.newArrayList(fishingOperationId), progressionModel); - if (error != null) { - throw new ApplicationBusinessException(error); - } + actionEngine.executeLoadActions(exportContext); - } catch (ApplicationBusinessException e) { - // error while checking cruise - if (log.isDebugEnabled()) { - log.debug("Got a check cruise error", e); - } - checkError = e; - } + for (GenericFormatExportCruiseContext cruiseContext : exportContext) { - GenericFormatArchive genericFormatArchive = GenericFormatArchive.forExport(null, context.getConfig().getTmpDirectory()); + Cruise cruise = cruiseContext.getCruise(); - try (GenericFormatExportContext exportContext = createExportContext(progressionModel, genericFormatArchive)) { + Set<FishingOperation> operations = cruiseContext.getOperations(); - FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); + String checkErrors = cruiseContext.getCheckErrors(); + if (checkErrors != null) { + errors.add(checkErrors); + } - exportCruise(exportContext, cruise, Lists.newArrayList(fishingOperation)); + exportCruise(exportContext, cruise, operations); + } actionEngine.executeTechnicalActions(exportContext); - } catch (IOException e) { - throw new ApplicationTechnicalException("Could not create cruise export", e); - } + GenericFormatExportResult result = new GenericFormatExportResult(exportRequest, errors); + return result; - if (checkError != null) { - // rethrow error - throw checkError; } - return genericFormatArchive.getWorkingDirectoryPath(); - } + /** * Export the sample category model as a csv file used for generic format import-export. * @@ -274,102 +223,75 @@ public class GenericFormatExportService extends GenericFormatServiceSupport { ProgressionModel progressionModel = new ProgressionModel(); progressionModel.setTotal(1000); - GenericFormatArchive genericFormatArchive = GenericFormatArchive.forExport(null, context.getConfig().getTmpDirectory()); + GenericFormatArchive archive = GenericFormatArchive.forExport(null, context.getConfig().getTmpDirectory()); - try (GenericFormatExportContext exportContext = createExportContext(progressionModel, genericFormatArchive)) { + CsvProducerForSampleCategory producerForSampleCategory = new CsvProducerForSampleCategory(archive.getSampleCategoryModelPath(), SampleCategoryModel.forExport(';')); - actionEngine.executeSampleCategoryModelAction(exportContext); + List<SampleCategoryRow> dataToExport = producerForSampleCategory.getDataToExport(context.getSampleCategoryModel()); - } catch (IOException e) { + try { + producerForSampleCategory.write(dataToExport); + } catch (Exception e) { throw new ApplicationTechnicalException("Could not export sample category model", e); } try { - Files.copy(genericFormatArchive.getSampleCategoryModelPath(), exportFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + Files.copy(archive.getSampleCategoryModelPath(), exportFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new ApplicationTechnicalException("Could not copy csv file to export file", e); } } - protected GenericFormatExportContext createExportContext(ProgressionModel progressionModel, GenericFormatArchive genericFormatArchive) { + protected GenericFormatExportRequest createExportRequest(GenericFormatExportConfiguration configuration) { Path attachmentsSourcePath = context.getConfig().getDbAttachmentDirectory().toPath(); TuttiProtocol tuttiProtocol = context.getDataContext().getProtocol(); - return new GenericFormatExportContext(progressionModel, - genericFormatArchive, - ';', - persistenceService, - fishingOperationDecorator, - context.getSampleCategoryModel(), - tuttiProtocol, - context.getConfig().getExportCountryId(), - attachmentsSourcePath); - - } - - protected void checkProgramCruises(ProgressionModel progressionModel, List<Cruise> allCruise) { + GenericFormatArchive archive = GenericFormatArchive.forExport(configuration.getExportFile(), context.getConfig().getTmpDirectory()); - List<String> errorsByCruise = new ArrayList<>(); - for (Cruise cruise : allCruise) { + GenericFormatExportRequest exportRequest = new GenericFormatExportRequest(configuration, + archive, + ';', + context.getSampleCategoryModel(), + tuttiProtocol, + context.getConfig().getExportCountryId(), + attachmentsSourcePath + ); - cruise = persistenceService.getCruise(cruise.getId()); - - List<String> allFishingOperation = persistenceService.getAllFishingOperationIds(cruise.getId()); - String error = getCruiseErrors(cruise, allFishingOperation, progressionModel); - - if (error != null) { - - if (log.isInfoEnabled()) { - log.info("Found some errors on cruise: " + cruise.getName()); - } - errorsByCruise.add(error); + return exportRequest; - } - - } - - if (!errorsByCruise.isEmpty()) { + } - // At least one cruise is bad - String errorMessage = Joiner.on("\n").join(errorsByCruise); - throw new ApplicationBusinessException(errorMessage); + protected GenericFormatExportContext createExportContext(GenericFormatExportRequest exportRequest, ProgressionModel progressionModel) { - } + return new GenericFormatExportContext(progressionModel, + exportRequest, + persistenceService, + fishingOperationDecorator); } - protected void exportCruise(GenericFormatExportContext exportContext, Cruise cruise, List<FishingOperation> operations) { + protected void exportCruise(GenericFormatExportContext exportContext, Cruise cruise, Set<FishingOperation> operations) { actionEngine.executeCruiseActions(exportContext, cruise); for (FishingOperation operation : operations) { - FishingOperation loadedOperation = persistenceService.getFishingOperation(operation.getId()); + GenericFormatExportOperationContext operationContext = exportContext.newOperationContext(persistenceService, weightComputingService, cruise, operation); + exportContext.increments(t("tutti.service.genericFormat.exportCruise.exportOperation", cruise.getName(), operationContext.getOperationLabel())); - exportOperation(exportContext, cruise, loadedOperation); + actionEngine.executeOperationActions(exportContext, operationContext); } } - protected void exportOperation(GenericFormatExportContext exportContext, Cruise cruise, FishingOperation operation) { - - GenericFormatExportOperationContext operationContext = exportContext.newOperationContext(persistenceService, weightComputingService, cruise, operation); - exportContext.increments(t("tutti.service.genericFormat.exportCruise.exportOperation", cruise.getName(), operationContext.getOperationLabel())); - - actionEngine.executeOperationActions(exportContext, operationContext); - - } - - protected int getCruiseNbStep(String cruiseId) { + protected int getCruiseNbStep(String cruiseId, int nbFishingOperations) { Cruise cruise = persistenceService.getCruise(cruiseId); Preconditions.checkNotNull(cruise); - List<String> allFishingOperationIds = persistenceService.getAllFishingOperationIds(cruiseId); - int nbFishingOperations = allFishingOperationIds.size(); int result = 1 + nbFishingOperations // check cruise + operations + 1 // export cruise @@ -380,65 +302,4 @@ public class GenericFormatExportService extends GenericFormatServiceSupport { } - protected String getCruiseErrors(Cruise cruise, Collection<String> fishingOperationIds, ProgressionModel progressionModel) { - - Map<String, String> errors = getFishingOperationsErrors(cruise, fishingOperationIds, progressionModel); - - String result; - - if (!errors.isEmpty()) { - - StringBuilder errorMessageBuilder = new StringBuilder(); - - for (String error : errors.values()) { - errorMessageBuilder.append("<li>").append(error).append("</li>"); - } - - String cruiseStr = cruiseDecorator.toString(cruise); - result = t("tutti.service.genericFormat.invalid.cruise", cruiseStr, errorMessageBuilder.toString()); - - } else { - - result = null; - - } - - return result; - - } - - protected Map<String, String> getFishingOperationsErrors(Cruise cruise, Collection<String> fishingOperationIds, ProgressionModel progressionModel) { - - Preconditions.checkNotNull(cruise); - Preconditions.checkNotNull(progressionModel); - - progressionModel.increments(t("tutti.service.genericFormat.checkCruise", cruise.getName())); - - Map<String, String> errors = new LinkedHashMap<>(); - - for (String fishingOperationId : fishingOperationIds) { - - FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); - progressionModel.increments(t("tutti.service.genericFormat.checkCruiseFishingOperation", cruise.getName(), fishingOperationDecorator.toString(fishingOperation))); - - Set<String> errorsForOperation = checkFishingOperation(fishingOperationId); - if (!errorsForOperation.isEmpty()) { - - String fishingOperationStr = fishingOperationDecorator.toString(fishingOperation); - - StringBuilder sb = new StringBuilder(); - for (String error : errorsForOperation) { - sb.append("<li>").append(error).append("</li>"); - } - String errorMessage = t("tutti.service.genericFormat.invalid.fishingOperation", fishingOperationStr, sb.toString()); - errors.put(fishingOperationId, errorMessage); - - } - - } - - return errors; - - } - } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java index 72d8712..cf2d065 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java @@ -28,10 +28,14 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.service.util.SynchronizationStatusHelper; +import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PdfGeneratorService; +import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiServiceContext; import fr.ifremer.tutti.service.catches.WeightCleaningService; import fr.ifremer.tutti.service.genericformat.importactions.DoCheckWeightAction; @@ -50,6 +54,7 @@ import fr.ifremer.tutti.service.genericformat.importactions.ImportReferentialPer import fr.ifremer.tutti.service.genericformat.importactions.ImportReferentialSpeciesAction; import fr.ifremer.tutti.service.genericformat.importactions.ImportReferentialVesselAction; import fr.ifremer.tutti.service.genericformat.importactions.ImportSurveyAction; +import fr.ifremer.tutti.service.genericformat.importactions.ImpotSampleCategoryAction; import fr.ifremer.tutti.service.genericformat.importactions.LoadAttachmentsAction; import fr.ifremer.tutti.service.genericformat.importactions.ValidateAccidentalCatchAction; import fr.ifremer.tutti.service.genericformat.importactions.ValidateCatchAction; @@ -58,10 +63,15 @@ import fr.ifremer.tutti.service.genericformat.importactions.ValidateIndividualOb import fr.ifremer.tutti.service.genericformat.importactions.ValidateMarineLitterAction; import fr.ifremer.tutti.service.genericformat.importactions.ValidateOperationAction; import fr.ifremer.tutti.service.genericformat.importactions.ValidateParameterAction; -import fr.ifremer.tutti.service.genericformat.importactions.ImpotSampleCategoryAction; import fr.ifremer.tutti.service.genericformat.importactions.ValidateSurveyAction; +import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; +import fr.ifremer.tutti.service.referential.ReferentialTemporaryGearService; +import fr.ifremer.tutti.service.referential.ReferentialTemporaryPersonService; +import fr.ifremer.tutti.service.referential.ReferentialTemporarySpeciesService; +import fr.ifremer.tutti.service.referential.ReferentialTemporaryVesselService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.decorator.Decorator; import java.io.File; import java.util.LinkedHashSet; @@ -75,20 +85,50 @@ import static org.nuiton.i18n.I18n.t; * @author Tony Chemit - chemit@codelutin.com * @since 3.14 */ -public class GenericFormatImportService extends GenericFormatServiceSupport { +public class GenericFormatImportService extends AbstractTuttiService { private static final Log log = LogFactory.getLog(GenericFormatImportService.class); - protected WeightCleaningService weightCleaningService; + private PersistenceService persistenceService; + + private ReferentialTemporaryGearService referentialTemporaryGearService; + + private ReferentialTemporaryPersonService referentialTemporaryPersonService; + + private ReferentialTemporarySpeciesService referentialTemporarySpeciesService; + + private ReferentialTemporaryVesselService referentialTemporaryVesselService; - protected PdfGeneratorService pdfGeneratorService; + private ProtocolImportExportService protocolImportExportService; + + private WeightCleaningService weightCleaningService; + + private PdfGeneratorService pdfGeneratorService; + + private GenericFormatCheckDataService checkDataService; + + private Decorator<FishingOperation> fishingOperationDecorator; + + private Decorator<Cruise> cruiseDecorator; @Override public void setServiceContext(TuttiServiceContext context) { super.setServiceContext(context); + weightCleaningService = getService(WeightCleaningService.class); pdfGeneratorService = getService(PdfGeneratorService.class); + checkDataService = getService(GenericFormatCheckDataService.class); + persistenceService = getService(PersistenceService.class); + referentialTemporaryGearService = getService(ReferentialTemporaryGearService.class); + referentialTemporaryPersonService = getService(ReferentialTemporaryPersonService.class); + referentialTemporarySpeciesService = getService(ReferentialTemporarySpeciesService.class); + referentialTemporaryVesselService = getService(ReferentialTemporaryVesselService.class); + protocolImportExportService = getService(ProtocolImportExportService.class); + + DecoratorService decoratorService = getService(DecoratorService.class); + cruiseDecorator = decoratorService.getDecoratorByType(Cruise.class); + fishingOperationDecorator = decoratorService.getDecoratorByType(FishingOperation.class); } @@ -379,7 +419,7 @@ public class GenericFormatImportService extends GenericFormatServiceSupport { actions.add(new ImportAccidentalCatchAction(importContext, persitenceHelper)); actions.add(new ImportIndividualObservationAction(importContext, persitenceHelper)); actions.add(new DoCleanWeightAction(importContext, weightCleaningService)); - actions.add(new DoCheckWeightAction(importContext, this)); + actions.add(new DoCheckWeightAction(importContext, checkDataService)); return actions; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CheckDataAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CheckDataAction.java new file mode 100644 index 0000000..2ffc165 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CheckDataAction.java @@ -0,0 +1,45 @@ +package fr.ifremer.tutti.service.genericformat.exportactions; + +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.genericformat.GenericFormatCheckDataService; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportContext; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportCruiseContext; + +import java.util.Set; + +/** + * Created on 3/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class CheckDataAction extends ExportTechnicalActionSupport { + + private final GenericFormatCheckDataService checkDataService; + + public CheckDataAction(GenericFormatCheckDataService checkDataService) { + + this.checkDataService = checkDataService; + + } + + @Override + public void execute(GenericFormatExportContext exportContext) { + + ProgressionModel progressionModel = exportContext.getProgressionModel(); + + for (GenericFormatExportCruiseContext cruiseContext : exportContext) { + + Cruise cruise = cruiseContext.getCruise(); + Set<FishingOperation> operations = cruiseContext.getOperations(); + + String checkErrors = checkDataService.getCruiseErrors(cruise, operations, progressionModel); + + cruiseContext.setCheckErrors(checkErrors); + + } + + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateAccidentalCatchRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateAccidentalCatchRowsAction.java index 17fbc37..829b5f0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateAccidentalCatchRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateAccidentalCatchRowsAction.java @@ -36,8 +36,12 @@ public class CreateAccidentalCatchRowsAction extends ExportFishingOperationActio operationContext.setAccidentalCatchRows(accidentalCatchRows); exportContext.getProducerForSpecies().prepareAccidentalRows(accidentalCatchRows); - List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getAccidentalBatches()); - operationContext.addAttachmentRows(attachmentRows); + if (exportContext.isExportAttachments()) { + + List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getAccidentalBatches()); + operationContext.addAttachmentRows(attachmentRows); + + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateCatchBatchRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateCatchBatchRowsAction.java index 11b881b..cd8b839 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateCatchBatchRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateCatchBatchRowsAction.java @@ -73,16 +73,20 @@ public class CreateCatchBatchRowsAction extends ExportFishingOperationActionSupp CsvProducerForSpecies producerForSpecies = exportContext.getProducerForSpecies(); producerForSpecies.prepareSpeciesBatchRows(rootSpeciesBatch); - CsvProducerForAttachment producerForAttachment = exportContext.getProducerForAttachment(); + if (exportContext.isExportAttachments()) { - List<AttachmentRow> attachmentRows = new ArrayList<>(); + CsvProducerForAttachment producerForAttachment = exportContext.getProducerForAttachment(); - for (SpeciesBatch speciesBatch : rootSpeciesBatch.getChildren()) { - List<Attachment> attachments = persistenceService.getAllAttachments(ObjectTypeCode.BATCH, speciesBatch.getIdAsInt()); - producerForAttachment.addAttachments(attachments, attachmentRows); - } + List<AttachmentRow> attachmentRows = new ArrayList<>(); + + for (SpeciesBatch speciesBatch : rootSpeciesBatch.getChildren()) { + List<Attachment> attachments = persistenceService.getAllAttachments(ObjectTypeCode.BATCH, speciesBatch.getIdAsInt()); + producerForAttachment.addAttachments(attachments, attachmentRows); + } + + operationContext.addAttachmentRows(attachmentRows); - operationContext.addAttachmentRows(attachmentRows); + } } @@ -96,13 +100,19 @@ public class CreateCatchBatchRowsAction extends ExportFishingOperationActionSupp CsvProducerForAttachment producerForAttachment = exportContext.getProducerForAttachment(); - List<AttachmentRow> attachmentRows = new ArrayList<>(); + if (exportContext.isExportAttachments()) { + + List<AttachmentRow> attachmentRows = new ArrayList<>(); + + for (BenthosBatch benthosBatch : rootSpeciesBatch.getChildren()) { + List<Attachment> attachments = persistenceService.getAllAttachments(ObjectTypeCode.BATCH, benthosBatch.getIdAsInt()); + producerForAttachment.addAttachments(attachments, attachmentRows); + } + + operationContext.addAttachmentRows(attachmentRows); - for (BenthosBatch benthosBatch : rootSpeciesBatch.getChildren()) { - List<Attachment> attachments = persistenceService.getAllAttachments(ObjectTypeCode.BATCH, benthosBatch.getIdAsInt()); - producerForAttachment.addAttachments(attachments, attachmentRows); } - operationContext.addAttachmentRows(attachmentRows); + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateIndividualObservationRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateIndividualObservationRowsAction.java index 5a1f35f..3230f49 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateIndividualObservationRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateIndividualObservationRowsAction.java @@ -36,8 +36,12 @@ public class CreateIndividualObservationRowsAction extends ExportFishingOperatio operationContext.setIndividualObservationRows(individualObservationRows); exportContext.getProducerForSpecies().prepareIndividualRows(individualObservationRows); - List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getIndividualObservations()); - operationContext.addAttachmentRows(attachmentRows); + if (exportContext.isExportAttachments()) { + + List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getIndividualObservations()); + operationContext.addAttachmentRows(attachmentRows); + + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateMarineLitterRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateMarineLitterRowsAction.java index 9d49530..452b336 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateMarineLitterRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateMarineLitterRowsAction.java @@ -36,8 +36,12 @@ public class CreateMarineLitterRowsAction extends ExportFishingOperationActionSu List<MarineLitterRow> marineLitterRows = exportContext.getProducerForMarineLitter().getDataToExport(operationContext); operationContext.setMarineLitterRows(marineLitterRows); - List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getRootMarineLitterBatch()); - operationContext.addAttachmentRows(attachmentRows); + if (exportContext.isExportAttachments()) { + + List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getRootMarineLitterBatch()); + operationContext.addAttachmentRows(attachmentRows); + + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateOperationRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateOperationRowsAction.java index 132d4bc..43ec895 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateOperationRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateOperationRowsAction.java @@ -39,8 +39,12 @@ public class CreateOperationRowsAction extends ExportFishingOperationActionSuppo OperationRow operationRow = exportContext.getProducerForOperation().getDataToExport(cruise, operation, catchBatch); operationContext.setOperationRow(operationRow); - List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operation, catchBatch); - operationContext.addAttachmentRows(attachmentRows); + if (exportContext.isExportAttachments()) { + + List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operation, catchBatch); + operationContext.addAttachmentRows(attachmentRows); + + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportProtocolAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportProtocolAction.java index 1eb9ec5..da82a62 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportProtocolAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportProtocolAction.java @@ -24,7 +24,7 @@ public class ExportProtocolAction extends ExportTechnicalActionSupport { @Override public void execute(GenericFormatExportContext exportContext) { - TuttiProtocol protocol = exportContext.getTuttiProtocol(); + TuttiProtocol protocol = exportContext.getProtocol(); if (protocol != null) { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportSurveyAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportSurveyAction.java index 37566eb..1602071 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportSurveyAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportSurveyAction.java @@ -49,17 +49,31 @@ public class ExportSurveyAction extends ExportCruiseActionSupport { SurveyRow surveyRow = producerForSurvey.getDataToExport(cruise, country); producerForSurvey.write(surveyRow); - List<Attachment> attachments = persistenceService.getAllAttachments(ObjectTypeCode.SCIENTIFIC_CRUISE, cruise.getIdAsInt()); - - CsvProducerForAttachment producerForAttachment = exportContext.getProducerForAttachment(); - List<AttachmentRow> attachmentRows = new ArrayList<>(); - producerForAttachment.addAttachments(attachments, attachmentRows); - producerForAttachment.write(attachmentRows); - } catch (Exception e) { throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.survey.error"), e); } + if (exportContext.isExportAttachments()) { + + exportAttachments(exportContext, cruise); + + } + + } + + protected void exportAttachments(GenericFormatExportContext exportContext, Cruise cruise) { + + List<Attachment> attachments = persistenceService.getAllAttachments(ObjectTypeCode.SCIENTIFIC_CRUISE, cruise.getIdAsInt()); + + CsvProducerForAttachment producerForAttachment = exportContext.getProducerForAttachment(); + List<AttachmentRow> attachmentRows = new ArrayList<>(); + producerForAttachment.addAttachments(attachments, attachmentRows); + + try { + producerForAttachment.write(attachmentRows); + } catch (Exception e) { + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.attachment.error"), e); + } } } \ No newline at end of file diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FinalizeExportAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FinalizeExportAction.java index 35b9cb9..35d3d1c 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FinalizeExportAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FinalizeExportAction.java @@ -16,32 +16,67 @@ public class FinalizeExportAction extends ExportTechnicalActionSupport { @Override public void execute(GenericFormatExportContext exportContext) { - if (!exportContext.isCruiseExported()) { + try { - try { - exportContext.getProducerForSurvey().writeEmpty(); - exportContext.getProducerForGearCaracteristics().writeEmpty(); - } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.survey.error"), e); + if (!exportContext.isCruiseExported()) { + addEmptyCruiseFiles(exportContext); } + if (!exportContext.isOperationExported()) { + addEmptyOperationFiles(exportContext); + } + + if (!exportContext.isExportAttachments()) { + addEmptyAttachmentFile(exportContext); + } + + } finally { + + exportContext.close(); + } - if (!exportContext.isOperationExported()) { + } - try { - exportContext.getProducerForOperation().writeEmpty(); - exportContext.getProducerForParameter().writeEmpty(); - exportContext.getProducerForAccidentalCatch().writeEmpty(); - exportContext.getProducerForIndividualObservation().writeEmpty(); - exportContext.getProducerForCatch().writeEmpty(); - exportContext.getProducerForMarineLitter().writeEmpty(); - exportContext.getProducerForAttachment().writeEmpty(); + protected void addEmptyCruiseFiles(GenericFormatExportContext exportContext) { - } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.operations.error"), e); - } + try { + + exportContext.getProducerForSurvey().writeEmpty(); + exportContext.getProducerForGearCaracteristics().writeEmpty(); + exportContext.getProducerForAttachment().writeEmpty(); + + } catch (Exception e) { + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.survey.error"), e); + } + + } + + protected void addEmptyOperationFiles(GenericFormatExportContext exportContext) { + + try { + + exportContext.getProducerForOperation().writeEmpty(); + exportContext.getProducerForParameter().writeEmpty(); + exportContext.getProducerForAccidentalCatch().writeEmpty(); + exportContext.getProducerForIndividualObservation().writeEmpty(); + exportContext.getProducerForCatch().writeEmpty(); + exportContext.getProducerForMarineLitter().writeEmpty(); + + } catch (Exception e) { + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.operations.error"), e); + } + + } + + protected void addEmptyAttachmentFile(GenericFormatExportContext exportContext) { + + try { + + exportContext.getProducerForAttachment().writeEmpty(); + } catch (Exception e) { + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.attachments.error"), e); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/GenerateExportArchiveAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/GenerateExportArchiveAction.java new file mode 100644 index 0000000..b88917f --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/GenerateExportArchiveAction.java @@ -0,0 +1,26 @@ +package fr.ifremer.tutti.service.genericformat.exportactions; + +import fr.ifremer.tutti.service.genericformat.GenericFormatArchive; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportContext; + +/** + * Created on 3/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class GenerateExportArchiveAction extends ExportTechnicalActionSupport { + + @Override + public void execute(GenericFormatExportContext exportContext) { + + if (exportContext.getExportFile() != null) { + + GenericFormatArchive archive = exportContext.getArchive(); + archive.createZip(exportContext.getProgressionModel()); + + } + + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/LoadDataAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/LoadDataAction.java new file mode 100644 index 0000000..f932632 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/LoadDataAction.java @@ -0,0 +1,58 @@ +package fr.ifremer.tutti.service.genericformat.exportactions; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Multimap; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportContext; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportCruiseContext; + +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 3/28/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class LoadDataAction extends ExportTechnicalActionSupport { + + private final PersistenceService persistenceService; + + public LoadDataAction(PersistenceService persistenceService) { + + this.persistenceService = persistenceService; + } + + @Override + public void execute(GenericFormatExportContext exportContext) { + + Multimap<String, String> dataIdsToExport = exportContext.getDataIdsToExport(); + + for (String cruiseId : dataIdsToExport.keySet()) { + + Collection<String> operationIds = dataIdsToExport.get(cruiseId); + + Cruise cruise = persistenceService.getCruise(cruiseId); + Preconditions.checkNotNull(cruise); + + Set<FishingOperation> operations = new LinkedHashSet<>(); + if (!operationIds.isEmpty()) { + for (String operationId : operationIds) { + + FishingOperation operation = persistenceService.getFishingOperation(operationId); + operations.add(operation); + + } + + } + + GenericFormatExportCruiseContext cruiseContext = new GenericFormatExportCruiseContext(cruise, operations); + exportContext.addCruiseContext(cruiseContext); + + } + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCheckWeightAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCheckWeightAction.java index a0bc986..95170cf 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCheckWeightAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/DoCheckWeightAction.java @@ -25,10 +25,10 @@ package fr.ifremer.tutti.service.genericformat.importactions; */ import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.service.genericformat.GenericFormatCheckDataService; import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportCruiseContext; import fr.ifremer.tutti.service.genericformat.GenericFormatImportOperationContext; -import fr.ifremer.tutti.service.genericformat.GenericFormatImportService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -47,11 +47,11 @@ public class DoCheckWeightAction extends ImportActionSupport { /** Logger. */ private static final Log log = LogFactory.getLog(DoCheckWeightAction.class); - private final GenericFormatImportService importService; + private final GenericFormatCheckDataService checkDataService; - public DoCheckWeightAction(GenericFormatImportContext importContext, GenericFormatImportService importService) { + public DoCheckWeightAction(GenericFormatImportContext importContext, GenericFormatCheckDataService checkDataService) { super(importContext); - this.importService = importService; + this.checkDataService = checkDataService; } @Override @@ -78,7 +78,7 @@ public class DoCheckWeightAction extends ImportActionSupport { progressionModel.increments(t("tutti.service.genericFormat.checkWeights.fishingOperation", cruiseContext.getCruiseLabel(), operationContext.getFishingOperationLabel())); - Set<String> errors = importService.checkFishingOperation(operationContext.getFishingOperation().getId()); + Set<String> errors = checkDataService.checkFishingOperation(operationContext.getFishingOperation().getId()); operationContext.addCheckErrors(errors); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationService.java index e29bdc7..4698ff8 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationService.java @@ -31,6 +31,8 @@ import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.service.AbstractTuttiService; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportConfiguration; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportResult; import fr.ifremer.tutti.service.genericformat.GenericFormatExportService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -88,10 +90,13 @@ public class ReportGenerationService extends AbstractTuttiService { // export fishing operation progressionModel.increments(t("tutti.report.step.export.fishingOperation")); - File exportDirectory = getService(GenericFormatExportService.class). - exportFishingOperation(request.getCruiseId(), - request.getFishingOperationId()); + GenericFormatExportService service = getService(GenericFormatExportService.class); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForFishingOperation(request.getCruiseId(), request.getFishingOperationId(), null); + GenericFormatExportResult exportResult = service.export(exportConfiguration, progressionModel); + + File exportDirectory = exportResult.getArchive().getWorkingDirectoryPath(); + File outputFile = newOutputFile(); ReportGenerationContext reportContext = new ReportGenerationContext(request, @@ -195,4 +200,16 @@ public class ReportGenerationService extends AbstractTuttiService { } + public int getNbSteps(ReportGenerationRequest request) { + + // get data / export / generate + int result = 4; + + GenericFormatExportService service = getService(GenericFormatExportService.class); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForFishingOperation(request.getCruiseId(), request.getFishingOperationId(), null); + result += service.getExportNbSteps(exportConfiguration); + return result; + + } + } diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index cf00e44..61b00b9 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -124,6 +124,8 @@ tutti.service.genericFormat.checkCruiseFishingOperation= tutti.service.genericFormat.checkWeights.fishingOperation= tutti.service.genericFormat.cleanWeights.fishingOperation= tutti.service.genericFormat.export.accidentalCatch.error= +tutti.service.genericFormat.export.attachment.error= +tutti.service.genericFormat.export.attachments.error= tutti.service.genericFormat.export.buildZip= tutti.service.genericFormat.export.catches.error= tutti.service.genericFormat.export.closeContext.error= diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index 88950e6..226148a 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -100,6 +100,8 @@ tutti.service.genericFormat.checkCruiseFishingOperation=Vérification de la camp tutti.service.genericFormat.checkWeights.fishingOperation=Vérification des poids du trait <strong>%s</strong> - <strong>%s</strong> tutti.service.genericFormat.cleanWeights.fishingOperation=Suppression des poids en double du trait <strong>%s</strong> - <strong>%s</strong> tutti.service.genericFormat.export.accidentalCatch.error=Erreur lors de l'export des captures accidentelles +tutti.service.genericFormat.export.attachment.error= +tutti.service.genericFormat.export.attachments.error= tutti.service.genericFormat.export.buildZip=Création de l'archive de l'export (fichier %s) tutti.service.genericFormat.export.catches.error=Erreur lors de l'export des captures tutti.service.genericFormat.export.closeContext.error=Erreur lors de la fermeture du contexte d'export diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceAno5804Test.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceAno5804Test.java index e579cc0..3ce33ec 100644 --- a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceAno5804Test.java +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceAno5804Test.java @@ -87,7 +87,7 @@ public class GenericFormatExportServiceAno5804Test { dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_ID, 3, OPERATION_1_ID, OPERATION_2_ID, OPERATION_3_ID); progressionModel = new ProgressionModel(); - progressionModel.setTotal(9); + } @Test @@ -99,7 +99,13 @@ public class GenericFormatExportServiceAno5804Test { Assert.assertFalse(exportFile.exists()); - service.exportCruise(dataContext.cruise.getId(), exportFile, progressionModel); + String cruiseId = dataContext.cruise.getId(); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(cruiseId, exportFile); + + int nbSteps = service.getExportNbSteps(exportConfiguration); + progressionModel.setTotal(nbSteps); + + service.export(exportConfiguration, progressionModel); Assert.assertTrue(exportFile.exists()); } diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceTest.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceTest.java index 3f648fc..f0677ab 100644 --- a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceTest.java +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceTest.java @@ -24,10 +24,6 @@ package fr.ifremer.tutti.service.genericformat; import com.google.common.io.Files; import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.ServiceDbResource; import fr.ifremer.tutti.service.TuttiServiceContext; @@ -38,8 +34,6 @@ import org.junit.Ignore; import org.junit.Test; import java.io.File; -import java.util.List; -import java.util.Map; /** * @author tchemit <chemit@codelutin.com> @@ -239,9 +233,12 @@ public class GenericFormatExportServiceTest { Assert.assertFalse(exportFile.exists()); String programId = dataContext.program.getId(); - progressionModel.setTotal(service.getExportProgramNbSteps(programId)); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForProgram(programId, exportFile); - service.exportProgram(programId, exportFile, progressionModel); + int nbSteps = service.getExportNbSteps(exportConfiguration); + progressionModel.setTotal(nbSteps); + + service.export(exportConfiguration, progressionModel); Assert.assertTrue(exportFile.exists()); } @@ -252,193 +249,197 @@ public class GenericFormatExportServiceTest { Assert.assertFalse(exportFile.exists()); - progressionModel.setTotal(service.getExportCruiseNbSteps(dataContext.cruise.getId())); - - service.exportCruise(dataContext.cruise.getId(), exportFile, progressionModel); - Assert.assertTrue(exportFile.exists()); - } - - @Test - public void exportSurvey() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); - } - ServiceDbResource.assertFileContent("Survey export:\n", - archive.getSurveyPath().toFile(), - SURVEY_CONTENT); - } - - @Test - public void exportGearCaracteristics() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportGearCaracteristics(exportContext, dataContext.cruise); - } - ServiceDbResource.assertFileContent("Gear caracteristics export:\n", - archive.getGearCaracteristicsPath().toFile(), - GEAR_CARACTERISTICS_CONTENT); - } - - @Test - public void exportOperations() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); - } - ServiceDbResource.assertFileContent("Operation export:\n", - archive.getOperationPath().toFile(), - OPERATION_CONTENT); - } - - @Test - public void exportOperationsWithNoCatches() throws Exception { - - dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_CGFS_ID, NB_EXPECTED_CGFS_OPERATIONS); - - FishingOperation operation = TuttiEntities.findById(dataContext.operations, "100105"); - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportOperation(exportContext, dataContext.cruise, operation); - } - - ServiceDbResource.assertFileContent("Operation export:\n", - archive.getOperationPath().toFile(), - OPERATION_WITH_NO_CATCH_CONTENT); - } - - @Test - public void exportOperationsWithNoGear() throws Exception { - - dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_CGFS_ID, NB_EXPECTED_CGFS_OPERATIONS); + String cruiseId = dataContext.cruise.getId(); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(cruiseId, exportFile); - FishingOperation operation = TuttiEntities.findById(dataContext.operations, "100105"); - operation.setGear(null); + int nbSteps = service.getExportNbSteps(exportConfiguration); + progressionModel.setTotal(nbSteps); - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportOperation(exportContext, dataContext.cruise, operation); - } - - ServiceDbResource.assertFileContent("Operation export:\n", - archive.getOperationPath().toFile(), - OPERATION_WITH_NO_CATCH_CONTENT_AND_NO_GEAR); - } - - @Test - public void exportParameters() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); - } - - ServiceDbResource.assertFileContent("Parameter export:\n", - archive.getParameterPath().toFile(), - PARAMETER_CONTENT); + service.export(exportConfiguration, progressionModel); + Assert.assertTrue(exportFile.exists()); } - @Test - public void exportCatches() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); - } - ServiceDbResource.assertFileContent("Catch export:\n", - archive.getCatchPath().toFile(), - CATCH_CONTENT); - } +// @Test +// public void exportSurvey() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); +// } +// ServiceDbResource.assertFileContent("Survey export:\n", +// archive.getSurveyPath().toFile(), +// SURVEY_CONTENT); +// } +// +// @Test +// public void exportGearCaracteristics() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportGearCaracteristics(exportContext, dataContext.cruise); +// } +// ServiceDbResource.assertFileContent("Gear caracteristics export:\n", +// archive.getGearCaracteristicsPath().toFile(), +// GEAR_CARACTERISTICS_CONTENT); +// } +// +// @Test +// public void exportOperations() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); +// } +// ServiceDbResource.assertFileContent("Operation export:\n", +// archive.getOperationPath().toFile(), +// OPERATION_CONTENT); +// } +// +// @Test +// public void exportOperationsWithNoCatches() throws Exception { +// +// dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_CGFS_ID, NB_EXPECTED_CGFS_OPERATIONS); +// +// FishingOperation operation = TuttiEntities.findById(dataContext.operations, "100105"); +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportOperation(exportContext, dataContext.cruise, operation); +// } +// +// ServiceDbResource.assertFileContent("Operation export:\n", +// archive.getOperationPath().toFile(), +// OPERATION_WITH_NO_CATCH_CONTENT); +// } +// +// @Test +// public void exportOperationsWithNoGear() throws Exception { +// +// dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_CGFS_ID, NB_EXPECTED_CGFS_OPERATIONS); +// +// FishingOperation operation = TuttiEntities.findById(dataContext.operations, "100105"); +// operation.setGear(null); +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportOperation(exportContext, dataContext.cruise, operation); +// } +// +// ServiceDbResource.assertFileContent("Operation export:\n", +// archive.getOperationPath().toFile(), +// OPERATION_WITH_NO_CATCH_CONTENT_AND_NO_GEAR); +// } +// +// @Test +// public void exportParameters() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); +// } +// +// ServiceDbResource.assertFileContent("Parameter export:\n", +// archive.getParameterPath().toFile(), +// PARAMETER_CONTENT); +// } +// +// @Test +// public void exportCatches() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); +// } +// ServiceDbResource.assertFileContent("Catch export:\n", +// archive.getCatchPath().toFile(), +// CATCH_CONTENT); +// } // To fix http://forge.codelutin.com/issues/2692 - @Test - public void exportCatchesAndSpecies() throws Exception { - - File protocolFile = new File("src/test/resources/tuttiProtocol.tuttiProtocol"); - - TuttiProtocol protocol = dbResource.loadProtocol(protocolFile); - - persistenceService.setProtocol(protocol); - - dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_CGFS_ID, NB_EXPECTED_CGFS_OPERATIONS); - - FishingOperation operation = TuttiEntities.findById(dataContext.operations, "100000"); - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportOperation(exportContext, dataContext.cruise, operation); - service.exportSpecies(exportContext); - } - - ServiceDbResource.assertFileContent("species export:\n", - archive.getSpeciesPath().toFile(), - SPECIES_CONTENT_2); - - ServiceDbResource.assertFileContent("Catch export:\n", - archive.getCatchPath().toFile(), - CATCH_CONTENT_2); - - - } +// @Test +// public void exportCatchesAndSpecies() throws Exception { +// +// File protocolFile = new File("src/test/resources/tuttiProtocol.tuttiProtocol"); +// +// TuttiProtocol protocol = dbResource.loadProtocol(protocolFile); +// +// persistenceService.setProtocol(protocol); +// +// dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_CGFS_ID, NB_EXPECTED_CGFS_OPERATIONS); +// +// FishingOperation operation = TuttiEntities.findById(dataContext.operations, "100000"); +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportOperation(exportContext, dataContext.cruise, operation); +// service.exportSpecies(exportContext); +// } +// +// ServiceDbResource.assertFileContent("species export:\n", +// archive.getSpeciesPath().toFile(), +// SPECIES_CONTENT_2); +// +// ServiceDbResource.assertFileContent("Catch export:\n", +// archive.getCatchPath().toFile(), +// CATCH_CONTENT_2); +// +// +// } // To fix http://forge.codelutin.com/issues/2523 - @Test - public void exportBadCatches() throws Exception { - - dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_CGFS_ID, NB_EXPECTED_CGFS_OPERATIONS); - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); - } - } - - @Test - public void exportMarineLitters() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); - } - ServiceDbResource.assertFileContent("MarineLitter export:\n", - archive.getMarineLitterPath().toFile(), - MARINE_LITTER_CONTENT); - } - - @Test - public void exportIndividualObservations() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); - } - ServiceDbResource.assertFileContent("individualObservation export:\n", - archive.getIndividualObservationPath().toFile(), - INDIVIDUAL_OBSERVATION_CONTENT); - } - - @Test - public void exportAccidentalCatch() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); - } - ServiceDbResource.assertFileContent("accidentalCatch export:\n", - archive.getAccidentalCatchPath().toFile(), - ACCIDENTAL_CATCH_CONTENT); - } - - @Test - public void exportSpecies() throws Exception { - - try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { - List<Species> allReferentSpecies = - persistenceService.getAllReferentSpecies(); - - Map<String, Species> allReferentSpeciesById = - TuttiEntities.splitById(allReferentSpecies); - exportContext.getProducerForSpecies().addSpecies(allReferentSpeciesById.get("35883")); - exportContext.getProducerForSpecies().addSpecies(allReferentSpeciesById.get("35884")); - exportContext.getProducerForSpecies().addSpecies(allReferentSpeciesById.get("19279")); - - service.exportSpecies(exportContext); - } - ServiceDbResource.assertFileContent("species export:\n", - archive.getSpeciesPath().toFile(), - SPECIES_CONTENT); - } +// @Test +// public void exportBadCatches() throws Exception { +// +// dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_CGFS_ID, NB_EXPECTED_CGFS_OPERATIONS); +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); +// } +// } +// +// @Test +// public void exportMarineLitters() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); +// } +// ServiceDbResource.assertFileContent("MarineLitter export:\n", +// archive.getMarineLitterPath().toFile(), +// MARINE_LITTER_CONTENT); +// } +// +// @Test +// public void exportIndividualObservations() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); +// } +// ServiceDbResource.assertFileContent("individualObservation export:\n", +// archive.getIndividualObservationPath().toFile(), +// INDIVIDUAL_OBSERVATION_CONTENT); +// } +// +// @Test +// public void exportAccidentalCatch() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// service.exportCruise(exportContext, dataContext.cruise, dataContext.operations); +// } +// ServiceDbResource.assertFileContent("accidentalCatch export:\n", +// archive.getAccidentalCatchPath().toFile(), +// ACCIDENTAL_CATCH_CONTENT); +// } +// +// @Test +// public void exportSpecies() throws Exception { +// +// try (GenericFormatExportContext exportContext = service.createExportContext(progressionModel, archive)) { +// List<Species> allReferentSpecies = +// persistenceService.getAllReferentSpecies(); +// +// Map<String, Species> allReferentSpeciesById = +// TuttiEntities.splitById(allReferentSpecies); +// exportContext.getProducerForSpecies().addSpecies(allReferentSpeciesById.get("35883")); +// exportContext.getProducerForSpecies().addSpecies(allReferentSpeciesById.get("35884")); +// exportContext.getProducerForSpecies().addSpecies(allReferentSpeciesById.get("19279")); +// +// service.exportSpecies(exportContext); +// } +// ServiceDbResource.assertFileContent("species export:\n", +// archive.getSpeciesPath().toFile(), +// SPECIES_CONTENT); +// } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatCruiseAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatCruiseAction.java index 6936da3..00e4783 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatCruiseAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatCruiseAction.java @@ -25,6 +25,7 @@ package fr.ifremer.tutti.ui.swing.content.home.actions; import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportConfiguration; import fr.ifremer.tutti.service.genericformat.GenericFormatExportService; import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUI; @@ -101,14 +102,15 @@ public class ExportGenericFormatCruiseAction extends LongActionSupport<SelectCru ProgressionModel progressionModel = getProgressionModel(); progressionModel.increments(t("tutti.exportCruise.action.computeNbSteps")); - - int nbSteps = service.getExportCruiseNbSteps(cruise.getId()); + + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(cruise.getId(), file); + int nbSteps = service.getExportNbSteps(exportConfiguration); progressionModel.adaptTotal(nbSteps); ApplicationBusinessException exportError = null; try { - service.exportCruise(cruise.getId(), file, progressionModel); + service.export(exportConfiguration, progressionModel); sendMessage(t("tutti.exportCruise.action.success", cruise.getName(), file.getName())); } catch (ApplicationBusinessException e) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatProgramCruisesAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatProgramCruisesAction.java index 238dfe4..a01ae44 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatProgramCruisesAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatProgramCruisesAction.java @@ -25,6 +25,7 @@ package fr.ifremer.tutti.ui.swing.content.home.actions; import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Program; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportConfiguration; import fr.ifremer.tutti.service.genericformat.GenericFormatExportService; import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUI; @@ -102,14 +103,15 @@ public class ExportGenericFormatProgramCruisesAction extends LongActionSupport<S progressionModel.increments(t("tutti.exportProgram.action.computeNbSteps")); - int nbSteps = service.getExportProgramNbSteps(program.getId()); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForProgram(program.getId(), file); + int nbSteps = service.getExportNbSteps(exportConfiguration); progressionModel.adaptTotal(nbSteps); ApplicationBusinessException exportError = null; try { - service.exportProgram(program.getId(), file, progressionModel); + service.export(exportConfiguration, progressionModel); } catch (ApplicationBusinessException e) { String errorMessage; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/actions/GenerateReportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/actions/GenerateReportAction.java index aee6fbf..a08260b 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/actions/GenerateReportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/actions/GenerateReportAction.java @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.service.report.ReportGenerationRequest; import fr.ifremer.tutti.service.report.ReportGenerationResult; +import fr.ifremer.tutti.service.report.ReportGenerationService; import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import fr.ifremer.tutti.ui.swing.content.report.ReportUI; import fr.ifremer.tutti.ui.swing.content.report.ReportUIHandler; @@ -64,12 +65,20 @@ public class GenerateReportAction extends LongActionSupport<ReportUIModel, Repor public void doAction() throws Exception { Preconditions.checkState(getModel().isValid()); - ProgressionModel progressionModel = new ProgressionModel(); - setProgressionModel(progressionModel); - progressionModel.setTotal(4); // get data / export / generate + createProgressionModelIfRequired(1); + + ProgressionModel progressionModel = getProgressionModel(); + + progressionModel.increments(t("tutti.generateReport.action.computeNbSteps")); + ReportGenerationRequest reportGenerationRequest = getModel().toBean(); - reportGenerationResult = getContext().getReportGenerationService().generateReport(reportGenerationRequest, progressionModel); + ReportGenerationService reportGenerationService = getContext().getReportGenerationService(); + + int nbSteps = reportGenerationService.getNbSteps(reportGenerationRequest); + progressionModel.adaptTotal(nbSteps); + + reportGenerationResult = reportGenerationService.generateReport(reportGenerationRequest, progressionModel); } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index cde4cf8..bb09b5c 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -19,7 +19,8 @@ tutti.applicationUpdater.prepareFirstDB.deleteDirectory.error=Erreur lors de la tutti.applicationUpdater.startUpdate=Téléchargement et installation d'une nouvelle version du module <strong>%s</strong> (version %s) tutti.applicationUpdater.startUpdate.db.installation=Téléchargement et installation de la base (version %s) tutti.applicationUpdater.startUpdate.db.update=Téléchargement et mise à jour de la base (version %s) -tutti.applicationUpdater.startUpdate.report= +tutti.applicationUpdater.startUpdate.report=Téléchargement et mise à jour des rapports (version %s) +tutti.generateReport.action.computeNbSteps=Calcul du nombre d'opérations tutti.applicationUpdater.synchroDB.prepare.error=Erreur lors de la préparation de la synchronisation de la base tutti.applicationUpdater.synchroDB.synchro.error=Erreur lors de la synchronisation de la base tutti.applicationUpdater.synchroDB.writeVersion.error=Erreur lors de l'écriture de la nouvelle version de la base de données dans le fichier %s -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 057b4a84db2f8602ffbad0c10f8610729fd08185 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:55:47 2015 +0200 introduce DataModel API in persistence module --- .../tutti/persistence/TuttiPersistence.java | 33 +++++++++ .../tutti/persistence/TuttiPersistenceImpl.java | 78 +++++++++++++++++++++- .../persistence/TuttiPersistenceNoDbImpl.java | 16 +++++ .../tutti/persistence/model/CruiseDataModel.java | 39 +++++++++++ .../tutti/persistence/model/DataModelSupport.java | 47 +++++++++++++ .../persistence/model/OperationDataModel.java | 33 +++++++++ .../tutti/persistence/model/ProgramDataModel.java | 39 +++++++++++ .../ifremer/tutti/service/PersistenceService.java | 18 ++++- 8 files changed, 301 insertions(+), 2 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java index b594cb6..d3a2912 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java @@ -22,6 +22,7 @@ package fr.ifremer.tutti.persistence; * #L% */ +import fr.ifremer.tutti.persistence.model.ProgramDataModel; import fr.ifremer.tutti.persistence.service.AccidentalBatchPersistenceService; import fr.ifremer.tutti.persistence.service.AttachmentPersistenceService; import fr.ifremer.tutti.persistence.service.BenthosBatchPersistenceService; @@ -73,4 +74,36 @@ public interface TuttiPersistence extends TuttiPersistenceServiceImplementor, String getImplementationName(); + /** + * To load a program with all his cruises and fishing operations. + * + * @param programId id of the program to load + * @param loadFishingOperation flag to load cruise fishing operations + * @return loaded program + * @since 3.14.3 + */ + ProgramDataModel loadProgram(String programId, boolean loadFishingOperation); + + /** + * * To load a program with given cruises and fishing operations. + * + * @param programId id of the program to load + * @param loadFishingOperation flag to load cruise fishing operations + * @param cruiseIds ids of cruises to load + * @return loaded program + * @since 3.14.3 + */ + ProgramDataModel loadCruises(String programId, boolean loadFishingOperation, String... cruiseIds); + + /** + * * To load a program for his given cruise and fishing operations. + * + * @param programId id of the program to load + * @param cruiseId id of cruise to load + * @param fishingOperationIds ids of fishing operation to load + * @return loaded program + * @since 3.14.3 + */ + ProgramDataModel loadCruise(String programId, String cruiseId, String... fishingOperationIds); + } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java index f125b75..0ebc857 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java @@ -54,6 +54,9 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.TuttiReferentialEntity; import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.persistence.model.CruiseDataModel; +import fr.ifremer.tutti.persistence.model.OperationDataModel; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; import fr.ifremer.tutti.persistence.service.AccidentalBatchPersistenceService; import fr.ifremer.tutti.persistence.service.AttachmentPersistenceService; import fr.ifremer.tutti.persistence.service.BenthosBatchPersistenceService; @@ -85,9 +88,13 @@ import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.sql.SQLException; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.Callable; /** @@ -261,6 +268,76 @@ public class TuttiPersistenceImpl implements TuttiPersistence { } } + @Override + public ProgramDataModel loadProgram(String programId, boolean loadFishingOperation) { + + Program program = getProgram(programId); + + Set<CruiseDataModel> cruiseModels = new LinkedHashSet<>(); + List<Cruise> cruises = getAllCruise(programId); + for (Cruise cruise : cruises) { + List<String> fishingOperationIds = loadFishingOperation ? getAllFishingOperationIds(cruise.getId()) : Collections.<String>emptyList(); + CruiseDataModel model = loadCruise(cruise, fishingOperationIds); + cruiseModels.add(model); + } + + ProgramDataModel result = new ProgramDataModel(program, cruiseModels); + return result; + + } + + @Override + public ProgramDataModel loadCruises(String programId, boolean loadFishingOperation, String... cruiseIds) { + + Program program = getProgram(programId); + + Set<CruiseDataModel> cruiseModels = new LinkedHashSet<>(); + for (String cruiseId : cruiseIds) { + Cruise cruise = getCruise(cruiseId); + List<String> fishingOperationIds = loadFishingOperation ? getAllFishingOperationIds(cruise.getId()) : Collections.<String>emptyList(); + CruiseDataModel model = loadCruise(cruise, fishingOperationIds); + cruiseModels.add(model); + } + + ProgramDataModel result = new ProgramDataModel(program, cruiseModels); + return result; + + } + + @Override + public ProgramDataModel loadCruise(String programId, String cruiseId, String... fishingOperationIds) { + + Program program = getProgram(programId); + + Set<CruiseDataModel> cruiseModels = new LinkedHashSet<>(); + Cruise cruise = getCruise(cruiseId); + CruiseDataModel model = loadCruise(cruise, Arrays.asList(fishingOperationIds)); + cruiseModels.add(model); + + ProgramDataModel result = new ProgramDataModel(program, cruiseModels); + return result; + + } + + protected CruiseDataModel loadCruise(Cruise cruise, List<String> fishingOperationIds) { + + Set<OperationDataModel> fishingOperationModels = new LinkedHashSet<>(); + + List<FishingOperation> fishingOperations = getAllFishingOperation(cruise.getId()); + for (FishingOperation fishingOperation : fishingOperations) { + + if (fishingOperationIds.contains(fishingOperation.getId())) { + OperationDataModel model = new OperationDataModel(fishingOperation); + fishingOperationModels.add(model); + } + + } + + CruiseDataModel result = new CruiseDataModel(cruise, fishingOperationModels); + return result; + + } + //------------------------------------------------------------------------// //-- CaracteristicPersistenceService methods --// //------------------------------------------------------------------------// @@ -860,7 +937,6 @@ public class TuttiPersistenceImpl implements TuttiPersistence { } - @Override public List<TuttiProtocol> getAllProtocol() { return getProtocolService().getAllProtocol(); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java index 879c146..bd05c77 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java @@ -49,6 +49,7 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.TuttiReferentialEntity; import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; import fr.ifremer.tutti.persistence.service.UpdateSchemaContextSupport; import org.nuiton.util.version.Version; @@ -72,6 +73,21 @@ public class TuttiPersistenceNoDbImpl implements TuttiPersistence { } @Override + public ProgramDataModel loadProgram(String programId, boolean loadFishingOperation) { + throw notImplemented(); + } + + @Override + public ProgramDataModel loadCruises(String programId, boolean loadFishingOperation, String... cruiseIds) { + throw notImplemented(); + } + + @Override + public ProgramDataModel loadCruise(String programId, String cruiseId, String... fishingOperationIds) { + throw notImplemented(); + } + + @Override public <V> V invoke(Callable<V> call) { throw notImplemented(); } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/CruiseDataModel.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/CruiseDataModel.java new file mode 100644 index 0000000..2414aa6 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/CruiseDataModel.java @@ -0,0 +1,39 @@ +package fr.ifremer.tutti.persistence.model; + +import com.google.common.collect.ImmutableSet; +import fr.ifremer.tutti.persistence.entities.data.Cruise; + +import java.util.Iterator; +import java.util.Set; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class CruiseDataModel extends DataModelSupport implements Iterable<OperationDataModel> { + + private static final long serialVersionUID = 1L; + + private final Set<OperationDataModel> operations; + + public CruiseDataModel(Cruise cruise, Set<OperationDataModel> operations) { + this(cruise.getId(), cruise.getName(), operations); + } + + public CruiseDataModel(String id, String label, Set<OperationDataModel> operations) { + super(id, label); + this.operations = ImmutableSet.copyOf(operations); + } + + @Override + public Iterator<OperationDataModel> iterator() { + return operations.iterator(); + } + + public int size() { + return operations.size(); + } + +} diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/DataModelSupport.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/DataModelSupport.java new file mode 100644 index 0000000..d596bf5 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/DataModelSupport.java @@ -0,0 +1,47 @@ +package fr.ifremer.tutti.persistence.model; + +import java.io.Serializable; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public abstract class DataModelSupport implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String id; + + private final String label; + + public DataModelSupport(String id, String label) { + this.id = id; + this.label = label; + } + + public String getId() { + return id; + } + + public String getLabel() { + return label; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DataModelSupport)) return false; + + DataModelSupport that = (DataModelSupport) o; + + return id.equals(that.id); + + } + + @Override + public int hashCode() { + return id.hashCode(); + } +} diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/OperationDataModel.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/OperationDataModel.java new file mode 100644 index 0000000..e5e541e --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/OperationDataModel.java @@ -0,0 +1,33 @@ +package fr.ifremer.tutti.persistence.model; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class OperationDataModel extends DataModelSupport { + + private static final long serialVersionUID = 1L; + + private static String getLabel(FishingOperation operation) { + String label = String.format("%1$s - %2$d - %3$s - %4$td/%4$tm/%4$tY", + operation.getStationNumber(), + operation.getFishingOperationNumber(), + operation.getMultirigAggregation(), + operation.getGearShootingStartDate()); + return label; + } + + public OperationDataModel(FishingOperation operation) { + this(operation.getId(), getLabel(operation)); + } + + public OperationDataModel(String id, String label) { + super(id,label); + } + + +} diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/ProgramDataModel.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/ProgramDataModel.java new file mode 100644 index 0000000..1743002 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/model/ProgramDataModel.java @@ -0,0 +1,39 @@ +package fr.ifremer.tutti.persistence.model; + +import com.google.common.collect.ImmutableSet; +import fr.ifremer.tutti.persistence.entities.data.Program; + +import java.util.Iterator; +import java.util.Set; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class ProgramDataModel extends DataModelSupport implements Iterable<CruiseDataModel> { + + private static final long serialVersionUID = 1L; + + private final Set<CruiseDataModel> cruises; + + public ProgramDataModel(Program program, Set<CruiseDataModel> cruises) { + this(program.getId(), program.getName(),cruises); + } + + public ProgramDataModel(String id, String label, Set<CruiseDataModel> cruises) { + super(id, label); + this.cruises = ImmutableSet.copyOf(cruises); + } + + public int size() { + return cruises.size(); + } + + @Override + public Iterator<CruiseDataModel> iterator() { + return cruises.iterator(); + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java index 8512225..48d68f1 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java @@ -66,6 +66,7 @@ import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.TuttiReferentialEntity; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.persistence.entities.referential.Vessels; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator; import fr.ifremer.tutti.persistence.service.UpdateSchemaContextSupport; import org.apache.commons.collections4.CollectionUtils; @@ -163,7 +164,7 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer } - public static interface FrequencyFunction<S extends SpeciesAbleBatch, F extends SpeciesAbleBatchFrequency> extends Function<S, List<F>> { + public interface FrequencyFunction<S extends SpeciesAbleBatch, F extends SpeciesAbleBatchFrequency> extends Function<S, List<F>> { } public FrequencyFunction<SpeciesBatch, SpeciesBatchFrequency> newSpeciesFrequenciesFunction() { @@ -236,6 +237,21 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer } @Override + public ProgramDataModel loadProgram(String programId, boolean loadFishingOperation) { + return driver.loadProgram(programId, loadFishingOperation); + } + + @Override + public ProgramDataModel loadCruises(String programId, boolean loadFishingOperation, String... cruiseIds) { + return driver.loadCruises(programId, loadFishingOperation, cruiseIds); + } + + @Override + public ProgramDataModel loadCruise(String programId, String cruiseId, String... fishingOperationIds) { + return driver.loadCruise(programId, cruiseId, fishingOperationIds); + } + + @Override public void lazyInit() { // this service does not used lazy init } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 80c598757d13db246fbc89423907fb24f0db23ee Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:56:32 2015 +0200 improve CSVProducer API --- .../fr/ifremer/tutti/service/csv/CsvProducer.java | 37 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/csv/CsvProducer.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/csv/CsvProducer.java index 751d459..aea273f 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/csv/CsvProducer.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/csv/CsvProducer.java @@ -25,8 +25,11 @@ package fr.ifremer.tutti.service.csv; */ import com.google.common.base.Charsets; +import com.google.common.base.Preconditions; import com.google.common.io.Files; -import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.BufferedWriter; @@ -46,12 +49,24 @@ import java.util.List; */ public abstract class CsvProducer<O, M extends AbstractTuttiImportExportModel<O>> implements Closeable { + /** Logger. */ + private static final Log log = LogFactory.getLog(CsvProducer.class); + private final BufferedWriter writer; private final TuttiRepeatableExport<O> export; + private boolean touch; + + private final String filename; + public CsvProducer(Path file, M model) { + Preconditions.checkNotNull(file, "CsvProducer need a not null file!"); + Preconditions.checkNotNull(model, "CsvProducer need a not null model!"); + + this.filename = file.toString(); + try { this.writer = Files.newWriter(file.toFile(), Charsets.UTF_8); } catch (FileNotFoundException e) { @@ -65,7 +80,7 @@ public abstract class CsvProducer<O, M extends AbstractTuttiImportExportModel<O> @Override public void close() throws IOException { - IOUtils.closeQuietly(writer); + writer.close(); } public void write(O row) throws Exception { @@ -78,12 +93,28 @@ public abstract class CsvProducer<O, M extends AbstractTuttiImportExportModel<O> public void write(List<O> rows) throws Exception { if (rows != null) { + if (!touch) { + + if (log.isDebugEnabled()) { + log.debug("CsvProducer " + this + " touched."); + } + touch = true; + + } export.write(rows, writer); } } public void writeEmpty() throws Exception { - export.write(Collections.<O>emptyList(), writer); + write(Collections.<O>emptyList()); + } + + public boolean wasTouched() { + return touch; } + @Override + public String toString() { + return new ToStringBuilder(this).append("filename", filename).toString(); + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit c5240d364bb3b772a72a5db55ba31f5aa207138a Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:57:29 2015 +0200 can now export partial data --- .../GenericFormatExportActionEngine.java | 21 ++- .../GenericFormatExportConfiguration.java | 84 +++++++++- .../genericformat/GenericFormatExportContext.java | 167 ++++++++++-------- .../genericformat/GenericFormatExportResult.java | 4 + .../genericformat/GenericFormatExportService.java | 81 ++++----- .../service/genericformat/csv/CatchModel.java | 2 +- .../tutti/service/genericformat/csv/CatchRow.java | 6 +- .../service/genericformat/csv/OperationRow.java | 186 +++++++++++++++------ .../CreateAccidentalCatchRowsAction.java | 21 +-- .../exportactions/CreateCatchBatchRowsAction.java | 52 +++++- .../CreateIndividualObservationRowsAction.java | 23 +-- .../CreateMarineLitterRowsAction.java | 21 +-- .../exportactions/CreateOperationRowsAction.java | 13 ++ .../exportactions/CreateParameterRowsAction.java | 5 + .../ExportFishingOperationActionSupport.java | 3 + .../exportactions/FinalizeExportAction.java | 71 +++----- .../exportactions/FlushOperationAction.java | 5 + .../exportactions/LoadDataAction.java | 26 ++- .../producer/CsvProducerForCatch.java | 32 ++++ .../producer/CsvProducerForOperation.java | 1 - .../resources/i18n/tutti-service_en_GB.properties | 1 + .../resources/i18n/tutti-service_fr_FR.properties | 1 + .../GenericFormatExportServiceAno5804Test.java | 3 +- .../GenericFormatExportServiceTest.java | 3 +- 24 files changed, 541 insertions(+), 291 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportActionEngine.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportActionEngine.java index be3d49b..d4cb72d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportActionEngine.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportActionEngine.java @@ -81,8 +81,6 @@ public class GenericFormatExportActionEngine { public void executeCruiseActions(GenericFormatExportContext exportContext, Cruise cruise) { - exportContext.setCruiseExported(true); - for (ExportCruiseActionSupport action : cruiseActions) { if (log.isInfoEnabled()) { @@ -96,14 +94,22 @@ public class GenericFormatExportActionEngine { public void executeOperationActions(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { - exportContext.setOperationExported(true); - for (ExportFishingOperationActionSupport action : fishingOperationsActions) { - if (log.isInfoEnabled()) { - log.info("Execute " + action.getClass().getSimpleName() + " on operation " + operationContext.getOperation().getId()); + if (action.doExecute(exportContext, operationContext)) { + + if (log.isInfoEnabled()) { + log.info("Execute " + action.getClass().getSimpleName() + " on operation " + operationContext.getOperation().getId()); + } + action.execute(exportContext, operationContext); + + } else { + + if (log.isInfoEnabled()) { + log.info("Skip " + action.getClass().getSimpleName() + " on operation " + operationContext.getOperation().getId()); + } + } - action.execute(exportContext, operationContext); } @@ -184,4 +190,5 @@ public class GenericFormatExportActionEngine { return actions; } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportConfiguration.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportConfiguration.java index 724c472..1c9a50b 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportConfiguration.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportConfiguration.java @@ -1,6 +1,6 @@ package fr.ifremer.tutti.service.genericformat; -import com.google.common.collect.Multimap; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; import java.io.File; import java.io.Serializable; @@ -16,9 +16,14 @@ public class GenericFormatExportConfiguration implements Serializable { private static final long serialVersionUID = -6500054741804757627L; /** - * Ids of cruise (keys) and fishing operations to export. + * Data to export. */ - private Multimap<String, String> cruiseAndFishingOperationIds; + private ProgramDataModel dataToExport; + + /** + * Archive file to produce. + */ + private File exportFile; /** * Should we export attachments ? @@ -26,16 +31,36 @@ public class GenericFormatExportConfiguration implements Serializable { private boolean exportAttachments; /** - * Archive file to produce. + * Should we export species batches ? */ - private File exportFile; + private boolean exportSpecies; + + /** + * Should we export benthos batches ? + */ + private boolean exportBenthos; - public Multimap<String, String> getCruiseAndFishingOperationIds() { - return cruiseAndFishingOperationIds; + /** + * Should we export marine litter batches ? + */ + private boolean exportMarineLitter; + + /** + * Should we export accidental catches ? + */ + private boolean exportAccidentalCatch; + + /** + * Should we export individual observations ? + */ + private boolean exportIndividualObservation; + + public ProgramDataModel getDataToExport() { + return dataToExport; } - public void setCruiseAndFishingOperationIds(Multimap<String, String> cruiseAndFishingOperationIds) { - this.cruiseAndFishingOperationIds = cruiseAndFishingOperationIds; + public void setDataToExport(ProgramDataModel dataToExport) { + this.dataToExport = dataToExport; } public boolean isExportAttachments() { @@ -53,4 +78,45 @@ public class GenericFormatExportConfiguration implements Serializable { public void setExportFile(File exportFile) { this.exportFile = exportFile; } + + public void setExportSpecies(boolean exportSpecies) { + this.exportSpecies = exportSpecies; + } + + public boolean isExportSpecies() { + return exportSpecies; + } + + public void setExportBenthos(boolean exportBenthos) { + this.exportBenthos = exportBenthos; + } + + public boolean isExportBenthos() { + return exportBenthos; + } + + public void setExportMarineLitter(boolean exportMarineLitter) { + this.exportMarineLitter = exportMarineLitter; + } + + public boolean isExportMarineLitter() { + return exportMarineLitter; + } + + public void setExportAccidentalCatch(boolean exportAccidentalCatch) { + this.exportAccidentalCatch = exportAccidentalCatch; + } + + public boolean isExportAccidentalCatch() { + return exportAccidentalCatch; + } + + public void setExportIndividualObservation(boolean exportIndividualObservation) { + this.exportIndividualObservation = exportIndividualObservation; + } + + public boolean isExportIndividualObservation() { + return exportIndividualObservation; + } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java index df7d922..1db7b3e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportContext.java @@ -25,7 +25,7 @@ package fr.ifremer.tutti.service.genericformat; */ import com.google.common.base.Preconditions; -import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; @@ -34,8 +34,10 @@ import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Speciess; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.catches.WeightComputingService; +import fr.ifremer.tutti.service.csv.CsvProducer; import fr.ifremer.tutti.service.genericformat.csv.AccidentalCatchModel; import fr.ifremer.tutti.service.genericformat.csv.AttachmentModel; import fr.ifremer.tutti.service.genericformat.csv.CatchModel; @@ -61,11 +63,13 @@ import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporaryGear import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporaryPerson; import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporarySpecies; import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporaryVessel; -import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; import java.io.Closeable; import java.io.File; +import java.io.IOException; import java.nio.file.Path; import java.util.Iterator; import java.util.LinkedHashSet; @@ -81,6 +85,9 @@ import java.util.Set; */ public class GenericFormatExportContext implements Closeable, Iterable<GenericFormatExportCruiseContext> { + /** Logger. */ + private static final Log log = LogFactory.getLog(GenericFormatExportContext.class); + private final GenericFormatExportRequest exportRequest; private final Decorator<FishingOperation> fishingOperationDecorator; @@ -125,10 +132,6 @@ public class GenericFormatExportContext implements Closeable, Iterable<GenericFo private final ProgressionModel progressionModel; - private boolean cruiseExported; - - private boolean operationExported; - private final Set<GenericFormatExportCruiseContext> cruiseContexts; GenericFormatExportContext(ProgressionModel progressionModel, @@ -138,11 +141,15 @@ public class GenericFormatExportContext implements Closeable, Iterable<GenericFo Preconditions.checkNotNull(progressionModel); this.progressionModel = progressionModel; + Preconditions.checkNotNull(exportRequest); this.exportRequest = exportRequest; + Preconditions.checkNotNull(fishingOperationDecorator); this.fishingOperationDecorator = fishingOperationDecorator; + Preconditions.checkNotNull(persistenceService); + this.weightMeasuredCaracteristic = persistenceService.getWeightMeasuredCaracteristic(); this.pmfmIdCaracteristic = persistenceService.getPmfmIdCaracteristic(); this.deadOrAliveCaracteristic = persistenceService.getDeadOrAliveCaracteristic(); @@ -184,51 +191,47 @@ public class GenericFormatExportContext implements Closeable, Iterable<GenericFo } public File getExportFile() { - return exportRequest.getExportConfiguration().getExportFile(); + return getExportConfiguration().getExportFile(); } - public Multimap<String, String> getDataIdsToExport() { - return exportRequest.getExportConfiguration().getCruiseAndFishingOperationIds(); + public ProgramDataModel getDataToExport() { + return getExportConfiguration().getDataToExport(); } - public GenericFormatExportOperationContext newOperationContext(PersistenceService persistenceService, - WeightComputingService weightComputingService, - Cruise cruise, FishingOperation operation) { + public boolean isExportAttachments() { + return getExportConfiguration().isExportAttachments(); + } - String operationLabel = fishingOperationDecorator.toString(operation); - GenericFormatExportOperationContext operationExportContext = new GenericFormatExportOperationContext(cruise, - operation, - operationLabel, - persistenceService, - weightComputingService, - getSampleCategoryModel(), - weightMeasuredCaracteristic, - pmfmIdCaracteristic, - deadOrAliveCaracteristic, - genderCaracteristic); - return operationExportContext; + public boolean isExportSpecies() { + return getExportConfiguration().isExportSpecies(); + } + public boolean isExportBenthos() { + return getExportConfiguration().isExportBenthos(); } - @Override - public void close() { + public boolean isExportMarineLitter() { + return getExportConfiguration().isExportMarineLitter(); + } + + public boolean isExportAccidentalCatch() { + return getExportConfiguration().isExportAccidentalCatch(); + } + + public boolean isExportIndividualObservation() { + return getExportConfiguration().isExportIndividualObservation(); + } - IOUtils.closeQuietly(producerForSurvey); - IOUtils.closeQuietly(producerForSpecies); - IOUtils.closeQuietly(producerForGearCaracteristics); - IOUtils.closeQuietly(producerForOperation); - IOUtils.closeQuietly(producerForParameter); - IOUtils.closeQuietly(producerForAccidentalCatch); - IOUtils.closeQuietly(producerForIndividualObservation); - IOUtils.closeQuietly(producerForCatch); - IOUtils.closeQuietly(producerForMarineLitter); - IOUtils.closeQuietly(producerForTemporaryGear); - IOUtils.closeQuietly(producerForTemporaryPerson); - IOUtils.closeQuietly(producerForTemporarySpecies); - IOUtils.closeQuietly(producerForTemporaryVessel); - IOUtils.closeQuietly(producerForSampleCategory); - IOUtils.closeQuietly(producerForAttachment); + public GenericFormatArchive getArchive() { + return exportRequest.getArchive(); + } + + public SampleCategoryModel getSampleCategoryModel() { + return exportRequest.getSampleCategoryModel(); + } + public File getProtocolFile() { + return getArchive().getProtocolPath().toFile(); } public ProgressionModel getProgressionModel() { @@ -295,44 +298,51 @@ public class GenericFormatExportContext implements Closeable, Iterable<GenericFo return producerForAttachment; } - public boolean isExportAttachments() { - return exportRequest.getExportConfiguration().isExportAttachments(); + public void increments(String message) { + progressionModel.increments(message); } - public GenericFormatArchive getArchive() { - return exportRequest.getArchive(); - } + public void addCruiseContext(Cruise cruise, Set<FishingOperation> operations) { - public File getProtocolFile() { - return getArchive().getProtocolPath().toFile(); - } + GenericFormatExportCruiseContext cruiseContext = new GenericFormatExportCruiseContext(cruise, operations); + cruiseContexts.add(cruiseContext); - public SampleCategoryModel getSampleCategoryModel() { - return exportRequest.getSampleCategoryModel(); } - public void increments(String message) { - progressionModel.increments(message); - } + public GenericFormatExportOperationContext newOperationContext(PersistenceService persistenceService, + WeightComputingService weightComputingService, + Cruise cruise, FishingOperation operation) { - public void setCruiseExported(boolean cruiseExported) { - this.cruiseExported = cruiseExported; - } + String operationLabel = fishingOperationDecorator.toString(operation); + GenericFormatExportOperationContext operationExportContext = new GenericFormatExportOperationContext(cruise, + operation, + operationLabel, + persistenceService, + weightComputingService, + getSampleCategoryModel(), + weightMeasuredCaracteristic, + pmfmIdCaracteristic, + deadOrAliveCaracteristic, + genderCaracteristic); + return operationExportContext; - public boolean isCruiseExported() { - return cruiseExported; } - public void setOperationExported(boolean operationExported) { - this.operationExported = operationExported; - } + @Override + public void close() { - public boolean isOperationExported() { - return operationExported; - } + for (CsvProducer csvProducer : producers()) { + + try { + csvProducer.close(); + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error("Could not close producer: " + csvProducer.getClass().getSimpleName(), e); + } + } + + } - public void addCruiseContext(GenericFormatExportCruiseContext cruiseContext) { - cruiseContexts.add(cruiseContext); } @Override @@ -340,4 +350,27 @@ public class GenericFormatExportContext implements Closeable, Iterable<GenericFo return cruiseContexts.iterator(); } + public Set<CsvProducer<?, ?>> producers() { + return Sets.newHashSet( + producerForSurvey, + producerForSpecies, + producerForGearCaracteristics, + producerForOperation, + producerForParameter, + producerForAccidentalCatch, + producerForIndividualObservation, + producerForCatch, + producerForMarineLitter, + producerForTemporaryGear, + producerForTemporaryPerson, + producerForTemporarySpecies, + producerForTemporaryVessel, + producerForSampleCategory, + producerForAttachment); + } + + protected GenericFormatExportConfiguration getExportConfiguration() { + return exportRequest.getExportConfiguration(); + } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportResult.java index 5330b7d..fa88bb5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportResult.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportResult.java @@ -38,4 +38,8 @@ public class GenericFormatExportResult implements Serializable { public List<String> getErrorsByCruise() { return errorsByCruise; } + + public boolean isSuccess() { + return errorsByCruise.isEmpty(); + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java index 3347457..518ba90 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportService.java @@ -23,13 +23,12 @@ package fr.ifremer.tutti.service.genericformat; */ import com.google.common.base.Preconditions; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.model.CruiseDataModel; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; import fr.ifremer.tutti.service.AbstractTuttiService; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; @@ -49,7 +48,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Set; @@ -91,84 +89,70 @@ public class GenericFormatExportService extends AbstractTuttiService { public GenericFormatExportConfiguration createExportConfigurationForProgram(String programId, File exportFile) { - Program program = persistenceService.getProgram(programId); - Preconditions.checkNotNull(program); - - if (log.isDebugEnabled()) { - log.debug("Will export program: " + programId); - } - - List<String> allCruiseIds = persistenceService.getAllCruiseId(programId); - Multimap<String, String> idsToExport = ArrayListMultimap.create(); - for (String cruiseId : allCruiseIds) { - List<String> operations = persistenceService.getAllFishingOperationIds(cruiseId); - idsToExport.putAll(cruiseId, operations); - } + ProgramDataModel dataToExport = persistenceService.loadProgram(programId, true); GenericFormatExportConfiguration configuration = new GenericFormatExportConfiguration(); configuration.setExportFile(exportFile); configuration.setExportAttachments(true); - configuration.setCruiseAndFishingOperationIds(idsToExport); + configuration.setExportSpecies(true); + configuration.setExportBenthos(true); + configuration.setExportMarineLitter(true); + configuration.setExportAccidentalCatch(true); + configuration.setExportIndividualObservation(true); + configuration.setDataToExport(dataToExport); return configuration; } - public GenericFormatExportConfiguration createExportConfigurationForCruise(String cruiseId, File exportFile) { + public GenericFormatExportConfiguration createExportConfigurationForCruise(String programId, String cruiseId, File exportFile) { Preconditions.checkNotNull(cruiseId); Preconditions.checkNotNull(exportFile); - Cruise cruise = persistenceService.getCruise(cruiseId); - Preconditions.checkNotNull(cruise); - - if (log.isDebugEnabled()) { - log.debug("Will export cruise: " + cruiseId); - } - - Multimap<String, String> idsToExport = ArrayListMultimap.create(); - List<String> operations = persistenceService.getAllFishingOperationIds(cruiseId); - idsToExport.putAll(cruiseId, operations); + ProgramDataModel dataToExport = persistenceService.loadCruises(programId, true, cruiseId); GenericFormatExportConfiguration configuration = new GenericFormatExportConfiguration(); configuration.setExportFile(exportFile); configuration.setExportAttachments(true); - configuration.setCruiseAndFishingOperationIds(idsToExport); + configuration.setExportSpecies(true); + configuration.setExportBenthos(true); + configuration.setExportMarineLitter(true); + configuration.setExportAccidentalCatch(true); + configuration.setExportIndividualObservation(true); + configuration.setDataToExport(dataToExport); return configuration; } - public GenericFormatExportConfiguration createExportConfigurationForFishingOperation(String cruiseId, String fishingOperationId, File exportFile) { + public GenericFormatExportConfiguration createExportConfigurationForFishingOperation(String programId, String cruiseId, String fishingOperationId, File exportFile) { + Preconditions.checkNotNull(programId); Preconditions.checkNotNull(cruiseId); Preconditions.checkNotNull(fishingOperationId); - Cruise cruise = persistenceService.getCruise(cruiseId); - Preconditions.checkNotNull(cruise); - - if (log.isDebugEnabled()) { - log.debug("Will export fishing operation: " + fishingOperationId); - } - FishingOperation fishingOperation = persistenceService.getFishingOperation(fishingOperationId); - Preconditions.checkNotNull(fishingOperation); - - Multimap<String, String> idsToExport = ArrayListMultimap.create(); - idsToExport.putAll(cruiseId, Collections.singletonList(fishingOperationId)); + ProgramDataModel dataToExport = persistenceService.loadCruise(programId, cruiseId, fishingOperationId); GenericFormatExportConfiguration configuration = new GenericFormatExportConfiguration(); configuration.setExportFile(exportFile); configuration.setExportAttachments(true); - configuration.setCruiseAndFishingOperationIds(idsToExport); + configuration.setExportSpecies(true); + configuration.setExportBenthos(true); + configuration.setExportMarineLitter(true); + configuration.setExportAccidentalCatch(true); + configuration.setExportIndividualObservation(true); + configuration.setDataToExport(dataToExport); return configuration; } public int getExportNbSteps(GenericFormatExportConfiguration configuration) { - Multimap<String, String> cruiseAndFishingOperationIds = configuration.getCruiseAndFishingOperationIds(); + ProgramDataModel dataToExport = configuration.getDataToExport(); int result = 8; // export species + sampleCategoryModel + protocol + temporary gear + temporary person + temporar species + temporary vessel + zip - for (String cruiseId : cruiseAndFishingOperationIds.keySet()) { - result += getCruiseNbStep(cruiseId, cruiseAndFishingOperationIds.get(cruiseId).size()); + for (CruiseDataModel cruise : dataToExport) { + int nbFishingOperations = cruise.size(); + result += getCruiseNbStep(nbFishingOperations); } return result; @@ -288,10 +272,7 @@ public class GenericFormatExportService extends AbstractTuttiService { } - protected int getCruiseNbStep(String cruiseId, int nbFishingOperations) { - - Cruise cruise = persistenceService.getCruise(cruiseId); - Preconditions.checkNotNull(cruise); + protected int getCruiseNbStep(int nbFishingOperations) { int result = 1 + nbFishingOperations // check cruise + operations + 1 // export cruise diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchModel.java index e97c7ff..6e66b56 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchModel.java @@ -121,7 +121,7 @@ public class CatchModel extends AbstractTuttiImportExportModel<CatchRow> { newColumnForExport("Poids_Reference", CatchRow.REFERENCE_WEIGHT, TuttiCsvUtil.PRIMITIVE_FLOAT); newColumnForExport("Coef_Elev_Espece_Capture", CatchRow.RAISING_FACTOR, TuttiCsvUtil.PRIMITIVE_FLOAT); - newColumnForExport("Coef_Final_Elevation", CatchRow.FINAL_RAISING_FACTOR, TuttiCsvUtil.PRIMITIVE_FLOAT); + newColumnForExport("Coef_Final_Elevation", CatchRow.FINAL_RAISING_FACTOR, TuttiCsvUtil.FLOAT); newColumnForExport("Serie_Id", Cruise.PROPERTY_PROGRAM, TuttiCsvUtil.PROGRAM_TECHNICAL_FORMATTER); for (SampleCategoryModelEntry entry : sampleCategoryModel.getCategory()) { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchRow.java index 79c79f6..cf73b2e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/CatchRow.java @@ -85,7 +85,7 @@ public class CatchRow extends RowWithOperationContextSupport { protected float raisingFactor; - protected float finalRaisingFactor; + protected Float finalRaisingFactor; protected Integer batchNumber; @@ -149,7 +149,7 @@ public class CatchRow extends RowWithOperationContextSupport { setFrequencyWeight(frequency.getWeight()); } - public void setFinalRaisingFactor(float finalRaisingFactor) { + public void setFinalRaisingFactor(Float finalRaisingFactor) { this.finalRaisingFactor = finalRaisingFactor; } @@ -177,7 +177,7 @@ public class CatchRow extends RowWithOperationContextSupport { return sampleCategory; } - public float getFinalRaisingFactor() { + public Float getFinalRaisingFactor() { return finalRaisingFactor; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/OperationRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/OperationRow.java index 27fe645..c33e9c6 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/OperationRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/csv/OperationRow.java @@ -151,6 +151,18 @@ public class OperationRow extends RowWithOperationContextSupport { protected Boolean marineLitterTotalWeightComputed; + private Boolean speciesTotalWeightComputed; + + private Boolean speciesTotalUnsortedWeightComputed; + + private Boolean speciesTotalSampleSortedWeightComputed; + + private Boolean benthosTotalWeightComputed; + + private Boolean benthosTotalUnsortedWeightComputed; + + private Boolean benthosTotalSampleSortedWeightComputed; + protected Integer fishingOperationObjectId; protected Integer catchObjectId; @@ -166,31 +178,113 @@ public class OperationRow extends RowWithOperationContextSupport { public void setCatchBatch(CatchBatch catchBatch) { - if (catchBatch == null) { - - // Avoid any NPE - catchBatch = CatchBatchs.newCatchBatch(); - } - - this.catchBatch = catchBatch; + CatchBatch batch = CatchBatchs.newCatchBatch(); + + batch.setCatchTotalWeight(catchBatch.getCatchTotalWeight()); + batch.setCatchTotalComputedWeight(catchBatch.getCatchTotalComputedWeight()); + batch.setCatchTotalSortedTremisWeight(catchBatch.getCatchTotalSortedTremisWeight()); + batch.setCatchTotalSortedCarousselWeight(catchBatch.getCatchTotalSortedCarousselWeight()); + batch.setCatchTotalSortedComputedWeight(catchBatch.getCatchTotalSortedComputedWeight()); + batch.setCatchTotalUnsortedComputedWeight(catchBatch.getCatchTotalUnsortedComputedWeight()); + batch.setCatchTotalRejectedWeight(catchBatch.getCatchTotalRejectedWeight()); + batch.setCatchTotalRejectedComputedWeight(catchBatch.getCatchTotalRejectedComputedWeight()); + + batch.setSpeciesTotalComputedWeight(catchBatch.getSpeciesTotalComputedWeight()); + batch.setSpeciesTotalSortedWeight(catchBatch.getSpeciesTotalSortedWeight()); + batch.setSpeciesTotalSortedWeight(catchBatch.getSpeciesTotalSortedWeight()); + batch.setSpeciesTotalUnsortedComputedWeight(catchBatch.getSpeciesTotalUnsortedComputedWeight()); + batch.setSpeciesTotalSampleSortedComputedWeight(catchBatch.getSpeciesTotalSampleSortedComputedWeight()); + batch.setSpeciesTotalLivingNotItemizedWeight(catchBatch.getSpeciesTotalLivingNotItemizedWeight()); + batch.setSpeciesTotalLivingNotItemizedWeight(catchBatch.getSpeciesTotalLivingNotItemizedWeight()); + batch.setSpeciesTotalInertWeight(catchBatch.getSpeciesTotalInertWeight()); + batch.setSpeciesTotalInertComputedWeight(catchBatch.getSpeciesTotalInertComputedWeight()); + + batch.setBenthosTotalComputedWeight(catchBatch.getBenthosTotalComputedWeight()); + batch.setBenthosTotalSortedWeight(catchBatch.getBenthosTotalSortedWeight()); + batch.setBenthosTotalSortedComputedWeight(catchBatch.getBenthosTotalSortedComputedWeight()); + batch.setBenthosTotalUnsortedComputedWeight(catchBatch.getBenthosTotalUnsortedComputedWeight()); + batch.setBenthosTotalInertWeight(catchBatch.getBenthosTotalInertWeight()); + batch.setBenthosTotalInertComputedWeight(catchBatch.getBenthosTotalInertComputedWeight()); + batch.setBenthosTotalSampleSortedComputedWeight(catchBatch.getBenthosTotalSampleSortedComputedWeight()); + batch.setBenthosTotalLivingNotItemizedWeight(catchBatch.getBenthosTotalLivingNotItemizedWeight()); + batch.setBenthosTotalLivingNotItemizedComputedWeight(catchBatch.getBenthosTotalLivingNotItemizedComputedWeight()); + + batch.setMarineLitterTotalWeight(catchBatch.getMarineLitterTotalWeight()); + batch.setMarineLitterTotalComputedWeight(catchBatch.getMarineLitterTotalComputedWeight()); + + this.catchBatch = batch; setCatchObjectId(catchBatch.getIdAsInt()); } - public void computeCatchValues() { + public void computeCatchValues(boolean exportSpecies, boolean exportBenthos, boolean exportMarineLitter) { setCatchTotalWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getCatchTotalWeight(), catchBatch.getCatchTotalComputedWeight())); setCatchTotalRejectedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getCatchTotalRejectedWeight(), catchBatch.getCatchTotalRejectedComputedWeight())); - setSpeciesTotalSortedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getSpeciesTotalSortedWeight(), catchBatch.getSpeciesTotalSortedComputedWeight())); - setSpeciesTotalInertWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getSpeciesTotalInertWeight(), catchBatch.getSpeciesTotalInertComputedWeight())); - setSpeciesTotalLivingNotItemizedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getSpeciesTotalLivingNotItemizedWeight(), catchBatch.getSpeciesTotalLivingNotItemizedComputedWeight())); - setBenthosTotalSortedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getBenthosTotalSortedWeight(), catchBatch.getBenthosTotalSortedComputedWeight())); - setBenthosTotalInertWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getBenthosTotalInertWeight(), catchBatch.getBenthosTotalInertComputedWeight())); - setBenthosTotalLivingNotItemizedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getBenthosTotalLivingNotItemizedWeight(), catchBatch.getBenthosTotalLivingNotItemizedComputedWeight())); + if (exportSpecies) { + + setSpeciesTotalSortedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getSpeciesTotalSortedWeight(), catchBatch.getSpeciesTotalSortedComputedWeight())); + setSpeciesTotalInertWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getSpeciesTotalInertWeight(), catchBatch.getSpeciesTotalInertComputedWeight())); + setSpeciesTotalLivingNotItemizedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getSpeciesTotalLivingNotItemizedWeight(), catchBatch.getSpeciesTotalLivingNotItemizedComputedWeight())); + + speciesTotalWeightComputed = true; + speciesTotalUnsortedWeightComputed = true; + speciesTotalSampleSortedWeightComputed = true; + + } else { + + // remove species values + + catchBatch.setSpeciesTotalComputedWeight(null); + catchBatch.setSpeciesTotalSortedWeight(null); + catchBatch.setSpeciesTotalSortedWeight(null); + catchBatch.setSpeciesTotalUnsortedComputedWeight(null); + catchBatch.setSpeciesTotalSampleSortedComputedWeight(null); + catchBatch.setSpeciesTotalLivingNotItemizedWeight(null); + catchBatch.setSpeciesTotalLivingNotItemizedComputedWeight(null); + catchBatch.setSpeciesTotalInertWeight(null); + catchBatch.setSpeciesTotalInertComputedWeight(null); + + } + + if (exportBenthos) { + + setBenthosTotalSortedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getBenthosTotalSortedWeight(), catchBatch.getBenthosTotalSortedComputedWeight())); + setBenthosTotalInertWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getBenthosTotalInertWeight(), catchBatch.getBenthosTotalInertComputedWeight())); + setBenthosTotalLivingNotItemizedWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getBenthosTotalLivingNotItemizedWeight(), catchBatch.getBenthosTotalLivingNotItemizedComputedWeight())); + + benthosTotalWeightComputed = true; + benthosTotalUnsortedWeightComputed = true; + benthosTotalSampleSortedWeightComputed = true; - setMarineLitterTotalWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getMarineLitterTotalWeight(), catchBatch.getMarineLitterTotalComputedWeight())); + } else { + + // remove benthos values + + catchBatch.setBenthosTotalComputedWeight(null); + catchBatch.setBenthosTotalSortedWeight(null); + catchBatch.setBenthosTotalSortedComputedWeight(null); + catchBatch.setBenthosTotalUnsortedComputedWeight(null); + catchBatch.setBenthosTotalInertWeight(null); + catchBatch.setBenthosTotalInertComputedWeight(null); + catchBatch.setBenthosTotalSampleSortedComputedWeight(null); + catchBatch.setBenthosTotalLivingNotItemizedWeight(null); + catchBatch.setBenthosTotalLivingNotItemizedComputedWeight(null); + + } + + if (exportMarineLitter) { + + setMarineLitterTotalWeightComputed(Numbers.getValueOrComputedValueComputed(catchBatch.getMarineLitterTotalWeight(), catchBatch.getMarineLitterTotalComputedWeight())); + + } else { + + // remove marine litter values + catchBatch.setMarineLitterTotalWeight(null); + catchBatch.setMarineLitterTotalComputedWeight(null); + } } @@ -452,7 +546,7 @@ public class OperationRow extends RowWithOperationContextSupport { public Float getSpeciesTotalSortedWeight() { return Numbers.getValueOrComputedValue( catchBatch.getSpeciesTotalSortedWeight(), - catchBatch.getSpeciesTotalSortedComputedWeight()); + catchBatch.getSpeciesTotalSortedWeight()); } public Float getSpeciesTotalUnsortedWeight() { @@ -460,9 +554,7 @@ public class OperationRow extends RowWithOperationContextSupport { } public Float getSpeciesTotalSampleSortedWeight() { - return Numbers.getValueOrComputedValue( - catchBatch.getSpeciesTotalSampleSortedComputedWeight(), - catchBatch.getSpeciesTotalSampleSortedComputedWeight()); + return catchBatch.getSpeciesTotalSampleSortedComputedWeight(); } public Float getSpeciesTotalLivingNotItemizedWeight() { @@ -513,52 +605,40 @@ public class OperationRow extends RowWithOperationContextSupport { catchBatch.getMarineLitterTotalComputedWeight()); } - public boolean isCatchTotalSortedTremisWeightComputed() { - return false; - } - - public boolean isCatchTotalSortedCarousselWeightComputed() { - return false; - } - - public boolean isCatchTotalSortedWeightComputed() { - return true; - } - - public boolean isCatchTotalUnsortedWeightComputed() { - return true; + public Boolean getCatchTotalWeightComputed() { + return catchTotalWeightComputed; } - public boolean isSpeciesTotalWeightComputed() { - return true; + public Boolean getCatchTotalRejectedWeightComputed() { + return catchTotalRejectedWeightComputed; } - public boolean isSpeciesTotalUnsortedWeightComputed() { - return true; + public Boolean getCatchTotalSortedTremisWeightComputed() { + return false; } - public boolean isSpeciesTotalSampleSortedWeightComputed() { - return true; + public Boolean getCatchTotalSortedCarousselWeightComputed() { + return false; } - public boolean isBenthosTotalWeightComputed() { + public Boolean getCatchTotalSortedWeightComputed() { return true; } - public boolean isBenthosTotalUnsortedWeightComputed() { + public Boolean getCatchTotalUnsortedWeightComputed() { return true; } - public boolean isBenthosTotalSampleSortedWeightComputed() { - return true; + public Boolean getSpeciesTotalWeightComputed() { + return speciesTotalWeightComputed; } - public Boolean getCatchTotalWeightComputed() { - return catchTotalWeightComputed; + public Boolean getSpeciesTotalUnsortedWeightComputed() { + return speciesTotalUnsortedWeightComputed; } - public Boolean getCatchTotalRejectedWeightComputed() { - return catchTotalRejectedWeightComputed; + public Boolean getSpeciesTotalSampleSortedWeightComputed() { + return speciesTotalSampleSortedWeightComputed; } public Boolean getSpeciesTotalSortedWeightComputed() { @@ -585,6 +665,18 @@ public class OperationRow extends RowWithOperationContextSupport { return benthosTotalLivingNotItemizedWeightComputed; } + public Boolean getBenthosTotalWeightComputed() { + return benthosTotalWeightComputed; + } + + public Boolean getBenthosTotalUnsortedWeightComputed() { + return benthosTotalUnsortedWeightComputed; + } + + public Boolean getBenthosTotalSampleSortedWeightComputed() { + return benthosTotalSampleSortedWeightComputed; + } + public Boolean getMarineLitterTotalWeightComputed() { return marineLitterTotalWeightComputed; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateAccidentalCatchRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateAccidentalCatchRowsAction.java index 829b5f0..b44964d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateAccidentalCatchRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateAccidentalCatchRowsAction.java @@ -28,20 +28,21 @@ public class CreateAccidentalCatchRowsAction extends ExportFishingOperationActio } @Override - public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { - - if (operationContext.isWithCatchBatch()) { + public boolean doExecute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { + return exportContext.isExportAccidentalCatch() && operationContext.isWithCatchBatch(); + } - List<AccidentalCatchRow> accidentalCatchRows = exportContext.getProducerForAccidentalCatch().getDataToExport(operationContext); - operationContext.setAccidentalCatchRows(accidentalCatchRows); - exportContext.getProducerForSpecies().prepareAccidentalRows(accidentalCatchRows); + @Override + public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { - if (exportContext.isExportAttachments()) { + List<AccidentalCatchRow> accidentalCatchRows = exportContext.getProducerForAccidentalCatch().getDataToExport(operationContext); + operationContext.setAccidentalCatchRows(accidentalCatchRows); + exportContext.getProducerForSpecies().prepareAccidentalRows(accidentalCatchRows); - List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getAccidentalBatches()); - operationContext.addAttachmentRows(attachmentRows); + if (exportContext.isExportAttachments()) { - } + List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getAccidentalBatches()); + operationContext.addAttachmentRows(attachmentRows); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateCatchBatchRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateCatchBatchRowsAction.java index cd8b839..88f15aa 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateCatchBatchRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateCatchBatchRowsAction.java @@ -39,28 +39,68 @@ public class CreateCatchBatchRowsAction extends ExportFishingOperationActionSupp } @Override + public boolean doExecute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { + return (exportContext.isExportSpecies() || exportContext.isExportBenthos()) && operationContext.isWithCatchBatch(); + } + + @Override public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { - if (operationContext.isWithCatchBatch()) { + boolean exportSpecies = exportContext.isExportSpecies(); + boolean exportBenthos = exportContext.isExportBenthos(); + boolean exportAll = exportSpecies && exportBenthos; + if (exportSpecies) { prepareSpeciesBatches(exportContext, operationContext); + } + if (exportBenthos) { prepareBenthosBatches(exportContext, operationContext); + } + + CatchBatch catchBatch = operationContext.getCatchBatch(); - CatchBatch catchBatch = operationContext.getCatchBatch(); + Float catchRaisingfactor = computeCatchRaisingfactor(catchBatch); - Float catchRaisingfactor = computeCatchRaisingfactor(catchBatch); - Float speciesCatchRaisingFactor = computeSpeciesRaisingFactor(catchBatch, catchRaisingfactor); - Float benthosCatchRaisingFactor = computeBenthosRaisingFactor(catchBatch, catchRaisingfactor); + Float speciesCatchRaisingFactor = null; + if (exportSpecies) { + speciesCatchRaisingFactor = computeSpeciesRaisingFactor(catchBatch, catchRaisingfactor); + } + + Float benthosCatchRaisingFactor = null; + if (exportBenthos) { + benthosCatchRaisingFactor = computeBenthosRaisingFactor(catchBatch, catchRaisingfactor); + } + + CsvProducerForCatch producerForCatch = exportContext.getProducerForCatch(); + + if (exportAll) { if (log.isInfoEnabled()) { log.info(String.format("Operation %s [catchRF: %s / speciesRF: %s / benthosRF: %s ]", operationContext.getOperation().getId(), catchRaisingfactor, speciesCatchRaisingFactor, benthosCatchRaisingFactor)); } - CsvProducerForCatch producerForCatch = exportContext.getProducerForCatch(); List<CatchRow> catchRows = producerForCatch.getDataToExport(operationContext, speciesCatchRaisingFactor, benthosCatchRaisingFactor); operationContext.setCatchRows(catchRows); + } else if (exportSpecies) { + + if (log.isInfoEnabled()) { + log.info(String.format("Operation %s [catchRF: %s / speciesRF: %s ]", operationContext.getOperation().getId(), catchRaisingfactor, speciesCatchRaisingFactor)); + } + + List<CatchRow> catchRows = producerForCatch.getSpeciesOnlyDataToExport(operationContext, speciesCatchRaisingFactor); + operationContext.setCatchRows(catchRows); + + } else if (exportBenthos) { + + if (log.isInfoEnabled()) { + log.info(String.format("Operation %s [catchRF: %s / benthosRF: %s ]", operationContext.getOperation().getId(), catchRaisingfactor, benthosCatchRaisingFactor)); + } + + List<CatchRow> catchRows = producerForCatch.getBenthosOnlyDataToExport(operationContext, benthosCatchRaisingFactor); + operationContext.setCatchRows(catchRows); + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateIndividualObservationRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateIndividualObservationRowsAction.java index 3230f49..17210d6 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateIndividualObservationRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateIndividualObservationRowsAction.java @@ -28,20 +28,21 @@ public class CreateIndividualObservationRowsAction extends ExportFishingOperatio } @Override - public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { - - if (operationContext.isWithCatchBatch()) { + public boolean doExecute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { + return exportContext.isExportIndividualObservation() && operationContext.isWithCatchBatch(); + } - List<IndividualObservationRow> individualObservationRows = exportContext.getProducerForIndividualObservation().getDataToExport(operationContext); - operationContext.setIndividualObservationRows(individualObservationRows); - exportContext.getProducerForSpecies().prepareIndividualRows(individualObservationRows); + @Override + public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { - if (exportContext.isExportAttachments()) { + List<IndividualObservationRow> individualObservationRows = exportContext.getProducerForIndividualObservation().getDataToExport(operationContext); + operationContext.setIndividualObservationRows(individualObservationRows); + exportContext.getProducerForSpecies().prepareIndividualRows(individualObservationRows); - List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getIndividualObservations()); - operationContext.addAttachmentRows(attachmentRows); + if (exportContext.isExportAttachments()) { - } + List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getIndividualObservations()); + operationContext.addAttachmentRows(attachmentRows); } @@ -55,7 +56,7 @@ public class CreateIndividualObservationRowsAction extends ExportFishingOperatio for (IndividualObservationBatch individualObservationBatch : individualObservationBatches) { List<Attachment> attachments = persistenceService.getAllAttachments(ObjectTypeCode.SAMPLE, individualObservationBatch.getIdAsInt()); - producerForAttachment. addAttachments(attachments, attachmentRows); + producerForAttachment.addAttachments(attachments, attachmentRows); } return attachmentRows; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateMarineLitterRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateMarineLitterRowsAction.java index 452b336..b6a2855 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateMarineLitterRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateMarineLitterRowsAction.java @@ -29,19 +29,20 @@ public class CreateMarineLitterRowsAction extends ExportFishingOperationActionSu } @Override - public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { - - if (operationContext.isWithCatchBatch()) { + public boolean doExecute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { + return exportContext.isExportMarineLitter() && operationContext.isWithCatchBatch(); + } - List<MarineLitterRow> marineLitterRows = exportContext.getProducerForMarineLitter().getDataToExport(operationContext); - operationContext.setMarineLitterRows(marineLitterRows); + @Override + public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { - if (exportContext.isExportAttachments()) { + List<MarineLitterRow> marineLitterRows = exportContext.getProducerForMarineLitter().getDataToExport(operationContext); + operationContext.setMarineLitterRows(marineLitterRows); - List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getRootMarineLitterBatch()); - operationContext.addAttachmentRows(attachmentRows); + if (exportContext.isExportAttachments()) { - } + List<AttachmentRow> attachmentRows = getAttachmentRows(exportContext, operationContext.getRootMarineLitterBatch()); + operationContext.addAttachmentRows(attachmentRows); } @@ -54,7 +55,7 @@ public class CreateMarineLitterRowsAction extends ExportFishingOperationActionSu List<AttachmentRow> attachmentRows = new ArrayList<>(); for (MarineLitterBatch marineLitterBatch : marineLitterBatches.getChildren()) { - List<Attachment> attachments =persistenceService.getAllAttachments(ObjectTypeCode.BATCH, marineLitterBatch.getIdAsInt()); + List<Attachment> attachments = persistenceService.getAllAttachments(ObjectTypeCode.BATCH, marineLitterBatch.getIdAsInt()); producerForAttachment.addAttachments(attachments, attachmentRows); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateOperationRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateOperationRowsAction.java index 43ec895..373c863 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateOperationRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateOperationRowsAction.java @@ -30,13 +30,25 @@ public class CreateOperationRowsAction extends ExportFishingOperationActionSuppo } @Override + public boolean doExecute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { + return true; + } + + @Override public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { FishingOperation operation = operationContext.getOperation(); Cruise cruise = operationContext.getCruise(); CatchBatch catchBatch = operationContext.getCatchBatch(); + boolean exportSpecies = exportContext.isExportSpecies(); + boolean exportBenthos = exportContext.isExportBenthos(); + boolean exportMarineLitter = exportContext.isExportMarineLitter(); + OperationRow operationRow = exportContext.getProducerForOperation().getDataToExport(cruise, operation, catchBatch); + + operationRow.computeCatchValues(exportSpecies, exportBenthos, exportMarineLitter); + operationContext.setOperationRow(operationRow); if (exportContext.isExportAttachments()) { @@ -70,4 +82,5 @@ public class CreateOperationRowsAction extends ExportFishingOperationActionSuppo return attachmentRows; } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateParameterRowsAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateParameterRowsAction.java index 2013771..f5cdec5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateParameterRowsAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/CreateParameterRowsAction.java @@ -17,6 +17,11 @@ import java.util.List; public class CreateParameterRowsAction extends ExportFishingOperationActionSupport { @Override + public boolean doExecute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { + return true; + } + + @Override public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { FishingOperation operation = operationContext.getOperation(); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportFishingOperationActionSupport.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportFishingOperationActionSupport.java index 8ce71d8..3ee5466 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportFishingOperationActionSupport.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/ExportFishingOperationActionSupport.java @@ -11,6 +11,9 @@ import fr.ifremer.tutti.service.genericformat.GenericFormatExportOperationContex */ public abstract class ExportFishingOperationActionSupport { + + public abstract boolean doExecute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext); + public abstract void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext); } \ No newline at end of file diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FinalizeExportAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FinalizeExportAction.java index 35d3d1c..c8f530d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FinalizeExportAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FinalizeExportAction.java @@ -1,8 +1,13 @@ package fr.ifremer.tutti.service.genericformat.exportactions; +import fr.ifremer.tutti.service.csv.CsvProducer; import fr.ifremer.tutti.service.genericformat.GenericFormatExportContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.application.ApplicationTechnicalException; +import java.util.Set; + import static org.nuiton.i18n.I18n.t; /** @@ -13,21 +18,28 @@ import static org.nuiton.i18n.I18n.t; */ public class FinalizeExportAction extends ExportTechnicalActionSupport { + /** Logger. */ + private static final Log log = LogFactory.getLog(FinalizeExportAction.class); + @Override public void execute(GenericFormatExportContext exportContext) { try { - if (!exportContext.isCruiseExported()) { - addEmptyCruiseFiles(exportContext); - } + Set<CsvProducer<?, ?>> producers = exportContext.producers(); + for (CsvProducer<?, ?> producer : producers) { - if (!exportContext.isOperationExported()) { - addEmptyOperationFiles(exportContext); - } + if (!producer.wasTouched()) { + try { + if (log.isInfoEnabled()) { + log.info("Write empty file for csv producer: " + producer); + } + producer.writeEmpty(); + } catch (Exception e) { + throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.emptyFile.error"), e); + } - if (!exportContext.isExportAttachments()) { - addEmptyAttachmentFile(exportContext); + } } } finally { @@ -38,47 +50,4 @@ public class FinalizeExportAction extends ExportTechnicalActionSupport { } - protected void addEmptyCruiseFiles(GenericFormatExportContext exportContext) { - - try { - - exportContext.getProducerForSurvey().writeEmpty(); - exportContext.getProducerForGearCaracteristics().writeEmpty(); - exportContext.getProducerForAttachment().writeEmpty(); - - } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.survey.error"), e); - } - - } - - protected void addEmptyOperationFiles(GenericFormatExportContext exportContext) { - - try { - - exportContext.getProducerForOperation().writeEmpty(); - exportContext.getProducerForParameter().writeEmpty(); - exportContext.getProducerForAccidentalCatch().writeEmpty(); - exportContext.getProducerForIndividualObservation().writeEmpty(); - exportContext.getProducerForCatch().writeEmpty(); - exportContext.getProducerForMarineLitter().writeEmpty(); - - } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.operations.error"), e); - } - - } - - protected void addEmptyAttachmentFile(GenericFormatExportContext exportContext) { - - try { - - exportContext.getProducerForAttachment().writeEmpty(); - - } catch (Exception e) { - throw new ApplicationTechnicalException(t("tutti.service.genericFormat.export.attachments.error"), e); - } - - } - } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FlushOperationAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FlushOperationAction.java index fbbb8cd..a226f0e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FlushOperationAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/FlushOperationAction.java @@ -15,6 +15,11 @@ import static org.nuiton.i18n.I18n.t; public class FlushOperationAction extends ExportFishingOperationActionSupport { @Override + public boolean doExecute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { + return true; + } + + @Override public void execute(GenericFormatExportContext exportContext, GenericFormatExportOperationContext operationContext) { try { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/LoadDataAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/LoadDataAction.java index f932632..fa45a02 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/LoadDataAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/exportactions/LoadDataAction.java @@ -1,14 +1,14 @@ package fr.ifremer.tutti.service.genericformat.exportactions; import com.google.common.base.Preconditions; -import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.model.CruiseDataModel; +import fr.ifremer.tutti.persistence.model.OperationDataModel; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.genericformat.GenericFormatExportContext; -import fr.ifremer.tutti.service.genericformat.GenericFormatExportCruiseContext; -import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; @@ -23,35 +23,29 @@ public class LoadDataAction extends ExportTechnicalActionSupport { private final PersistenceService persistenceService; public LoadDataAction(PersistenceService persistenceService) { - this.persistenceService = persistenceService; } @Override public void execute(GenericFormatExportContext exportContext) { - Multimap<String, String> dataIdsToExport = exportContext.getDataIdsToExport(); - - for (String cruiseId : dataIdsToExport.keySet()) { + ProgramDataModel dataToExport = exportContext.getDataToExport(); - Collection<String> operationIds = dataIdsToExport.get(cruiseId); + for (CruiseDataModel cruiseDataModel : dataToExport) { - Cruise cruise = persistenceService.getCruise(cruiseId); + Cruise cruise = persistenceService.getCruise(cruiseDataModel.getId()); Preconditions.checkNotNull(cruise); Set<FishingOperation> operations = new LinkedHashSet<>(); - if (!operationIds.isEmpty()) { - for (String operationId : operationIds) { - FishingOperation operation = persistenceService.getFishingOperation(operationId); - operations.add(operation); + for (OperationDataModel operationDataModel : cruiseDataModel) { - } + FishingOperation operation = persistenceService.getFishingOperation(operationDataModel.getId()); + operations.add(operation); } - GenericFormatExportCruiseContext cruiseContext = new GenericFormatExportCruiseContext(cruise, operations); - exportContext.addCruiseContext(cruiseContext); + exportContext.addCruiseContext(cruise, operations); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/producer/CsvProducerForCatch.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/producer/CsvProducerForCatch.java index 54389b6..1091dc2 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/producer/CsvProducerForCatch.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/producer/CsvProducerForCatch.java @@ -89,6 +89,38 @@ public class CsvProducerForCatch extends CsvProducer<CatchRow, CatchModel> { } + public List<CatchRow> getBenthosOnlyDataToExport(GenericFormatExportOperationContext operationExportContext, + Float benthosCatchRaisingFactor) { + + List<CatchRow> rows = new ArrayList<>(); + + BatchContainer<BenthosBatch> rootBenthosBatch = operationExportContext.getRootBenthosBatch(); + + Caracteristic weightMeasuredCaracteristic = operationExportContext.getWeightMeasuredCaracteristic(); + String batchWeightUnit = weightMeasuredCaracteristic.getUnit(); + + addBenthosBatches(operationExportContext, rootBenthosBatch, benthosCatchRaisingFactor, batchWeightUnit, rows); + + return rows; + + } + + public List<CatchRow> getSpeciesOnlyDataToExport(GenericFormatExportOperationContext operationExportContext, + Float speciesCatchRaisingFactor) { + + List<CatchRow> rows = new ArrayList<>(); + + BatchContainer<SpeciesBatch> rootSpeciesBatch = operationExportContext.getRootSpeciesBatch(); + + Caracteristic weightMeasuredCaracteristic = operationExportContext.getWeightMeasuredCaracteristic(); + String batchWeightUnit = weightMeasuredCaracteristic.getUnit(); + + addSpeciesBatches(operationExportContext, rootSpeciesBatch, speciesCatchRaisingFactor, batchWeightUnit, rows); + + return rows; + + } + protected void addBenthosBatches(GenericFormatExportOperationContext operationExportContext, BatchContainer<BenthosBatch> rootBenthosBatch, Float benthosCatchRaisingFactor, diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/producer/CsvProducerForOperation.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/producer/CsvProducerForOperation.java index 508cd05..7ae4a55 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/producer/CsvProducerForOperation.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/producer/CsvProducerForOperation.java @@ -51,7 +51,6 @@ public class CsvProducerForOperation extends CsvProducer<OperationRow, Operation row.setCruise(cruise); row.setFishingOperation(operation); row.setCatchBatch(catchBatch); - row.computeCatchValues(); return row; diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index 61b00b9..5fb02a1 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -130,6 +130,7 @@ tutti.service.genericFormat.export.buildZip= tutti.service.genericFormat.export.catches.error= tutti.service.genericFormat.export.closeContext.error= tutti.service.genericFormat.export.context.error= +tutti.service.genericFormat.export.emptyFile.error= tutti.service.genericFormat.export.exportProtocol= tutti.service.genericFormat.export.exportSampleCategoyModel= tutti.service.genericFormat.export.exportSpecies= diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index 226148a..4bf7a12 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -106,6 +106,7 @@ tutti.service.genericFormat.export.buildZip=Création de l'archive de l'export ( tutti.service.genericFormat.export.catches.error=Erreur lors de l'export des captures tutti.service.genericFormat.export.closeContext.error=Erreur lors de la fermeture du contexte d'export tutti.service.genericFormat.export.context.error=Erreur lors de la création des fichiers pour l'export +tutti.service.genericFormat.export.emptyFile.error=Erreur lors de la création d'un fichier pour l'export tutti.service.genericFormat.export.error.invalid.cruise=Erreur d'élévation de poids sur les traits de la campagne %s \:<ul>%s</ul> tutti.service.genericFormat.export.error.invalid.fishingOperation=L'élévation des poids ne peut pas être réalisée sur le trait %s, pour les raisons suivantes \:<ul>%s</ul> tutti.service.genericFormat.export.exportProtocol=Export du protocol %s diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceAno5804Test.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceAno5804Test.java index 3ce33ec..322bc47 100644 --- a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceAno5804Test.java +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceAno5804Test.java @@ -99,8 +99,9 @@ public class GenericFormatExportServiceAno5804Test { Assert.assertFalse(exportFile.exists()); + String programId = dataContext.program.getId(); String cruiseId = dataContext.cruise.getId(); - GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(cruiseId, exportFile); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(programId, cruiseId, exportFile); int nbSteps = service.getExportNbSteps(exportConfiguration); progressionModel.setTotal(nbSteps); diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceTest.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceTest.java index f0677ab..ca91118 100644 --- a/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceTest.java +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/genericformat/GenericFormatExportServiceTest.java @@ -249,8 +249,9 @@ public class GenericFormatExportServiceTest { Assert.assertFalse(exportFile.exists()); + String programId = dataContext.program.getId(); String cruiseId = dataContext.cruise.getId(); - GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(cruiseId, exportFile); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(programId, cruiseId, exportFile); int nbSteps = service.getExportNbSteps(exportConfiguration); progressionModel.setTotal(nbSteps); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 148837e7b87a045a9be17dec2e747f95e60f5f93 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:58:27 2015 +0200 impact Export API in Report service --- .../tutti/service/report/ReportGenerationRequest.java | 13 +++++++++++++ .../tutti/service/report/ReportGenerationService.java | 5 +++-- .../tutti/ui/swing/content/report/ReportUIHandler.java | 4 ++++ .../tutti/ui/swing/content/report/ReportUIModel.java | 10 ++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationRequest.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationRequest.java index f9e42ea..23ba176 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationRequest.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationRequest.java @@ -43,6 +43,11 @@ public class ReportGenerationRequest implements Serializable { protected File report; /** + * Selected program id. + */ + protected String programId; + + /** * Selected cruise id (of fishing operation). */ protected String cruiseId; @@ -60,6 +65,14 @@ public class ReportGenerationRequest implements Serializable { this.report = report; } + public String getProgramId() { + return programId; + } + + public void setProgramId(String programId) { + this.programId = programId; + } + public String getCruiseId() { return cruiseId; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationService.java index 4698ff8..d435bd2 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/report/ReportGenerationService.java @@ -80,6 +80,7 @@ public class ReportGenerationService extends AbstractTuttiService { Preconditions.checkNotNull(request); Preconditions.checkNotNull(request.getReport()); Preconditions.checkState(request.getReport().exists()); + Preconditions.checkNotNull(request.getProgramId()); Preconditions.checkNotNull(request.getCruiseId()); Preconditions.checkNotNull(request.getFishingOperationId()); @@ -91,7 +92,7 @@ public class ReportGenerationService extends AbstractTuttiService { // export fishing operation progressionModel.increments(t("tutti.report.step.export.fishingOperation")); GenericFormatExportService service = getService(GenericFormatExportService.class); - GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForFishingOperation(request.getCruiseId(), request.getFishingOperationId(), null); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForFishingOperation(request.getProgramId(), request.getCruiseId(), request.getFishingOperationId(), null); GenericFormatExportResult exportResult = service.export(exportConfiguration, progressionModel); @@ -206,7 +207,7 @@ public class ReportGenerationService extends AbstractTuttiService { int result = 4; GenericFormatExportService service = getService(GenericFormatExportService.class); - GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForFishingOperation(request.getCruiseId(), request.getFishingOperationId(), null); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForFishingOperation(request.getProgramId(), request.getCruiseId(), request.getFishingOperationId(), null); result += service.getExportNbSteps(exportConfiguration); return result; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/ReportUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/ReportUIHandler.java index 67e49a0..344e76e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/ReportUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/ReportUIHandler.java @@ -59,6 +59,10 @@ public class ReportUIHandler extends AbstractTuttiUIHandler<ReportUIModel, Repor ReportUIModel model = new ReportUIModel(); + // set programId + String programId = getDataContext().getProgramId(); + model.setProgramId(programId); + // set cruiseId String cruiseId = getDataContext().getCruiseId(); model.setCruiseId(cruiseId); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/ReportUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/ReportUIModel.java index 22ea0f8..7b29788 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/ReportUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/report/ReportUIModel.java @@ -63,6 +63,8 @@ public class ReportUIModel extends AbstractTuttiBeanUIModel<ReportGenerationRequ /** Report to use. */ protected File report; + protected String programId; + protected String cruiseId; protected FishingOperation fishingOperation; @@ -99,6 +101,14 @@ public class ReportUIModel extends AbstractTuttiBeanUIModel<ReportGenerationRequ firePropertyChange(PROPERTY_REPORT, oldValue, report); } + public String getProgramId() { + return programId; + } + + public void setProgramId(String programId) { + this.programId = programId; + } + public String getCruiseId() { return cruiseId; } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit a95fae176fdaafcfad2d248bee0f6d2ebe503d92 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 15:59:08 2015 +0200 impact Export API in legacy export actions --- .../actions/ExportGenericFormatCruiseAction.java | 37 +++--- .../ExportGenericFormatProgramCruisesAction.java | 30 ++--- .../ImportGenericFormatProgramCruisesAction.java | 138 --------------------- .../actions/OpenGenericFormatImportScreen.java | 66 ---------- 4 files changed, 37 insertions(+), 234 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatCruiseAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatCruiseAction.java index 00e4783..bf9cd13 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatCruiseAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatCruiseAction.java @@ -22,20 +22,24 @@ package fr.ifremer.tutti.ui.swing.content.home.actions; * #L% */ +import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.service.genericformat.GenericFormatExportConfiguration; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportResult; import fr.ifremer.tutti.service.genericformat.GenericFormatExportService; -import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUI; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUIHandler; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUIModel; +import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.application.ApplicationBusinessException; import java.io.File; +import java.util.List; import static org.nuiton.i18n.I18n.t; @@ -52,6 +56,8 @@ public class ExportGenericFormatCruiseAction extends LongActionSupport<SelectCru protected File file; + private GenericFormatExportResult exportResult; + public ExportGenericFormatCruiseAction(SelectCruiseUIHandler handler) { super(handler, true); } @@ -82,14 +88,21 @@ public class ExportGenericFormatCruiseAction extends LongActionSupport<SelectCru @Override public void releaseAction() { + exportResult = null; file = null; + handler.resetEditCruiseAction(); super.releaseAction(); } @Override public void doAction() throws Exception { + + Program program = getModel().getProgram(); + Preconditions.checkNotNull(program); + Cruise cruise = getModel().getCruise(); Preconditions.checkNotNull(cruise); + Preconditions.checkNotNull(file); if (log.isInfoEnabled()) { @@ -103,27 +116,21 @@ public class ExportGenericFormatCruiseAction extends LongActionSupport<SelectCru ProgressionModel progressionModel = getProgressionModel(); progressionModel.increments(t("tutti.exportCruise.action.computeNbSteps")); - GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(cruise.getId(), file); + GenericFormatExportConfiguration exportConfiguration = service.createExportConfigurationForCruise(program.getId(), cruise.getId(), file); int nbSteps = service.getExportNbSteps(exportConfiguration); progressionModel.adaptTotal(nbSteps); - ApplicationBusinessException exportError = null; + exportResult = service.export(exportConfiguration, progressionModel); - try { - service.export(exportConfiguration, progressionModel); + sendMessage(t("tutti.exportCruise.action.success", cruise.getName(), file.getName())); - sendMessage(t("tutti.exportCruise.action.success", cruise.getName(), file.getName())); - } catch (ApplicationBusinessException e) { + if (!exportResult.isSuccess()) { - String errorMessage; - errorMessage = t("tutti.exportCruise.action.exportErrors", cruise.getName(), e.getMessage()); - exportError = new ApplicationBusinessException(errorMessage); + List<String> errorsByCruise = exportResult.getErrorsByCruise(); + String errorMessage = t("tutti.exportCruise.action.exportErrors", cruise.getName(), Joiner.on('\n').join(errorsByCruise)); + throw new ApplicationBusinessException(errorMessage); } - handler.resetEditCruiseAction(); - - if (exportError != null) { - throw exportError; - } } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatProgramCruisesAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatProgramCruisesAction.java index a01ae44..b046527 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatProgramCruisesAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ExportGenericFormatProgramCruisesAction.java @@ -22,20 +22,23 @@ package fr.ifremer.tutti.ui.swing.content.home.actions; * #L% */ +import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.service.genericformat.GenericFormatExportConfiguration; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportResult; import fr.ifremer.tutti.service.genericformat.GenericFormatExportService; -import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUI; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUIHandler; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUIModel; +import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.application.ApplicationBusinessException; import java.io.File; +import java.util.List; import static org.nuiton.i18n.I18n.t; @@ -52,6 +55,8 @@ public class ExportGenericFormatProgramCruisesAction extends LongActionSupport<S protected File file; + private GenericFormatExportResult exportResult; + public ExportGenericFormatProgramCruisesAction(SelectCruiseUIHandler handler) { super(handler, true); } @@ -82,6 +87,8 @@ public class ExportGenericFormatProgramCruisesAction extends LongActionSupport<S @Override public void releaseAction() { file = null; + exportResult = null; + handler.resetEditProgramAction(); super.releaseAction(); } @@ -107,26 +114,19 @@ public class ExportGenericFormatProgramCruisesAction extends LongActionSupport<S int nbSteps = service.getExportNbSteps(exportConfiguration); progressionModel.adaptTotal(nbSteps); + exportResult = service.export(exportConfiguration, progressionModel); - ApplicationBusinessException exportError = null; + sendMessage(t("tutti.exportProgram.action.success", program.getName(), file.getName())); - try { - service.export(exportConfiguration, progressionModel); - } catch (ApplicationBusinessException e) { + if (exportResult.isSuccess()) { + List<String> errorsByCruise = exportResult.getErrorsByCruise(); String errorMessage; - errorMessage = t("tutti.exportProgram.action.exportErrors", program.getName(), e.getMessage()); + errorMessage = t("tutti.exportProgram.action.exportErrors", program.getName(), Joiner.on('\n').join(errorsByCruise)); - exportError = new ApplicationBusinessException(errorMessage); + throw new ApplicationBusinessException(errorMessage); } - handler.resetEditProgramAction(); - - sendMessage(t("tutti.exportProgram.action.success", program.getName(), - file.getName())); - - if (exportError != null) { - throw exportError; - } } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ImportGenericFormatProgramCruisesAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ImportGenericFormatProgramCruisesAction.java deleted file mode 100644 index b1bce89..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/ImportGenericFormatProgramCruisesAction.java +++ /dev/null @@ -1,138 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.home.actions; - -/* - * #%L - * Tutti :: UI - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2012 - 2015 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import com.google.common.base.Preconditions; -import fr.ifremer.tutti.persistence.entities.data.Program; -import fr.ifremer.tutti.service.genericformat.GenericFormatImportConfiguration; -import fr.ifremer.tutti.service.genericformat.GenericFormatImportService; -import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; -import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUI; -import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUIHandler; -import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUIModel; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.ApplicationBusinessException; - -import java.io.File; - -import static org.nuiton.i18n.I18n.t; - -/** - * Created on 2/11/15. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 3.14 - */ -public class ImportGenericFormatProgramCruisesAction extends LongActionSupport<SelectCruiseUIModel, SelectCruiseUI, SelectCruiseUIHandler> { - - /** Logger. */ - private static final Log log = LogFactory.getLog(ImportGenericFormatProgramCruisesAction.class); - - protected File file; - - public ImportGenericFormatProgramCruisesAction(SelectCruiseUIHandler handler) { - super(handler, true); - } - - @Override - public boolean prepareAction() throws Exception { - - boolean doAction = super.prepareAction(); - - if (doAction) { - - // choose file to import - file = chooseFile( - t("tutti.selectCruise.title.choose.importGenericFormatFile"), - t("tutti.selectCruise.action.importGenericformat"), - "^.+\\.zip$", t("tutti.common.file.zip") - ); - - doAction = file != null; - } - - if (doAction) { - - // compute number of steps (will also check archive format) - - GenericFormatImportConfiguration importConfiguration = new GenericFormatImportConfiguration(); - importConfiguration.setImportFile(file); - - GenericFormatImportService service = getContext().getGenericFormatImportService(); - int nbSteps = service.getImportProgramNbSteps(importConfiguration); - createProgressionModelIfRequired(nbSteps); - - } - - return doAction; - - } - - @Override - public void doAction() throws Exception { - - Program program = getModel().getProgram(); - Preconditions.checkNotNull(program); - Preconditions.checkNotNull(file); - - if (log.isInfoEnabled()) { - log.info("Will import cruises to program " + program.getName() + " from archive: " + file); - } - - GenericFormatImportService service = getContext().getGenericFormatImportService(); - - ApplicationBusinessException importError = null; - - GenericFormatImportConfiguration importConfiguration = new GenericFormatImportConfiguration(); - importConfiguration.setImportFile(file); - importConfiguration.setProgramId(program.getId()); - - try { - service.importProgram(importConfiguration, getProgressionModel()); - } catch (ApplicationBusinessException e) { - - String errorMessage; - errorMessage = t("tutti.importProgram.action.importErrors", program.getName(), e.getMessage()); - - importError = new ApplicationBusinessException(errorMessage); - } - - handler.resetEditProgramAction(); - - sendMessage(t("tutti.importProgram.action.success", program.getName(), file.getName())); - - if (importError != null) { - throw importError; - } - } - - @Override - public void releaseAction() { - file = null; - super.releaseAction(); - } -} - diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/OpenGenericFormatImportScreen.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/OpenGenericFormatImportScreen.java deleted file mode 100644 index a540de5..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/actions/OpenGenericFormatImportScreen.java +++ /dev/null @@ -1,66 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.home.actions; - -/* - * #%L - * Tutti :: UI - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2012 - 2015 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import fr.ifremer.tutti.ui.swing.TuttiScreen; -import fr.ifremer.tutti.ui.swing.content.actions.AbstractChangeScreenAction; -import fr.ifremer.tutti.ui.swing.content.MainUIHandler; - -import static org.nuiton.i18n.I18n.t; - -/** - * Created on 2/24/15. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 3.14 - */ -public class OpenGenericFormatImportScreen extends AbstractChangeScreenAction { - - public OpenGenericFormatImportScreen(MainUIHandler handler) { - super(handler, true, TuttiScreen.GENERIC_FORMAT_IMPORT); - } - - @Override - public void doAction() throws Exception { - - createProgressionModelIfRequired(5); - - getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.allGear")); - getContext().getPersistenceService().getAllGear(); - - getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.allPerson")); - getContext().getPersistenceService().getAllPerson(); - - getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.allSpecies")); - getContext().getPersistenceService().getAllSpecies(); - - getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.allVessel")); - getContext().getPersistenceService().getAllVessel(); - - getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.ui")); - - super.doAction(); - } -} \ No newline at end of file -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit bf8a93c34480c6529baf9c75591bac53274f0665 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 16:00:01 2015 +0200 add new export screen --- .../filtered-resources/tutti-help-fr.properties | 39 ++--- .../fr/ifremer/tutti/ui/swing/TuttiScreen.java | 6 + .../actions/OpenGenericFormatExportScreen.java | 41 +++++ .../genericformat/GenericFormatExportUI.css | 169 +++++++++++++++++++++ .../genericformat/GenericFormatExportUI.jaxx | 121 +++++++++++++++ .../GenericFormatExportUIHandler.java | 154 +++++++++++++++++++ .../genericformat/GenericFormatExportUIModel.java | 156 +++++++++++++++++++ .../genericformat/actions/FoldAllDataAction.java | 41 +++++ .../actions/GenericFormatExportAction.java | 113 ++++++++++++++ .../genericformat/actions/SelectAllDataAction.java | 35 +++++ .../genericformat/actions/UnfoldAllDataAction.java | 39 +++++ .../actions/UnselectAllDataAction.java | 35 +++++ .../genericformat/tree/CruiseSelectTreeNode.java | 121 +++++++++++++++ .../tree/DataSelectTreeCellEditor.java | 65 ++++++++ .../tree/DataSelectTreeCellRenderer.java | 112 ++++++++++++++ .../tree/DataSelectTreeNodeSupport.java | 49 ++++++ .../tree/OperationSelectTreeNode.java | 51 +++++++ .../genericformat/tree/ProgramSelectTreeNode.java | 64 ++++++++ .../src/main/resources/icons/action-collapse.png | Bin 0 -> 372 bytes .../src/main/resources/icons/action-expand.png | Bin 0 -> 371 bytes .../src/main/resources/icons/action-select.png | Bin 0 -> 392 bytes .../src/main/resources/icons/action-unselect.png | Bin 0 -> 311 bytes 22 files changed, 1387 insertions(+), 24 deletions(-) diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index 3e7f55a..0a7e502 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -1,28 +1,5 @@ -### -# #%L -# Tutti :: UI -# $Id:$ -# $HeadURL:$ -# %% -# Copyright (C) 2012 - 2015 Ifremer -# %% -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public -# License along with this program. If not, see -# <http://www.gnu.org/licenses/gpl-3.0.html>. -# #L% -### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Sat Mar 07 10:47:12 CET 2015 +#Sun Mar 29 16:12:43 CEST 2015 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -334,6 +311,19 @@ tutti.fishingOperations.action.deleteFishingOperation.help=editFishingOperation. tutti.fishingOperations.action.newFishingOperation.help=editFishingOperation.html\#traitActions tutti.fishingOperations.field.fishingOperation.help=editFishingOperation.html\#fields tutti.fishingOperations.help=editFishingOperation.html +tutti.genericFormatExport.action.closeGenericFormatExport.help= +tutti.genericFormatExport.action.export.help= +tutti.genericFormatExport.action.foldAll.help= +tutti.genericFormatExport.action.selectAll.help= +tutti.genericFormatExport.action.unfoldAll.help= +tutti.genericFormatExport.action.unselectAll.help= +tutti.genericFormatExport.field.exportAccidentalCatch.help= +tutti.genericFormatExport.field.exportAttachments.help= +tutti.genericFormatExport.field.exportBenthos.help= +tutti.genericFormatExport.field.exportIndividualObservation.help= +tutti.genericFormatExport.field.exportMarineLitter.help= +tutti.genericFormatExport.field.exportSpecies.help= +tutti.genericFormatExport.field.program.help= tutti.genericFormatImport.action.closeGenericFormatImport.help=genericFormat.html\#generic_format_import_actions tutti.genericFormatImport.action.generateReport.help=genericFormat.html\#generic_format_import_actions tutti.genericFormatImport.action.import.help=genericFormat.html\#generic_format_import_actions @@ -373,6 +363,7 @@ tutti.main.menu.action.editSampleCategoryModel.help=menu.html\#menu_administrati tutti.main.menu.action.exit.help=menu.html\#menu_fichier tutti.main.menu.action.generateCruiseReport.help=menu.html\#menu_action tutti.main.menu.action.generateSelectedCruiseReport.help=menu.html\#menu_action +tutti.main.menu.action.genericFormatExport.help= tutti.main.menu.action.genericFormatImport.help=menu.html\#menu_action tutti.main.menu.action.importTemporaryReferential.help=menu.html\#menu_administration tutti.main.menu.action.manageDb.help=menu.html\#menu_fichier diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiScreen.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiScreen.java index 76801dc..e1f370a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiScreen.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiScreen.java @@ -110,4 +110,10 @@ public enum TuttiScreen { * @since 3.14 */ GENERIC_FORMAT_IMPORT, + /** + * To perform a generic format export. + * + * @since 3.14.3 + */ + GENERIC_FORMAT_EXPORT, } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/OpenGenericFormatExportScreen.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/OpenGenericFormatExportScreen.java new file mode 100644 index 0000000..2825e49 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/OpenGenericFormatExportScreen.java @@ -0,0 +1,41 @@ +package fr.ifremer.tutti.ui.swing.content.actions; + +import fr.ifremer.tutti.ui.swing.TuttiScreen; +import fr.ifremer.tutti.ui.swing.content.MainUIHandler; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class OpenGenericFormatExportScreen extends AbstractChangeScreenAction { + + public OpenGenericFormatExportScreen(MainUIHandler handler) { + super(handler, true, TuttiScreen.GENERIC_FORMAT_EXPORT); + } + + @Override + public void doAction() throws Exception { + + createProgressionModelIfRequired(5); + + getProgressionModel().increments(t("tutti.openGenericFormatExportScreen.step.loading.allGear")); + getContext().getPersistenceService().getAllGear(); + + getProgressionModel().increments(t("tutti.openGenericFormatExportScreen.step.loading.allPerson")); + getContext().getPersistenceService().getAllPerson(); + + getProgressionModel().increments(t("tutti.openGenericFormatExportScreen.step.loading.allSpecies")); + getContext().getPersistenceService().getAllSpecies(); + + getProgressionModel().increments(t("tutti.openGenericFormatExportScreen.step.loading.allVessel")); + getContext().getPersistenceService().getAllVessel(); + + getProgressionModel().increments(t("tutti.openGenericFormatExportScreen.step.loading.ui")); + + super.doAction(); + } +} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUI.css new file mode 100644 index 0000000..ea92a8e --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUI.css @@ -0,0 +1,169 @@ +/* + * #%L + * Tutti :: UI + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2012 - 2015 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +BeanFilterableComboBox { + showReset: true; + bean: {model}; +} + +JToolBar { + borderPainted: false; + floatable: false; + opaque: true; +} + +#genericFormatExportTopPanel { + _help: {"tutti.genericFormatExport.help"}; +} + +#exportOptions { + border: {BorderFactory.createTitledBorder(t("tutti.genericFormatExport.exportOptions.legend"))}; +} + +#dataSelectionPane { + border: {BorderFactory.createTitledBorder(t("tutti.genericFormatExport.selectData.legend"))}; + columnHeaderView: {dataSelectionTreeHeader}; +} + +#dataSelectionTree { + model: {new DefaultTreeModel(null)}; + rootVisible: false; + scrollsOnExpand: true; + editable: true; + toggleClickCount: 1; + cellEditor: {new DataSelectTreeCellEditor(dataSelectionTree)}; + cellRenderer: {new DataSelectTreeCellRenderer()}; +} + +#programLabel { + text: "tutti.genericFormatExport.field.program"; + labelFor: {programComboBox}; + toolTipText: "tutti.genericFormatExport.field.program.tip"; + _help: {"tutti.genericFormatExport.field.program.help"}; +} + +#programComboBox { + property: program; + selectedItem: {model.getProgram()}; + _validatorLabel: {t("tutti.genericFormatExport.field.program")}; + _help: {"tutti.genericFormatExport.field.program.help"}; +} + +#exportAttachmentsCheckBox { + text: "tutti.genericFormatExport.field.exportAttachments"; + selected: {model.isExportAttachments()}; + toolTipText: "tutti.genericFormatExport.field.exportAttachments.tip"; + _help: {"tutti.genericFormatExport.field.exportAttachments.help"}; +} + +#exportSpeciesCheckBox { + text: "tutti.genericFormatExport.field.exportSpecies"; + selected: {model.isExportSpecies()}; + toolTipText: "tutti.genericFormatExport.field.exportSpecies.tip"; + _help: {"tutti.genericFormatExport.field.exportSpecies.help"}; +} + +#exportBenthosCheckBox { + text: "tutti.genericFormatExport.field.exportBenthos"; + selected: {model.isExportBenthos()}; + toolTipText: "tutti.genericFormatExport.field.exportBenthos.tip"; + _help: {"tutti.genericFormatExport.field.exportBenthos.help"}; +} + +#exportMarineLitterCheckBox { + text: "tutti.genericFormatExport.field.exportMarineLitter"; + selected: {model.isExportMarineLitter()}; + toolTipText: "tutti.genericFormatExport.field.exportMarineLitter.tip"; + _help: {"tutti.genericFormatExport.field.exportMarineLitter.help"}; +} + +#exportAccidentalCatchCheckBox { + text: "tutti.genericFormatExport.field.exportAccidentalCatch"; + selected: {model.isExportAccidentalCatch()}; + toolTipText: "tutti.genericFormatExport.field.exportAccidentalCatch.tip"; + _help: {"tutti.genericFormatExport.field.exportAccidentalCatch.help"}; +} + +#exportIndividualObservationCheckBox { + text: "tutti.genericFormatExport.field.exportIndividualObservation"; + selected: {model.isExportIndividualObservation()}; + toolTipText: "tutti.genericFormatExport.field.exportIndividualObservation.tip"; + _help: {"tutti.genericFormatExport.field.exportIndividualObservation.help"}; +} + +#exportButton { + actionIcon: export; + text: "tutti.genericFormatExport.action.export"; + toolTipText: "tutti.genericFormatExport.action.export.tip"; + i18nMnemonic: "tutti.genericFormatExport.action.export.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.content.genericformat.actions.GenericFormatExportAction.class}; + enabled: {model.isCanExport()}; + _help: {"tutti.genericFormatExport.action.export.help"}; +} + +#closeButton { + actionIcon: cancel; + text: "tutti.genericFormatExport.action.closeGenericFormatExport"; + toolTipText: "tutti.genericFormatExport.action.closeGenericFormatExport.tip"; + i18nMnemonic: "tutti.genericFormatExport.action.closeGenericFormatExport.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.content.actions.OpenHomeScreenAction.class}; + _help: {"tutti.genericFormatExport.action.closeGenericFormatExport.help"}; +} + +#selectAllButton { + actionIcon: select; + /*text: "tutti.genericFormatExport.action.selectAll";*/ + toolTipText: "tutti.genericFormatExport.action.selectAll.tip"; + enabled: {model.getProgram() != null}; + _simpleAction: {fr.ifremer.tutti.ui.swing.content.genericformat.actions.SelectAllDataAction.class}; + _help: {"tutti.genericFormatExport.action.selectAll.help"}; +} + +#unselectAllButton { + actionIcon: unselect; + /*text: "tutti.genericFormatExport.action.unselectAll";*/ + toolTipText: "tutti.genericFormatExport.action.unselectAll.tip"; + enabled: {model.getProgram() != null}; + _simpleAction: {fr.ifremer.tutti.ui.swing.content.genericformat.actions.UnselectAllDataAction.class}; + _help: {"tutti.genericFormatExport.action.unselectAll.help"}; +} + +#foldAllButton { + actionIcon: collapse; + /*text: "tutti.genericFormatExport.action.foldAll";*/ + toolTipText: "tutti.genericFormatExport.action.foldAll.tip"; + enabled: {model.getProgram() != null}; + _simpleAction: {fr.ifremer.tutti.ui.swing.content.genericformat.actions.FoldAllDataAction.class}; + _help: {"tutti.genericFormatExport.action.foldAll.help"}; +} + +#unfoldAllButton { + actionIcon: expand; + /*text: "tutti.genericFormatExport.action.unfoldAll";*/ + toolTipText: "tutti.genericFormatExport.action.unfoldAll.tip"; + enabled: {model.getProgram() != null}; + _simpleAction: {fr.ifremer.tutti.ui.swing.content.genericformat.actions.UnfoldAllDataAction.class}; + _help: {"tutti.genericFormatExport.action.unfoldAll.help"}; +} + diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUI.jaxx new file mode 100644 index 0000000..ab64dbe --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUI.jaxx @@ -0,0 +1,121 @@ +<!-- + #%L + Tutti :: UI + %% + Copyright (C) 2012 - 2014 Ifremer + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> +<JPanel id='genericFormatImportTopPanel' layout='{new BorderLayout()}' decorator='help' + implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<GenericFormatExportUIModel, GenericFormatExportUIHandler>'> + + <import> + fr.ifremer.tutti.persistence.entities.data.Program + + fr.ifremer.tutti.ui.swing.TuttiHelpBroker + + fr.ifremer.tutti.ui.swing.util.TuttiUI + fr.ifremer.tutti.ui.swing.util.TuttiUIUtil + fr.ifremer.tutti.ui.swing.content.genericformat.tree.DataSelectTreeCellEditor + fr.ifremer.tutti.ui.swing.content.genericformat.tree.DataSelectTreeCellRenderer + + jaxx.runtime.swing.editor.bean.BeanFilterableComboBox + + javax.swing.tree.DefaultTreeModel + + static org.nuiton.i18n.I18n.t + static jaxx.runtime.SwingUtil.getStringValue + </import> + + <script><![CDATA[ + + public GenericFormatExportUI(TuttiUI parentUI) { + TuttiUIUtil.setParentUI(this, parentUI); + } + ]]></script> + + <GenericFormatExportUIModel id='model' initializer='getContextValue(GenericFormatExportUIModel.class)'/> + + <TuttiHelpBroker id='broker' constructorParams='"tutti.genericFormatimport.help"'/> + + <BeanValidator id='validator' bean='model' context='edit' uiClass='jaxx.runtime.validator.swing.ui.ImageValidationUI'> + <field name='program' component='programComboBox'/> + </BeanValidator> + + <Table fill='both' constraints='BorderLayout.NORTH'> + + <!-- select program --> + <row> + <cell> + <JLabel id='programLabel'/> + </cell> + <cell> + <BeanFilterableComboBox id='programComboBox' constructorParams='this' genericType='Program'/> + </cell> + </row> + + <!-- select data --> + <row> + <cell weightx='1' weighty='1' columns='2'> + <JPanel layout='{new BorderLayout()}'> + <JScrollPane id='dataSelectionPane' constraints='BorderLayout.CENTER'> + <JTree id='dataSelectionTree'/> + </JScrollPane> + <JPanel id='exportOptions' layout='{new BorderLayout()}' constraints='BorderLayout.EAST'> + <JPanel layout='{new GridLayout(0, 1)}' constraints='BorderLayout.NORTH'> + <JCheckBox id='exportAttachmentsCheckBox' onItemStateChanged='handler.setBoolean(event, "exportAttachments")'/> + <JCheckBox id='exportSpeciesCheckBox' onItemStateChanged='handler.setBoolean(event, "exportSpecies")'/> + <JCheckBox id='exportBenthosCheckBox' onItemStateChanged='handler.setBoolean(event, "exportBenthos")'/> + <JCheckBox id='exportMarineLitterCheckBox' onItemStateChanged='handler.setBoolean(event, "exportMarineLitter")'/> + <JCheckBox id='exportAccidentalCatchCheckBox' onItemStateChanged='handler.setBoolean(event, "exportAccidentalCatch")'/> + <JCheckBox id='exportIndividualObservationCheckBox' onItemStateChanged='handler.setBoolean(event, "exportIndividualObservation")'/> + </JPanel> + </JPanel> + </JPanel> + </cell> + </row> + + <row> + <cell fill='both' columns='2'> + <JPanel layout='{new GridLayout(1, 0)}'> + <JButton id='closeButton'/> + <JButton id='exportButton'/> + </JPanel> + </cell> + </row> + + </Table> + + <JToolBar id='dataSelectionTreeHeader'> + <JButton id='unfoldAllButton'/> + <JButton id='foldAllButton'/> + <JButton id='selectAllButton'/> + <JButton id='unselectAllButton'/> + </JToolBar> + + <!--Table fill='both' constraints='BorderLayout.SOUTH'> + + <row> + <cell fill='both' weightx="1"> + <JPanel layout='{new GridLayout(1, 0)}'> + <JButton id='closeButton'/> + <JButton id='exportButton'/> + </JPanel> + </cell> + </row> + </Table--> + +</JPanel> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUIHandler.java new file mode 100644 index 0000000..fd14a96 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUIHandler.java @@ -0,0 +1,154 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.data.Program; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.ProgramSelectTreeNode; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.application.swing.util.CloseableUI; + +import javax.swing.JComponent; +import javax.swing.JTree; +import javax.swing.ToolTipManager; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeSelectionModel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Set; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class GenericFormatExportUIHandler extends AbstractTuttiUIHandler<GenericFormatExportUIModel, GenericFormatExportUI> implements CloseableUI { + + /** Logger. */ + private static final Log log = LogFactory.getLog(GenericFormatExportUIHandler.class); + + @Override + public void beforeInit(GenericFormatExportUI ui) { + + super.beforeInit(ui); + + getDataContext().resetValidationDataContext(); + + GenericFormatExportUIModel model = new GenericFormatExportUIModel(); + + ui.setContextValue(model); + + model.addPropertyChangeListener(new PropertyChangeListener() { + + final Set<String> propertyNamesToCanExport = Sets.newHashSet(GenericFormatExportUIModel.PROPERTY_PROGRAM); + + @Override + public void propertyChange(PropertyChangeEvent evt) { + GenericFormatExportUIModel source = (GenericFormatExportUIModel) evt.getSource(); + String propertyName = evt.getPropertyName(); + + if (propertyNamesToCanExport.contains(propertyName)) { + + boolean canExport = source.computeIsCanExport(); + source.setCanExport(canExport); + + } + + if (GenericFormatExportUIModel.PROPERTY_PROGRAM.equals(propertyName)) { + + // Reload data + remove selection + Program program = (Program) evt.getNewValue(); + onProgramChanged(program); + + } + + } + }); + + } + + @Override + public void afterInit(GenericFormatExportUI ui) { + + initUI(ui); + + GenericFormatExportUIModel model = getModel(); + initBeanFilterableComboBox(ui.getProgramComboBox(), + Lists.newArrayList(getPersistenceService().getAllProgram()), + model.getProgram()); + + SwingValidator validator = ui.getValidator(); + + registerValidators(validator); + + JTree tree = ui.getDataSelectionTree(); + tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + + ToolTipManager.sharedInstance().registerComponent(tree); + + if (getDataContext().isProgramFilled()) { + + Program program = getDataContext().getProgram(); + + if (log.isInfoEnabled()) { + log.info("Using selected program " + program); + } + + model.setProgram(program); + + } + + } + + @Override + protected JComponent getComponentToFocus() { + return getUI().getProgramComboBox(); + } + + @Override + public void onCloseUI() { + if (log.isDebugEnabled()) { + log.debug("closing: " + ui); + } + clearValidators(); + } + + @Override + public boolean quitUI() { + return true; + } + + @Override + public SwingValidator<GenericFormatExportUIModel> getValidator() { + return ui.getValidator(); + } + + protected void onProgramChanged(Program program) { + + if (log.isInfoEnabled()) { + log.info("Program changed: " + program); + } + + ProgramSelectTreeNode root; + if (program == null) { + + root = null; + + } else { + + ProgramDataModel dataModel = getPersistenceService().loadProgram(program.getId(), true); + root = new ProgramSelectTreeNode(dataModel); + + } + + DefaultTreeModel treeModel = (DefaultTreeModel) ui.getDataSelectionTree().getModel(); + treeModel.setRoot(root); + getModel().setRootNode(root); + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUIModel.java new file mode 100644 index 0000000..69ddefc --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/GenericFormatExportUIModel.java @@ -0,0 +1,156 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat; + +import fr.ifremer.tutti.persistence.entities.data.Program; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportConfiguration; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.ProgramSelectTreeNode; +import org.jdesktop.beans.AbstractSerializableBean; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class GenericFormatExportUIModel extends AbstractSerializableBean { + + private static final long serialVersionUID = 1L; + + public static final String PROPERTY_PROGRAM = "program"; + + public static final String PROPERTY_EXPORT_ATTACHMENTS = "exportAttachments"; + + public static final String PROPERTY_EXPORT_SPECIES = "exportSpecies"; + + public static final String PROPERTY_EXPORT_BENTHOS = "exportBenthos"; + + public static final String PROPERTY_EXPORT_MARINE_LITTER = "exportMarineLitter"; + + public static final String PROPERTY_EXPORT_ACCIDENTAL_CATCH = "exportAccidentalCatch"; + + public static final String PROPERTY_EXPORT_INDIVIDUAL_OBSERVATION = "exportIndividualObservation"; + + public static final String PROPERTY_CAN_EXPORT = "canExport"; + + private Program program; + + private boolean exportSpecies = true; + + private boolean exportBenthos = true; + + private boolean exportMarineLitter = true; + + private boolean exportAccidentalCatch = true; + + private boolean exportIndividualObservation = true; + + private boolean exportAttachments = true; + + private boolean canExport; + + private ProgramSelectTreeNode rootNode; + + public GenericFormatExportConfiguration toExportConfiguration() { + + GenericFormatExportConfiguration configuration = new GenericFormatExportConfiguration(); + + configuration.setExportSpecies(exportSpecies); + configuration.setExportBenthos(exportBenthos); + configuration.setExportMarineLitter(exportMarineLitter); + configuration.setExportAccidentalCatch(exportAccidentalCatch); + configuration.setExportIndividualObservation(exportIndividualObservation); + configuration.setExportAttachments(exportAttachments); + + ProgramDataModel selectedDataModel = rootNode.getSelectedDataModel(); + configuration.setDataToExport(selectedDataModel); + + return configuration; + + } + + public Program getProgram() { + return program; + } + + public void setProgram(Program program) { + Object oldValue = getProgram(); + this.program = program; + firePropertyChange(PROPERTY_PROGRAM, oldValue, program); + } + + public boolean isExportSpecies() { + return exportSpecies; + } + + public void setExportSpecies(boolean exportSpecies) { + this.exportSpecies = exportSpecies; + firePropertyChange(PROPERTY_EXPORT_SPECIES, null, exportSpecies); + } + + public boolean isExportBenthos() { + return exportBenthos; + } + + public void setExportBenthos(boolean exportBenthos) { + this.exportBenthos = exportBenthos; + firePropertyChange(PROPERTY_EXPORT_BENTHOS, null, exportBenthos); + } + + public boolean isExportMarineLitter() { + return exportMarineLitter; + } + + public void setExportMarineLitter(boolean exportMarineLitter) { + this.exportMarineLitter = exportMarineLitter; + firePropertyChange(PROPERTY_EXPORT_MARINE_LITTER, null, exportMarineLitter); + } + + public boolean isExportAccidentalCatch() { + return exportAccidentalCatch; + } + + public void setExportAccidentalCatch(boolean exportAccidentalCatch) { + this.exportAccidentalCatch = exportAccidentalCatch; + firePropertyChange(PROPERTY_EXPORT_ACCIDENTAL_CATCH, null, exportAccidentalCatch); + } + + public boolean isExportIndividualObservation() { + return exportIndividualObservation; + } + + public void setExportIndividualObservation(boolean exportIndividualObservation) { + this.exportIndividualObservation = exportIndividualObservation; + firePropertyChange(PROPERTY_EXPORT_INDIVIDUAL_OBSERVATION, null, exportIndividualObservation); + } + + public boolean isExportAttachments() { + return exportAttachments; + } + + public void setExportAttachments(boolean exportAttachments) { + this.exportAttachments = exportAttachments; + firePropertyChange(PROPERTY_EXPORT_ATTACHMENTS, null, exportAttachments); + } + + public boolean isCanExport() { + return canExport; + } + + public void setCanExport(boolean canExport) { + this.canExport = canExport; + firePropertyChange(PROPERTY_CAN_EXPORT, null, canExport); + } + + public boolean computeIsCanExport() { + //TODO select data + return getProgram() != null; + } + + public void setRootNode(ProgramSelectTreeNode rootNode) { + this.rootNode = rootNode; + } + + public ProgramSelectTreeNode getRootNode() { + return rootNode; + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/FoldAllDataAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/FoldAllDataAction.java new file mode 100644 index 0000000..cdca10c --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/FoldAllDataAction.java @@ -0,0 +1,41 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.actions; + +import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatExportUI; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.CruiseSelectTreeNode; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.ProgramSelectTreeNode; +import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; + +import javax.swing.JTree; +import javax.swing.tree.TreePath; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class FoldAllDataAction extends SimpleActionSupport<GenericFormatExportUI> { + + private static final long serialVersionUID = 1L; + + public FoldAllDataAction(GenericFormatExportUI ui) { + super(ui); + } + + @Override + protected void onActionPerformed(GenericFormatExportUI ui) { + + JTree tree = ui.getDataSelectionTree(); + + tree.getSelectionModel().clearSelection(); + + ProgramSelectTreeNode root = ui.getModel().getRootNode(); + TreePath rootPath = new TreePath(root); + + for (CruiseSelectTreeNode node : root) { + tree.collapsePath(rootPath.pathByAddingChild(node)); + } + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/GenericFormatExportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/GenericFormatExportAction.java new file mode 100644 index 0000000..44e39dd --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/GenericFormatExportAction.java @@ -0,0 +1,113 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.actions; + +import com.google.common.base.Joiner; +import fr.ifremer.tutti.persistence.entities.data.Program; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportConfiguration; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportResult; +import fr.ifremer.tutti.service.genericformat.GenericFormatExportService; +import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatExportUI; +import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatExportUIHandler; +import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatExportUIModel; +import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.application.ApplicationBusinessException; + +import java.io.File; +import java.util.List; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class GenericFormatExportAction extends LongActionSupport<GenericFormatExportUIModel, GenericFormatExportUI, GenericFormatExportUIHandler> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(GenericFormatImportAction.class); + + private GenericFormatExportResult exportResult; + + private File exportFile; + + public GenericFormatExportAction(GenericFormatExportUIHandler handler) { + super(handler, false); + } + + @Override + public boolean prepareAction() throws Exception { + + boolean doAction = super.prepareAction(); + + if (doAction) { + + doAction = getModel().isCanExport(); + + } + + if (doAction) { + + Program program = getModel().getProgram(); + + // choose file to export + exportFile = saveFileWithStartDirectory( + getConfig().getExportBackupDirectory(), + false, + "exportProgram-" + program.getName(), + "zip", + t("tutti.genericFormat.title.choose.exportFile"), + t("tutti.genericFormat.action.chooseExportFile"), + "^.+\\.zip$", t("tutti.common.file.genericFormat") + ); + doAction = exportFile != null; + } + + return doAction; + + } + + @Override + public void doAction() throws Exception { + + GenericFormatExportConfiguration configuration = getModel().toExportConfiguration(); + configuration.setExportFile(exportFile); + + GenericFormatExportService service = getContext().getGenericFormatExportService(); + + int nbSteps = service.getExportNbSteps(configuration); + + if (log.isInfoEnabled()) { + log.info("Export nb steps: " + nbSteps); + } + createProgressionModelIfRequired(nbSteps); + + Program program = getModel().getProgram(); + + if (log.isInfoEnabled()) { + log.info("Do generic format export for program: " + program.getName() + " to file: " + exportFile); + } + + exportResult = service.export(configuration, getProgressionModel()); + + sendMessage(t("tutti.genericFormat.export.action.success", exportFile)); + + if (!exportResult.isSuccess()) { + + List<String> errorsByCruise = exportResult.getErrorsByCruise(); + String errorMessage = t("tutti.exportCruise.action.exportErrors", program.getName(), Joiner.on('\n').join(errorsByCruise)); + throw new ApplicationBusinessException(errorMessage); + } + + } + + @Override + public void releaseAction() { + exportFile = null; + exportResult = null; + super.releaseAction(); + } + +} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/SelectAllDataAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/SelectAllDataAction.java new file mode 100644 index 0000000..9e1d393 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/SelectAllDataAction.java @@ -0,0 +1,35 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.actions; + +import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatExportUI; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.CruiseSelectTreeNode; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.ProgramSelectTreeNode; +import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class SelectAllDataAction extends SimpleActionSupport<GenericFormatExportUI> { + + private static final long serialVersionUID = 1L; + + public SelectAllDataAction(GenericFormatExportUI ui) { + super(ui); + } + + @Override + protected void onActionPerformed(GenericFormatExportUI ui) { + + ProgramSelectTreeNode root = ui.getModel().getRootNode(); + + for (CruiseSelectTreeNode node : root) { + node.setSelected(true); + } + + ui.getDataSelectionTree().repaint(); + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/UnfoldAllDataAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/UnfoldAllDataAction.java new file mode 100644 index 0000000..b837dc4 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/UnfoldAllDataAction.java @@ -0,0 +1,39 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.actions; + +import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatExportUI; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.CruiseSelectTreeNode; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.ProgramSelectTreeNode; +import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; + +import javax.swing.JTree; +import javax.swing.tree.TreePath; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class UnfoldAllDataAction extends SimpleActionSupport<GenericFormatExportUI> { + + private static final long serialVersionUID = 1L; + + public UnfoldAllDataAction(GenericFormatExportUI ui) { + super(ui); + } + + @Override + protected void onActionPerformed(GenericFormatExportUI ui) { + + JTree tree = ui.getDataSelectionTree(); + + ProgramSelectTreeNode root = ui.getModel().getRootNode(); + TreePath rootPath = new TreePath(root); + + for (CruiseSelectTreeNode node : root) { + tree.expandPath(rootPath.pathByAddingChild(node)); + } + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/UnselectAllDataAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/UnselectAllDataAction.java new file mode 100644 index 0000000..e2589e0 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/UnselectAllDataAction.java @@ -0,0 +1,35 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.actions; + +import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatExportUI; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.CruiseSelectTreeNode; +import fr.ifremer.tutti.ui.swing.content.genericformat.tree.ProgramSelectTreeNode; +import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class UnselectAllDataAction extends SimpleActionSupport<GenericFormatExportUI> { + + private static final long serialVersionUID = 1L; + + public UnselectAllDataAction(GenericFormatExportUI ui) { + super(ui); + } + + @Override + protected void onActionPerformed(GenericFormatExportUI ui) { + + ProgramSelectTreeNode root = ui.getModel().getRootNode(); + + for (CruiseSelectTreeNode node : root) { + node.setSelected(false); + } + + ui.getDataSelectionTree().repaint(); + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/CruiseSelectTreeNode.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/CruiseSelectTreeNode.java new file mode 100644 index 0000000..23e6d85 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/CruiseSelectTreeNode.java @@ -0,0 +1,121 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.tree; + +import com.google.common.collect.Iterators; +import fr.ifremer.tutti.persistence.model.CruiseDataModel; +import fr.ifremer.tutti.persistence.model.OperationDataModel; + +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class CruiseSelectTreeNode extends DataSelectTreeNodeSupport<CruiseDataModel> implements Iterable<OperationSelectTreeNode> { + + private static final long serialVersionUID = 1L; + + private final int nbChilds; + + private int nbChildSelected; + + private boolean objectValueIsAdjusting; + + public CruiseSelectTreeNode(CruiseDataModel userObject) { + super(userObject); + + for (OperationDataModel operation : userObject) { + + OperationSelectTreeNode operationNode = new OperationSelectTreeNode(operation); + add(operationNode); + + } + + nbChilds = userObject.size(); + + } + + public boolean isPartialSelected() { + return nbChildSelected > 0 && nbChildSelected < nbChilds; + } + + public int getNbChilds() { + return nbChilds; + } + + public int getNbChildSelected() { + return nbChildSelected; + } + + @Override + public boolean isSelected() { + return nbChilds > 0 && nbChilds == nbChildSelected; + } + + @Override + public void setSelected(boolean selected) { + + objectValueIsAdjusting = true; + try { + + for (OperationSelectTreeNode o : this) { + o.setSelected(selected); + } + + } finally { + + objectValueIsAdjusting = false; + + } + + updateSelectedSate(); + + } + + @Override + public CruiseDataModel getSelectedDataModel() { + + Set<OperationDataModel> operations = new LinkedHashSet<>(); + + for (OperationSelectTreeNode o : this) { + OperationDataModel operation = o.getSelectedDataModel(); + if (operation != null) { + operations.add(operation); + } + } + + CruiseDataModel result; + if (operations.isEmpty()) { + result = null; + } else { + result = new CruiseDataModel(getId(), getLabel(), operations); + } + + return result; + + } + + @Override + public Iterator<OperationSelectTreeNode> iterator() { + return Iterators.forEnumeration(children()); + } + + public void updateSelectedSate() { + + if (!objectValueIsAdjusting) { + + nbChildSelected = 0; + for (OperationSelectTreeNode o : this) { + if (o.isSelected()) { + nbChildSelected++; + } + } + + } + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeCellEditor.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeCellEditor.java new file mode 100644 index 0000000..8662ac6 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeCellEditor.java @@ -0,0 +1,65 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.tree; + +import javax.swing.DefaultCellEditor; +import javax.swing.JCheckBox; +import javax.swing.JTree; +import javax.swing.SwingUtilities; +import javax.swing.tree.DefaultTreeCellEditor; +import java.awt.Component; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; +import java.util.EventObject; + +/** + * Created on 3/30/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class DataSelectTreeCellEditor extends DefaultTreeCellEditor { + + private final JCheckBox editor; + + public DataSelectTreeCellEditor(JTree tree) { + super(tree, null); + this.editor = new JCheckBox(); + this.realEditor = new DefaultCellEditor(editor); + } + + @Override + public Component getTreeCellEditorComponent(JTree tree, Object value, + boolean isSelected, boolean expanded, boolean leaf, int row) { + String text = null; + if (value instanceof DataSelectTreeNodeSupport) { + text = ((DataSelectTreeNodeSupport) value).getLabel(); + value = ((DataSelectTreeNodeSupport) value).isSelected(); + } + editor.setText(text); + + Component treeCellEditorComponent = super.getTreeCellEditorComponent(tree, value, isSelected, expanded, leaf, row); + return treeCellEditorComponent; + } + + @Override + protected boolean canEditImmediately(EventObject event) { + if ((event instanceof MouseEvent) && + SwingUtilities.isLeftMouseButton((MouseEvent) event)) { + MouseEvent me = (MouseEvent) event; + return inHitRegion(me.getX(), me.getY()); + } + return (event == null); + } + + @Override + protected boolean inHitRegion(int x, int y) { + if (lastRow != -1 && tree != null) { + Rectangle bounds = tree.getRowBounds(lastRow); + + if (bounds != null && x >= (bounds.x + offset) && (x - 12) <= (bounds.x + offset)) { + return true; + } + + } + return false; + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeCellRenderer.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeCellRenderer.java new file mode 100644 index 0000000..ae08858 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeCellRenderer.java @@ -0,0 +1,112 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.tree; + +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JTree; +import javax.swing.UIDefaults; +import javax.swing.UIManager; +import javax.swing.tree.DefaultTreeCellRenderer; +import java.awt.Component; +import java.awt.Font; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class DataSelectTreeCellRenderer extends DefaultTreeCellRenderer { + + private static final long serialVersionUID = 1L; + + private final JCheckBox normalCheckBox; + + private final JCheckBox partialCheckBox; + + private Font normalFont; + + private Font boldFont; + + public DataSelectTreeCellRenderer() { + + normalCheckBox = new JCheckBox(); + partialCheckBox = new JCheckBox(); + + Object iconPainter = UIManager.getDefaults().get("CheckBox[Disabled+Selected].iconPainter"); + UIDefaults defaults = new UIDefaults(); + defaults.put("CheckBox[Disabled].iconPainter", iconPainter); + partialCheckBox.putClientProperty("Nimbus.Overrides", defaults); + partialCheckBox.putClientProperty("Nimbus.Overrides.InheritDefaults", false); + partialCheckBox.setEnabled(false); + + normalFont = UIManager.getFont("CheckBox.font"); + boldFont = normalFont.deriveFont(Font.BOLD); + } + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + + JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + + String text = null; + String tip = null; + boolean filled = false; + + JCheckBox checkBox = normalCheckBox; + + if (value != null && value instanceof DataSelectTreeNodeSupport) { + + DataSelectTreeNodeSupport node = (DataSelectTreeNodeSupport) value; + + text = node.getLabel(); + filled = node.isSelected(); + + if (node instanceof CruiseSelectTreeNode) { + + CruiseSelectTreeNode cruiseSelectTreeNode = (CruiseSelectTreeNode) node; + + if (filled) { + + tip = t("tutti.selectNode.cruiseSelected", cruiseSelectTreeNode.getNbChildSelected()); + + } else if (cruiseSelectTreeNode.isPartialSelected()) { + + checkBox = partialCheckBox; + + text += String.format(" ( %d / %d )", cruiseSelectTreeNode.getNbChildSelected(), cruiseSelectTreeNode.getNbChilds()); + + tip = t("tutti.selectNode.cruisePartialSelected", cruiseSelectTreeNode.getNbChildSelected(), cruiseSelectTreeNode.getNbChilds()); + } + + } else if (node instanceof OperationSelectTreeNode) { + + text = t("tutti.selectNode.operation", text); + + if (filled) { + + tip = t("tutti.selectNode.operationSelected", text); + } + } + } + + Font font; + if (filled) { + font = this.boldFont; + } else { + font = normalFont; + } + + checkBox.setFont(font); + checkBox.setSelected(filled); + checkBox.setBackground(label.getBackground()); + checkBox.setForeground(label.getForeground()); + checkBox.setText(text); + checkBox.setToolTipText(tip); + + return checkBox; + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeNodeSupport.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeNodeSupport.java new file mode 100644 index 0000000..4b905d7 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/DataSelectTreeNodeSupport.java @@ -0,0 +1,49 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.tree; + +import fr.ifremer.tutti.persistence.model.DataModelSupport; + +import javax.swing.tree.DefaultMutableTreeNode; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public abstract class DataSelectTreeNodeSupport<O extends DataModelSupport> extends DefaultMutableTreeNode { + + private static final long serialVersionUID = 1L; + + public abstract boolean isSelected(); + + public abstract void setSelected(boolean selected); + + public abstract O getSelectedDataModel(); + + public DataSelectTreeNodeSupport(O userObject) { + super(userObject); + } + + public String getId() { + return getUserObject().getId(); + } + + public String getLabel() { + return getUserObject().getLabel(); + } + + @Override + public O getUserObject() { + return (O) super.getUserObject(); + } + + @Override + public void setUserObject(Object userObject) { + if (userObject instanceof Boolean) { + setSelected((boolean) userObject); + } else { + super.setUserObject(userObject); + } + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/OperationSelectTreeNode.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/OperationSelectTreeNode.java new file mode 100644 index 0000000..607f5b3 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/OperationSelectTreeNode.java @@ -0,0 +1,51 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.tree; + +import fr.ifremer.tutti.persistence.model.OperationDataModel; + +/** + * Created on 3/29/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class OperationSelectTreeNode extends DataSelectTreeNodeSupport<OperationDataModel> { + + private static final long serialVersionUID = 1L; + + private boolean selected; + + public OperationSelectTreeNode(OperationDataModel userObject) { + super(userObject); + setAllowsChildren(false); + } + + @Override + public boolean isSelected() { + return selected; + } + + @Override + public void setSelected(boolean selected) { + this.selected = selected; + getParent().updateSelectedSate(); + } + + @Override + public OperationDataModel getSelectedDataModel() { + + OperationDataModel result; + if (isSelected()) { + result = new OperationDataModel(getId(), getLabel()); + } else { + result = null; + } + return result; + + } + + @Override + public CruiseSelectTreeNode getParent() { + return (CruiseSelectTreeNode) super.getParent(); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/ProgramSelectTreeNode.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/ProgramSelectTreeNode.java new file mode 100644 index 0000000..5e14bea --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/tree/ProgramSelectTreeNode.java @@ -0,0 +1,64 @@ +package fr.ifremer.tutti.ui.swing.content.genericformat.tree; + +import com.google.common.collect.Iterators; +import fr.ifremer.tutti.persistence.model.CruiseDataModel; +import fr.ifremer.tutti.persistence.model.ProgramDataModel; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +/** + * Created on 3/30/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14.3 + */ +public class ProgramSelectTreeNode extends DataSelectTreeNodeSupport<ProgramDataModel> implements Iterable<CruiseSelectTreeNode> { + + private static final long serialVersionUID = 1L; + + public ProgramSelectTreeNode(ProgramDataModel userObject) { + super(userObject); + + for (CruiseDataModel cruise : userObject) { + + CruiseSelectTreeNode cruiseNode = new CruiseSelectTreeNode(cruise); + add(cruiseNode); + + } + } + + @Override + public boolean isSelected() { + //Not use here + return false; + } + + @Override + public void setSelected(boolean selected) { + //Not use here + } + + @Override + public ProgramDataModel getSelectedDataModel() { + + Set<CruiseDataModel> cruises = new HashSet<CruiseDataModel>(); + + for (CruiseSelectTreeNode o : this) { + CruiseDataModel cruise = o.getSelectedDataModel(); + if (cruise != null) { + cruises.add(cruise); + } + } + + ProgramDataModel result = new ProgramDataModel(getId(), getLabel(), cruises); + return result; + } + + @Override + public Iterator<CruiseSelectTreeNode> iterator() { + return Iterators.forEnumeration(children()); + } + +} diff --git a/tutti-ui-swing/src/main/resources/icons/action-collapse.png b/tutti-ui-swing/src/main/resources/icons/action-collapse.png new file mode 100644 index 0000000..f88a24a Binary files /dev/null and b/tutti-ui-swing/src/main/resources/icons/action-collapse.png differ diff --git a/tutti-ui-swing/src/main/resources/icons/action-expand.png b/tutti-ui-swing/src/main/resources/icons/action-expand.png new file mode 100644 index 0000000..3c19e48 Binary files /dev/null and b/tutti-ui-swing/src/main/resources/icons/action-expand.png differ diff --git a/tutti-ui-swing/src/main/resources/icons/action-select.png b/tutti-ui-swing/src/main/resources/icons/action-select.png new file mode 100644 index 0000000..bbee129 Binary files /dev/null and b/tutti-ui-swing/src/main/resources/icons/action-select.png differ diff --git a/tutti-ui-swing/src/main/resources/icons/action-unselect.png b/tutti-ui-swing/src/main/resources/icons/action-unselect.png new file mode 100644 index 0000000..3b49008 Binary files /dev/null and b/tutti-ui-swing/src/main/resources/icons/action-unselect.png differ -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit c4d6063d677074ff2885e35357909766f5d64fd1 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Mar 30 16:02:00 2015 +0200 generic format import action only from menu + improve select popup open (add a timer for this) --- .../fr/ifremer/tutti/ui/swing/content/MainUI.css | 13 ++++- .../fr/ifremer/tutti/ui/swing/content/MainUI.jaxx | 2 + .../tutti/ui/swing/content/MainUIHandler.java | 8 +++ .../actions/OpenGenericFormatImportScreen.java | 65 ++++++++++++++++++++++ .../tutti/ui/swing/content/home/SelectCruiseUI.css | 10 +--- .../ui/swing/content/home/SelectCruiseUI.jaxx | 26 ++++----- .../swing/content/home/SelectCruiseUIHandler.java | 56 ++++++++++++------- .../ifremer/tutti/ui/swing/util/TuttiUIUtil.java | 33 ----------- .../resources/i18n/tutti-ui-swing_en_GB.properties | 58 +++++++++++++++++++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 62 ++++++++++++++++++++- 10 files changed, 252 insertions(+), 81 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css index 40233bd..ad4eb77 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css @@ -230,10 +230,21 @@ JMenu { toolTipText: "tutti.main.action.genericFormatImport.tip"; i18nMnemonic: "tutti.main.action.genericFormatImport.mnemonic"; enabled: {model.getScreen() != TuttiScreen.GENERIC_FORMAT_IMPORT}; - _applicationAction: {fr.ifremer.tutti.ui.swing.content.home.actions.OpenGenericFormatImportScreen.class}; + _applicationAction: {fr.ifremer.tutti.ui.swing.content.actions.OpenGenericFormatImportScreen.class}; _help: {"tutti.main.menu.action.genericFormatImport.help"}; } + +#menuActionGenericFormatExport { + actionIcon: export; + text: "tutti.main.action.genericFormatExport"; + toolTipText: "tutti.main.action.genericFormatExport.tip"; + i18nMnemonic: "tutti.main.action.genericFormatExport.mnemonic"; + enabled: {model.getScreen() != TuttiScreen.GENERIC_FORMAT_EXPORT}; + _applicationAction: {fr.ifremer.tutti.ui.swing.content.actions.OpenGenericFormatExportScreen.class}; + _help: {"tutti.main.menu.action.genericFormatExport.help"}; +} + #menuAdministration { text: "tutti.main.menu.administration"; toolTipText: "tutti.main.menu.administration.tip"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx index 04af99a..275ecd6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx @@ -75,6 +75,8 @@ <JMenuItem id='menuActionEditCatches'/> <JMenuItem id='menuActionValidateCatches'/> <JMenuItem id='menuActionGenerateCruiseReport'/> + <JSeparator/> + <JMenuItem id='menuActionGenericFormatExport'/> <JMenuItem id='menuActionGenericFormatImport'/> </JMenu> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java index dac8e7c..be514ff 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java @@ -36,6 +36,7 @@ import fr.ifremer.tutti.ui.swing.content.cruise.EditCruiseUI; import fr.ifremer.tutti.ui.swing.content.cruise.EditCruiseUIHandler; import fr.ifremer.tutti.ui.swing.content.db.DbManagerUI; import fr.ifremer.tutti.ui.swing.content.db.DbManagerUIHandler; +import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatExportUI; import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatImportUI; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUI; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; @@ -460,6 +461,13 @@ public class MainUIHandler extends AbstractTuttiUIHandler<TuttiUIContext, MainUI screenTitle = t("tutti.genericFormatImport.title"); icon = ui.getMenuActionGenericFormatImport().getIcon(); break; + + case GENERIC_FORMAT_EXPORT: + + screenUI = new GenericFormatExportUI(ui); + screenTitle = t("tutti.genericFormatExport.title"); + icon = ui.getMenuActionGenericFormatExport().getIcon(); + break; } JButton showHelp = ui.getShowHelp(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/OpenGenericFormatImportScreen.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/OpenGenericFormatImportScreen.java new file mode 100644 index 0000000..3199d31 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/OpenGenericFormatImportScreen.java @@ -0,0 +1,65 @@ +package fr.ifremer.tutti.ui.swing.content.actions; + +/* + * #%L + * Tutti :: UI + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2012 - 2015 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ifremer.tutti.ui.swing.TuttiScreen; +import fr.ifremer.tutti.ui.swing.content.MainUIHandler; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 2/24/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.14 + */ +public class OpenGenericFormatImportScreen extends AbstractChangeScreenAction { + + public OpenGenericFormatImportScreen(MainUIHandler handler) { + super(handler, true, TuttiScreen.GENERIC_FORMAT_IMPORT); + } + + @Override + public void doAction() throws Exception { + + createProgressionModelIfRequired(5); + + getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.allGear")); + getContext().getPersistenceService().getAllGear(); + + getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.allPerson")); + getContext().getPersistenceService().getAllPerson(); + + getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.allSpecies")); + getContext().getPersistenceService().getAllSpecies(); + + getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.allVessel")); + getContext().getPersistenceService().getAllVessel(); + + getProgressionModel().increments(t("tutti.openGenericFormatImportScreen.step.loading.ui")); + + super.doAction(); + } +} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css index 4c7b282..6280f7a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css @@ -56,7 +56,7 @@ BeanFilterableComboBox { } #editProgramComboBox { - model: {SwingUtil.newComboModel(editProgramButton, exportProgramButton, importProgramButton)}; + model: {SwingUtil.newComboModel(editProgramButton, exportProgramButton)}; enabled: {model.isProgramFound()}; renderer: {new ActionListCellRenderer()}; } @@ -77,14 +77,6 @@ BeanFilterableComboBox { _help: {"tutti.selectCruise.action.exportProgram.help"}; } -#importProgramButton { - actionIcon: import; - text: "tutti.selectCruise.action.importProgram"; - _applicationAction: {fr.ifremer.tutti.ui.swing.content.home.actions.OpenGenericFormatImportScreen.class}; - toolTipText: "tutti.selectCruise.action.importProgram.tip"; - _help: {"tutti.selectCruise.action.importProgram.help"}; -} - #newProgramButton { actionIcon: add; text: "tutti.selectCruise.action.newProgram"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx index 9543016..90eb8b3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx @@ -63,7 +63,6 @@ <JButton id='editProgramButton'/> <JButton id='exportProgramButton'/> - <JButton id='importProgramButton'/> <JButton id='editCruiseButton'/> <JButton id='exportCruiseButton'/> <JButton id='sendCruiseReportButton'/> @@ -89,14 +88,13 @@ <JLabel id='programLabel'/> </cell> <cell weightx='1.0'> - <BeanFilterableComboBox id='programCombobox' constructorParams='this' - genericType='Program'/> + <BeanFilterableComboBox id='programCombobox' constructorParams='this' genericType='Program'/> </cell> <cell> <JPanel layout='{new GridLayout(1,0)}'> <JComboBox id='editProgramComboBox' - onMouseEntered='if (editProgramComboBox.isEnabled()) { editProgramComboBox.showPopup(); }' - onMouseClicked='if (editProgramComboBox.isEnabled()) { handler.startEditProgramAction(event); }' + onMouseEntered='handler.showActions(editProgramComboBox, 300)' + onMouseClicked='handler.startComboFirstAction(event)' onActionPerformed='handler.startEditProgramAction(event)'/> <JButton id='newProgramButton'/> </JPanel> @@ -107,14 +105,13 @@ <JLabel id='cruiseLabel'/> </cell> <cell> - <BeanFilterableComboBox id='cruiseCombobox' constructorParams='this' - genericType='Cruise'/> + <BeanFilterableComboBox id='cruiseCombobox' constructorParams='this' genericType='Cruise'/> </cell> <cell> <JPanel layout='{new GridLayout(1,0)}'> <JComboBox id='editCruiseComboBox' - onMouseEntered='if (editCruiseComboBox.isEnabled()) { editCruiseComboBox.showPopup(); }' - onMouseClicked='if (editCruiseComboBox.isEnabled()) { handler.startEditCruiseAction(event); }' + onMouseEntered='handler.showActions(editCruiseComboBox, 300)' + onMouseClicked='handler.startComboFirstAction(event)' onActionPerformed='handler.startEditCruiseAction(event)'/> <JButton id='newCruiseButton'/> </JPanel> @@ -125,18 +122,17 @@ <JLabel id='protocolLabel'/> </cell> <cell> - <BeanFilterableComboBox id='protocolCombobox' constructorParams='this' - genericType='TuttiProtocol'/> + <BeanFilterableComboBox id='protocolCombobox' constructorParams='this' genericType='TuttiProtocol'/> </cell> <cell> <JPanel layout='{new GridLayout(1,0)}'> <JComboBox id='editProtocolComboBox' - onMouseEntered='if (editProtocolComboBox.isEnabled()) { editProtocolComboBox.showPopup(); }' - onMouseClicked='if (editProtocolComboBox.isEnabled()) { handler.startExistingProtocolAction(event); }' + onMouseEntered='handler.showActions(editProtocolComboBox, 300)' + onMouseClicked='handler.startComboFirstAction(event)' onActionPerformed='handler.startExistingProtocolAction(event)'/> <JComboBox id='newProtocolComboBox' - onMouseEntered='newProtocolComboBox.showPopup()' - onMouseClicked='handler.startNewProtocolAction(event)' + onMouseEntered='handler.showActions(newProtocolComboBox, 300)' + onMouseClicked='handler.startComboFirstAction(event)' onActionPerformed='handler.startNewProtocolAction(event)'/> </JPanel> </cell> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java index 65c8bcc..0a641b0 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java @@ -40,12 +40,12 @@ import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import java.awt.event.ActionEvent; -import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; +import java.util.Timer; +import java.util.TimerTask; /** * Main ui content to select cruise. @@ -59,6 +59,8 @@ public class SelectCruiseUIHandler extends AbstractTuttiUIHandler<SelectCruiseUI private static final Log log = LogFactory.getLog(SelectCruiseUIHandler.class); + private Timer timer; + @Override public SwingValidator<SelectCruiseUIModel> getValidator() { return ui.getValidator(); @@ -133,6 +135,8 @@ public class SelectCruiseUIHandler extends AbstractTuttiUIHandler<SelectCruiseUI initUI(ui); + timer = new Timer("ShowActions::"); + SelectCruiseUIModel model = getModel(); initBeanFilterableComboBox(ui.getProgramCombobox(), @@ -234,6 +238,16 @@ public class SelectCruiseUIHandler extends AbstractTuttiUIHandler<SelectCruiseUI return getUI().getEditCatchesButton(); } + public void showActions(JComboBox comboBox, long delay) { + + if (comboBox.isEnabled()) { + + timer.schedule(new ShowComboBoxPopupActions(comboBox), delay); + + } + + } + protected boolean resetEditProtocolAction; protected boolean resetNewProtocolAction; @@ -288,43 +302,32 @@ public class SelectCruiseUIHandler extends AbstractTuttiUIHandler<SelectCruiseUI getModel().removePropertyChangeListener(listener); } clearValidators(); - } - - public void startEditProgramAction(MouseEvent event) { - startComboFirstAction(event); + timer.purge(); + timer.cancel(); } public void startEditProgramAction(ActionEvent event) { startEditAction(!resetEditProgramAction, event); } - public void startEditCruiseAction(MouseEvent event) { - startComboFirstAction(event); - } - public void startEditCruiseAction(ActionEvent event) { startEditAction(!resetEditCruiseAction, event); } - public void startExistingProtocolAction(MouseEvent event) { - startComboFirstAction(event); - } - public void startExistingProtocolAction(ActionEvent event) { startEditAction(!resetEditProtocolAction, event); } - public void startNewProtocolAction(MouseEvent event) { - startComboFirstAction(event); - } - public void startNewProtocolAction(ActionEvent event) { startEditAction(!resetNewProtocolAction, event); } - protected void startComboFirstAction(MouseEvent event) { + public void startComboFirstAction(MouseEvent event) { JComboBox combo = (JComboBox) event.getSource(); - getContext().getActionEngine().runAction((AbstractButton) combo.getItemAt(0)); + if (combo.isEnabled()) { + AbstractButton action = (AbstractButton) combo.getItemAt(0); + getContext().getActionEngine().runAction(action); + } } protected void startEditAction(boolean canEdit, ActionEvent event) { @@ -345,4 +348,17 @@ public class SelectCruiseUIHandler extends AbstractTuttiUIHandler<SelectCruiseUI combo.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); combo.addMouseListener(TuttiUIUtil.GRAB_FOCUS_ON_ENTER_LISTENER); } + + private static class ShowComboBoxPopupActions extends TimerTask { + private final JComboBox comboBox; + + public ShowComboBoxPopupActions(JComboBox comboBox) { + this.comboBox = comboBox; + } + + @Override + public void run() { + comboBox.showPopup(); + } + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java index bfbbf6e..4ec2aca 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java @@ -34,15 +34,12 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.application.ApplicationBusinessException; import org.nuiton.jaxx.application.swing.util.ApplicationUIUtil; -import javax.swing.AbstractAction; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.ImageIcon; import javax.swing.JComponent; import java.awt.Color; import java.awt.Desktop; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -190,34 +187,4 @@ public final class TuttiUIUtil extends ApplicationUIUtil { } - public static Action addDelegateAction(AbstractButton button, String actionName) { - - Action action = new AbstractAction() { - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - - AbstractButton source = (AbstractButton) e.getSource(); - - ActionListener[] actionListeners = source.getActionListeners(); - - for (ActionListener actionListener : actionListeners) { - if (this != actionListener) { - if (log.isDebugEnabled()) { - log.debug("Do actionPerformed on listener: " + actionListener); - } - actionListener.actionPerformed(e); - } - } - - } - - }; - - prepareAction(button, action, actionName); - return action; - - } } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index be193c4..1f7d8db 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -1415,15 +1415,19 @@ tutti.gearUseFeatureTable.action.removeCaracteristic.tip= tutti.gearUseFeatureTable.table.header.key= tutti.gearUseFeatureTable.table.header.value= tutti.gearUseFeatureTable.title= +tutti.generateReport.action.computeNbSteps= tutti.genericFormat.action.chooseDbBackupFile= +tutti.genericFormat.action.chooseExportFile= tutti.genericFormat.action.chooseImportReportFile= tutti.genericFormat.action.chooseValidateReportFile= +tutti.genericFormat.export.action.success= tutti.genericFormat.import.error= tutti.genericFormat.import.error.tip= tutti.genericFormat.import.success= tutti.genericFormat.import.success.tip= tutti.genericFormat.importReportFile.saved= tutti.genericFormat.title.choose.dbBackupFile= +tutti.genericFormat.title.choose.exportFile= tutti.genericFormat.title.choose.exportImportReportfile= tutti.genericFormat.title.choose.exportValidateReportfile= tutti.genericFormat.title.choose.saveImportReportfile= @@ -1433,6 +1437,47 @@ tutti.genericFormat.validate.error.tip= tutti.genericFormat.validate.success= tutti.genericFormat.validate.success.tip= tutti.genericFormat.validateReportFile.saved= +tutti.genericFormatExport.action.closeGenericFormatExport= +tutti.genericFormatExport.action.closeGenericFormatExport.mnemonic= +tutti.genericFormatExport.action.closeGenericFormatExport.tip= +tutti.genericFormatExport.action.export= +tutti.genericFormatExport.action.export.mnemonic= +tutti.genericFormatExport.action.export.tip= +tutti.genericFormatExport.action.foldAll= +tutti.genericFormatExport.action.foldAll.mnemonic= +tutti.genericFormatExport.action.foldAll.tip= +tutti.genericFormatExport.action.selectAll= +tutti.genericFormatExport.action.selectAll.mnemonic= +tutti.genericFormatExport.action.selectAll.tip= +tutti.genericFormatExport.action.unfoldAll= +tutti.genericFormatExport.action.unfoldAll.mnemonic= +tutti.genericFormatExport.action.unfoldAll.tip= +tutti.genericFormatExport.action.unselectAll= +tutti.genericFormatExport.action.unselectAll.mnemonic= +tutti.genericFormatExport.action.unselectAll.tip= +tutti.genericFormatExport.exportConfiguration.legend= +tutti.genericFormatExport.exportFile.extension= +tutti.genericFormatExport.exportFile.extension.description= +tutti.genericFormatExport.exportOptions.legend= +tutti.genericFormatExport.field.exportAccidentalCatch= +tutti.genericFormatExport.field.exportAccidentalCatch.tip= +tutti.genericFormatExport.field.exportAttachments= +tutti.genericFormatExport.field.exportAttachments.tip= +tutti.genericFormatExport.field.exportBenthos= +tutti.genericFormatExport.field.exportBenthos.tip= +tutti.genericFormatExport.field.exportFile= +tutti.genericFormatExport.field.exportFile.tip= +tutti.genericFormatExport.field.exportIndividualObservation= +tutti.genericFormatExport.field.exportIndividualObservation.tip= +tutti.genericFormatExport.field.exportMarineLitter= +tutti.genericFormatExport.field.exportMarineLitter.tip= +tutti.genericFormatExport.field.exportSpecies= +tutti.genericFormatExport.field.exportSpecies.tip= +tutti.genericFormatExport.field.program= +tutti.genericFormatExport.field.program.tip= +tutti.genericFormatExport.selectData.legend= +tutti.genericFormatExport.title= +tutti.genericFormatExport.validateExport.legend= tutti.genericFormatImport.action.closeGenericFormatImport= tutti.genericFormatImport.action.closeGenericFormatImport.mnemonic= tutti.genericFormatImport.action.closeGenericFormatImport.tip= @@ -1592,6 +1637,9 @@ tutti.main.action.exit.tip= tutti.main.action.generateSelectedCruiseReport= tutti.main.action.generateSelectedCruiseReport.mnemonic= tutti.main.action.generateSelectedCruiseReport.tip= +tutti.main.action.genericFormatExport= +tutti.main.action.genericFormatExport.mnemonic= +tutti.main.action.genericFormatExport.tip= tutti.main.action.genericFormatImport= tutti.main.action.genericFormatImport.mnemonic= tutti.main.action.genericFormatImport.tip= @@ -1767,6 +1815,11 @@ tutti.openDb.step.checkSchemaVersion= tutti.openDb.step.open= tutti.openDb.step.updateReferential= tutti.openDb.step.will.migrateSchema= +tutti.openGenericFormatExportScreen.step.loading.allGear= +tutti.openGenericFormatExportScreen.step.loading.allPerson= +tutti.openGenericFormatExportScreen.step.loading.allSpecies= +tutti.openGenericFormatExportScreen.step.loading.allVessel= +tutti.openGenericFormatExportScreen.step.loading.ui= tutti.openGenericFormatImportScreen.step.loading.allGear= tutti.openGenericFormatImportScreen.step.loading.allPerson= tutti.openGenericFormatImportScreen.step.loading.allSpecies= @@ -1926,6 +1979,10 @@ tutti.selectCruise.title.choose.importFile= tutti.selectCruise.title.choose.importGenericFormatFile= tutti.selectCruise.title.choose.importProtocolFile= tutti.selectCruise.warn.invalid.selected.data= +tutti.selectNode.cruisePartialSelected= +tutti.selectNode.cruiseSelected= +tutti.selectNode.operation= +tutti.selectNode.operationSelected= tutti.selectSpecies.action.cancel= tutti.selectSpecies.action.cancel.mnemonic= tutti.selectSpecies.action.cancel.tip= @@ -1990,6 +2047,7 @@ tutti.title.openReplaceTemporaryUI.noSource= tutti.title.openReplaceTemporaryUI.noTarget= tutti.title.openReplaceTemporaryVesselUI.noSource= tutti.title.openReplaceTemporaryVesselUI.noTarget= +tutti.todo= tutti.toolbar.menu.action= tutti.toolbar.menu.action.mnemonic= tutti.toolbar.menu.action.tip= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index bb09b5c..5d71199 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -20,7 +20,6 @@ tutti.applicationUpdater.startUpdate=Téléchargement et installation d'une nouv tutti.applicationUpdater.startUpdate.db.installation=Téléchargement et installation de la base (version %s) tutti.applicationUpdater.startUpdate.db.update=Téléchargement et mise à jour de la base (version %s) tutti.applicationUpdater.startUpdate.report=Téléchargement et mise à jour des rapports (version %s) -tutti.generateReport.action.computeNbSteps=Calcul du nombre d'opérations tutti.applicationUpdater.synchroDB.prepare.error=Erreur lors de la préparation de la synchronisation de la base tutti.applicationUpdater.synchroDB.synchro.error=Erreur lors de la synchronisation de la base tutti.applicationUpdater.synchroDB.writeVersion.error=Erreur lors de l'écriture de la nouvelle version de la base de données dans le fichier %s @@ -1359,15 +1358,19 @@ tutti.gearUseFeatureTable.action.removeCaracteristic.tip=Supprimer la caractéri tutti.gearUseFeatureTable.table.header.key=Caractéristique tutti.gearUseFeatureTable.table.header.value=Valeur tutti.gearUseFeatureTable.title=Mise en œuvre de l'engin +tutti.generateReport.action.computeNbSteps=Calcul du nombre d'opérations tutti.genericFormat.action.chooseDbBackupFile=Sauvegarder la base de données +tutti.genericFormat.action.chooseExportFile=Exporter tutti.genericFormat.action.chooseImportReportFile=Enregistrer tutti.genericFormat.action.chooseValidateReportFile=Enregistrer +tutti.genericFormat.export.action.success=Export générique terminé (fichier <strong>%s</strong>) tutti.genericFormat.import.error=Des erreurs ont été détectées lors de l'import tutti.genericFormat.import.error.tip=Vous pouvez consulter le rapport d'import pour les corriger tutti.genericFormat.import.success=L'import s'est déroulé avec succès tutti.genericFormat.import.success.tip=Vous pouvez consulter le rapport d'import (%s) tutti.genericFormat.importReportFile.saved=Le rapport d'import a été enregistré <strong>%s</strong> tutti.genericFormat.title.choose.dbBackupFile=Sauvegarder la base de données +tutti.genericFormat.title.choose.exportFile=Exporter des données au format générique tutti.genericFormat.title.choose.saveImportReportfile=Enregisrer le rapport d'import tutti.genericFormat.title.choose.saveValidateReportfile=Enregisrer le rapport de validation tutti.genericFormat.validate.error=Des erreurs ont été détectées lors de la validation @@ -1375,6 +1378,46 @@ tutti.genericFormat.validate.error.tip=Vous pouvez consulter le rapport de valid tutti.genericFormat.validate.success=La validation s'est déroulée avec succès tutti.genericFormat.validate.success.tip=Vous pouvez consulter le rapport de validation (%s) tutti.genericFormat.validateReportFile.saved=Le rapport de validation a été enregistré <strong>%s</strong> +tutti.genericFormatExport.action.closeGenericFormatExport=Quitter +tutti.genericFormatExport.action.closeGenericFormatExport.mnemonic=Q +tutti.genericFormatExport.action.closeGenericFormatExport.tip=Quitter l'écran d'export +tutti.genericFormatExport.action.export=Exporter +tutti.genericFormatExport.action.export.mnemonic=E +tutti.genericFormatExport.action.export.tip=Exporter les données sélectionnées +tutti.genericFormatExport.action.foldAll=Tout Replier +tutti.genericFormatExport.action.foldAll.mnemonic=R +tutti.genericFormatExport.action.foldAll.tip=Tout replier +tutti.genericFormatExport.action.selectAll=Tout sélectionner +tutti.genericFormatExport.action.selectAll.mnemonic=S +tutti.genericFormatExport.action.selectAll.tip=Tout sélectionner +tutti.genericFormatExport.action.unfoldAll=Tout Déplier +tutti.genericFormatExport.action.unfoldAll.mnemonic=D +tutti.genericFormatExport.action.unfoldAll.tip=Tout déplier +tutti.genericFormatExport.action.unselectAll=Tout désélectionner +tutti.genericFormatExport.action.unselectAll.mnemonic=T +tutti.genericFormatExport.action.unselectAll.tip=Tout désélectionner +tutti.genericFormatExport.exportConfiguration.legend=Configuration +tutti.genericFormatExport.exportFile.extension=zip +tutti.genericFormatExport.exportFile.extension.description=Archive d'import générique (.zip) +tutti.genericFormatExport.exportOptions.legend=Options d'export +tutti.genericFormatExport.field.exportAccidentalCatch=Exporter les captures accidentelles +tutti.genericFormatExport.field.exportAccidentalCatch.tip=Exporter les captures accidentelles +tutti.genericFormatExport.field.exportAttachments=Exporter les pièces-jointes +tutti.genericFormatExport.field.exportAttachments.tip=Exporter les pièces-jointes +tutti.genericFormatExport.field.exportBenthos=Exporter les lots Benthos +tutti.genericFormatExport.field.exportBenthos.tip=Exporter les lots Benthos +tutti.genericFormatExport.field.exportFile=Fichier d'export +tutti.genericFormatExport.field.exportFile.tip=Fichier d'export +tutti.genericFormatExport.field.exportIndividualObservation=Exporter les observations individuelles +tutti.genericFormatExport.field.exportIndividualObservation.tip=Exporter les observations individuelles +tutti.genericFormatExport.field.exportMarineLitter=Exporter les macro-déchets +tutti.genericFormatExport.field.exportMarineLitter.tip=Exporter les macro-déchets +tutti.genericFormatExport.field.exportSpecies=Exporter les lots Espèces +tutti.genericFormatExport.field.exportSpecies.tip=Exporter les lots Espèces +tutti.genericFormatExport.field.program=Série de campagne +tutti.genericFormatExport.field.program.tip=Série de campagne +tutti.genericFormatExport.selectData.legend=Sélection des données à exporter +tutti.genericFormatExport.title=Export générique tutti.genericFormatImport..extension=zip tutti.genericFormatImport..extension.description=Archive d'import générique (.zip) tutti.genericFormatImport.action.closeGenericFormatImport=Quitter @@ -1525,8 +1568,11 @@ tutti.main.action.exit.tip=Quitter l'application tutti.main.action.generateSelectedCruiseReport=Rapport tutti.main.action.generateSelectedCruiseReport.mnemonic=R tutti.main.action.generateSelectedCruiseReport.tip=Générer des rapports +tutti.main.action.genericFormatExport=Export générique +tutti.main.action.genericFormatExport.mnemonic=E +tutti.main.action.genericFormatExport.tip=Exporter des campagnes au format générique tutti.main.action.genericFormatImport=Import générique -tutti.main.action.genericFormatImport.mnemonic=BirtSample +tutti.main.action.genericFormatImport.mnemonic=I tutti.main.action.genericFormatImport.tip=Importer des campagnes au format générique tutti.main.action.goto.previousScreen.tip=Retour à l'écran précédent tutti.main.action.importTemporaryReferential=Référentiels temporaires @@ -1687,7 +1733,12 @@ tutti.openDb.step.checkSchemaVersion=Vérification de la compatibilité de la ba tutti.openDb.step.open=Ouverture de la base <strong>%s</strong> tutti.openDb.step.updateReferential= tutti.openDb.step.will.migrateSchema=Démarrage de la mise à jour du schéma de la base depuis la version %s vers la version %s -tutti.openGenericFormatImportScreen.step.loading.allGear=Chargement du référentiel engin +tutti.openGenericFormatExportScreen.step.loading.allGear=Chargement du référentiel Engin +tutti.openGenericFormatExportScreen.step.loading.allPerson=Chargement du référentiel Personne +tutti.openGenericFormatExportScreen.step.loading.allSpecies=Chargement du référentiel Taxinomique +tutti.openGenericFormatExportScreen.step.loading.allVessel=Chargement du référentiel Navire +tutti.openGenericFormatExportScreen.step.loading.ui=Chargement des interfaces graphiques +tutti.openGenericFormatImportScreen.step.loading.allGear=Chargement du référentiel Engin tutti.openGenericFormatImportScreen.step.loading.allPerson=Chargement du référentiel Personne tutti.openGenericFormatImportScreen.step.loading.allSpecies=Chargement du référentiel Taxinomique tutti.openGenericFormatImportScreen.step.loading.allVessel=Chargement du référentiel Navire @@ -1818,6 +1869,10 @@ tutti.selectCruise.title.choose.importFile=Importer le protocole tutti.selectCruise.title.choose.importGenericFormatFile=Importer des campagnes tutti.selectCruise.title.choose.importProtocolFile=Importer le protocole tutti.selectCruise.warn.invalid.selected.data=Les données sélectionnées ne sont pas valides, impossible de saisir ou valider les captures. +tutti.selectNode.cruisePartialSelected=La campagne est partiellement sélectionnée pour l'export ( %s traits à exporter , %s enregistrés ) +tutti.selectNode.cruiseSelected=La campagne est sélectionnée pour l'export ( %s traits à exporter ) +tutti.selectNode.operation=Trait %s +tutti.selectNode.operationSelected=Le trait est sélectionné pour l'export tutti.selectSpecies.action.cancel=Annuler tutti.selectSpecies.action.cancel.mnemonic=A tutti.selectSpecies.action.cancel.tip=Annuler la sélection de l'espèce @@ -1874,6 +1929,7 @@ tutti.splitSpeciesBatch.table.header.weight=Poids tutti.splitSpeciesBatch.title=Catégorisation du lot tutti.title.openReplaceTemporaryUI.noSource=Pas de référentiel temporaire de type %s dans la base tutti.title.openReplaceTemporaryUI.noTarget=Pas de référentiel officiel de type %s dans la base +tutti.todo= tutti.toolbar.menu.action=Actions tutti.toolbar.menu.action.mnemonic=A tutti.toolbar.menu.action.tip=Actions possibles pour cet onglet -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm