branch feature/8204 updated (1b68887 -> cd3f1b6)
This is an automated email from the git hooks/post-receive script. New change to branch feature/8204 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git omits 1b68887 add or remove the sampling code even if the row should not be sampled according to the protocol (fixes #8204) omits 1f6c3a9 we show the popup until the user enters a valid sample code (refs #8204) omits fb7af9a On decremente uniquement si le code matché est le plus haut + amélioration code omits 14f33e2 Add more logs + display error if code is not available (Fixes #8204) omits 572e4a5 Ajout d'un cache de code de prélèvement viables ou non + blocage si code de prélèvement pas possible (See #8204) omits 2c0517b Ajout d'une méthode sur la persistence pour tester qu'on peut utiliser un code de prélèvement (See #8204) omits db0df76 Amélioration du cache des codes de prélèvements (ne pas utiliser des Integer en valeurs d'une map) adds a32347d Utilisation de la bonne liste de taxons (See #8200) adds efd0d34 Merge branch 'feature/8200' into 'develop' adds f56397f lecture de la mesure venant de l'ichtyometre, qu'importe le mode de copie (fixes #8206) adds 4365ccc livrable #8206 Merge branch 'feature/8206' into develop adds ff7f247 l'ui qui permet d'avoir la popup plus large doit etre mise sur la combo à la création, sinon ça a l'air de virer des listeners (fixes #8209) adds 827b53a livrable #8209 Merge branch 'feature/8209' into develop adds 9d0beb9 on pousse la caracteristique de maturité dans les caracteristiques par defaut pour que la maturité ne soit pas éditable sur un lot maturé (fixes #8219) adds 1a76326 livrable #8219 Merge branch 'feature/8219' into develop new 23db1ec Amélioration du cache des codes de prélèvements (ne pas utiliser des Integer en valeurs d'une map) new 27b822c Ajout d'une méthode sur la persistence pour tester qu'on peut utiliser un code de prélèvement (See #8204) new 16b60e9 Ajout d'un cache de code de prélèvement viables ou non + blocage si code de prélèvement pas possible (See #8204) new f5aaca3 Add more logs + display error if code is not available (Fixes #8204) new e8523b6 On decremente uniquement si le code matché est le plus haut + amélioration code new b83f3ca we show the popup until the user enters a valid sample code (refs #8204) new cd3f1b6 add or remove the sampling code even if the row should not be sampled according to the protocol (fixes #8204) This update added new revisions after undoing existing revisions. That is to say, some revisions that were in the old version of the branch are not in the new version. This situation occurs when a user --force pushes a change and generates a repository containing something like this: * -- * -- B -- O -- O -- O (1b68887) \ N -- N -- N refs/heads/feature/8204 (cd3f1b6) You should already have received notification emails for all of the O revisions, and so the following emails describe only the N revisions from the common base, B. Any revisions marked "omits" are not gone; other references still refer to them. Any revisions marked "discards" are gone forever. The 7 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit cd3f1b6a8c53d233f5d50e15386ce87a523f62a2 Author: Kevin Morin <morin@codelutin.com> Date: Mon Apr 4 16:24:32 2016 +0200 add or remove the sampling code even if the row should not be sampled according to the protocol (fixes #8204) commit b83f3ca26d12277b07f1c820c0a9bc463ee51e09 Author: Kevin Morin <morin@codelutin.com> Date: Mon Apr 4 16:22:38 2016 +0200 we show the popup until the user enters a valid sample code (refs #8204) commit e8523b6831cbf9ae5b14ddc42b619639681b3dc7 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 15:45:53 2016 +0200 On decremente uniquement si le code matché est le plus haut + amélioration code commit f5aaca37e68726ab61194479ad63e5bf3504a708 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 15:02:13 2016 +0200 Add more logs + display error if code is not available (Fixes #8204) 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) commit 27b822c7bc9aaa205a1cf2b081c9f8f1224e33fb Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 14:48:23 2016 +0200 Ajout d'une méthode sur la persistence pour tester qu'on peut utiliser un code de prélèvement (See #8204) commit 23db1ec992a8b2b38a0f7ba8e03372b2f5289eb8 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 10:23:53 2016 +0200 Amélioration du cache des codes de prélèvements (ne pas utiliser des Integer en valeurs d'une map) Summary of changes: .../IndividualObservationBatchTableModel.java | 10 ++++- .../create/CreateSpeciesBatchUIHandler.java | 3 +- .../species/frequency/SpeciesFrequencyUI.jaxx | 7 ++-- .../frequency/SpeciesFrequencyUIHandler.java | 6 --- .../actions/ApplySpeciesFrequencyRafaleAction.java | 17 ++++---- .../swing/util/WideDataBeanFilterableComboBox.java | 26 ++++++++++++ .../tutti/ui/swing/util/WideDataComboBoxUI.java | 48 ++++++++++++++++------ 7 files changed, 84 insertions(+), 33 deletions(-) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/WideDataBeanFilterableComboBox.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8204 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 23db1ec992a8b2b38a0f7ba8e03372b2f5289eb8 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 10:23:53 2016 +0200 Amélioration du cache des codes de prélèvements (ne pas utiliser des Integer en valeurs d'une map) --- .../service/sampling/CruiseSamplingCache.java | 60 +++++++++++++++++----- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index 3fc5dea..cfb80f0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -39,6 +39,7 @@ import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.util.Numbers; +import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -111,7 +112,7 @@ public class CruiseSamplingCache implements Closeable { /** * Le code prélèvement le plus grand pour chaque espèce */ - private final Map<Integer, Integer> highestSamplingCodeBySpecies = new HashMap<>(); + private final Map<Integer, MutableInt> highestSamplingCodeBySpecies = new HashMap<>(); public CruiseSamplingCache(Integer cruiseId, TuttiProtocol protocol, Caracteristic sexCaracteristic, Collection<Caracteristic> maturityCaracteristics) { this.cruiseId = cruiseId; @@ -207,9 +208,13 @@ public class CruiseSamplingCache implements Closeable { if (samplingCode != null) { int code = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); - Integer highestSamplingCode = highestSamplingCodeBySpecies.get(species.getReferenceTaxonId()); - if (highestSamplingCode == null || code > highestSamplingCode) { - highestSamplingCodeBySpecies.put(species.getReferenceTaxonId(), code); + MutableInt highestSamplingCode = highestSamplingCodeBySpecies.get(species.getReferenceTaxonId()); + if (highestSamplingCode == null) { + highestSamplingCode = new MutableInt(); + highestSamplingCodeBySpecies.put(species.getReferenceTaxonId(), highestSamplingCode); + } + if (code > highestSamplingCode.intValue()) { + highestSamplingCode.setValue(code); } addSampling(fishingOperationId, optionalZone, species, gender, maturity, lengthStepInMm, samplingCode); @@ -588,7 +593,8 @@ public class CruiseSamplingCache implements Closeable { int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); - removeSamplingCode(species.getReferenceTaxonId(), samplingCode); + removeSamplingCode(species.getReferenceTaxonId()); +// removeSamplingCode(species.getReferenceTaxonId(), samplingCode); if (log.isInfoEnabled()) { log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); @@ -729,7 +735,9 @@ public class CruiseSamplingCache implements Closeable { } public int getNextSamplingCodeId(Integer speciesId) { - return highestSamplingCodeBySpecies.getOrDefault(speciesId, 0) + 1; + MutableInt samplingCode = highestSamplingCodeBySpecies.get(speciesId); + return (samplingCode == null ? 0 : samplingCode.intValue()) + 1; +// return highestSamplingCodeBySpecies.getOrDefault(speciesId, 0) + 1; } public int addSamplingCode(Integer speciesId, String samplingCode) { @@ -737,17 +745,43 @@ public class CruiseSamplingCache implements Closeable { Integer code = Integer.parseInt(codeParts[codeParts.length - 1]); // increment the highest sampling code if it is this code - return highestSamplingCodeBySpecies.compute(speciesId, - (key, highestSamplingCode) -> highestSamplingCode == null ? code : Math.max(highestSamplingCode, code)); +// return highestSamplingCodeBySpecies.compute(speciesId, +// (key, highestSamplingCode) -> highestSamplingCode == null ? code : Math.max(highestSamplingCode, code)); + + MutableInt samplingCodeFound = highestSamplingCodeBySpecies.get(speciesId); + if (samplingCodeFound==null) { + samplingCodeFound = new MutableInt(code); + highestSamplingCodeBySpecies.put(speciesId, samplingCodeFound); + } else { + samplingCodeFound.setValue(Math.max(samplingCodeFound.intValue(), code)); + } + return samplingCodeFound.intValue(); + // Ce code ne compile pas. +// return highestSamplingCodeBySpecies.compute(speciesId, +// (key, highestSamplingCode) -> { +// if (highestSamplingCode == null) { +// highestSamplingCode = new MutableInt(code); +// } else { +// int nexValue = Math.max(highestSamplingCode.intValue(), code); +// highestSamplingCode.setValue(nexValue); +// } +// return highestSamplingCode; +// }); } - public int removeSamplingCode(Integer speciesId, String samplingCode) { - String[] codeParts = samplingCode.split("#"); - Integer code = Integer.parseInt(codeParts[codeParts.length - 1]); + + public void removeSamplingCode(Integer speciesId) { +// public void removeSamplingCode(Integer speciesId, String samplingCode) { +// String[] codeParts = samplingCode.split("#"); +// Integer code = Integer.parseInt(codeParts[codeParts.length - 1]); // decrement the highest sampling code if it is this code - return highestSamplingCodeBySpecies.computeIfPresent(speciesId, - (key, highestSamplingCode) -> code.equals(highestSamplingCode) ? code - 1 : highestSamplingCode); + MutableInt samplingCodeFound = highestSamplingCodeBySpecies.get(speciesId); + if (samplingCodeFound!=null) { + samplingCodeFound.decrement(); + } +// return highestSamplingCodeBySpecies.computeIfPresent(speciesId, +// (key, highestSamplingCode) -> code.equals(highestSamplingCode) ? code - 1 : highestSamplingCode); } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8204 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 27b822c7bc9aaa205a1cf2b081c9f8f1224e33fb Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 14:48:23 2016 +0200 Ajout d'une méthode sur la persistence pour tester qu'on peut utiliser un code de prélèvement (See #8204) --- .../tutti/persistence/TuttiPersistenceImpl.java | 5 ++ .../persistence/TuttiPersistenceNoDbImpl.java | 5 ++ ...dividualObservationBatchPersistenceService.java | 10 +++ ...dualObservationBatchPersistenceServiceImpl.java | 49 +++++++++++++ .../service/util/SamplePersistenceHelper.java | 82 +++++++++++++++++----- .../src/main/resources/queries-failsafe.hbm.xml | 36 ++++++++++ .../ifremer/tutti/service/PersistenceService.java | 5 ++ .../tutti/service/sampling/SamplingCodePrefix.java | 4 ++ 8 files changed, 177 insertions(+), 19 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java index 5cf2795..a319038 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java @@ -1373,6 +1373,11 @@ public class TuttiPersistenceImpl implements TuttiPersistence { } @Override + public boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix) { + return getIndividualObservationBatchService().isSamplingCodeAvailable(cruiseId, referenceTaxonId, samplingCodeSuffix); + } + + @Override public Collection<IndividualObservationBatch> createIndividualObservationBatches(Collection<IndividualObservationBatch> individualObservations) { return getIndividualObservationBatchService().createIndividualObservationBatches(individualObservations); } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java index c839c6d..abf9daa 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java @@ -922,6 +922,11 @@ public class TuttiPersistenceNoDbImpl implements TuttiPersistence { } @Override + public boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix) { + throw notImplemented(); + } + + @Override public Collection<IndividualObservationBatch> createIndividualObservationBatches(Collection<IndividualObservationBatch> individualObservations) { throw notImplemented(); } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java index 9498897..75b27f2 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java @@ -44,6 +44,16 @@ public interface IndividualObservationBatchPersistenceService extends TuttiPersi List<IndividualObservationBatch> getAllIndividualObservationBatchsForCruise(Integer cruiseId); + /** + * Test if a sampling code suffix is available for a given cruise and species all over the existing individual observations. + * + * @param cruiseId id of the cruise of individual observations to test + * @param referenceTaxonId id of the species used in individual observations to test + * @param samplingCodeSuffix the sampling code suffix to test + * @return {@code true} if given sampling code is not already used in database, {@code false} otherwise. + */ + boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix); + @Transactional(readOnly = false) Collection<IndividualObservationBatch> createIndividualObservationBatches(Collection<IndividualObservationBatch> individualObservations); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java index 7c274b5..3af20f5 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java @@ -63,6 +63,7 @@ import org.hibernate.type.IntegerType; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -106,6 +107,15 @@ public class IndividualObservationBatchPersistenceServiceImpl extends AbstractPe @Resource(name = "fishingOperationPersistenceService") protected FishingOperationPersistenceService fishingOperationPersistenceService; + protected Caracteristic sampleCodeCaracteristic; + + @Override + public void init() { + super.init(); + + sampleCodeCaracteristic = caracteristicService.getSampleCodeCaracteristic(); + } + @Override public List<IndividualObservationBatch> getAllIndividualObservationBatchsForCruise(Integer cruiseId) { Preconditions.checkNotNull(cruiseId); @@ -126,6 +136,45 @@ public class IndividualObservationBatchPersistenceServiceImpl extends AbstractPe } @Override + public boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix) { + + Preconditions.checkNotNull(cruiseId); + Preconditions.checkNotNull(referenceTaxonId); + Preconditions.checkNotNull(samplingCodeSuffix); + + List<Integer> allFishingOperationIds = fishingOperationPersistenceService.getAllFishingOperationIds(cruiseId); + for (Integer fishingOperationId : allFishingOperationIds) { + + Iterator<Integer> list = queryListTyped("allFishingOperationSampleIdsWithBatchForSpecies", + "fishingOperationId", IntegerType.INSTANCE, fishingOperationId, + "referenceTaxonId", IntegerType.INSTANCE, referenceTaxonId); + + while (list.hasNext()) { + + Integer sampleId = list.next(); + + Serializable sampleMeasurementValue = samplePersistenceHelper.getSampleMeasurementValue(sampleId, sampleCodeCaracteristic); + if (sampleMeasurementValue != null) { + + if (sampleMeasurementValue.toString().endsWith(samplingCodeSuffix)) { + + // sampling code suffix found, stop NOW! + return false; + + } + + } + + } + + } + + // Free to use + return true; + + } + + @Override public List<IndividualObservationBatch> getAllIndividualObservationBatchsForFishingOperation(Integer fishingOperationId) { Preconditions.checkNotNull(fishingOperationId); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/SamplePersistenceHelper.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/SamplePersistenceHelper.java index 36c2ddc..239c78a 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/SamplePersistenceHelper.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/SamplePersistenceHelper.java @@ -140,27 +140,30 @@ public class SamplePersistenceHelper extends AbstractPersistenceService { CaracteristicMap caracteristicMap = sample.getCaracteristics(); while (list.hasNext()) { - int colIndex = 0; +// int colIndex = 0; Object[] source = list.next(); - Integer pmfmId = (Integer) source[colIndex++]; - Float numericalValue = (Float) source[colIndex++]; - String alphanumericalValue = (String) source[colIndex++]; - Integer qualitativeValueId = (Integer) source[colIndex]; - + Integer pmfmId = (Integer) source[0]; Caracteristic caracteristic = caracteristicService.getCaracteristic(pmfmId); - Serializable value = null; - switch (caracteristic.getCaracteristicType()) { - - case NUMBER: - value = numericalValue; - break; - case QUALITATIVE: - value = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, qualitativeValueId); - break; - case TEXT: - value = alphanumericalValue; - break; - } + Serializable value = getMeasurementValue(caracteristic, source); + +// Float numericalValue = (Float) source[colIndex++]; +// String alphanumericalValue = (String) source[colIndex++]; +// Integer qualitativeValueId = (Integer) source[colIndex]; +// +// +// Serializable value = null; +// switch (caracteristic.getCaracteristicType()) { +// +// case NUMBER: +// value = numericalValue; +// break; +// case QUALITATIVE: +// value = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, qualitativeValueId); +// break; +// case TEXT: +// value = alphanumericalValue; +// break; +// } caracteristicMap.put(caracteristic, value); } @@ -180,6 +183,20 @@ public class SamplePersistenceHelper extends AbstractPersistenceService { } + public <S extends SampleEntity> Serializable getSampleMeasurementValue(Integer sampleId, Caracteristic caracteristic) { + + Object[] source = queryUnique("sampleMeasurement", + "sampleId", IntegerType.INSTANCE, sampleId, + "pmfmId", IntegerType.INSTANCE, caracteristic.getIdAsInt()); + + Serializable value = null; + if (source != null) { + value = getMeasurementValue(caracteristic, source); + } + + return value; + } + public <S extends SampleEntity> CaracteristicMap extractCommonSampleCaracteristics(S sample) { CaracteristicMap caracteristics = CaracteristicMap.copy(sample.getCaracteristics()); @@ -233,4 +250,31 @@ public class SamplePersistenceHelper extends AbstractPersistenceService { return result; } + protected Serializable getMeasurementValue(Caracteristic caracteristic, Object[] source) { + + Serializable value; + // On commence à 1 car à 0 il y a le pmfmId + int colIndex = 1; +// Integer pmfmId = (Integer) source[colIndex++]; + Float numericalValue = (Float) source[colIndex++]; + String alphanumericalValue = (String) source[colIndex++]; + Integer qualitativeValueId = (Integer) source[colIndex]; + + switch (caracteristic.getCaracteristicType()) { + + case NUMBER: + value = numericalValue; + break; + case QUALITATIVE: + value = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, qualitativeValueId); + break; + case TEXT: + value = alphanumericalValue; + break; + default: + throw new IllegalStateException("Can't deal with caracteristicType: " + caracteristic.getCaracteristicType()); + } + return value; + } + } diff --git a/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml b/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml index 4d1c4a0..464fa47 100644 --- a/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml +++ b/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml @@ -511,6 +511,24 @@ <query-param name="fishingOperationId" type="java.lang.Integer"/> </query> + <!-- [DAT-23] Get all fishing operations sample ids with a batch for a given taxon (they are all individual observations in Tutti) --> + <query cacheable="true" name="allFishingOperationSampleIdsWithBatchForSpecies"> + <![CDATA[ + SELECT + s.id AS id + FROM + SampleImpl s + WHERE + s.fishingOperation.id = :fishingOperationId + AND s.referenceTaxon.id = :referenceTaxonId + AND s.batch IS NOT NULL + ORDER BY + s.id + ]]> + <query-param name="fishingOperationId" type="java.lang.Integer"/> + <query-param name="referenceTaxonId" type="java.lang.Integer"/> + </query> + <!-- [DAT-23-1] Get all fishing operations samples for a given batch --> <query cacheable="true" name="allFishingOperationSamplesForBatch"> <![CDATA[ @@ -577,6 +595,24 @@ <query-param name="sampleId" type="java.lang.Integer"/> </query> + <!-- [DAT-24] Get sample measurement of a given sample id and pmfm id --> + <query cacheable="true" name="sampleMeasurement"> + <![CDATA[ + SELECT + sm.pmfm.id as pmfmId, + sm.numericalValue as numericalValue, + sm.alphanumericalValue as alphanumericalValue, + sm.qualitativeValue.id as qualitativeValueId + from + SampleMeasurementImpl sm + WHERE + sm.sample.id = :sampleId + AND sm.pmfm.id = :pmfmId + ]]> + <query-param name="sampleId" type="java.lang.Integer"/> + <query-param name="pmfmId" type="java.lang.Integer"/> + </query> + <!--query cacheable="true" name="catchBatch"> <![CDATA[ SELECT diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java index 439a17b..6616593 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java @@ -1665,6 +1665,11 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer } @Override + public boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix) { + return driver.isSamplingCodeAvailable(cruiseId, referenceTaxonId, samplingCodeSuffix); + } + + @Override public Collection<IndividualObservationBatch> createIndividualObservationBatches(Collection<IndividualObservationBatch> individualObservations) { return driver.createIndividualObservationBatches(individualObservations); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingCodePrefix.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingCodePrefix.java index 3c65cd2..2e29d42 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingCodePrefix.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingCodePrefix.java @@ -64,6 +64,10 @@ public class SamplingCodePrefix { return toString() + samplingCodeId; } + public String toSpeciesOnlySamplingCode(int samplingCodeId) { + return species + SEPARATOR + samplingCodeId; + } + /** * Extrait l'id du code (le nombre à la fin) * @param samplingCode -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch 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>.
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 f5aaca37e68726ab61194479ad63e5bf3504a708 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 15:02:13 2016 +0200 Add more logs + display error if code is not available (Fixes #8204) --- .../frequency/actions/EditSampleCodeAction.java | 45 +++++++++++++++++----- .../resources/i18n/tutti-ui-swing_en_GB.properties | 1 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 1 + 3 files changed, 38 insertions(+), 9 deletions(-) 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 ad7923f..43478e8 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 @@ -37,6 +37,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; +import static org.nuiton.i18n.I18n.t; + /** * @author Kevin Morin (Code Lutin) * @since 4.5 @@ -66,8 +68,8 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI Integer sampleCode = model.getSampleCode(); String samplingCode = model.getSampleCodePrefix().toSamplingCode(sampleCode); - if (log.isInfoEnabled()) { - log.info("Try to set sampling code: " + samplingCode); + if (log.isDebugEnabled()) { + log.debug("Test if sampling code " + samplingCode + " is available."); } IndividualObservationUICache individualObservationUICache = ui.getHandler().getIndividualObservationUICache(); @@ -75,12 +77,21 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI 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!"); + if (log.isDebugEnabled()) { + log.debug("Sampling code " + samplingCode + " is not available."); + } + TuttiUIContext.getApplicationContext().getErrorHelper().showErrorDialog(t("tutti.editSpeciesFrequencies.error.notAvailableSamplingCode", samplingCode)); + + } else { + + if (log.isDebugEnabled()) { + log.debug("Sampling code " + samplingCode + " is available, use it on selected row."); + } + + selectedRow.setSamplingCode(samplingCode); + obsTableModel.fireTableRowsUpdated(selectedRowIndex, selectedRowIndex); } - selectedRow.setSamplingCode(samplingCode); - obsTableModel.fireTableRowsUpdated(selectedRowIndex, selectedRowIndex); } @@ -93,12 +104,18 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI if (individualObservationUICache.isSamplingCodeNotAvailable(sampleCode)) { // le code n'est pas disponible (on le sait depuis le cache de l'écran) + if (log.isDebugEnabled()) { + log.debug("Sampling code " + sampleCode + " is known as not available from cache. Can't use it."); + } return false; } if (individualObservationUICache.isSamplingCodeAvailable(sampleCode)) { // le code est pas disponible (on le sait depuis le cache de l'écran) + if (log.isDebugEnabled()) { + log.debug("Sampling code " + sampleCode + " is known as available from cache. Can use it."); + } return true; } @@ -107,9 +124,19 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI PersistenceService persistenceService = applicationContext.getPersistenceService(); String samplingCodeSuffix = selectedRow.getSamplingCodePrefix().toSpeciesOnlySamplingCode(sampleCode); - return persistenceService.isSamplingCodeAvailable(applicationContext.getCruiseId(), - selectedRow.getSpecies().getReferenceTaxonId(), - samplingCodeSuffix); + boolean samplingCodeAvailable = persistenceService.isSamplingCodeAvailable(applicationContext.getCruiseId(), + selectedRow.getSpecies().getReferenceTaxonId(), + samplingCodeSuffix); + + if (log.isDebugEnabled()) { + if (samplingCodeAvailable) { + log.debug("Sampling code " + sampleCode + " is known as available from database. Can use it."); + } else { + log.debug("Sampling code " + sampleCode + " is known as not available from database. Can't use it."); + } + } + + return samplingCodeAvailable; } } 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 e9c7a23..3a279cf 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 @@ -1574,6 +1574,7 @@ tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.message= tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.title= tutti.editSpeciesFrequencies.error.itchyometer.bad.record= tutti.editSpeciesFrequencies.error.length.doublon= +tutti.editSpeciesFrequencies.error.notAvailableSamplingCode= tutti.editSpeciesFrequencies.field.addIndividualObservationOnRafale= tutti.editSpeciesFrequencies.field.addIndividualObservationOnRafale.tip= tutti.editSpeciesFrequencies.field.copyRtpWeights= 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 867d16b..343d943 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 @@ -1474,6 +1474,7 @@ tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.message=Vous êtes sur tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.title=Copier les poids calculés via les RTP tutti.editSpeciesFrequencies.error.itchyometer.bad.record=La mesure provenant de l'ichtyomètre n'est pas valide (la donnée est peut-être corrompue) \:<br/><ul><li>Enregistrement \: <strong>%s</strong></li><li>CRC \: <strong>%s</strong></li><li>CRC calculé \: <strong>%s</strong></li></ul> tutti.editSpeciesFrequencies.error.length.doublon=La classe de taille <strong>%s</strong> est utilisée plusieurs fois (deuxième occurrence trouvée à la ligne <strong>%s</strong>), ce qui n'est pas autorisé.<hr/>Veuillez corriger cela pour pouvoir enregistrer les mensurations. +tutti.editSpeciesFrequencies.error.notAvailableSamplingCode=Le code de prélèvement <strong>%s</strong> est déjà utilisé sur cette campagne; veuillez en choisir un autre. tutti.editSpeciesFrequencies.field.addIndividualObservationOnRafale=Ajouter aux observations individuelles tutti.editSpeciesFrequencies.field.addIndividualObservationOnRafale.tip=Ajouter une ligne d'observation individuelle avec la taille saisie tutti.editSpeciesFrequencies.field.copyRtpWeights=Recopie des poids via RTP -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8204 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit e8523b6831cbf9ae5b14ddc42b619639681b3dc7 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 15:45:53 2016 +0200 On decremente uniquement si le code matché est le plus haut + amélioration code --- .../tutti/service/sampling/CruiseSamplingCache.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index cfb80f0..c2a25e2 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -355,7 +355,7 @@ public class CruiseSamplingCache implements Closeable { * @param gender le sexe de l'échantillon (peut-être null) * @param maturity la maturité de l'échantillon (peut-être null) * @param lengthStep la classe de taille de l'échantillon (en mm) - * @param samplingCode le code de prélèvement ajouté + * @param samplingCode le code de prélèvement ajouté */ public void addSampling(Integer fishingOperationId, Optional<Zone> optionalZone, @@ -593,8 +593,7 @@ public class CruiseSamplingCache implements Closeable { int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); - removeSamplingCode(species.getReferenceTaxonId()); -// removeSamplingCode(species.getReferenceTaxonId(), samplingCode); + removeSamplingCode(species.getReferenceTaxonId(), samplingCode); if (log.isInfoEnabled()) { log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); @@ -740,7 +739,7 @@ public class CruiseSamplingCache implements Closeable { // return highestSamplingCodeBySpecies.getOrDefault(speciesId, 0) + 1; } - public int addSamplingCode(Integer speciesId, String samplingCode) { + protected int addSamplingCode(Integer speciesId, String samplingCode) { String[] codeParts = samplingCode.split("#"); Integer code = Integer.parseInt(codeParts[codeParts.length - 1]); @@ -749,13 +748,13 @@ public class CruiseSamplingCache implements Closeable { // (key, highestSamplingCode) -> highestSamplingCode == null ? code : Math.max(highestSamplingCode, code)); MutableInt samplingCodeFound = highestSamplingCodeBySpecies.get(speciesId); - if (samplingCodeFound==null) { + if (samplingCodeFound == null) { samplingCodeFound = new MutableInt(code); highestSamplingCodeBySpecies.put(speciesId, samplingCodeFound); } else { samplingCodeFound.setValue(Math.max(samplingCodeFound.intValue(), code)); } - return samplingCodeFound.intValue(); + return samplingCodeFound.intValue(); // Ce code ne compile pas. // return highestSamplingCodeBySpecies.compute(speciesId, // (key, highestSamplingCode) -> { @@ -770,14 +769,12 @@ public class CruiseSamplingCache implements Closeable { } - public void removeSamplingCode(Integer speciesId) { -// public void removeSamplingCode(Integer speciesId, String samplingCode) { -// String[] codeParts = samplingCode.split("#"); -// Integer code = Integer.parseInt(codeParts[codeParts.length - 1]); + protected void removeSamplingCode(Integer speciesId, String samplingCode) { + int code = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); // decrement the highest sampling code if it is this code MutableInt samplingCodeFound = highestSamplingCodeBySpecies.get(speciesId); - if (samplingCodeFound!=null) { + if (samplingCodeFound != null && code == samplingCodeFound.intValue()) { samplingCodeFound.decrement(); } // return highestSamplingCodeBySpecies.computeIfPresent(speciesId, -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8204 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit b83f3ca26d12277b07f1c820c0a9bc463ee51e09 Author: Kevin Morin <morin@codelutin.com> Date: Mon Apr 4 16:22:38 2016 +0200 we show the popup until the user enters a valid sample code (refs #8204) --- .../frequency/actions/EditSampleCodeAction.java | 50 +++++++++++++--------- 1 file changed, 29 insertions(+), 21 deletions(-) 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 43478e8..91ff95a 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 @@ -60,40 +60,48 @@ public class EditSampleCodeAction extends SimpleActionSupport<SpeciesFrequencyUI int selectedRowIndex = obsTable.getSelectedRow(); IndividualObservationBatchRowModel selectedRow = obsTableModel.getRows().get(selectedRowIndex); SampleCodeEditionPopupUI sampleCodeEditionPopupUI = new SampleCodeEditionPopupUI(ui); - sampleCodeEditionPopupUI.open(selectedRow.getSamplingCodePrefix(), selectedRow.getSamplingCodeId()); - SampleCodeEditionPopupUIModel model = sampleCodeEditionPopupUI.getModel(); - if (model.isValid()) { + boolean samplingCodeAvailable = false; + boolean modelValid; + do { + Integer samplingCodeId = selectedRow.getSamplingCodeId(); + sampleCodeEditionPopupUI.open(selectedRow.getSamplingCodePrefix(), samplingCodeId); - Integer sampleCode = model.getSampleCode(); + SampleCodeEditionPopupUIModel model = sampleCodeEditionPopupUI.getModel(); + modelValid = model.isValid(); - String samplingCode = model.getSampleCodePrefix().toSamplingCode(sampleCode); - if (log.isDebugEnabled()) { - log.debug("Test if sampling code " + samplingCode + " is available."); - } - - IndividualObservationUICache individualObservationUICache = ui.getHandler().getIndividualObservationUICache(); + if (modelValid) { - boolean samplingCodeAvailable = isSamplingCodeAvailable(individualObservationUICache, sampleCode, selectedRow); - if (!samplingCodeAvailable) { + Integer sampleCode = model.getSampleCode(); + String samplingCode = model.getSampleCodePrefix().toSamplingCode(sampleCode); if (log.isDebugEnabled()) { - log.debug("Sampling code " + samplingCode + " is not available."); + log.debug("Test if sampling code " + samplingCode + " is available."); } - TuttiUIContext.getApplicationContext().getErrorHelper().showErrorDialog(t("tutti.editSpeciesFrequencies.error.notAvailableSamplingCode", samplingCode)); - } else { + IndividualObservationUICache individualObservationUICache = ui.getHandler().getIndividualObservationUICache(); - if (log.isDebugEnabled()) { - log.debug("Sampling code " + samplingCode + " is available, use it on selected row."); - } + samplingCodeAvailable = samplingCodeId.equals(sampleCode) || isSamplingCodeAvailable(individualObservationUICache, sampleCode, selectedRow); + if (!samplingCodeAvailable) { - selectedRow.setSamplingCode(samplingCode); - obsTableModel.fireTableRowsUpdated(selectedRowIndex, selectedRowIndex); + if (log.isDebugEnabled()) { + log.debug("Sampling code " + samplingCode + " is not available."); + } + TuttiUIContext.getApplicationContext().getErrorHelper().showErrorDialog(t("tutti.editSpeciesFrequencies.error.notAvailableSamplingCode", samplingCode)); + } else { + + if (log.isDebugEnabled()) { + log.debug("Sampling code " + samplingCode + " is available, use it on selected row."); + } + + selectedRow.setSamplingCode(samplingCode); + obsTableModel.fireTableRowsUpdated(selectedRowIndex, selectedRowIndex); + + } } - } + } while (!samplingCodeAvailable && modelValid); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8204 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit cd3f1b6a8c53d233f5d50e15386ce87a523f62a2 Author: Kevin Morin <morin@codelutin.com> Date: Mon Apr 4 16:24:32 2016 +0200 add or remove the sampling code even if the row should not be sampled according to the protocol (fixes #8204) --- .../fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index c2a25e2..dd03eb7 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -390,8 +390,6 @@ public class CruiseSamplingCache implements Closeable { int operationSamplingNb = operationCache.incrementSamplingNb(operationKey); - addSamplingCode(species.getReferenceTaxonId(), samplingCode); - if (log.isInfoEnabled()) { log.info("add Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); } @@ -399,6 +397,8 @@ public class CruiseSamplingCache implements Closeable { SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); fireResumeUpdated(event); } + + addSamplingCode(species.getReferenceTaxonId(), samplingCode); } /** @@ -593,8 +593,6 @@ public class CruiseSamplingCache implements Closeable { int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); - removeSamplingCode(species.getReferenceTaxonId(), samplingCode); - if (log.isInfoEnabled()) { log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); } @@ -602,6 +600,9 @@ public class CruiseSamplingCache implements Closeable { SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, optionalZone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); fireResumeUpdated(event); } + + removeSamplingCode(species.getReferenceTaxonId(), samplingCode); + } /** -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm