This is an automated email from the git hooks/post-receive script. New commit to branch feature/8204 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 16b60e9f488abb48ab118eb5b3622b0d3e0fb89f Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 14:48:38 2016 +0200 Ajout d'un cache de code de prélèvement viables ou non + blocage si code de prélèvement pas possible (See #8204) --- .../frequency/IndividualObservationUICache.java | 113 ++++++++++++++++----- .../frequency/SpeciesFrequencyUIHandler.java | 2 +- .../frequency/actions/EditSampleCodeAction.java | 59 ++++++++++- 3 files changed, 144 insertions(+), 30 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java index a0c2f63..f6a03ab 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java @@ -32,6 +32,7 @@ import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; +import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; import fr.ifremer.tutti.service.sampling.SamplingEvent; import fr.ifremer.tutti.service.sampling.SamplingListener; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; @@ -44,8 +45,11 @@ import org.nuiton.decorator.Decorator; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.Closeable; +import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.TreeSet; import static org.nuiton.i18n.I18n.t; @@ -74,11 +78,24 @@ public class IndividualObservationUICache implements Closeable { private SpeciesFrequencyUI ui; /** + * Contient les codes de prélèvements qu'on sait non utilisables. + * + * Au chargement de l'écran, on remplit cet ensemble avec les codes des observations individuelles du lot. + */ + private final Set<Integer> samplingCodesNotAvailable = new TreeSet<>(); + + /** + * Contient les codes de prélèvements qu'on sait utilisables. + * + * Dès qu'un code de prélèvement est ajouté ou modifié dans l'écran, on l'ajoute ici. + */ + private final Set<Integer> samplingCodesAvailable = new TreeSet<>(); + + /** * Est-ce que le cache est actif ? */ private boolean on; - public IndividualObservationUICache(Optional<CruiseSamplingCache> samplingCache, SpeciesFrequencyUIModel uiModel, Caracteristic sexCaracteristic) { this.samplingCache = samplingCache; @@ -162,8 +179,8 @@ public class IndividualObservationUICache implements Closeable { Decorator<Species> speciesDecorator = ui.getHandler().getDecorator(Species.class, DecoratorService.WITH_SURVEY_CODE); String key = speciesDecorator.toString(species) - + " " + Numbers.convertFromMm(event.getLengthStep(), uiModel.getLengthStepCaracteristicUnit()) - + " " + uiModel.getLengthStepCaracteristicUnit(); + + " " + Numbers.convertFromMm(event.getLengthStep(), uiModel.getLengthStepCaracteristicUnit()) + + " " + uiModel.getLengthStepCaracteristicUnit(); if (event.getGender() != null) { key += " " + event.getGender().getDescription(); } @@ -193,7 +210,7 @@ public class IndividualObservationUICache implements Closeable { } - public void init(SpeciesFrequencyUI ui, SpeciesBatchRowModel speciesEditRow, FishingOperation fishingOperation) { + public void init(SpeciesFrequencyUI ui, SpeciesBatchRowModel speciesEditRow, FishingOperation fishingOperation, List<IndividualObservationBatchRowModel> individualObservationRows) { Objects.requireNonNull(ui); Objects.requireNonNull(speciesEditRow); @@ -207,6 +224,12 @@ public class IndividualObservationUICache implements Closeable { if (samplingCache.isPresent()) { samplingCache.get().addSamplingListener(samplingListener); } + this.samplingCodesAvailable.clear(); + this.samplingCodesNotAvailable.clear(); + + individualObservationRows.stream() + .filter(individualObservationRow -> individualObservationRow.getSamplingCode() != null) + .forEach(individualObservationRow -> addSamplingCodeNotAvailable(individualObservationRow.getSamplingCode())); } @Override @@ -234,9 +257,9 @@ public class IndividualObservationUICache implements Closeable { /** * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille + * @param gender le sexe + * @param maturityQualitativeValue l'état de maturité + * @param lengthStep la classe de taille */ public void incrementsObservationNb(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, float lengthStep) { incrementsObservationNb(gender, maturityQualitativeValue, lengthStep, Optional.empty()); @@ -245,10 +268,10 @@ public class IndividualObservationUICache implements Closeable { /** * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - * @param samplingCode le code de prélèvement ajouté s'il y en a un + * @param gender le sexe + * @param maturityQualitativeValue l'état de maturité + * @param lengthStep la classe de taille + * @param samplingCode le code de prélèvement ajouté s'il y en a un */ public void incrementsObservationNb(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, @@ -277,10 +300,10 @@ public class IndividualObservationUICache implements Closeable { /** * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - * @param samplingCode le code de prélèvement ajouté + * @param gender le sexe + * @param maturityQualitativeValue l'état de maturité + * @param lengthStep la classe de taille + * @param samplingCode le code de prélèvement ajouté */ public void incrementsSamplingNb(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, @@ -301,6 +324,10 @@ public class IndividualObservationUICache implements Closeable { maturity, uiModel.getLengthStepInMm(lengthStep), samplingCode); + + // Le code n'est plus utilisable + addSamplingCodeNotAvailable(samplingCode); + } /** @@ -317,9 +344,9 @@ public class IndividualObservationUICache implements Closeable { /** * Retire une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille + * @param gender le sexe + * @param maturityQualitativeValue l'état de maturité + * @param lengthStep la classe de taille */ public void decrementsObservationNb(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, float lengthStep) { @@ -329,10 +356,10 @@ public class IndividualObservationUICache implements Closeable { /** * Retire une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - * @param samplingCode le code de prélèvement supprimée + * @param gender le sexe + * @param maturityQualitativeValue l'état de maturité + * @param lengthStep la classe de taille + * @param samplingCode le code de prélèvement supprimée */ public void decrementsObservationNb(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, @@ -361,10 +388,10 @@ public class IndividualObservationUICache implements Closeable { /** * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. * - * @param gender le sexe - * @param maturityQualitativeValue l'état de maturité - * @param lengthStep la classe de taille - * @param samplingCode le code de prélèvement supprimé + * @param gender le sexe + * @param maturityQualitativeValue l'état de maturité + * @param lengthStep la classe de taille + * @param samplingCode le code de prélèvement supprimé */ public void decrementsSamplingNb(CaracteristicQualitativeValue gender, Optional<CaracteristicQualitativeValue> maturityQualitativeValue, @@ -385,6 +412,9 @@ public class IndividualObservationUICache implements Closeable { maturity, uiModel.getLengthStepInMm(lengthStep), samplingCode); + + addSamplingCodeAvailable(samplingCode); + } /** @@ -434,4 +464,35 @@ public class IndividualObservationUICache implements Closeable { } + public boolean isSamplingCodeNotAvailable(int samplingCode) { + return samplingCodesNotAvailable.contains(samplingCode); + } + + public boolean isSamplingCodeAvailable(int samplingCode) { + return samplingCodesAvailable.contains(samplingCode); + } + + public void addSamplingCodeAvailable(String samplingCode) { + + int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); + if (log.isInfoEnabled()) { + log.info(String.format("Make samplingCode: %s (%d) available", samplingCode, samplingCodeNumber)); + } + samplingCodesNotAvailable.remove(samplingCodeNumber); + samplingCodesAvailable.add(samplingCodeNumber); + + } + + public void addSamplingCodeNotAvailable(String samplingCode) { + + int samplingCodeNumber = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); + if (log.isInfoEnabled()) { + log.info(String.format("Make samplingCode: %s (%d) not available", samplingCode, samplingCodeNumber)); + } + samplingCodesNotAvailable.add(samplingCodeNumber); + samplingCodesAvailable.remove(samplingCodeNumber); + + } + + } 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 5b9865d..9880f90 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 @@ -928,7 +928,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation()); + individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getIndividualObservationRows()); model.setModify(false); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java index d935646..ad7923f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java @@ -24,12 +24,17 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SampleCodeEditionPopupUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SampleCodeEditionPopupUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; /** @@ -38,6 +43,9 @@ import org.jdesktop.swingx.JXTable; */ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI> { + /** Logger. */ + private static final Log log = LogFactory.getLog(EditSampleCodeAction.class); + public EditSampleCodeAction(SpeciesFrequencyUI speciesFrequencyUI) { super(speciesFrequencyUI, false); } @@ -45,8 +53,7 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI @Override protected void onActionPerformed(SpeciesFrequencyUI ui) { JXTable obsTable = ui.getObsTable(); - IndividualObservationBatchTableModel obsTableModel = - (IndividualObservationBatchTableModel) obsTable.getModel(); + IndividualObservationBatchTableModel obsTableModel = (IndividualObservationBatchTableModel) obsTable.getModel(); int selectedRowIndex = obsTable.getSelectedRow(); IndividualObservationBatchRowModel selectedRow = obsTableModel.getRows().get(selectedRowIndex); @@ -55,8 +62,54 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI SampleCodeEditionPopupUIModel model = sampleCodeEditionPopupUI.getModel(); if (model.isValid()) { - selectedRow.setSamplingCode(model.getSampleCodePrefix().toSamplingCode(model.getSampleCode())); + + Integer sampleCode = model.getSampleCode(); + + String samplingCode = model.getSampleCodePrefix().toSamplingCode(sampleCode); + if (log.isInfoEnabled()) { + log.info("Try to set sampling code: " + samplingCode); + } + + IndividualObservationUICache individualObservationUICache = ui.getHandler().getIndividualObservationUICache(); + + boolean samplingCodeAvailable = isSamplingCodeAvailable(individualObservationUICache, sampleCode, selectedRow); + if (!samplingCodeAvailable) { + + //TODO kmorin mettre une jolie boite de dialogue + throw new IllegalStateException("Le code de prélèvement " + samplingCode + " est déjà utilisé en base!"); + + } + selectedRow.setSamplingCode(samplingCode); obsTableModel.fireTableRowsUpdated(selectedRowIndex, selectedRowIndex); + + } + + } + + protected boolean isSamplingCodeAvailable(IndividualObservationUICache individualObservationUICache, + Integer sampleCode, + IndividualObservationBatchRowModel selectedRow) { + + if (individualObservationUICache.isSamplingCodeNotAvailable(sampleCode)) { + + // le code n'est pas disponible (on le sait depuis le cache de l'écran) + return false; + } + + if (individualObservationUICache.isSamplingCodeAvailable(sampleCode)) { + + // le code est pas disponible (on le sait depuis le cache de l'écran) + return true; } + + // on demande en base si le code est disponible + TuttiUIContext applicationContext = TuttiUIContext.getApplicationContext(); + PersistenceService persistenceService = applicationContext.getPersistenceService(); + + String samplingCodeSuffix = selectedRow.getSamplingCodePrefix().toSpeciesOnlySamplingCode(sampleCode); + return persistenceService.isSamplingCodeAvailable(applicationContext.getCruiseId(), + selectedRow.getSpecies().getReferenceTaxonId(), + samplingCodeSuffix); + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.