This is an automated email from the git hooks/post-receive script. New commit to branch feature/8153 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 879dea246c86caafc93e1401a3a76085e34829f9 Author: Kevin Morin <morin@codelutin.com> Date: Wed Mar 30 17:34:17 2016 +0200 on recharge les lignes ) partir du résultat de l'import (fixes #8153) --- .../persistence/entities/CaracteristicMap.java | 2 +- .../IndividualObservationBatchTableModel.java | 12 +- .../catches/species/BenthosBatchUISupportImpl.java | 3 +- .../catches/species/SpeciesBatchUISupportImpl.java | 3 +- .../species/SpeciesOrBenthosBatchUISupport.java | 3 +- .../frequency/SpeciesFrequencyUIHandler.java | 321 ++++++++++++++++++++- .../species/frequency/SpeciesFrequencyUIModel.java | 8 + .../ImportMultiPostSpeciesSupportAction.java | 87 ++++-- .../resources/i18n/tutti-ui-swing_en_GB.properties | 1 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 1 + 10 files changed, 411 insertions(+), 30 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/CaracteristicMap.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/CaracteristicMap.java index 68a7c66..7bb4001 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/CaracteristicMap.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/CaracteristicMap.java @@ -58,7 +58,7 @@ public class CaracteristicMap extends LinkedHashMap<Caracteristic, Serializable> public boolean hasNonNullValues(Collection<Caracteristic> caracteristicsToIgnore) { return keySet().stream() - .filter(caracteristic -> caracteristicsToIgnore.contains(caracteristic) && get(caracteristic) != null) + .filter(caracteristic -> !caracteristicsToIgnore.contains(caracteristic) && get(caracteristic) != null) .count() > 0; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java index b6577c8..fb5dc78 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java @@ -41,6 +41,7 @@ import javax.swing.event.TableColumnModelListener; import java.io.Serializable; import java.util.Collection; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.n; @@ -166,6 +167,10 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } } + public Optional<Caracteristic> getMaturityCaracteristic() { + return maturityCaracteristic; + } + public void setMaturityCaracteristic(Optional<Caracteristic> maturityCaracteristic) { this.maturityCaracteristic = maturityCaracteristic; if (rows != null) { @@ -251,9 +256,10 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab for (int i = rows.size() - 1 ; i >= 0 ; i--) { IndividualObservationBatchRowModel row = rows.get(i); // if the row has no data set, then it could be the empty row we are looking for - defaultCaracteristicsMap.keySet().stream() - .filter(key -> defaultCaracteristicsMap.get(key) != null).collect(Collectors.toSet()); - if (row.isEmpty()) { + Set<Caracteristic> notNullCaracteristics = defaultCaracteristicsMap.keySet().stream() + .filter(key -> defaultCaracteristicsMap.get(key) != null) + .collect(Collectors.toSet()); + if (row.isEmpty(notNullCaracteristics)) { result = row; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/BenthosBatchUISupportImpl.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/BenthosBatchUISupportImpl.java index 5af43d1..9cc5dec 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/BenthosBatchUISupportImpl.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/BenthosBatchUISupportImpl.java @@ -31,6 +31,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.catches.multipost.MultiPostImportResult; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; @@ -236,7 +237,7 @@ public class BenthosBatchUISupportImpl extends SpeciesOrBenthosBatchUISupport { } @Override - public Map<String, Object> importMultiPost(File file, FishingOperation operation, SpeciesBatch speciesBatch, boolean importFrequencies, boolean importIndivudalObservations) { + public MultiPostImportResult importMultiPost(File file, FishingOperation operation, SpeciesBatch speciesBatch, boolean importFrequencies, boolean importIndivudalObservations) { return context.getMultiPostImportService().importBenthosBatch(file, operation, speciesBatch, importFrequencies, importIndivudalObservations); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUISupportImpl.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUISupportImpl.java index 2dee051..8bba93e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUISupportImpl.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUISupportImpl.java @@ -31,6 +31,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.catches.multipost.MultiPostImportResult; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; @@ -226,7 +227,7 @@ public class SpeciesBatchUISupportImpl extends SpeciesOrBenthosBatchUISupport { } @Override - public Map<String, Object> importMultiPost(File file, FishingOperation operation, SpeciesBatch speciesBatch, boolean importFrequencies, boolean importIndivudalObservations) { + public MultiPostImportResult importMultiPost(File file, FishingOperation operation, SpeciesBatch speciesBatch, boolean importFrequencies, boolean importIndivudalObservations) { return context.getMultiPostImportService().importSpeciesBatch(file, operation, speciesBatch, importFrequencies, importIndivudalObservations); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesOrBenthosBatchUISupport.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesOrBenthosBatchUISupport.java index 79e88e2..d9f2de7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesOrBenthosBatchUISupport.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesOrBenthosBatchUISupport.java @@ -33,6 +33,7 @@ import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.catches.multipost.MultiPostImportResult; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; @@ -152,7 +153,7 @@ public abstract class SpeciesOrBenthosBatchUISupport { public abstract Map<String, Object> importMultiPost(File file, FishingOperation operation, boolean importFrequencies, boolean importIndivudalObservations); - public abstract Map<String, Object> importMultiPost(File file, FishingOperation operation, SpeciesBatch speciesBatch, boolean importFrequencies, boolean importIndivudalObservations); + public abstract MultiPostImportResult importMultiPost(File file, FishingOperation operation, SpeciesBatch speciesBatch, boolean importFrequencies, boolean importIndivudalObservations); public abstract void exportMultiPost(File file, FishingOperation operation, boolean importFrequencies, boolean importIndivudalObservations); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index 6d6158b..4d5f545 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -843,7 +843,112 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci context.removeVetoableChangeListener(TuttiUIContext.PROPERTY_SCREEN, changeScreenListener); } - public void editBatch(FrequencyCellEditor editor, Optional<String> optionalTitle) { +public void editBatch(FrequencyCellEditor editor, Optional<String> optionalTitle) { + + SpeciesBatchRowModel speciesBatch = editor.getEditRow(); + Objects.requireNonNull(speciesBatch, "Impossible d'éditer un lot non renseigné"); + + // on enlève la colonne spécifique à l'espèce précédente + if (maturityColumnId.isPresent()) { + TableColumnExt maturityColumn = ui.getObsTable().getColumnExt(maturityColumnId.get()); + ui.getObsTable().removeColumn(maturityColumn); + maturityColumnId = Optional.empty(); + } + + if (optionalTitle.isPresent()) { + + String title = optionalTitle.get(); + frequenciesHistogramPopup.setTitle(title + t("tutti.editSpeciesFrequencies.title")); + averageWeightsHistogramPopup.setTitle(title + weightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight"))); + + } + + frequencyEditor = editor; + SpeciesFrequencyUIModel model = getModel(); + + model.setNextEditableRowIndex(frequencyEditor.getNextEditableRowIndex()); + + List<SpeciesFrequencyRowModel> frequency = speciesBatch.getFrequency(); + List<IndividualObservationBatchRowModel> individualObservations = speciesBatch.getIndividualObservation(); + + + model.setInitBatchEdition(true); + + try { + // keep batch (will be used to push back editing entry) + model.setBatch(speciesBatch); + model.setMinStep(null); + model.setMaxStep(null); + model.setCopyRtpWeights(false); + model.setAddIndividualObservationOnRafale(false); + + Optional<String> speciesMaturityPmfmId = Optional.empty(); + + // set rtps + TuttiProtocol protocol = getDataContext().getProtocol(); + if (protocol != null) { + + Integer referenceTaxonId = speciesBatch.getSpecies().getReferenceTaxonId(); + Optional<SpeciesProtocol> optSpeciesProtocol = + protocol.getSpecies().stream() + .filter(sp -> sp.getSpeciesReferenceTaxonId().equals(referenceTaxonId)) + .findFirst(); + + if (optSpeciesProtocol.isPresent()) { + SpeciesProtocol speciesProtocol = optSpeciesProtocol.get(); + Rtp rtp; + CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(sexCaracteristic.getIdAsInt()); + + if (sampleCategoryValue != null) { + + if (Sexs.isMale(sampleCategoryValue)) { + rtp = speciesProtocol.getRtpMale(); + } else if (Sexs.isFemale(sampleCategoryValue)) { + rtp = speciesProtocol.getRtpFemale(); + } else { + rtp = speciesProtocol.getRtpUndefined(); + } + + } else { + rtp = speciesProtocol.getRtpUndefined(); + } + getModel().setRtp(rtp); + + speciesMaturityPmfmId = Optional.ofNullable(speciesProtocol.getMaturityPmfmId()); + } + + } + + // Add maturity column if necessary + + Optional<Caracteristic> maturityCaracteristic = speciesMaturityPmfmId.map(maturityCaracteristics::get); + + setMaturityCaracteristic(maturityCaracteristic); + + loadFrequenciesAndObservations(frequency, individualObservations); + + if (getContext().isIchtyometerConnected()) { + + // let's listen the ichtyometer + listenItchtyometer(); + + } + + individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation()); + + model.setModify(false); + + getContext().addVetoableChangeListener(TuttiUIContext.PROPERTY_SCREEN, changeScreenListener); + + } finally { + model.setInitBatchEdition(false); + //FIXME Voir si c'est nécessaire ? + model.setModify(false); + } + + } + + public void editBatchOld(FrequencyCellEditor editor, Optional<String> optionalTitle) { SpeciesBatchRowModel speciesBatch = editor.getEditRow(); Objects.requireNonNull(speciesBatch, "Impossible d'éditer un lot non renseigné"); @@ -1908,4 +2013,218 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getEditSampleCodeMenu().setEnabled(sampleCodeMenusEnabled); ui.getDeleteSampleCodeMenu().setEnabled(sampleCodeMenusEnabled); } + + + public void loadFrequenciesAndObservations(List<SpeciesFrequencyRowModel> frequency, List<IndividualObservationBatchRowModel> individualObservations) { + SpeciesFrequencyUIModel model = getModel(); + SpeciesBatchRowModel speciesBatch = model.getBatch(); + + model.setInitBatchEdition(true); + + try { + + FrequencyConfigurationMode mode = FrequencyConfigurationMode.FREQUENCIES; + FrequencyConfigurationMode frequenciesMode = FrequencyConfigurationMode.AUTO_GEN; + + model.setTotalNumber(null); + model.setTotalComputedWeight(null); + model.setTotalWeight(null); + model.setSimpleCount(null); + model.setRtp(null); + + Caracteristic lengthStepCaracteristic = null; + CopyIndividualObservationMode copyIndividualObservationMode = null; + + List<SpeciesFrequencyRowModel> rows = new ArrayList<>(); + List<IndividualObservationBatchRowModel> obsRows = new ArrayList<>(); + + Species species = speciesBatch.getSpecies(); + IndividualObservationBatchTableModel obsTableModel = getObsTableModel(); + obsTableModel.setSpecies(species); + + SamplingCodePrefix samplingCodePrefix = new SamplingCodePrefix(getConfig().getSamplingCodePrefix(), decorate(species, DecoratorService.WITH_SURVEY_CODE_NO_NAME)); + obsTableModel.setSamplingCodePrefix(samplingCodePrefix); + + model.setTotalWeight(speciesBatch.getWeight()); + + // + // try to load existing frequency + // + + if (CollectionUtils.isNotEmpty(frequency)) { + + SpeciesFrequencyTableModel tableModel = getTableModel(); + + for (SpeciesFrequencyRowModel rowModel : frequency) { + + SpeciesFrequencyRowModel newRow = tableModel.createNewRow(false, false); + newRow.copy(rowModel); + rows.add(newRow); + + } + + // use first frequency row length step caracteristics + + SpeciesFrequencyRowModel rowModel = frequency.get(0); + lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); + + if (log.isInfoEnabled()) { + log.info("Use existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); + } + } + + // + // try to load existing individual observations + // + + if (CollectionUtils.isNotEmpty(individualObservations)) { + + IndividualObservationBatchTableModel tableModel = getObsTableModel(); + tableModel.setRows(new ArrayList<>()); + + int rankOrder = 1; + for (IndividualObservationBatchRowModel rowModel : individualObservations) { + + CopyIndividualObservationMode incomingCopyIndividualObservationMode = rowModel.getCopyIndividualObservationMode(); + Objects.requireNonNull(incomingCopyIndividualObservationMode, "Mode de recopie non trouvé sur l'observation individuelle: " + rowModel.getId()); + if (copyIndividualObservationMode == null) { + copyIndividualObservationMode = incomingCopyIndividualObservationMode; + } else { + if (copyIndividualObservationMode != incomingCopyIndividualObservationMode) { + throw new IllegalStateException("Plusieurs modes de recopie trouvés sur les observations individuelles du lot, ce qui est impossible"); + } + } + IndividualObservationBatchRowModel newRow = tableModel.createNewRow(); + newRow.copy(rowModel); + newRow.setRankOrder(rankOrder++); + newRow.addPropertyChangeListener(obsChangedListener); + newRow.setValid(true); + + if (getObsTableModel().getMaturityCaracteristic().isPresent()) { + + Caracteristic caracteristicKey = getObsTableModel().getMaturityCaracteristic().get(); + Serializable caracteristicValue = newRow.getCaracteristics().remove(caracteristicKey); + newRow.getDefaultCaracteristics().putIfAbsent(caracteristicKey, caracteristicValue); + } + + obsRows.add(newRow); + + } + + // use first individual observation row length step caracteristics + + if (lengthStepCaracteristic == null) { + IndividualObservationBatchRowModel rowModel = individualObservations.get(0); + lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); + + if (log.isInfoEnabled()) { + log.info("Use existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); + } + } + + } else { + + // par défaut pas de mode de recopie + copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; + + } + + if (log.isInfoEnabled()) { + log.info("CopyIndividualObservationMode: " + copyIndividualObservationMode); + } + + SpeciesBatchRowModel previousSiblingRow = frequencyEditor.getPreviousSiblingRow(); + + if (lengthStepCaracteristic == null && previousSiblingRow != null) { + + // try to get it from his previous brother row + List<SpeciesFrequencyRowModel> previousFrequency = previousSiblingRow.getFrequency(); + + if (CollectionUtils.isNotEmpty(previousFrequency)) { + + // use the first frequency length step caracteristic / step + SpeciesFrequencyRowModel rowModel = previousFrequency.get(0); + lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); + if (log.isInfoEnabled()) { + log.info("Use previous sibling existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); + } + } + } + + if (lengthStepCaracteristic == null) { + + String lengthStepPmfmId = taxonCache.getLengthStepPmfmId(species); + + if (lengthStepPmfmId != null) { + + lengthStepCaracteristic = lengthStepCaracteristics.get(lengthStepPmfmId); + + if (log.isInfoEnabled()) { + log.info("Use existing from protocol lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); + } + + } + } + + if (lengthStepCaracteristic == null) { + String speciesLengthStepPmfmId = taxonCache.getLengthStepPmfmId(species); + if (speciesLengthStepPmfmId == null) { + mode = FrequencyConfigurationMode.SIMPLE_COUNTING; + } + } + + if (log.isInfoEnabled()) { + log.info("FrequencyConfigurationMode: " + mode); + } + + if (log.isDebugEnabled()) { + log.debug("Will edit batch row: " + speciesBatch + " with " + rows.size() + " frequency"); + } + + Integer number = speciesBatch.getNumber(); + if (number != null && rows.isEmpty()) { + mode = FrequencyConfigurationMode.SIMPLE_COUNTING; + model.setSimpleCount(number); + } + + // make sure configuration mode will be rebound + model.setConfigurationMode(null); + model.setConfigurationMode(mode); + + model.setFrequenciesConfigurationMode(null); + model.setFrequenciesConfigurationMode(frequenciesMode); + + // connect model to validator + ui.getValidator().setBean(model); + + // always sort row by their length + // see http://forge.codelutin.com/issues/2482 + Collections.sort(rows); + + model.setLengthStepCaracteristic(lengthStepCaracteristic); + model.setRows(rows); + + CaracteristicMap sampleCategoryValues = new CaracteristicMap(); + Iterator<SampleCategory<?>> iterator = speciesBatch.iterator(); + iterator.forEachRemaining(sampleCategory -> { + Caracteristic caracteristic = sampleCategory.getCategoryDef().getCaracteristic(); + sampleCategoryValues.put(caracteristic, sampleCategory.getCategoryValue()); + }); + + obsTableModel.setDefaultCaracteristicValues(sampleCategoryValues); + + model.setIndividualObservationRows(obsRows); + obsTableModel.setRows(obsRows); + model.recomputeIndividualObservationRowsValidateState(); + + // let's change the copy mode (mark it in init mode to avoid user change confirmation and some recompuations) + model.setCopyIndividualObservationMode(null); + model.setCopyIndividualObservationMode(copyIndividualObservationMode); + + model.computeRowWeightWithRtp(); + + } finally { + model.setInitBatchEdition(false); + } + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java index 877503f..fe1d875 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java @@ -776,6 +776,10 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa firePropertyChange(PROPERTY_EMPTY_ROWS, null, emptyRows); } + public boolean isNonEmptyRows() { + return getRowCount() - emptyRows.size() - rowsInError.size() > 0; + } + public int computeTotalNumber() { int result = 0; if (rows != null) { @@ -943,6 +947,10 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa isNonEmptyIndividualObservationRowsInError()); } + public boolean isNonEmptyIndividualObservationRow() { + return individualObservationRows.stream().anyMatch(row -> !row.isEmpty(defaultCaracteristic)); + } + public void recomputeRowsValidateState() { if (log.isInfoEnabled()) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java index b26f7f4..f608cff 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java @@ -26,15 +26,16 @@ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.catches.multipost.MultiPostImportService; +import fr.ifremer.tutti.service.catches.multipost.MultiPostImportResult; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; -import fr.ifremer.tutti.ui.swing.content.operation.catches.actions.ImportMultiPostActionSupport; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyCellComponent; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; +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.swing.AbstractApplicationUIHandler; @@ -42,8 +43,6 @@ import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler; import javax.swing.JOptionPane; import java.io.File; import java.util.List; -import java.util.Map; -import java.util.Optional; import static org.nuiton.i18n.I18n.t; @@ -51,19 +50,39 @@ import static org.nuiton.i18n.I18n.t; * @author Tony Chemit - chemit@codelutin.com * @since 4.5 */ -public abstract class ImportMultiPostSpeciesSupportAction extends ImportMultiPostActionSupport<SpeciesFrequencyUIModel, SpeciesFrequencyUI, SpeciesFrequencyUIHandler> { +public abstract class ImportMultiPostSpeciesSupportAction extends LongActionSupport<SpeciesFrequencyUIModel, SpeciesFrequencyUI, SpeciesFrequencyUIHandler> { /** Logger. */ private static final Log log = LogFactory.getLog(ImportMultiPostSpeciesSupportAction.class); + /** + * File to import. + */ + private File file; + + /** + * Optional data that were not imported. + */ + private MultiPostImportResult importResult; + protected ImportMultiPostSpeciesSupportAction(SpeciesFrequencyUIHandler handler) { - super(handler); + super(handler, false); } public abstract boolean isImportFrequencies(); public abstract boolean isImportIndivudalObservations(); + protected abstract String getSuccessMessage(File file); + + protected abstract String getFileExtension(); + + protected abstract String getFileExtensionDescription(); + + protected abstract String getFileChooserTitle(); + + protected abstract String getFileChooserButton(); + @Override public boolean prepareAction() throws Exception { boolean doAction = super.prepareAction(); @@ -72,14 +91,15 @@ public abstract class ImportMultiPostSpeciesSupportAction extends ImportMultiPos String message = "<ul>"; boolean ask = false; - if (isImportFrequencies() && getModel().getRowCount() > 0) { + if (isImportFrequencies() && getModel().isNonEmptyRows()) { ask = true; message = "<li>" + t("tutti.askBeforeMultiPostImport.frequencies.message") + "</li>"; } - if (isImportIndivudalObservations() && getModel().getIndividualObservationRows().size() > 0) { + if (isImportIndivudalObservations() && getModel().getIndividualObservationRows().size() > 0 + && getModel().isNonEmptyIndividualObservationRow()) { ask = true; - message += "<li>" + t("tutti.askBeforeMultiPostImport.frequencies.message") + "</li>"; + message += "<li>" + t("tutti.askBeforeMultiPostImport.observations.message") + "</li>"; } message += "</ul>"; @@ -112,8 +132,20 @@ public abstract class ImportMultiPostSpeciesSupportAction extends ImportMultiPos } + } + + if (doAction) { + + // choose file to import + file = chooseFile(getFileChooserTitle(), + getFileChooserButton(), + "^.*\\." + getFileExtension(), + getFileExtensionDescription()); + + doAction = file != null; } + } return doAction; @@ -121,12 +153,14 @@ public abstract class ImportMultiPostSpeciesSupportAction extends ImportMultiPos } @Override - protected final Map<String, Object> importBatches(MultiPostImportService multiPostImportExportService, File file, FishingOperation operation) { + public final void doAction() throws Exception { + + FishingOperation operation = getDataContext().getFishingOperation(); SpeciesOrBenthosBatchUISupport batchUISupport = getModel().getSpeciesOrBenthosBatchUISupport(); SpeciesBatch speciesBatch = getModel().getBatch().toEntity(); - return batchUISupport.importMultiPost(file, operation, speciesBatch, isImportFrequencies(), isImportIndivudalObservations()); -// return multiPostImportExportService.importSpeciesBatch(file, operation, speciesBatch, isImportFrequencies(), isImportIndivudalObservations()); + + importResult = batchUISupport.importMultiPost(file, operation, speciesBatch, isImportFrequencies(), isImportIndivudalObservations()); } @@ -134,27 +168,36 @@ public abstract class ImportMultiPostSpeciesSupportAction extends ImportMultiPos public final void postSuccessAction() { super.postSuccessAction(); + sendMessage(getSuccessMessage(file)); + SpeciesFrequencyCellComponent.FrequencyCellEditor frequencyEditor = getHandler().getFrequencyEditor(); SpeciesBatchRowModel editRow = frequencyEditor.getEditRow(); Integer speciesBatchId = editRow.getIdAsInt(); - PersistenceService persistenceService = getContext().getPersistenceService(); - List<SpeciesBatchFrequency> frequencies = persistenceService.getAllSpeciesBatchFrequency(speciesBatchId); + List<SpeciesBatchFrequency> frequencies = importResult.getImportedFrequencies(); if (log.isInfoEnabled()) { log.info("[SpeciesBatch: " + speciesBatchId + "] Frequencies: " + frequencies.size()); } - editRow.loadFrequencies(frequencies); - - List<IndividualObservationBatch> individualObservations = persistenceService.getAllIndividualObservationBatchsForBatch(speciesBatchId); - editRow.loadIndividualObservations(getConfig().getIndividualObservationWeightUnit(), - getDataContext().getDefaultIndividualObservationCaracteristics(), - individualObservations); + List<SpeciesFrequencyRowModel> frequencyRows = SpeciesFrequencyRowModel.fromEntity(getModel().getSpeciesOrBenthosBatchUISupport().getWeightUnit(), frequencies); + List<IndividualObservationBatch> individualObservations = importResult.getImportedObservations(); if (log.isInfoEnabled()) { log.info("[SpeciesBatch: " + speciesBatchId + "] Individual Observations: " + individualObservations.size()); } - getHandler().editBatch(frequencyEditor, Optional.empty()); + List<IndividualObservationBatchRowModel> individualObservationRows = IndividualObservationBatchRowModel.fromEntity(getConfig().getIndividualObservationWeightUnit(), + getDataContext().getDefaultIndividualObservationCaracteristics(), + individualObservations); + + getHandler().loadFrequenciesAndObservations(frequencyRows, individualObservationRows); + getModel().setModify(true); } + + @Override + public final void releaseAction() { + file = null; + importResult = null; + super.releaseAction(); + } } 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 0a401a9..518fe4c 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 @@ -49,6 +49,7 @@ tutti.applicationUpdater.updateDone.deleteDirectory.i18n.error= tutti.askBeforeMultiPostImport.frequencies.message= tutti.askBeforeMultiPostImport.help= tutti.askBeforeMultiPostImport.message= +tutti.askBeforeMultiPostImport.observations.message= tutti.askBeforeMultiPostImport.title= tutti.askToCancelEditFrequencies.help= tutti.askToCancelEditFrequencies.message= 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 3232776..90e313d 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 @@ -34,6 +34,7 @@ tutti.askBeforeMultiPostImport.frequencies.message=Des mensurations existent tutti.askBeforeMultiPostImport.help=Que voulez-vous faire ?<ul><li><strong>Annuler l'import</strong> pour annuler l'opération d'import</li><li><strong>Réaliser l'import</strong> pour supprimer les données existantes puis réaliser l'import</li></ul> tutti.askBeforeMultiPostImport.individualObservations.message=Des observations individuelles existent tutti.askBeforeMultiPostImport.message=%s<br/>Elles seront supprimées avant l'import. +tutti.askBeforeMultiPostImport.observations.message=Des observations existent tutti.askBeforeMultiPostImport.title=Des données existent; elles seront supprimées avant l'import \! tutti.askToCancelEditFrequencies.help=Que voulez-vous faire ?<ul><li><strong>Annuler</strong> pour rester sur l'écran</li><li><strong>Continuer</strong> pour confirmer la perte des données modifiées et le retour sur l'écran des lots</li></ul> tutti.askToCancelEditFrequencies.message=Des modifications sur les mensurations - observations individuelles ne sont pas enregistrées. -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.