Tony CHEMIT pushed to branch develop-9.0.x at ultreiaio / ird-observe Commits: 95047bae by Tony Chemit at 2023-03-13T08:24:22+01:00 Consolidation - ajout consolidation pour les logbook - - - - - 1313b4ed by Tony Chemit at 2023-03-13T08:24:22+01:00 Ajout d'une documentation sur la consolidation - Closes #2642 - - - - - 01c2aa78 by Tony Chemit at 2023-03-13T08:24:22+01:00 Remove javadoc from site reports (not ready to use it) - - - - - 19 changed files: - .gitignore - client/datasource/actions/src/main/i18n/getters/java.getter - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/actions/Start.java - client/runner/src/main/i18n/translations/client-runner_en_GB.properties - client/runner/src/main/i18n/translations/client-runner_es_ES.properties - client/runner/src/main/i18n/translations/client-runner_fr_FR.properties - core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateResult.java - + core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/ActivityConsolidateResult.java - + core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/ActivityConsolidateResultBuilder.java - core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/FloatingObjectActions.java → core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/FloatingObjectConsolidateActions.java - core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/FloatingObjectConsolidateEngine.java - core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateEngine.java - + core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/ActivityConsolidateContext.java - + core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/ActivityConsolidateEngine.java - core/services/test/src/main/java/fr/ird/observe/services/service/data/ps/ConsolidateDataServiceFixtures.java - pom.xml - + src/site/markdown/consolidation.md - src/site/markdown/index.md - src/site/site.xml Changes: ===================================== .gitignore ===================================== @@ -19,7 +19,8 @@ /*~ /*/*~ /src/site/markdown/CHANGELOG.md -/src/site/markdown/*.md +/src/site/markdown/observe-client.md +/src/site/markdown/observe-server.md /src/site/resources/*.conf client/runner/src/main/assembly/dist/config/observe-client* server/runner/src/main/assembly/dist/config/observe-server* ===================================== client/datasource/actions/src/main/i18n/getters/java.getter ===================================== @@ -32,12 +32,15 @@ observe.ui.datasource.actions.config.data.sources.equals observe.ui.datasource.editor.actions.activity.pairing observe.ui.datasource.editor.actions.consolidate observe.ui.datasource.editor.actions.consolidate.description -observe.ui.datasource.editor.actions.consolidate.message.activity.modification -observe.ui.datasource.editor.actions.consolidate.message.activity.warning +observe.ui.datasource.editor.actions.consolidate.end.trip +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning observe.ui.datasource.editor.actions.consolidate.message.modifications.modification observe.ui.datasource.editor.actions.consolidate.message.modifications.property observe.ui.datasource.editor.actions.consolidate.message.modifications.warning observe.ui.datasource.editor.actions.consolidate.message.noChanges +observe.ui.datasource.editor.actions.consolidate.message.observation.activity.modification +observe.ui.datasource.editor.actions.consolidate.message.observation.activity.warning observe.ui.datasource.editor.actions.consolidate.message.operation.done observe.ui.datasource.editor.actions.consolidate.message.save.changes observe.ui.datasource.editor.actions.consolidate.message.trip.modification ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/actions/Start.java ===================================== @@ -27,10 +27,10 @@ import fr.ird.observe.client.datasource.actions.actions.AdminTabUIActionSupport; import fr.ird.observe.client.datasource.actions.consolidate.ConsolidateModel; import fr.ird.observe.client.datasource.actions.consolidate.ConsolidateUI; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; +import fr.ird.observe.consolidation.AtomicConsolidateAction; import fr.ird.observe.consolidation.data.ps.common.TripConsolidateRequest; import fr.ird.observe.consolidation.data.ps.common.TripConsolidateResult; import fr.ird.observe.consolidation.data.ps.dcp.SimplifiedObjectTypeSpecializedRules; -import fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult; import fr.ird.observe.dto.BusinessDto; import fr.ird.observe.dto.ObserveUtil; import fr.ird.observe.dto.ProgressionModel; @@ -45,6 +45,8 @@ import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; import fr.ird.observe.services.service.data.ps.ConsolidateDataService; import io.ultreia.java4all.bean.monitor.JavaBeanPropertyModification; import io.ultreia.java4all.i18n.I18n; +import io.ultreia.java4all.lang.Strings; +import io.ultreia.java4all.util.TimeLog; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; @@ -55,6 +57,7 @@ import java.awt.event.ActionEvent; import java.util.Date; import java.util.LinkedHashSet; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import static io.ultreia.java4all.i18n.I18n.t; @@ -96,45 +99,30 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { ConsolidateDataService consolidateDataService = dataSource.getPsConsolidateDataService(); - int index = 0; + AtomicInteger index = new AtomicInteger(); int nbTrips = tripIds.size(); SimplifiedObjectTypeSpecializedRules simplifiedObjectTypeSpecializedRules = getClientConfig().getSimplifiedObjectTypeSpecializedRules(); Set<TripConsolidateResult> results = new LinkedHashSet<>(); for (String tripId : tripIds) { - - progressModel.increments(); - - if (stepModel.checkIfTripAlreadyProcessed(tripId)) { - // this one has already been processed - sendMessage(t("observe.ui.datasource.editor.actions.consolidate.skip.trip", ++index, nbTrips, tripId)); - progressModel.increments(); - continue; - } - sendMessage(t("observe.ui.datasource.editor.actions.consolidate.start.trip", ++index, nbTrips, tripId)); - - // mark trip processed - stepModel.setTripProcessed(tripId); - - if (TripAware.isLonglineId(tripId)) { - // can't consolidate LL trips... - progressModel.increments(); - continue; - } - TripConsolidateRequest request = new TripConsolidateRequest(); - request.setTripId(tripId); - request.setFailIfLengthWeightParameterNotFound(stepModel.isConsolidationFailIfLengthWeightParameterNotFound()); - request.setFailIfLengthLengthParameterNotFound(stepModel.isConsolidationFailIfLengthLengthParameterNotFound()); - - TripConsolidateResult result = consolidateDataService.consolidateTrip(simplifiedObjectTypeSpecializedRules, request); - if (result != null) { - printResult(result); - if (result.withModifications()) { - results.add(result); - } + long t0 = TimeLog.getTime(); + try { + consolidateTrip(tripId, + index, + nbTrips, + stepModel, + simplifiedObjectTypeSpecializedRules, + consolidateDataService, + progressModel, + results); + } finally { + ObserveUtil.cleanMemory(); + String message = t("observe.ui.datasource.editor.actions.consolidate.end.trip", index, nbTrips, tripId, Strings.convertTime(TimeLog.getTime() - t0)); + log.info(message); + sendMessage(message); + sendMessage("------------------------"); } - ObserveUtil.cleanMemory(); } progressModel.increments(); if (results.isEmpty()) { @@ -148,6 +136,47 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { return WizardState.SUCCESSED; } + void consolidateTrip(String tripId, + AtomicInteger index, + int nbTrips, + ConsolidateModel stepModel, + SimplifiedObjectTypeSpecializedRules simplifiedObjectTypeSpecializedRules, + ConsolidateDataService consolidateDataService, + ProgressionModel progressModel, + Set<TripConsolidateResult> results) { + progressModel.increments(); + + if (stepModel.checkIfTripAlreadyProcessed(tripId)) { + // this one has already been processed + sendMessage(t("observe.ui.datasource.editor.actions.consolidate.skip.trip", index.incrementAndGet(), nbTrips, tripId)); + progressModel.increments(); + return; + } + sendMessage(t("observe.ui.datasource.editor.actions.consolidate.start.trip", index.incrementAndGet(), nbTrips, tripId)); + + // mark trip processed + stepModel.setTripProcessed(tripId); + + if (TripAware.isLonglineId(tripId)) { + // can't consolidate LL trips... + progressModel.increments(); + return; + } + TripConsolidateRequest request = new TripConsolidateRequest(); + request.setTripId(tripId); + request.setFailIfLengthWeightParameterNotFound(stepModel.isConsolidationFailIfLengthWeightParameterNotFound()); + request.setFailIfLengthLengthParameterNotFound(stepModel.isConsolidationFailIfLengthLengthParameterNotFound()); + + TripConsolidateResult result = consolidateDataService.consolidateTrip(simplifiedObjectTypeSpecializedRules, request); + if (result != null) { + printResult(result); + if (result.withModifications()) { + results.add(result); + } + } + ObserveUtil.cleanMemory(); + } + void printResult(TripConsolidateResult result) { String tripSeineLabel = result.getTripLabel(); if (result.withModifications()) { @@ -156,21 +185,23 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { if (result.withWarnings()) { sendMessage(t("observe.ui.datasource.editor.actions.consolidate.message.trip.warning", result.getTripId(), tripSeineLabel)); } - for (ActivityConsolidateResult activityResult : result.getActivityObservationResults()) { + for (fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult activityResult : result.getActivityObservationResults()) { + printResult(activityResult); + } + for (fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult activityResult : result.getActivityLogbookResults()) { printResult(activityResult); } for (ToolkitIdModifications batchResult : result.getLocalmarketBatchResults()) { printResult(BatchDto.class, batchResult); } - sendMessage("---------------"); } - void printResult(ActivityConsolidateResult activityResult) { + void printResult(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult activityResult) { if (activityResult.withModifications()) { - sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.activity.modification", activityResult.getActivityId(), activityResult.getActivityLabel())); + sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.observation.activity.modification", activityResult.getActivityId(), activityResult.getActivityLabel())); } if (activityResult.withWarnings()) { - sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.activity.warning", activityResult.getActivityId(), activityResult.getActivityLabel())); + sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.observation.activity.warning", activityResult.getActivityId(), activityResult.getActivityLabel())); } printResult(SetDto.class, activityResult.getSetModifications()); for (ToolkitIdModifications modification : activityResult.getFloatingObjectModifications()) { @@ -184,6 +215,18 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { } } + void printResult(fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult activityResult) { + if (activityResult.withModifications()) { + sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification", activityResult.getActivityId(), activityResult.getActivityLabel())); + } + if (activityResult.withWarnings()) { + sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning", activityResult.getActivityId(), activityResult.getActivityLabel())); + } + for (ToolkitIdModifications modification : activityResult.getFloatingObjectModifications()) { + printResult(FloatingObjectDto.class, modification); + } + } + private void printResult(Class<? extends BusinessDto> dataType, ToolkitIdModifications modifications) { if (modifications == null) { return; @@ -193,7 +236,10 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.modifications.modification", modifications.modificationsCount(), type, modifications.getId(), modifications.getLabel())); for (JavaBeanPropertyModification modification : modifications.getModifications()) { String property = I18n.t(ObserveI18nDecoratorHelper.getPropertyI18nKey(dataType, modification.getPropertyName())); - String message = I18n.t("observe.ui.datasource.editor.actions.consolidate.message.modifications.property", property, modification.getOldValue(), modification.getNewValue()); + String message = I18n.t("observe.ui.datasource.editor.actions.consolidate.message.modifications.property", + property, + AtomicConsolidateAction.decorateValue(modification.getOldValue()), + AtomicConsolidateAction.decorateValue(modification.getNewValue())); sendMessage(" - " + message); } } ===================================== client/runner/src/main/i18n/translations/client-runner_en_GB.properties ===================================== @@ -490,15 +490,18 @@ observe.ui.datasource.editor.actions.activity.pairing=Activities pairing observe.ui.datasource.editor.actions.consolidate=Consolidate data observe.ui.datasource.editor.actions.consolidate.config=Consolidate data configuration observe.ui.datasource.editor.actions.consolidate.description=Consolidate observed data -observe.ui.datasource.editor.actions.consolidate.message.activity.modification=Computed data for activity [%s] %s -observe.ui.datasource.editor.actions.consolidate.message.activity.warning=Some warnings were found for activity [%s] %s +observe.ui.datasource.editor.actions.consolidate.end.trip=End consolidate data on trip %s / %s (%s) [duration\: %s] +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Some data were computed for Logbook activity [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Some warnings were found for Logbook activity [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d change(s) for data of type %s [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Property %s, old value\: %s - new value\: %s observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d warning(s) for data of type %s [%s] %s observe.ui.datasource.editor.actions.consolidate.message.noChanges=No data modified. +observe.ui.datasource.editor.actions.consolidate.message.observation.activity.modification=Some data were computed for Observations activity [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.observation.activity.warning=Some warnings were found for Observations activity [%s] %s observe.ui.datasource.editor.actions.consolidate.message.operation.done=Consolidate operation done in %1$s. observe.ui.datasource.editor.actions.consolidate.message.save.changes=Save modified %1$s trip(s). -observe.ui.datasource.editor.actions.consolidate.message.trip.modification=Data consolidate for trip [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.trip.modification=Some data were computed for trip [%s] %s observe.ui.datasource.editor.actions.consolidate.message.trip.warning=Some warnings were found for trip [%s] %s observe.ui.datasource.editor.actions.consolidate.skip.trip=Skip already consolidated data on trip %s / %s (%s) observe.ui.datasource.editor.actions.consolidate.start.trip=Start consolidate data on trip %s / %s (%s) ===================================== client/runner/src/main/i18n/translations/client-runner_es_ES.properties ===================================== @@ -490,12 +490,15 @@ observe.ui.datasource.editor.actions.activity.pairing=Activities pairing \#TODO observe.ui.datasource.editor.actions.consolidate=Calcular los datos observe.ui.datasource.editor.actions.consolidate.config=Consolidate data configuration observe.ui.datasource.editor.actions.consolidate.description=Calcular los datos que no fueron observados -observe.ui.datasource.editor.actions.consolidate.message.activity.modification=Datos calculados para la actividad [%s] %s -observe.ui.datasource.editor.actions.consolidate.message.activity.warning=Some warnings were found for activity [%s] %s +observe.ui.datasource.editor.actions.consolidate.end.trip=End consolidate data on trip %s / %s (%s) [duration\: %s] \#TODO +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Some data were computed for Logbook activity [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Some warnings were found for Logbook activity [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d change(s) for data of type %s [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Property %s, old value\: %s - new value\: %s \#TODO observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d warning(s) for data of type %s [%s] %s observe.ui.datasource.editor.actions.consolidate.message.noChanges=No modificación de datos. +observe.ui.datasource.editor.actions.consolidate.message.observation.activity.modification=Some data were computed for Observations activity [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.observation.activity.warning=Some warnings were found for Observations activity [%s] %s observe.ui.datasource.editor.actions.consolidate.message.operation.done=Operación de calculo de datos terminada en %1$s. observe.ui.datasource.editor.actions.consolidate.message.save.changes=Guardar las modificaciones de la(s) %1$s marea(s) modificada(s). observe.ui.datasource.editor.actions.consolidate.message.trip.modification=Datos calculados para la marea [%s] %s ===================================== client/runner/src/main/i18n/translations/client-runner_fr_FR.properties ===================================== @@ -490,15 +490,18 @@ observe.ui.datasource.editor.actions.activity.pairing=Appairement des activités observe.ui.datasource.editor.actions.consolidate=Calculer les données observe.ui.datasource.editor.actions.consolidate.config=Configuration de la consolidation observe.ui.datasource.editor.actions.consolidate.description=Calculer les données non observées -observe.ui.datasource.editor.actions.consolidate.message.activity.modification=Données calculées pour l'activité [%s] %s -observe.ui.datasource.editor.actions.consolidate.message.activity.warning=Des avertissements ont été détectés pour l'activité [%s] %s +observe.ui.datasource.editor.actions.consolidate.end.trip=Consolidation terminée pour la marée %s / %s (%s) [durée \: %s] +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Des données ont été calculées pour l'activité (Livre de bord) [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Des avertissements ont été détectés pour l'activité (Livre de bord) [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d modification(s) pour la donnée de type %s [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Propriété %s, ancienne valeur \: %s - nouvelle valeur \: %s observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d avertissement(s) pour la donnée de type %s [%s] %s observe.ui.datasource.editor.actions.consolidate.message.noChanges=Aucune donnée modifiée. +observe.ui.datasource.editor.actions.consolidate.message.observation.activity.modification=Des données ont été calculées pour l'activité (Observation) [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.observation.activity.warning=Des avertissements ont été détectés pour l'activité (Observation) [%s] %s observe.ui.datasource.editor.actions.consolidate.message.operation.done=Opération de calcul des données terminée à %1$s. observe.ui.datasource.editor.actions.consolidate.message.save.changes=Sauvegarde des modifications sur la(es) %1$s marée(s) modifiée(s). -observe.ui.datasource.editor.actions.consolidate.message.trip.modification=Données calculées pour la marée [%s] %s. +observe.ui.datasource.editor.actions.consolidate.message.trip.modification=Des données ont été calculées pour la marée [%s] %s. observe.ui.datasource.editor.actions.consolidate.message.trip.warning=Des avertissement ont été détectés pour la marée [%s] %s. observe.ui.datasource.editor.actions.consolidate.skip.trip=Marée déjà consolidée %s / %s (%s) observe.ui.datasource.editor.actions.consolidate.start.trip=Démarrage de la consolidation pour la marée %s / %s (%s) ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateResult.java ===================================== @@ -23,7 +23,6 @@ package fr.ird.observe.consolidation.data.ps.common; */ -import fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult; import fr.ird.observe.dto.ToolkitIdModifications; import io.ultreia.java4all.util.json.JsonAware; @@ -49,16 +48,25 @@ public class TripConsolidateResult implements JsonAware { /** * Observation activities results. */ - protected final Set<ActivityConsolidateResult> activityObservationResults; + protected final Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> activityObservationResults; + /** + * Logbook activities results. + */ + protected final Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> activityLogbookResults; /** * Local market batches results. */ protected final Set<ToolkitIdModifications> localmarketBatchResults; - public TripConsolidateResult(String tripId, String tripLabel, Set<ActivityConsolidateResult> activityObservationResults, Set<ToolkitIdModifications> localmarketBatchResults) { + public TripConsolidateResult(String tripId, + String tripLabel, + Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> activityObservationResults, + Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> activityLogbookResults, + Set<ToolkitIdModifications> localmarketBatchResults) { this.tripId = tripId; this.tripLabel = tripLabel; this.activityObservationResults = activityObservationResults; + this.activityLogbookResults = activityLogbookResults; this.localmarketBatchResults = localmarketBatchResults; } @@ -70,21 +78,27 @@ public class TripConsolidateResult implements JsonAware { return tripLabel; } - public Set<ActivityConsolidateResult> getActivityObservationResults() { + public Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> getActivityObservationResults() { return activityObservationResults; } + public Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> getActivityLogbookResults() { + return activityLogbookResults; + } + public Set<ToolkitIdModifications> getLocalmarketBatchResults() { return localmarketBatchResults; } public boolean withModifications() { - return activityObservationResults.stream().anyMatch(ActivityConsolidateResult::withModifications) || + return activityObservationResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withModifications) || + activityLogbookResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult::withModifications) || localmarketBatchResults.stream().anyMatch(ToolkitIdModifications::withModifications); } public boolean withWarnings() { - return activityObservationResults.stream().anyMatch(ActivityConsolidateResult::withWarnings) || + return activityObservationResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withWarnings) || + activityLogbookResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult::withWarnings) || localmarketBatchResults.stream().anyMatch(ToolkitIdModifications::withWarnings); } } ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/ActivityConsolidateResult.java ===================================== @@ -0,0 +1,99 @@ +package fr.ird.observe.consolidation.data.ps.logbook; + +/*- + * #%L + * ObServe Core :: API :: Dto Consolidation + * %% + * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.dto.ToolkitIdModifications; +import io.ultreia.java4all.util.json.JsonAware; + +import java.util.Set; + +/** + * Created on 12/03/2023. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.28 + */ +public class ActivityConsolidateResult implements JsonAware { + + /** + * Id of activity. + */ + protected String activityId; + + /** + * Label of activity. + */ + private String activityLabel; + + /** + * All modification on floating objects. + */ + private Set<ToolkitIdModifications> floatingObjectModifications; + + public String getActivityId() { + return activityId; + } + + public void setActivityId(String activityId) { + this.activityId = activityId; + } + + public String getActivityLabel() { + return activityLabel; + } + + public void setActivityLabel(String activityLabel) { + this.activityLabel = activityLabel; + } + + public Set<ToolkitIdModifications> getFloatingObjectModifications() { + return floatingObjectModifications; + } + + public void setFloatingObjectModifications(Set<ToolkitIdModifications> floatingObjectModifications) { + this.floatingObjectModifications = floatingObjectModifications; + } + + public boolean withModifications() { + if (getFloatingObjectModifications() != null) { + for (ToolkitIdModifications modifications : floatingObjectModifications) { + if (modifications.withModifications()) { + return true; + } + } + } + return false; + } + + public boolean withWarnings() { + if (getFloatingObjectModifications() != null) { + for (ToolkitIdModifications modifications : floatingObjectModifications) { + if (modifications.withWarnings()) { + return true; + } + } + } + return false; + } +} + ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/ActivityConsolidateResultBuilder.java ===================================== @@ -0,0 +1,63 @@ +package fr.ird.observe.consolidation.data.ps.logbook; + +/*- + * #%L + * ObServe Core :: API :: Dto Consolidation + * %% + * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.dto.ToolkitIdModifications; + +import java.util.LinkedHashSet; +import java.util.Optional; +import java.util.Set; + +/** + * Created on 12/03/2023. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.28 + */ +public class ActivityConsolidateResultBuilder { + private final Set<ToolkitIdModifications> floatingObjectModificationBuilder = new LinkedHashSet<>(); + private final String activityLabel; + private final String activityId; + + public ActivityConsolidateResultBuilder(String activityId, String activityLabel) { + this.activityId = activityId; + this.activityLabel = activityLabel; + } + + public Optional<ActivityConsolidateResult> build() { + boolean noModification = floatingObjectModificationBuilder.isEmpty(); + + if (noModification) { + return Optional.empty(); + } + ActivityConsolidateResult result = new ActivityConsolidateResult(); + result.setActivityId(activityId); + result.setActivityLabel(activityLabel); + result.setFloatingObjectModifications(floatingObjectModificationBuilder); + return Optional.of(result); + } + + public void flushFloatingObjectModification(ToolkitIdModifications modifications) { + floatingObjectModificationBuilder.add(modifications); + } +} ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/FloatingObjectActions.java → core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/FloatingObjectConsolidateActions.java ===================================== @@ -23,12 +23,13 @@ package fr.ird.observe.consolidation.data.ps.logbook; */ import fr.ird.observe.consolidation.AtomicConsolidateAction; +import fr.ird.observe.consolidation.data.ps.dcp.CleanComputedValuesAction; import fr.ird.observe.consolidation.data.ps.dcp.ComputeBiodegradableConsolidateAction; import fr.ird.observe.consolidation.data.ps.dcp.ComputeNonEntanglingConsolidateAction; import fr.ird.observe.consolidation.data.ps.dcp.ComputeSimplifiedObjectTypeConsolidateAction; -import fr.ird.observe.consolidation.data.ps.dcp.FloatingObjectConsolidateAction; import fr.ird.observe.dto.data.ps.logbook.FloatingObjectDto; -import fr.ird.observe.dto.data.ps.logbook.FloatingObjectPartDto; + +import java.util.List; /** * Created on 09/03/2023. @@ -36,31 +37,26 @@ import fr.ird.observe.dto.data.ps.logbook.FloatingObjectPartDto; * @author Tony Chemit - dev@tchemit.fr * @since 9.0.27 */ -public enum FloatingObjectActions implements AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> { +public enum FloatingObjectConsolidateActions implements AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> { + CleanComputedValuesWhenArriving(new CleanComputedValuesAction.WhenArriving<>()), + CleanComputedValuesWhenLeaving(new CleanComputedValuesAction.WhenLeaving<>()), ComputeBiodegradableWhenArriving(new ComputeBiodegradableConsolidateAction.WhenArriving<>()), ComputeBiodegradableWhenLeaving(new ComputeBiodegradableConsolidateAction.WhenLeaving<>()), - ComputeNonEntanglingWhenArriving(new ComputeNonEntanglingConsolidateAction.WhenArriving<>()), ComputeNonEntanglingWhenLeaving(new ComputeNonEntanglingConsolidateAction.WhenLeaving<>()), - ComputeSimplifiedObjectTypeWhenArriving(new ComputeSimplifiedObjectTypeConsolidateAction.WhenArriving<>()), ComputeSimplifiedObjectTypeWhenLeaving(new ComputeSimplifiedObjectTypeConsolidateAction.WhenLeaving<>()); - private final FloatingObjectConsolidateAction<?, FloatingObjectDto, FloatingObjectPartDto, FloatingObjectConsolidateRequest, FloatingObjectConsolidateContext> action; + private final AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> action; - FloatingObjectActions(FloatingObjectConsolidateAction<?, FloatingObjectDto, FloatingObjectPartDto, FloatingObjectConsolidateRequest, FloatingObjectConsolidateContext> action) { + FloatingObjectConsolidateActions(AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> action) { this.action = action; } @Override - public String fieldName() { - return action.fieldName(); - } - - @Override - public String extraFieldName() { - return action.extraFieldName(); + public List<String> fieldNames() { + return action.fieldNames(); } @Override @@ -75,6 +71,6 @@ public enum FloatingObjectActions implements AtomicConsolidateAction<FloatingObj @Override public String toString() { - return FloatingObjectActions.class.getSimpleName() + "." + name(); + return "ps.logbook." + FloatingObjectConsolidateActions.class.getSimpleName() + "." + name(); } } ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/FloatingObjectConsolidateEngine.java ===================================== @@ -46,33 +46,43 @@ public class FloatingObjectConsolidateEngine extends FloatingObjectConsolidateEn return new FloatingObjectConsolidateContext(getSimplifiedObjectTypeManager(), getMonitor(), getDecorator()); } + @Override + protected AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> cleanComputedValuesWhenArrivingAction() { + return FloatingObjectConsolidateActions.CleanComputedValuesWhenArriving; + } + + @Override + protected AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> cleanComputedValuesWhenLeavingAction() { + return FloatingObjectConsolidateActions.CleanComputedValuesWhenLeaving; + } + @Override protected AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> computeSimplifiedObjectTypeWhenArrivingAction() { - return FloatingObjectActions.ComputeSimplifiedObjectTypeWhenArriving; + return FloatingObjectConsolidateActions.ComputeSimplifiedObjectTypeWhenArriving; } @Override protected AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> computeSimplifiedObjectTypeWhenLeavingAction() { - return FloatingObjectActions.ComputeSimplifiedObjectTypeWhenLeaving; + return FloatingObjectConsolidateActions.ComputeSimplifiedObjectTypeWhenLeaving; } @Override protected AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> computeBiodegradableWhenArrivingAction() { - return FloatingObjectActions.ComputeBiodegradableWhenArriving; + return FloatingObjectConsolidateActions.ComputeBiodegradableWhenArriving; } @Override protected AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> computeBiodegradableWhenLeavingAction() { - return FloatingObjectActions.ComputeBiodegradableWhenLeaving; + return FloatingObjectConsolidateActions.ComputeBiodegradableWhenLeaving; } @Override protected AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> computeNonEntanglingWhenArrivingAction() { - return FloatingObjectActions.ComputeNonEntanglingWhenArriving; + return FloatingObjectConsolidateActions.ComputeNonEntanglingWhenArriving; } @Override protected AtomicConsolidateAction<FloatingObjectConsolidateContext, FloatingObjectDto> computeNonEntanglingWhenLeavingAction() { - return FloatingObjectActions.ComputeNonEntanglingWhenLeaving; + return FloatingObjectConsolidateActions.ComputeNonEntanglingWhenLeaving; } } ===================================== core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateEngine.java ===================================== @@ -26,16 +26,12 @@ import fr.ird.observe.consolidation.data.ps.dcp.SimplifiedObjectTypeManager; import fr.ird.observe.consolidation.data.ps.localmarket.BatchConsolidateEngine; import fr.ird.observe.consolidation.data.ps.localmarket.BatchConsolidateRequest; import fr.ird.observe.consolidation.data.ps.localmarket.GetOptionalRtpMeanWeightImpl; -import fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateEngine; -import fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult; import fr.ird.observe.decoration.DecoratorService; import fr.ird.observe.dto.ToolkitIdModifications; import fr.ird.observe.dto.data.ps.localmarket.BatchDto; import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.entities.data.ps.common.Trip; import fr.ird.observe.entities.data.ps.localmarket.Batch; -import fr.ird.observe.entities.data.ps.observation.Activity; -import fr.ird.observe.entities.data.ps.observation.Route; import fr.ird.observe.spi.service.ServiceContext; import io.ultreia.java4all.decoration.Decorator; import org.apache.logging.log4j.LogManager; @@ -56,11 +52,13 @@ public class TripConsolidateEngine { private static final Logger log = LogManager.getLogger(TripConsolidateEngine.class); private final ServiceContext context; private final BatchConsolidateEngine localmarketBatchEngine; - private final ActivityConsolidateEngine activityConsolidateEngine; + private final fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateEngine observationActivityConsolidateEngine; + private final fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateEngine logbookActivityConsolidateEngine; public TripConsolidateEngine(ServiceContext context, SimplifiedObjectTypeManager simplifiedObjectTypeManager) { this.context = context; - this.activityConsolidateEngine = new ActivityConsolidateEngine(context, simplifiedObjectTypeManager); + this.observationActivityConsolidateEngine = new fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateEngine(context, simplifiedObjectTypeManager); + this.logbookActivityConsolidateEngine = new fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateEngine(context, simplifiedObjectTypeManager); this.localmarketBatchEngine = new BatchConsolidateEngine(new GetOptionalRtpMeanWeightImpl(context), context.getDecoratorService()); } @@ -76,15 +74,16 @@ public class TripConsolidateEngine { Set<ToolkitIdModifications> localmarketBatchResults = consolidateLocalmarketBatches(trip, failIfLengthWeightParameterNotFound); - Set<ActivityConsolidateResult> activityConsolidateResults = consolidateObservationActivities(trip, failIfLengthWeightParameterNotFound, failIfLengthLengthParameterNotFound); + Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> observationActivityConsolidateResults = consolidateObservationActivities(trip, failIfLengthWeightParameterNotFound, failIfLengthLengthParameterNotFound); + Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> logbookActivityConsolidateResults = consolidateLogbookActivities(trip); - if (activityConsolidateResults.isEmpty() && localmarketBatchResults.isEmpty()) { + if (observationActivityConsolidateResults.isEmpty() && localmarketBatchResults.isEmpty() && logbookActivityConsolidateResults.isEmpty()) { // no modification, nor warning on this trip return Optional.empty(); } decoratorService.installDecorator(Trip.class, trip); String tripLabel = trip.toString(); - TripConsolidateResult result = new TripConsolidateResult(tripId, tripLabel, activityConsolidateResults, localmarketBatchResults); + TripConsolidateResult result = new TripConsolidateResult(tripId, tripLabel, observationActivityConsolidateResults, logbookActivityConsolidateResults, localmarketBatchResults); if (result.withModifications()) { log.info(String.format("Found some modifications on trip: %s - %s", tripId, result.getTripLabel())); } @@ -123,18 +122,18 @@ public class TripConsolidateEngine { return result; } - private Set<ActivityConsolidateResult> consolidateObservationActivities(Trip trip, boolean failIfLengthWeightParameterNotFound, boolean failIfLengthLengthParameterNotFound) { - Set<ActivityConsolidateResult> result = new LinkedHashSet<>(); + private Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> consolidateObservationActivities(Trip trip, boolean failIfLengthWeightParameterNotFound, boolean failIfLengthLengthParameterNotFound) { + Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> result = new LinkedHashSet<>(); int routeIndex = 0; int routeMax = trip.getRouteObsSize(); - Decorator routeDecorator = context.getDecoratorService().getDecoratorByType(Route.class); - for (Route route : trip.getRouteObs()) { + Decorator routeDecorator = context.getDecoratorService().getDecoratorByType(fr.ird.observe.entities.data.ps.observation.Route.class); + for (fr.ird.observe.entities.data.ps.observation.Route route : trip.getRouteObs()) { route.registerDecorator(routeDecorator); - String routePrefix = String.format("Route %s [%s/%s] ", route, ++routeIndex, routeMax); + String routePrefix = String.format("Observations - Route %s [%s/%s] ", route, ++routeIndex, routeMax); log.debug(String.format("%s Start consolidate route: %s", routePrefix, route.getTopiaId())); int activityIndex = 0; int activityMax = route.getActivitySize(); - for (Activity activity : route.getActivity()) { + for (fr.ird.observe.entities.data.ps.observation.Activity activity : route.getActivity()) { String activityPrefix = String.format("%s - Activity [%s/%s] ", routePrefix, ++activityIndex, activityMax); @@ -142,12 +141,41 @@ public class TripConsolidateEngine { log.debug(String.format("%s Skip activity (No set nor floating object found): %s", activityPrefix, activity.getTopiaId())); continue; } - Optional<ActivityConsolidateResult> activityResult = activityConsolidateEngine.consolidateActivity(trip, - route, - activity, - activityPrefix, - failIfLengthWeightParameterNotFound, - failIfLengthLengthParameterNotFound); + Optional<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> activityResult = observationActivityConsolidateEngine.consolidateActivity(trip, + route, + activity, + activityPrefix, + failIfLengthWeightParameterNotFound, + failIfLengthLengthParameterNotFound); + activityResult.ifPresent(result::add); + } + } + return result; + } + + private Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> consolidateLogbookActivities(Trip trip) { + Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> result = new LinkedHashSet<>(); + int routeIndex = 0; + int routeMax = trip.getRouteLogbookSize(); + Decorator routeDecorator = context.getDecoratorService().getDecoratorByType(fr.ird.observe.entities.data.ps.logbook.Route.class); + for (fr.ird.observe.entities.data.ps.logbook.Route route : trip.getRouteLogbook()) { + route.registerDecorator(routeDecorator); + String routePrefix = String.format("Logbook - Route %s [%s/%s] ", route, ++routeIndex, routeMax); + log.debug(String.format("%s Start consolidate route: %s", routePrefix, route.getTopiaId())); + int activityIndex = 0; + int activityMax = route.getActivitySize(); + for (fr.ird.observe.entities.data.ps.logbook.Activity activity : route.getActivity()) { + + String activityPrefix = String.format("%s - Activity [%s/%s] ", routePrefix, ++activityIndex, activityMax); + + if (activity.isFloatingObjectEmpty()) { + log.debug(String.format("%s Skip activity (No floating object found): %s", activityPrefix, activity.getTopiaId())); + continue; + } + Optional<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> activityResult = logbookActivityConsolidateEngine.consolidateActivity(trip, + route, + activity, + activityPrefix); activityResult.ifPresent(result::add); } } ===================================== core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/ActivityConsolidateContext.java ===================================== @@ -0,0 +1,63 @@ +package fr.ird.observe.consolidation.data.ps.logbook; + +/*- + * #%L + * ObServe Core :: Persistence :: Consolidation + * %% + * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.decoration.DecoratorService; +import fr.ird.observe.dto.ToolkitIdModifications; +import fr.ird.observe.entities.ObserveTopiaDaoSupplier; +import fr.ird.observe.entities.data.ps.logbook.Activity; +import fr.ird.observe.spi.service.ServiceContext; + +import java.util.Locale; +import java.util.Optional; + +/** + * Created on 12/03/2023. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.28 + */ +public class ActivityConsolidateContext { + public final Locale locale; + public final ObserveTopiaDaoSupplier daoSupplier; + public final DecoratorService decoratorService; + public final String activityPrefix; + public final ActivityConsolidateResultBuilder resultBuilder; + + public ActivityConsolidateContext(ServiceContext context, Activity activity, String activityPrefix) { + this.activityPrefix = activityPrefix; + this.decoratorService = context.getDecoratorService(); + this.locale = context.getApplicationLocale(); + this.daoSupplier = (ObserveTopiaDaoSupplier) context.getTopiaPersistenceContext(); + this.resultBuilder = new ActivityConsolidateResultBuilder(activity.getTopiaId(), activity.toString()); + } + + public void flushFloatingObject(ToolkitIdModifications modifications) { + resultBuilder.flushFloatingObjectModification(modifications); + } + + public Optional<ActivityConsolidateResult> buildResult() { + return resultBuilder.build(); + } + +} ===================================== core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/ActivityConsolidateEngine.java ===================================== @@ -0,0 +1,144 @@ +package fr.ird.observe.consolidation.data.ps.logbook; + +/*- + * #%L + * ObServe Core :: Persistence :: Consolidation + * %% + * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.consolidation.data.ps.dcp.SimplifiedObjectTypeManager; +import fr.ird.observe.dto.ToolkitIdModifications; +import fr.ird.observe.dto.data.ActivityAware; +import fr.ird.observe.dto.data.ps.logbook.FloatingObjectDto; +import fr.ird.observe.dto.data.ps.logbook.FloatingObjectPartDto; +import fr.ird.observe.dto.referential.ReferentialLocale; +import fr.ird.observe.entities.data.ps.common.Trip; +import fr.ird.observe.entities.data.ps.logbook.Activity; +import fr.ird.observe.entities.data.ps.logbook.FloatingObject; +import fr.ird.observe.entities.data.ps.logbook.FloatingObjectPart; +import fr.ird.observe.entities.data.ps.logbook.Route; +import fr.ird.observe.spi.service.ServiceContext; +import io.ultreia.java4all.decoration.Decorator; +import io.ultreia.java4all.util.Dates; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.LinkedHashSet; +import java.util.Optional; + +/** + * Created on 12/03/2023. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.28 + */ +public class ActivityConsolidateEngine { + private static final Logger log = LogManager.getLogger(ActivityConsolidateEngine.class); + private final ServiceContext context; + private final FloatingObjectConsolidateEngine floatingObjectConsolidateEngine; + private final Decorator activityDecorator; + + public ActivityConsolidateEngine(ServiceContext context, SimplifiedObjectTypeManager simplifiedObjectTypeManager) { + this.context = context; + this.floatingObjectConsolidateEngine = new FloatingObjectConsolidateEngine(simplifiedObjectTypeManager, context.getDecoratorService()); + this.activityDecorator = context.getDecoratorService().getDecoratorByType(Activity.class, ActivityAware.CLASSIFIER_WITH_ROUTE); + } + + public Optional<ActivityConsolidateResult> consolidateActivity(Trip trip, + Route route, + Activity activity, + String activityPrefix) { + if (activity.isFloatingObjectEmpty()) { + log.debug(String.format("%s Skip activity (No floating object found): %s", activityPrefix, activity.getTopiaId())); + return Optional.empty(); + } + activity.setTime(Dates.getDateAndTime(route.getDate(), activity.getTime(), true, true)); + activity.registerDecorator(activityDecorator); + + ActivityConsolidateContext activityContext = new ActivityConsolidateContext(context, + activity, + activityPrefix); + try { + log.debug(String.format("%s Start consolidate activity: %s", activityContext.activityPrefix, activity.getTopiaId())); + if (activity.isFloatingObjectNotEmpty()) { + for (FloatingObject floatingObject : activity.getFloatingObject()) { + consolidateFloatingObject(activityContext, floatingObject); + } + } + Optional<ActivityConsolidateResult> result = activityContext.buildResult(); + result.ifPresent(r -> { + if (r.withModifications()) { + log.info(String.format("%s Found some modifications on activity: %s - %s", activityPrefix, activity.getTopiaId(), r.getActivityLabel())); + } + if (r.withWarnings()) { + log.info(String.format("%s Found some warnings on activity: %s - %s", activityPrefix, activity.getTopiaId(), r.getActivityLabel())); + } + }); + return result; + } catch (Exception e) { + log.error(String.format("%s Could not consolidate trip: %s, route: %s - activity: %s", activityPrefix, trip.getTopiaId(), route.getTopiaId(), activity.getTopiaId()), e); + throw e; + } + } + + private void consolidateFloatingObject(ActivityConsolidateContext activityContext, FloatingObject floatingObject) { + + if (floatingObject.getObjectOperation() == null) { + log.warn("**********************"); + log.warn(String.format("Floating object %s has no object operation....", floatingObject.getTopiaId())); + log.warn("**********************"); + return; + } + + ReferentialLocale referentialLocale = context.getReferentialLocale(); + + FloatingObjectDto floatingObjectDto = FloatingObject.toDto(referentialLocale, floatingObject); + + java.util.Set<FloatingObjectPartDto> floatingObjectPartSet = new LinkedHashSet<>(FloatingObjectPart.SPI.toDataDtoList(referentialLocale, floatingObject.getFloatingObjectPart())); + FloatingObjectConsolidateRequest request = new FloatingObjectConsolidateRequest(floatingObjectDto, floatingObjectPartSet); + Optional<ToolkitIdModifications> result = floatingObjectConsolidateEngine.consolidate(request); + + result.ifPresent(r -> { + // flush to main result + activityContext.flushFloatingObject(r); + // flush back modifications detected to entity + r.flushToBean(floatingObject); + }); + + if (request.isNeedClean()) { + log.warn("**********************"); + log.warn(String.format("Floating object %s has some bad parts, this will be fixed here....", floatingObject.getTopiaId())); + log.warn("**********************"); + // Need to clean dcp parts + boolean notWhenArriving = !floatingObject.getObjectOperation().isWhenArriving(); + boolean notWhenLeaving = !floatingObject.getObjectOperation().isWhenLeaving(); + for (FloatingObjectPart floatingObjectPart : floatingObject.getFloatingObjectPart()) { + if (floatingObjectPart.getWhenArriving() != null && notWhenArriving) { + log.info(String.format("Set whenArriving to null for part: %s", floatingObjectPart.getTopiaId())); + floatingObjectPart.setWhenArriving(null); + } + if (floatingObjectPart.getWhenLeaving() != null && notWhenLeaving) { + log.info(String.format("Set whenLeaving to null for part: %s", floatingObjectPart.getTopiaId())); + floatingObjectPart.setWhenLeaving(null); + } + } + } + } + +} ===================================== core/services/test/src/main/java/fr/ird/observe/services/service/data/ps/ConsolidateDataServiceFixtures.java ===================================== @@ -28,7 +28,6 @@ import fr.ird.observe.consolidation.data.ps.common.TripConsolidateResult; import fr.ird.observe.consolidation.data.ps.dcp.SimplifiedObjectTypeManager; import fr.ird.observe.consolidation.data.ps.dcp.SimplifiedObjectTypeSpecializedRules; import fr.ird.observe.consolidation.data.ps.localmarket.BatchConsolidateRequest; -import fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult; import fr.ird.observe.decoration.DecoratorService; import fr.ird.observe.dto.ToolkitIdModifications; import fr.ird.observe.dto.data.ps.localmarket.BatchDto; @@ -210,9 +209,11 @@ public class ConsolidateDataServiceFixtures extends GeneratedConsolidateDataServ TripConsolidateResult actual = service.consolidateTrip(simplifiedObjectTypeSpecializedRules, request); Assert.assertNotNull(actual); Assert.assertNotNull(actual.getActivityObservationResults()); + Assert.assertNotNull(actual.getActivityLogbookResults()); + Assert.assertEquals(0, actual.getActivityLogbookResults().size()); Assert.assertEquals(getIntegerProperty("consolidateTrip.activityResult.count"), actual.getActivityObservationResults().size()); - Assert.assertEquals(getIntegerProperty("consolidateTrip.activityResult.withModifications.count"), actual.getActivityObservationResults().stream().filter(ActivityConsolidateResult::withModifications).count()); - Assert.assertEquals(getIntegerProperty("consolidateTrip.activityResult.withWarnings.count"), actual.getActivityObservationResults().stream().filter(ActivityConsolidateResult::withWarnings).count()); + Assert.assertEquals(getIntegerProperty("consolidateTrip.activityResult.withModifications.count"), actual.getActivityObservationResults().stream().filter(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withModifications).count()); + Assert.assertEquals(getIntegerProperty("consolidateTrip.activityResult.withWarnings.count"), actual.getActivityObservationResults().stream().filter(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withWarnings).count()); } } ===================================== pom.xml ===================================== @@ -1244,7 +1244,8 @@ </reportSet> </reportSets> </plugin> - <plugin> + <!-- FIXME Need some work before javadoc is fine--> + <!--plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>${plugin.version.javadoc}</version> @@ -1256,7 +1257,7 @@ </reports> </reportSet> </reportSets> - </plugin> + </plugin--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jxr-plugin</artifactId> ===================================== src/site/markdown/consolidation.md ===================================== @@ -0,0 +1,295 @@ +# Consolidation + +Ce document décrit les règles de calcul utilisées lors de l'opération de consolidation. + +## Modèle commun + +Pour le moment aucune consolidation n'est effectiée sur ce modèle. + +## Modèle Palangre + +Pour le moment aucune consolidation n'est effectiée sur ce modèle. + +## Modèle Senne + +### Paquetage Commun + +Pour le moment aucune consolidation n'est effectiée sur ce paquetage. + +### Paquetage Livre de Bord + +#### Entité Objet flottant (ps.logbook.FloatingObject) + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/logbook/FloatingObjectConsolidateActions.html#FloatingObjectConsolidateActions) + +| Code | Champs | +|:----------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------| +| ps.logbook.FloatingObjectConsolidateActions.CleanComputedValuesWhenArriving | computedWhenArrivingBiodegradable <br/>computedWhenArrivingNonEntangling<br/>computedWhenArrivingSimplifiedObjectType | + +Si l'objet flottant n'est pas actif sur l'arrivée, alors supprimer toutes les données calculées sur l'arrivée. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/CleanComputedValuesAction.html) + +| Code | Champs | +|:---------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------| +| ps.logbook.FloatingObjectConsolidateActions.CleanComputedValuesWhenLeaving | computedWhenLeavingBiodegradable<br/>computedWhenLeavingNonEntangling<br/>computedWhenLeavingSimplifiedObjectType | + +Si l'objet flottant n'est pas actif sur le départ, alors supprimer toutes les données calculées sur le départ. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/CleanComputedValuesAction.html) + +| Code | Champs | +|:-----------------------------------------------------------------------------|:----------------------------------| +| ps.logbook.FloatingObjectConsolidateActions.ComputeBiodegradableWhenArriving | computedWhenArrivingBiodegradable | + +Calcul de la propriété **computedWhenArrivingBiodegradable** à partir des matériaux sur l'arrivée. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeBiodegradableConsolidateAction.html) + +| Code | Champs | +|:----------------------------------------------------------------------------|:---------------------------------| +| ps.logbook.FloatingObjectConsolidateActions.ComputeBiodegradableWhenLeaving | computedWhenLeavingBiodegradable | + +Calcul de la propriété **computedWhenLeavingBiodegradable** à partir des matériaux sur le départ. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeBiodegradableConsolidateAction.html) + +| Code | Champs | +|:-----------------------------------------------------------------------------|:----------------------------------| +| ps.logbook.FloatingObjectConsolidateActions.ComputeNonEntanglingWhenArriving | computedWhenArrivingNonEntangling | + +Calcul de la propriété **computedWhenArrivingNonEntangling** à partir des matériaux sur l'arrivée. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeNonEntanglingConsolidateAction.html) + +| Code | Champs | +|:----------------------------------------------------------------------------|:---------------------------------| +| ps.logbook.FloatingObjectConsolidateActions.ComputeNonEntanglingWhenLeaving | computedWhenLeavingNonEntangling | + +Calcul de la propriété **computedWhenLeavingNonEntangling** à partir des matériaux sur le départ. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeNonEntanglingConsolidateAction.html) + +| Code | Champs | +|:------------------------------------------------------------------------------------|:-----------------------------------------| +| ps.logbook.FloatingObjectConsolidateActions.ComputeSimplifiedObjectTypeWhenArriving | computedWhenArrivingSimplifiedObjectType | + +Calcul de la propriété **computedWhenArrivingSimplifiedObjectType** à partir des matériaux sur l'arrivée. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeSimplifiedObjectTypeConsolidateAction.html) + +| Code | Champs | +|:-----------------------------------------------------------------------------------|:----------------------------------------| +| ps.logbook.FloatingObjectConsolidateActions.ComputeSimplifiedObjectTypeWhenLeaving | computedWhenLeavingSimplifiedObjectType | + +Calcul de la propriété **computedWhenLeavingSimplifiedObjectType** à partir des matériaux sur le départ. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeSimplifiedObjectTypeConsolidateAction.html) + +### Paquetage Observations + +#### Entité Calée (ps.observation.Set) + +[Code source](./core/core-persistence/core-persistence-consolidation/xref/fr/ird/observe/consolidation/data/ps/observation/SetConsolidateActions.html#SetConsolidateActions) + +| Code | Champs | +|:-------------------------------------------------------|:-----------| +| ps.observation.SetConsolidateActions.ComputeSchoolType | SchoolType | + +Calcul du type de banc à partir des systèmes observés de l'activité. + +#### Entité Objet flottant (ps.observation.FloatingObject) + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/observation/FloatingObjectConsolidateActions.html#FloatingObjectConsolidateActions) + +| Code | Champs | +|:--------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------| +| ps.observation.FloatingObjectConsolidateActions.CleanComputedValuesWhenArriving | computedWhenArrivingBiodegradable <br/>computedWhenArrivingNonEntangling<br/>computedWhenArrivingSimplifiedObjectType | + +Si l'objet flottant n'est pas actif sur l'arrivée, alors supprimer toutes les données calculées sur l'arrivée. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/CleanComputedValuesAction.html) + +| Code | Champs | +|:-------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------| +| ps.observation.FloatingObjectConsolidateActions.CleanComputedValuesWhenLeaving | computedWhenLeavingBiodegradable<br/>computedWhenLeavingNonEntangling<br/>computedWhenLeavingSimplifiedObjectType | + +Si l'objet flottant n'est pas actif sur le départ, alors supprimer toutes les données calculées sur le départ. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/CleanComputedValuesAction.html) + +| Code | Champs | +|:---------------------------------------------------------------------------------|:----------------------------------| +| ps.observation.FloatingObjectConsolidateActions.ComputeBiodegradableWhenArriving | computedWhenArrivingBiodegradable | + +Calcul de la propriété **computedWhenArrivingBiodegradable** à partir des matériaux sur l'arrivée. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeBiodegradableConsolidateAction.html) + +| Code | Champs | +|:--------------------------------------------------------------------------------|:---------------------------------| +| ps.observation.FloatingObjectConsolidateActions.ComputeBiodegradableWhenLeaving | computedWhenLeavingBiodegradable | + +Calcul de la propriété **computedWhenLeavingBiodegradable** à partir des matériaux sur le départ. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeBiodegradableConsolidateAction.html) + +| Code | Champs | +|:---------------------------------------------------------------------------------|:----------------------------------| +| ps.observation.FloatingObjectConsolidateActions.ComputeNonEntanglingWhenArriving | computedWhenArrivingNonEntangling | + +Calcul de la propriété **computedWhenArrivingNonEntangling** à partir des matériaux sur l'arrivée. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeNonEntanglingConsolidateAction.html) + +| Code | Champs | +|:--------------------------------------------------------------------------------|:---------------------------------| +| ps.observation.FloatingObjectConsolidateActions.ComputeNonEntanglingWhenLeaving | computedWhenLeavingNonEntangling | + +Calcul de la propriété **computedWhenLeavingNonEntangling** à partir des matériaux sur le départ. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeNonEntanglingConsolidateAction.html) + +| Code | Champs | +|:----------------------------------------------------------------------------------------|:-----------------------------------------| +| ps.observation.FloatingObjectConsolidateActions.ComputeSimplifiedObjectTypeWhenArriving | computedWhenArrivingSimplifiedObjectType | + +Calcul de la propriété **computedWhenArrivingSimplifiedObjectType** à partir des matériaux sur l'arrivée. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeSimplifiedObjectTypeConsolidateAction.html) + +| Code | Champs | +|:---------------------------------------------------------------------------------------|:----------------------------------------| +| ps.observation.FloatingObjectConsolidateActions.ComputeSimplifiedObjectTypeWhenLeaving | computedWhenLeavingSimplifiedObjectType | + +Calcul de la propriété **computedWhenLeavingSimplifiedObjectType** à partir des matériaux sur le départ. + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/dcp/ComputeSimplifiedObjectTypeConsolidateAction.html) + +#### Entité Capture (ps.observation.Catch) + +[Code source](./core/core-persistence/core-persistence-consolidation/xref/fr/ird/observe/consolidation/data/ps/observation/CatchConsolidateActions.html#CatchConsolidateActions) + +| Code | Champs | +|:-----------------------------------------------------------------------|:----------------------------------------| +| ps.observation.CatchConsolidateActions.ComputeMeanLengthFromMeanWeight | meanLength<br/>meanLengthComputedSource | + +Pour calculer la taille moyenne de la capture à partir du poids moyen de la capture et du RTP adéquate. + +La propriété calculée sera *CatchComputedValueSource.fromData*. + +| Code | Champs | +|:-----------------------------------------------------------------------|:----------------------------------------| +| ps.observation.CatchConsolidateActions.ComputeMeanWeightFromMeanLength | meanWeight<br/>meanWeightComputedSource | + +Pour calculer le poids moyen de la capture à partir de la taille moyenne de la capture et du RTP adéquate. + +La propriété calculée sera *CatchComputedValueSource.fromData*. + +| Code | Champs | +|:-------------------------------------------------------------------------------------|:------------------------------------------| +| ps.observation.CatchConsolidateActions.ComputeCatchWeightFromTotalCountAndMeanWeight | catchWeight<br/>catchWeightComputedSource | + +Pour calculer le poids total de la capture à partir du poids moyen et de l'effectif de la capture. + +La propriété calculée sera *CatchComputedValueSource.fromData*. + +| Code | Champs | +|:-------------------------------------------------------------------------------------|:----------------------------------------| +| ps.observation.CatchConsolidateActions.ComputeTotalCountFromCatchWeightAndMeanWeight | totalCount<br/>totalCountComputedSource | + +Pour calculer l'effectif de la capture à partir du poids total et moyen de la capture. + +La propriété calculée sera *CatchComputedValueSource.fromData*. + +| Code | Champs | +|:-------------------------------------------------------------------------------------|:----------------------------------------| +| ps.observation.CatchConsolidateActions.ComputeMeanWeightFromTotalCountAndCatchWeight | meanWeight<br/>meanWeightComputedSource | + +Pour calculer la taille moyenne à partir du poids total et de l'effectif de la capture. + +La propriété calculée sera *CatchComputedValueSource.fromData*. + +| Code | Champs | +|:-------------------------------------------------------------------|:----------------------------------------| +| ps.observation.CatchConsolidateActions.CopyMeanLengthFromParameter | meanLength<br/>meanLengthComputedSource | + +Pour recopier la taille moyenne du RTP adéquate. + +La propriété calculée sera *CatchComputedValueSource.fromReferentiel*. + +| Code | Champs | +|:-------------------------------------------------------------------|:----------------------------------------| +| ps.observation.CatchConsolidateActions.CopyMeanWeightFromParameter | meanWeight<br/>meanWeightComputedSource | + +Pour recopier le poids moyen du RTP adéquate. + +La propriété calculée sera *CatchComputedValueSource.fromReferentiel*. + +| Code | Champs | +|:--------------------------------------------------------------------|:----------------------------------------| +| ps.observation.CatchConsolidateActions.ComputeMeanLengthFromSamples | meanLength<br/>meanLengthComputedSource | + +Pour calculer la taille moyenne à partir des tailles moyennes des échantillons associés. + +La propriété calculée sera *CatchComputedValueSource.fromSample*. + +| Code | Champs | +|:--------------------------------------------------------------------|:----------------------------------------| +| ps.observation.CatchConsolidateActions.ComputeTotalCountFromSamples | totalCount<br/>totalCountComputedSource | + +Pour calculer l'effectif de la capture à partir des effectifs des échantillons associés. + +La propriété calculée sera *CatchComputedValueSource.fromSample*. + +| Code | Champs | +|:---------------------------------------------------------------------|:--------------------| +| ps.observation.CatchConsolidateActions.CleanCatchWeightMeasureMethod | weightMeasureMethod | + +Pour supprimer la méthode de mesure de poids si le poids a été calculé ou qu'il n'y a pas de poids. + +#### Entité Échantillon (ps.observation.SampleMeasure) + +[Code source](./core/core-persistence/core-persistence-consolidation/xref/fr/ird/observe/consolidation/data/ps/observation/SampleMeasureConsolidateActions.html#SampleMeasureConsolidateActions) + +| Code | Champs | +|:-----------------------------------------------------------------------|:----------------------------| +| ps.observation.SampleMeasureConsolidateActions.ComputeLengthFromWeight | length<br/>isLengthComputed | + +Calcul de la taille depuis le poids en utilisant la RTP adéquate. + +| Code | Champs | +|:-----------------------------------------------------------------------|:----------------------------| +| ps.observation.SampleMeasureConsolidateActions.ComputeWeightFromLength | weight<br/>isWeightComputed | + +Calcul du poids depuis la taille en utilisant la RTP adéquate. + +### Paquetage Marché local + +#### Entité Lot (ps.localmarket.Batch) + +[Code source](./core/core-api/core-api-dto-consolidation/xref/fr/ird/observe/consolidation/data/ps/localmarket/BatchConsolidateActions.html#BatchConsolidateActions) + +| Code | Champs | +|:--------------------------------------------------------------------------|:--------------------------------| +| ps.localmarket.BatchConsolidateActions.ComputeWeightFromSpeciesMeanWeight | weight<br/>weightComputedSource | + +Si le conditionnement est de type **Espèce unité**, on calcule alors le poids à partir du poids moyen du +conditionnement (si celui est défini) et de l'effectif du lot. + +La propriété calculée sera *BatchWeightComputedValueSource.fromSpeciesMeanWeight*. + +| Code | Champs | +|:----------------------------------------------------------------------------|:--------------------------------| +| ps.localmarket.BatchConsolidateActions.ComputeWeightFromPackagingMeanWeight | weight<br/>weightComputedSource | + +Si le conditionnement est de type **Conditionnement non pesé**, on calcule alors le poids à partir du poids moyen de +l'espèce de la RTP adéquate (si celle-ci est définie) et de l'effectif du lot. + +La propriété calculée sera *BatchWeightComputedValueSource.fromPackagingMeanWeight*. + +| Code | Champs | +|:---------------------------------------------------------|:--------------------------------| +| ps.localmarket.BatchConsolidateActions.ResetWeightValues | weight<br/>weightComputedSource | + +Dans les autres cas, on supprime tout simplement le poids car on ne peut pas le calculer. \ No newline at end of file ===================================== src/site/markdown/index.md ===================================== @@ -14,6 +14,7 @@ Le logiciel *ObServe*... **TODO** - [Configuration client](./observe-client.html) - [Configuration server](./observe-server.html) - [Documentation de l'outil de reporting](./report/index.html) +- [Documentation de l'outil de consolidation](./consolidation.html) ===================================== src/site/site.xml ===================================== @@ -86,6 +86,7 @@ <item name="Configuration (fichier d'exemple)" target="_blank" href="./observe-client.conf"/> <item name="Filtrage des référentiels" href="./referential-filter.html"/> <item name="Synchronisation référentiel avancée" href="./synchro-referential.html"/> + <item name="Consolidation des données" href="./consolidation.html"/> <item name="Outil de reporting" href="./report/index.html"> <item name="Syntaxe d'un rapport" href="./report/syntax.html"/> <item name="Opérations disponibles pour un rapport" href="./report/embedded-operations.html"/> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c69cacf50dd64615b2a83e88a... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c69cacf50dd64615b2a83e88a... You're receiving this email because of your account on gitlab.com.