Author: kmorin Date: 2013-04-23 18:52:15 +0200 (Tue, 23 Apr 2013) New Revision: 873 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/873 Log: refs #2079 [CONTROLE] - Contr?\195?\180le / Validation apr?\195?\168s la saisie Added: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml Removed: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/AccidentalBatch-error-validation.xml trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/IndividualObservationBatch-error-validation.xml trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-error-validation.xml trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-warning-validation.xml trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/BeanValidatorDetectorTest.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java 2013-04-23 16:52:15 UTC (rev 873) @@ -28,14 +28,19 @@ import com.esotericsoftware.yamlbeans.YamlReader; import com.esotericsoftware.yamlbeans.YamlWriter; import com.google.common.base.Charsets; +import com.google.common.collect.Lists; import com.google.common.io.Files; import fr.ifremer.tutti.TuttiTechnicalException; import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; +import fr.ifremer.tutti.persistence.entities.data.*; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.IOUtils; import java.io.BufferedWriter; import java.io.File; import java.io.Reader; +import java.util.List; /** * Helper classaround {@link TuttiProtocol}. @@ -88,4 +93,111 @@ result.writeConfig.setWriteRootTags(false); return result; } + + /** + * Is the species batch respecting the protocol recommendations? + * @param protocol the current protocol + * @param batch the batch to check (it should be a leaf) + * @param frequencies the frequencies of the batch + * @return true if the batch respects the protocol, false otherwise + */ + public static boolean isSpeciesBatchValid(TuttiProtocol protocol, + SpeciesBatch batch, + List<SpeciesBatchFrequency> frequencies) { + boolean result = true; + + if (protocol != null) { + Species species = batch.getSpecies(); + List<SpeciesProtocol> speciesProtocols = protocol.getSpecies(); + SpeciesProtocol speciesProtocol = getSpeciesProtocol(species, speciesProtocols); + + if (speciesProtocol != null) { + List<SampleCategoryEnum> mandatoryCategories = getMandatoryCategories(speciesProtocol); + + SpeciesBatch browsingBatch = batch; + while (browsingBatch.getParentBatch() != null) { + mandatoryCategories.remove(browsingBatch.getSampleCategoryType()); + browsingBatch = browsingBatch.getParentBatch(); + } + result = mandatoryCategories.isEmpty() && + (!speciesProtocol.isCountIfNoFrequencyEnabled() + || CollectionUtils.isNotEmpty(frequencies) + || batch.getNumber() != null); + } + } + return result; + } + + /** + * Is the benthos batch respecting the protocol recommendations? + * @param protocol the current protocol + * @param batch the batch to check (it should be a leaf) + * @param frequencies the frequencies of the batch + * @return true if the batch respects the protocol, false otherwise + */ + public static boolean isBenthosBatchValid(TuttiProtocol protocol, + BenthosBatch batch, + List<BenthosBatchFrequency> frequencies) { + boolean result = true; + + if (protocol != null) { + Species species = batch.getSpecies(); + List<SpeciesProtocol> speciesProtocols = protocol.getBenthos(); + SpeciesProtocol speciesProtocol = getSpeciesProtocol(species, speciesProtocols); + + if (speciesProtocol != null) { + // get the categories which should be set + List<SampleCategoryEnum> mandatoryCategories = getMandatoryCategories(speciesProtocol); + + BenthosBatch browsingBatch = batch; + while (browsingBatch.getParentBatch() != null) { + mandatoryCategories.remove(browsingBatch.getSampleCategoryType()); + browsingBatch = browsingBatch.getParentBatch(); + } + result = mandatoryCategories.isEmpty() && + (!speciesProtocol.isCountIfNoFrequencyEnabled() + || CollectionUtils.isNotEmpty(frequencies) + || batch.getNumber() != null); + } + } + return result; + } + + /** + * Retrieve the speciesprotocol corresponding to the species of the batch + * @param species + * @param speciesProtocols + * @return + */ + protected static SpeciesProtocol getSpeciesProtocol(Species species, List<SpeciesProtocol> speciesProtocols) { + for (SpeciesProtocol speciesProtocol : speciesProtocols) { + if (species.getReferenceTaxonId().equals( + speciesProtocol.getSpeciesReferenceTaxonId())) { + return speciesProtocol; + } + } + return null; + } + + /** + * Gets the mandatory categories accroding to the protocol + * @param speciesProtocol + * @return + */ + protected static List<SampleCategoryEnum> getMandatoryCategories(SpeciesProtocol speciesProtocol) { + List<SampleCategoryEnum> mandatoryCategories = Lists.newArrayList(); + if (speciesProtocol.isSizeEnabled()) { + mandatoryCategories.add(SampleCategoryEnum.size); + } + if (speciesProtocol.isSexEnabled()) { + mandatoryCategories.add(SampleCategoryEnum.sex); + } + if (speciesProtocol.isMaturityEnabled()) { + mandatoryCategories.add(SampleCategoryEnum.maturity); + } + if (speciesProtocol.isAgeEnabled()) { + mandatoryCategories.add(SampleCategoryEnum.age); + } + return mandatoryCategories; + } } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java 2013-04-23 16:52:15 UTC (rev 873) @@ -24,8 +24,10 @@ * #L% */ +import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java 2013-04-23 16:52:15 UTC (rev 873) @@ -142,65 +142,6 @@ return result; } - /** - * To check if can compute the weights of the given operation - * <p/> - * If no error found, then return is a empty list, otherwise the errors found - * - * @param fishingOperation the operation to check. - * @return list of errors, or empty list if no error found. - * @since 1.4 - */ - public List<String> checkOperation(FishingOperation fishingOperation) { - - if (log.isDebugEnabled()) { - log.debug("Will check fishingOperation: " + fishingOperation); - } - - List<String> result = Lists.newArrayList(); - String fishingOperationId = fishingOperation.getId(); - CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(fishingOperationId); - - BatchContainer<SpeciesBatch> rootSpeciesBatch; - try { - rootSpeciesBatch = getComputedSpeciesBatches(fishingOperation); - - } catch (TuttiBusinessException e) { - result.add(e.getMessage()); - rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId); - } - - BatchContainer<BenthosBatch> rootBenthosBatch; - try { - rootBenthosBatch = getComputedBenthosBatches(fishingOperation); - - } catch (TuttiBusinessException e) { - result.add(e.getMessage()); - rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId); - } - - BatchContainer<MarineLitterBatch> rootMarineLitterBatch; - try { - rootMarineLitterBatch = getComputedMarineLitterBatches(fishingOperation); - - } catch (TuttiBusinessException e) { - result.add(e.getMessage()); - rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId); - } - - try { - if (catchBatch != null) { - computeCatchBatchWeights(catchBatch, - rootSpeciesBatch, - rootBenthosBatch, - rootMarineLitterBatch); - } - } catch (TuttiBusinessException e) { - result.add(e.getMessage()); - } - return result; - } - public void computeCatchBatchWeights(CatchBatch catchBatch, BatchContainer<SpeciesBatch> rootSpeciesBatch, BatchContainer<BenthosBatch> rootBenthosBatch, Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java 2013-04-23 16:52:15 UTC (rev 873) @@ -24,25 +24,37 @@ * #L% */ +import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.TuttiBusinessException; +import fr.ifremer.tutti.persistence.entities.data.*; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.service.AbstractTuttiService; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.TuttiServiceContext; import fr.ifremer.tutti.service.ValidationService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.validator.NuitonValidatorResult; import org.nuiton.validator.NuitonValidatorScope; import java.util.List; import java.util.Map; +import static org.nuiton.i18n.I18n._; + /** + * Service to validate the operations of a cruise + * * @author kmorin <kmorin@codelutin.com> * @since 1.4 */ public class ValidateCruiseOperationsService extends AbstractTuttiService { + private static final Log log = LogFactory.getLog(ValidateCruiseOperationsService.class); + protected PersistenceService persistenceService; protected ValidationService validationService; @@ -57,6 +69,10 @@ tuttiWeightComputingService = getService(TuttiWeightComputingService.class); } + /** + * Validates the operations of the currently selected cruise. + * @return a map containing the operations and the validation results + */ public Map<FishingOperation, NuitonValidatorResult> validateCruiseOperations() { Map<FishingOperation, NuitonValidatorResult> result = Maps.newHashMap(); @@ -65,13 +81,134 @@ for (FishingOperation operation : operations) { NuitonValidatorResult validator = validationService.validateFishingOperation(operation, ValidationService.VALIDATION_CONTEXT_VALIDATE); - List<String> errors = tuttiWeightComputingService.checkOperation(operation); - Map<String, List<String>> errorMap = Maps.newHashMap(); - errorMap.put("cacthes", errors); - validator.addMessagesForScope(NuitonValidatorScope.ERROR, errorMap); + checkOperation(operation, validator); result.put(operation, validator); } return result; } + + /** + * Adds additional messages to the validation results + * @param fishingOperation the operation to validate + * @param validator the validatpr containing the messages. + */ + protected void checkOperation(FishingOperation fishingOperation, + NuitonValidatorResult validator) { + if (log.isDebugEnabled()) { + log.debug("Will check fishingOperation: " + fishingOperation); + } + + List<String> errors = Lists.newArrayList(); + String fishingOperationId = fishingOperation.getId(); + CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(fishingOperationId); + + BatchContainer<SpeciesBatch> rootSpeciesBatch; + try { + rootSpeciesBatch = tuttiWeightComputingService.getComputedSpeciesBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + errors.add(e.getMessage()); + rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId); + } + + BatchContainer<BenthosBatch> rootBenthosBatch; + try { + rootBenthosBatch = tuttiWeightComputingService.getComputedBenthosBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + errors.add(e.getMessage()); + rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId); + } + + BatchContainer<MarineLitterBatch> rootMarineLitterBatch; + try { + rootMarineLitterBatch = tuttiWeightComputingService.getComputedMarineLitterBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + errors.add(e.getMessage()); + rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId); + } + + try { + if (catchBatch != null) { + tuttiWeightComputingService.computeCatchBatchWeights(catchBatch, + rootSpeciesBatch, + rootBenthosBatch, + rootMarineLitterBatch); + } + } catch (TuttiBusinessException e) { + errors.add(e.getMessage()); + } + + Map<String, List<String>> errorMap = Maps.newHashMap(); + errorMap.put("catches", errors); + validator.addMessagesForScope(NuitonValidatorScope.ERROR, errorMap); + + TuttiDataContext dataContext = context.getDataContext(); + if (dataContext.isProtocolFilled()) { + TuttiProtocol protocol = dataContext.getProtocol(); + Map<String, List<String>> warningMap = Maps.newHashMap(); + + for (SpeciesBatch batch : rootSpeciesBatch.getChildren()) { + if (isSpeciesBatchInvalid(batch, protocol)) { + warningMap.put("species", Lists.newArrayList(_("tutti.validator.warning.species.protocolNotRespected"))); + break; + } + } + + for (BenthosBatch batch : rootBenthosBatch.getChildren()) { + if (isBenthosBatchInvalid(batch, protocol)) { + warningMap.put("benthos", Lists.newArrayList(_("tutti.validator.warning.benthos.protocolNotRespected"))); + break; + } + } + + validator.addMessagesForScope(NuitonValidatorScope.WARNING, warningMap); + } + } + + /** + * Is the species batch respecting the protocol recommendations? + * @param batch the batch to check + * @param protocol the current protocol + * @return true if the batch or one of its children does not respect the protocol, false otherwise + */ + protected boolean isSpeciesBatchInvalid(SpeciesBatch batch, TuttiProtocol protocol) { + if (batch.isChildBatchsEmpty()) { + List<SpeciesBatchFrequency> frequencies = + persistenceService.getAllSpeciesBatchFrequency(batch.getId()); + return !TuttiProtocols.isSpeciesBatchValid(protocol, batch, frequencies); + } + + for (SpeciesBatch child : batch.getChildBatchs()) { + boolean invalid = isSpeciesBatchInvalid(child, protocol); + if (invalid) { + return true; + } + } + return false; + } + + /** + * Is the benthos batch respecting the protocol recommendations? + * @param batch the batch to check + * @param protocol the current protocol + * @return true if the batch or one of its children does not respect the protocol, false otherwise + */ + protected boolean isBenthosBatchInvalid(BenthosBatch batch, TuttiProtocol protocol) { + if (batch.isChildBatchsEmpty()) { + List<BenthosBatchFrequency> frequencies = + persistenceService.getAllBenthosBatchFrequency(batch.getId()); + return !TuttiProtocols.isBenthosBatchValid(protocol, batch, frequencies); + } + + for (BenthosBatch child : batch.getChildBatchs()) { + boolean invalid = isBenthosBatchInvalid(child, protocol); + if (invalid) { + return true; + } + } + return false; + } } Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/AccidentalBatch-error-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/AccidentalBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/AccidentalBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873) @@ -30,9 +30,7 @@ <field name="species"> <field-validator type="required" short-circuit="true"> - <message> - tutti.service.operations.accidental.error.species.required - </message> + <message>tutti.validator.error.accidental.species.required</message> </field-validator> </field> Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873) @@ -28,6 +28,12 @@ "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> + <field name="species"> + <field-validator type="required" short-circuit="true"> + <message>tutti.validator.error.benthosBatch.species.required</message> + </field-validator> + </field> + <field name="weight"> <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/IndividualObservationBatch-error-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/IndividualObservationBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/IndividualObservationBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873) @@ -31,7 +31,7 @@ <field name="species"> <field-validator type="required" short-circuit="true"> <message> - tutti.service.operations.individualObservation.error.species.required + tutti.validator.error.individualObservation.species.required </message> </field-validator> </field> @@ -39,7 +39,7 @@ <field name="weight"> <field-validator type="required" short-circuit="true"> <message> - tutti.service.operations.individualObservation.error.weight.required + tutti.validator.error.individualObservation.weight.required </message> </field-validator> </field> @@ -47,7 +47,7 @@ <field name="size"> <field-validator type="required" short-circuit="true"> <message> - tutti.service.operations.individualObservation.error.size.required + tutti.validator.error.individualObservation.size.required </message> </field-validator> </field> @@ -55,7 +55,7 @@ <field name="lengthStepCaracteristic"> <field-validator type="required" short-circuit="true"> <message> - tutti.service.operations.individualObservation.error.lengthStepCaracteristic.required + tutti.validator.error.individualObservation.lengthStepCaracteristic.required </message> </field-validator> </field> Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-error-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873) @@ -31,19 +31,19 @@ <field name="marineLitterCategory"> <field-validator type="required" short-circuit="true"> - <message>tutti.service.operations.marineLitter.error.marineLitterCategory.required</message> + <message>tutti.validator.error.marineLitter.marineLitterCategory.required</message> </field-validator> </field> <field name="marineLitterSizeCategory"> <field-validator type="required" short-circuit="true"> - <message>tutti.service.operations.marineLitter.error.marineLitterSizeCategory.required</message> + <message>tutti.validator.error.marineLitter.marineLitterSizeCategory.required</message> </field-validator> </field> <field name="number"> <field-validator type="required" short-circuit="true"> - <message>tutti.service.operations.marineLitter.error.number.required</message> + <message>tutti.validator.error.marineLitter.number.required</message> </field-validator> </field> Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-warning-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-warning-validation.xml 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-warning-validation.xml 2013-04-23 16:52:15 UTC (rev 873) @@ -31,7 +31,7 @@ <field name="weight"> <field-validator type="required" short-circuit="true"> - <message>tutti.service.operations.marineLitter.warning.weight.required</message> + <message>tutti.validator.warning.marineLitter.weight.required</message> </field-validator> </field> Deleted: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873) @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - #%L - Tutti :: Service - $Id$ - $HeadURL$ - %% - Copyright (C) 2012 - 2013 Ifremer - %% - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with this program. If not, see - <http://www.gnu.org/licenses/gpl-3.0.html>. - #L% - --> - -<!DOCTYPE validators PUBLIC - "-//Apache Struts//XWork Validator 1.0.3//EN" - "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> -<validators> - - <field name="weight"> - <field-validator type="fieldexpression" short-circuit="true"> - <param name="expression"> - <![CDATA[ !(sampleCategoryWeight == null && weight != null) ]]> - </param> - <message>tutti.service.operations.computeWeights.error.species.incoherentRowWeightCategory</message> - </field-validator> - - <field-validator type="fieldexpression" short-circuit="true"> - <param name="expression"> - <![CDATA[ weight == null || sampleCategoryWeight == null || weight <= sampleCategoryWeight ]]> - </param> - <message>tutti.service.operations.computeWeights.error.species.incoherentSampleWeight</message> - </field-validator> - </field> - -</validators> \ No newline at end of file Added: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml (rev 0) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873) @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + Tutti :: Service + $Id: SpeciesBatch-error-validation.xml 862 2013-04-23 08:09:40Z kmorin $ + $HeadURL: http://svn.forge.codelutin.com/svn/tutti/trunk/tutti-service/src/main/resour... $ + %% + Copyright (C) 2012 - 2013 Ifremer + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="species"> + <field-validator type="required" short-circuit="true"> + <message>tutti.validator.error.speciesBatch.species.required</message> + </field-validator> + </field> + + <field name="weight"> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ !(sampleCategoryWeight == null && weight != null) ]]> + </param> + <message>tutti.service.operations.computeWeights.error.species.incoherentRowWeightCategory</message> + </field-validator> + + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ weight == null || sampleCategoryWeight == null || weight <= sampleCategoryWeight ]]> + </param> + <message>tutti.service.operations.computeWeights.error.species.incoherentSampleWeight</message> + </field-validator> + </field> + +</validators> \ No newline at end of file Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-04-23 16:52:15 UTC (rev 873) @@ -105,6 +105,8 @@ tutti.service.operations.validate.marineLitter.error.marineLitterSizeCategory.required= tutti.service.operations.validate.marineLitter.error.number.required= tutti.service.operations.validate.marineLitter.warning.weight.required= +tutti.validator.error.accidental.species.required= +tutti.validator.error.benthosBatch.species.required= tutti.validator.error.comment.too.long= tutti.validator.error.cruise.beginDate.required= tutti.validator.error.cruise.dates.endBeforeStart= @@ -137,10 +139,17 @@ tutti.validator.error.fishingOperation.trawlDistance.tooLong= tutti.validator.error.fishingOperation.trawlNetNumber.required= tutti.validator.error.fishingOperation.vessel.required= +tutti.validator.error.individualObservation.lengthStepCaracteristic.required= +tutti.validator.error.individualObservation.size.required= +tutti.validator.error.individualObservation.species.required= +tutti.validator.error.individualObservation.weight.required= tutti.validator.error.latitude.end.required= tutti.validator.error.latitude.start.required= tutti.validator.error.longitude.end.required= tutti.validator.error.longitude.start.required= +tutti.validator.error.marineLitter.marineLitterCategory.required= +tutti.validator.error.marineLitter.marineLitterSizeCategory.required= +tutti.validator.error.marineLitter.number.required= tutti.validator.error.program.description.required= tutti.validator.error.program.description.too.long= tutti.validator.error.program.existingKey= @@ -148,5 +157,9 @@ tutti.validator.error.program.zone.required= tutti.validator.error.protocol.name.alreadyUsed= tutti.validator.error.protocol.name.required= +tutti.validator.error.speciesBatch.species.required= +tutti.validator.warning.benthos.protocolNotRespected= tutti.validator.warning.latitude.outOfBounds= tutti.validator.warning.longitude.outOfBounds= +tutti.validator.warning.marineLitter.weight.required= +tutti.validator.warning.species.protocolNotRespected= Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-04-23 16:52:15 UTC (rev 873) @@ -62,7 +62,6 @@ tutti.service.exportSumatra.header.species=Espèce tutti.service.exportSumatra.header.station=Station tutti.service.exportSumatra.header.weight=Total -tutti.service.operations.accidental.error.species.required=L'espèce est obligatoire tutti.service.operations.computeWeights.error.benthos.incoherentCategoryWeight=Le poids total des mensurations d'un lot du benthos est supérieur au poids de la catégorie tutti.service.operations.computeWeights.error.benthos.incoherentParentCategoryWeight=Le poids de la catégorie d'un lot du benthos est différent de la somme des poids de ses sous-catégories tutti.service.operations.computeWeights.error.benthos.incoherentRowWeightCategory=Le poids de sous-échantillon est renseigné alors que le lot n'a pas de poids. @@ -81,14 +80,8 @@ tutti.service.operations.computeWeights.error.species.incoherentTotalSorted=Le poids total Vrac des espèces est inférieur à la somme des poids Vrac triés, inerte trié et vivant non détaillé trié tutti.service.operations.computeWeights.error.species.noWeight=Un lot des espèces n'a pas de poids tutti.service.operations.exportCatchesReport.error=Erreur lors de la génération du rapport des captures -tutti.service.operations.individualObservation.error.lengthStepCaracteristic.required=La classe de taille est obligatoire -tutti.service.operations.individualObservation.error.size.required=La taille est obligatoire -tutti.service.operations.individualObservation.error.species.required=L'espèce est obligatoire -tutti.service.operations.individualObservation.error.weight.required=Le poids est obligatoire -tutti.service.operations.marineLitter.error.marineLitterCategory.required=La catégorie du lot de macro-déchet est obligatoire -tutti.service.operations.marineLitter.error.marineLitterSizeCategory.required=La catégorie de taille du lot de macro-déchet est obligatoire -tutti.service.operations.marineLitter.error.number.required=Le nombre du lot de macro-déchet est obligatoire -tutti.service.operations.marineLitter.warning.weight.required=Un lot de macro-déchets n'a pas de poids +tutti.validator.error.accidental.species.required=L'espèce est obligatoire +tutti.validator.error.benthosBatch.species.required=L'espèce est obligatoire tutti.validator.error.comment.too.long=Taille de commentaire trop longue (limitée à %s caractères) tutti.validator.error.cruise.beginDate.required=La date de début est obligatoire tutti.validator.error.cruise.dates.endBeforeStart=La date de fin doit être après la date de début @@ -121,10 +114,17 @@ tutti.validator.error.fishingOperation.trawlDistance.tooLong=La distance du trait dépasse 3 milles marin (5556 m), merci de vérifier les coordonnées tutti.validator.error.fishingOperation.trawlNetNumber.required=Le numéro de poche est obligatoire tutti.validator.error.fishingOperation.vessel.required=Le navire est obligatoire +tutti.validator.error.individualObservation.lengthStepCaracteristic.required=La classe de taille est obligatoire +tutti.validator.error.individualObservation.size.required=La taille est obligatoire +tutti.validator.error.individualObservation.species.required=L'espèce est obligatoire +tutti.validator.error.individualObservation.weight.required=Le poids est obligatoire tutti.validator.error.latitude.end.required=La latitude de fin de traîne est obligatoire tutti.validator.error.latitude.start.required=La latitude de début de traîne est obligatoire tutti.validator.error.longitude.end.required=La longitude de fin de traîne est obligatoire tutti.validator.error.longitude.start.required=La longitude de début de traîne est obligatoire +tutti.validator.error.marineLitter.marineLitterCategory.required=La catégorie du lot de macro-déchet est obligatoire +tutti.validator.error.marineLitter.marineLitterSizeCategory.required=La catégorie de taille du lot de macro-déchet est obligatoire +tutti.validator.error.marineLitter.number.required=Le nombre du lot de macro-déchet est obligatoire tutti.validator.error.program.description.required=La description de la série est obligatoire tutti.validator.error.program.description.too.long=Taille de la description trop longue (limitée à %s caractères) tutti.validator.error.program.existingKey=Le couple nom/zone existe déjà @@ -132,5 +132,9 @@ tutti.validator.error.program.zone.required=La zone de la série est obligatoire tutti.validator.error.protocol.name.alreadyUsed=Le nom du protocole est déjà utilisé tutti.validator.error.protocol.name.required=Le nom du protocole est obligatoire +tutti.validator.error.speciesBatch.species.required= +tutti.validator.warning.benthos.protocolNotRespected=Un lot du benthos ne suit pas les recommandations du protocole tutti.validator.warning.latitude.outOfBounds=La Latitude doit être comprise entre -90.0 et 90.0 tutti.validator.warning.longitude.outOfBounds=La longitude doit être comprise entre -180.0 et 180.0 +tutti.validator.warning.marineLitter.weight.required=Un lot de macro-déchets n'a pas de poids +tutti.validator.warning.species.protocolNotRespected=Un lot des espèces ne suit pas les recommandations du protocole Modified: trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/BeanValidatorDetectorTest.java =================================================================== --- trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/BeanValidatorDetectorTest.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/BeanValidatorDetectorTest.java 2013-04-23 16:52:15 UTC (rev 873) @@ -24,11 +24,7 @@ */ package fr.ifremer.tutti.service; -import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; -import fr.ifremer.tutti.persistence.entities.data.Cruise; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.data.Program; -import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; +import fr.ifremer.tutti.persistence.entities.data.*; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import org.junit.BeforeClass; import org.junit.Test; @@ -69,7 +65,10 @@ TuttiProtocol.class, SpeciesBatch.class, BenthosBatch.class, - FishingOperation.class + FishingOperation.class, + MarineLitterBatch.class, + IndividualObservationBatch.class, + AccidentalBatch.class }; } @@ -84,7 +83,7 @@ SortedSet<NuitonValidator<?>> validators = detectValidators(ALL_TYPES); assertFalse(validators.isEmpty()); - assertEquals(7, validators.size()); + assertEquals(10, validators.size()); } @Test @@ -95,8 +94,11 @@ validators = detectValidators(Pattern.compile(contextName), ALL_TYPES); assertValidatorSetWithSameContextName(validators, null, + AccidentalBatch.class, BenthosBatch.class, Cruise.class, + IndividualObservationBatch.class, + MarineLitterBatch.class, Program.class, SpeciesBatch.class, TuttiProtocol.class Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-04-23 16:52:15 UTC (rev 873) @@ -82,10 +82,6 @@ */ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessageNotifier, JAXXHelpUIHandler, PropagatePropertyChangeListener.PropagatePropertyChange { - public static final String VALIDATION_CONTEXT_EDIT = "edit"; - - public static final String VALIDATION_CONTEXT_VALIDATE = "validate"; - /** Logger. */ private static final Log log = LogFactory.getLog(TuttiUIContext.class); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java 2013-04-23 16:52:15 UTC (rev 873) @@ -25,6 +25,7 @@ */ import com.google.common.base.Preconditions; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.ui.swing.TuttiScreen; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import org.apache.commons.logging.Log; @@ -52,7 +53,7 @@ if (log.isInfoEnabled()) { log.info("Edit operations of cruise: " + getContext().getCruiseId()); } - getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_EDIT); + getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_EDIT); super.doAction(); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-04-23 16:52:15 UTC (rev 873) @@ -29,6 +29,7 @@ import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.ui.swing.RunTutti; import fr.ifremer.tutti.ui.swing.TuttiScreen; import fr.ifremer.tutti.ui.swing.TuttiUIContext; @@ -446,7 +447,7 @@ String validationContext = context.getValidationContext(); - if (TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(validationContext)) { + if (ValidationService.VALIDATION_CONTEXT_EDIT.equals(validationContext)) { // edit operations screenTitle = _("tutti.fishingOperations.title.edit.operations", getSelectedCruiseTitle()); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java 2013-04-23 16:52:15 UTC (rev 873) @@ -25,6 +25,8 @@ */ import com.google.common.base.Preconditions; +import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.ui.swing.TuttiScreen; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import org.apache.commons.logging.Log; @@ -49,7 +51,7 @@ @Override protected void doAction() throws Exception { Preconditions.checkState(getContext().isCruiseFilled()); - getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_VALIDATE); + getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_VALIDATE); // getContext().setScreen(null); if (log.isInfoEnabled()) { log.info("Validate operations of cruise: " + getContext().getCruiseId()); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java 2013-04-23 16:52:15 UTC (rev 873) @@ -25,6 +25,7 @@ */ import com.google.common.base.Preconditions; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.ui.swing.TuttiScreen; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.AbstractChangeScreenAction; @@ -54,7 +55,7 @@ if (log.isInfoEnabled()) { log.info("Edit operations of cruise: " + getContext().getCruiseId()); } - getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_EDIT); + getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_EDIT); super.doAction(); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java 2013-04-23 16:52:15 UTC (rev 873) @@ -25,6 +25,7 @@ */ import com.google.common.base.Preconditions; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.ui.swing.TuttiScreen; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.AbstractChangeScreenAction; @@ -52,7 +53,7 @@ protected void doAction() throws Exception { Preconditions.checkState(getContext().isProgramFilled()); Preconditions.checkState(getContext().isCruiseFilled()); - getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_VALIDATE); + getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_VALIDATE); if (log.isInfoEnabled()) { log.info("Validate operations of cruise: " + getContext().getCruiseId()); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-04-23 16:52:15 UTC (rev 873) @@ -31,6 +31,7 @@ import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.fishing.AbstractCaracteristicTabUIModel; import fr.ifremer.tutti.ui.swing.content.operation.fishing.GearUseFeatureTabUIModel; @@ -129,7 +130,7 @@ saveFishingOperation(toSave); - if (TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(getContext().getValidationContext())) { + if (ValidationService.VALIDATION_CONTEXT_EDIT.equals(getContext().getValidationContext())) { handler.getParentUi().getTabPane().setSelectedIndex(1); handler.getParentUi().getCatchesTabContent().getTabPane().setSelectedIndex(1); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUIHandler.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUIHandler.java 2013-04-23 16:52:15 UTC (rev 873) @@ -37,9 +37,11 @@ import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; @@ -56,6 +58,7 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.split.SplitBenthosBatchUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.split.SplitBenthosBatchUIModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import fr.ifremer.tutti.ui.swing.util.TuttiUI; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; @@ -80,6 +83,7 @@ import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.nuiton.util.decorator.Decorator; +import org.nuiton.validator.NuitonValidatorResult; import javax.swing.JComponent; import javax.swing.JOptionPane; @@ -134,6 +138,8 @@ private final EnumMap<TableViewMode, RowFilter<BenthosBatchTableModel, Integer>> tableFilters; + protected ValidationService validationService = getContext().getValidationService(); + public BenthosBatchUIHandler(TuttiUI<?, ?> parentUi, BenthosBatchUI ui) { super(parentUi, ui, @@ -277,31 +283,19 @@ @Override protected boolean isRowValid(BenthosBatchRowModel row) { + BenthosBatch batch = convertRowToBean(row, true); + NuitonValidatorResult validator = validationService.validateBenthosBatch(batch); + boolean result = !validator.hasErrorMessagess(); - // a row is valid if species category is not empty and valid - // then if any of none empty category is valid - Species species = row.getSpecies(); - boolean result = species != null; - if (result && row.isBatchLeaf()) { - if (TuttiUIContext.VALIDATION_CONTEXT_VALIDATE.equals(getContext().getValidationContext())) { - TuttiProtocol protocol = getDataContext().getProtocol(); - if (protocol != null) { - List<SpeciesProtocol> speciesProtocols = protocol.getBenthos(); - for (SpeciesProtocol speciesProtocol : speciesProtocols) { - if (species.getReferenceTaxonId().equals( - speciesProtocol.getSpeciesReferenceTaxonId())) { - - result = (!speciesProtocol.isSizeEnabled() || row.getSizeCategoryValue() != null) - && (!speciesProtocol.isSexEnabled() || row.getSexCategoryValue() != null) - && (!speciesProtocol.isMaturityEnabled() || row.getMaturityCategoryValue() != null) - && (!speciesProtocol.isAgeEnabled() || row.getAgeCategoryValue() != null) - && (!speciesProtocol.isCountIfNoFrequencyEnabled() - || CollectionUtils.isNotEmpty(row.getFrequency()) - || row.getNumber() != null); - } - } - } - } + if (result + && ValidationService.VALIDATION_CONTEXT_VALIDATE.equals( + getContext().getValidationContext()) + && row.isBatchLeaf()) { + List<BenthosBatchFrequency> frequencies = + BenthosFrequencyRowModel.toBeans(row.getFrequency(), batch); + result = TuttiProtocols.isBenthosBatchValid(getDataContext().getProtocol(), + batch, + frequencies); } return result; @@ -967,18 +961,12 @@ BenthosBatchRowModel row = tableModel.getEntry(rowIndex); int selectedRowCount = getTable().getSelectedRowCount(); - if (row.isValid()) { + enableSplit = true; + enableRemove = true; + enableRemoveSub = true; + enableRename = true; + enableCreateMelag = true; - // must have at least species filled in row - // otherwise nothing can be done - - enableSplit = true; - enableRemove = true; - enableRemoveSub = true; - enableRename = true; - enableCreateMelag = true; - } - if (enableSplit) { // can split if selected batch is a leaf @@ -1234,4 +1222,24 @@ return model.getSelectedSpecies(); } + protected BenthosBatch convertRowToBean(BenthosBatchRowModel row, boolean convertParent) { + SampleCategory<?> sampleCategory = row.getFinestCategory(); + Preconditions.checkNotNull(sampleCategory); + Preconditions.checkNotNull(sampleCategory.getCategoryType()); + Preconditions.checkNotNull(sampleCategory.getCategoryValue()); + + BenthosBatch catchBean = row.toBean(); + + // apply sample category + catchBean.setSampleCategoryType(sampleCategory.getCategoryType()); + catchBean.setSampleCategoryValue(sampleCategory.getCategoryValue()); + catchBean.setSampleCategoryWeight(sampleCategory.getCategoryWeight()); + + if (convertParent && row.getParentBatch() != null) { + BenthosBatch parent = convertRowToBean(row.getParentBatch(), true); + catchBean.setParentBatch(parent); + } + + return catchBean; + } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-04-23 16:23:05 UTC (rev 872) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-04-23 16:52:15 UTC (rev 873) @@ -37,9 +37,11 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; @@ -78,6 +80,7 @@ import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.nuiton.util.decorator.Decorator; +import org.nuiton.validator.NuitonValidatorResult; import javax.swing.JComponent; import javax.swing.JOptionPane; @@ -132,6 +135,8 @@ private final EnumMap<TableViewMode, RowFilter<SpeciesBatchTableModel, Integer>> tableFilters; + protected ValidationService validationService = getContext().getValidationService(); + public SpeciesBatchUIHandler(TuttiUI<?, ?> parentUi, SpeciesBatchUI ui) { super(parentUi, ui, @@ -274,31 +279,20 @@ @Override protected boolean isRowValid(SpeciesBatchRowModel row) { + SpeciesBatch batch = convertRowToBean(row, true); + NuitonValidatorResult validator = validationService.validateSpeciesBatch(batch); + boolean result = !validator.hasErrorMessagess(); - // a row is valid if species category is not empty and valid - // then if any of none empty category is valid - Species species = row.getSpecies(); - boolean result = species != null; - if (result && row.isBatchLeaf()) { - if (TuttiUIContext.VALIDATION_CONTEXT_VALIDATE.equals(getContext().getValidationContext())) { - TuttiProtocol protocol = getDataContext().getProtocol(); - if (protocol != null) { - List<SpeciesProtocol> speciesProtocols = protocol.getSpecies(); - for (SpeciesProtocol speciesProtocol : speciesProtocols) { - if (species.getReferenceTaxonId().equals( - speciesProtocol.getSpeciesReferenceTaxonId())) { + if (result + && ValidationService.VALIDATION_CONTEXT_VALIDATE.equals( + getContext().getValidationContext()) + && row.isBatchLeaf()) { - result = (!speciesProtocol.isSizeEnabled() || row.getSizeCategoryValue() != null) - && (!speciesProtocol.isSexEnabled() || row.getSexCategoryValue() != null) - && (!speciesProtocol.isMaturityEnabled() || row.getMaturityCategoryValue() != null) - && (!speciesProtocol.isAgeEnabled() || row.getAgeCategoryValue() != null) - && (!speciesProtocol.isCountIfNoFrequencyEnabled() - || CollectionUtils.isNotEmpty(row.getFrequency()) - || row.getNumber() != null); - } - } - } - } + List<SpeciesBatchFrequency> frequencies = + SpeciesFrequencyRowModel.toBeans(row.getFrequency(), batch); + result = TuttiProtocols.isSpeciesBatchValid(getDataContext().getProtocol(), + batch, + frequencies); } return result; @@ -962,18 +956,12 @@ SpeciesBatchRowModel row = tableModel.getEntry(rowIndex); int selectedRowCount = getTable().getSelectedRowCount(); - if (row.getSpecies() != null) { + enableSplit = true; + enableRemove = true; + enableRemoveSub = true; + enableRename = true; + enableCreateMelag = true; - // must have at least species filled in row - // otherwise nothing can be done - - enableSplit = true; - enableRemove = true; - enableRemoveSub = true; - enableRename = true; - enableCreateMelag = true; - } - if (enableSplit) { // can split if selected batch is a leaf @@ -1229,4 +1217,25 @@ return model.getSelectedSpecies(); } + + protected SpeciesBatch convertRowToBean(SpeciesBatchRowModel row, boolean convertParent) { + SampleCategory<?> sampleCategory = row.getFinestCategory(); + Preconditions.checkNotNull(sampleCategory); + Preconditions.checkNotNull(sampleCategory.getCategoryType()); + Preconditions.checkNotNull(sampleCategory.getCategoryValue()); + + SpeciesBatch catchBean = row.toBean(); + + // apply sample category + catchBean.setSampleCategoryType(sampleCategory.getCategoryType()); + catchBean.setSampleCategoryValue(sampleCategory.getCategoryValue()); + catchBean.setSampleCategoryWeight(sampleCategory.getCategoryWeight()); + + if (convertParent && row.getParentBatch() != null) { + SpeciesBatch parent = convertRowToBean(row.getParentBatch(), true); + catchBean.setParentBatch(parent); + } + + return catchBean; + } }