Author: tchemit Date: 2014-05-14 14:03:51 +0200 (Wed, 14 May 2014) New Revision: 1763 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1763 Log: fixes #5062 [PUPITRI] Gestion du m?\195?\169lange Added: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/Signs.java branches/tutti-3.4.x/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportServiceEvo5062Test.java branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.car branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.tnk branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.tuttiProtocol Modified: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java Modified: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java =================================================================== --- branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java 2014-05-13 20:52:44 UTC (rev 1762) +++ branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java 2014-05-14 12:03:51 UTC (rev 1763) @@ -66,7 +66,7 @@ protected String speciesId; - protected String sign; + protected Signs sign; protected Directions direction; @@ -101,11 +101,11 @@ this.speciesId = speciesId; } - public String getSign() { + public Signs getSign() { return sign; } - public void setSign(String sign) { + public void setSign(Signs sign) { this.sign = sign; } @@ -127,7 +127,7 @@ public boolean isSorted() { - boolean sorted = Directions.VAT == direction && !"H".equals(sign); + boolean sorted = Directions.VAT == direction && !Signs.UNSORTED.equals(sign); return sorted; } Modified: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java =================================================================== --- branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java 2014-05-13 20:52:44 UTC (rev 1762) +++ branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java 2014-05-14 12:03:51 UTC (rev 1763) @@ -25,7 +25,10 @@ */ import fr.ifremer.tutti.service.TuttiCsvUtil; +import org.nuiton.csv.ValueParser; +import java.text.ParseException; + /** * @author kmorin <kmorin@codelutin.com> * @since 1.2 @@ -38,7 +41,18 @@ newMandatoryColumn(CarrouselRow.PROPERTY_OPERATION_CODE); newMandatoryColumn(CarrouselRow.PROPERTY_RIG_NUMBER); newMandatoryColumn(CarrouselRow.PROPERTY_SPECIES_ID); - newMandatoryColumn(CarrouselRow.PROPERTY_SIGN); + newMandatoryColumn(CarrouselRow.PROPERTY_SIGN, + new ValueParser<Signs>() { + @Override + public Signs parse(String value) throws ParseException { + Signs result = Signs.getSign(value.toUpperCase()); + if (result == null) { + throw new ParseException("Could not parse Sign value: " + value, 0); + } + return result; + } + } + ); newMandatoryColumn(CarrouselRow.PROPERTY_DIRECTION, TuttiCsvUtil.newEnumByNameParserFormatter(Directions.class)); newMandatoryColumn(CarrouselRow.PROPERTY_WEIGHT, Modified: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java =================================================================== --- branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java 2014-05-13 20:52:44 UTC (rev 1762) +++ branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java 2014-05-14 12:03:51 UTC (rev 1763) @@ -25,11 +25,7 @@ */ import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; -import fr.ifremer.tutti.persistence.service.TuttiEnumerationFile; import org.apache.commons.lang3.mutable.MutableFloat; import java.io.Serializable; @@ -43,117 +39,8 @@ private static final long serialVersionUID = 1L; - public static enum Signs { - DEFAULT("0") { - @Override - public Integer getCategory(TuttiEnumerationFile enumerationFile) { - return enumerationFile.PMFM_ID_SEX; - } + public static final String MELAG_META_SPECIES = "MELA-NGE"; - @Override - public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { - return enumerationFile.QUALITATIVE_SEX_UNDEFINED_ID; - } - }, - UNSORTED("H") { - @Override - public Integer getCategory(TuttiEnumerationFile enumerationFile) { - // special case, there is no cateogry possible here - return null; - } - - @Override - public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { - // special case, there is no cateogry possible here - return null; - } - }, - MALE("1") { - @Override - public Integer getCategory(TuttiEnumerationFile enumerationFile) { - return enumerationFile.PMFM_ID_SEX; - } - - @Override - public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { - return enumerationFile.QUALITATIVE_SEX_MALE_ID; - } - }, - FEMALE("2") { - @Override - public Integer getCategory(TuttiEnumerationFile enumerationFile) { - return enumerationFile.PMFM_ID_SEX; - } - - @Override - public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { - return enumerationFile.QUALITATIVE_SEX_FEMALE_ID; - } - }, - SMALL("P") { - @Override - public Integer getCategory(TuttiEnumerationFile enumerationFile) { - return enumerationFile.PMFM_ID_SIZE_CATEGORY; - } - - @Override - public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { - return enumerationFile.QUALITATIVE_SIZE_SMALL_ID; - } - }, - MEDIUM("M") { - @Override - public Integer getCategory(TuttiEnumerationFile enumerationFile) { - return enumerationFile.PMFM_ID_SIZE_CATEGORY; - } - - @Override - public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { - return enumerationFile.QUALITATIVE_SIZE_MEDIUM_ID; - } - }, - BIG("G") { - @Override - public Integer getCategory(TuttiEnumerationFile enumerationFile) { - return enumerationFile.PMFM_ID_SIZE_CATEGORY; - } - - @Override - public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { - return enumerationFile.QUALITATIVE_SIZE_BIG_ID; - } - }; - - private String sign; - - Signs(String sign) { - this.sign = sign; - } - - public static Signs getSign(String sign) { - Signs result = null; - for (Signs s : values()) { - if (s.sign.equals(sign)) { - result = s; - break; - } - } - return result; - } - - public abstract Integer getCategory(TuttiEnumerationFile enumerationFile); - - public abstract Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile); - - public void registerSign(TuttiEnumerationFile enumerationFile, - Caracteristic caracteristic, - Map<Signs, CaracteristicQualitativeValue> map) { - Integer valueId = getQualitativeValueId(enumerationFile); - CaracteristicQualitativeValue result = TuttiEntities.getQualitativeValue(caracteristic, valueId); - map.put(this, result); - } - } - protected Species species; protected boolean sorted; @@ -173,20 +60,41 @@ return sorted; } + public boolean isForMelag() { + return weightBySign.containsKey(Signs.MELAG); + } + + public boolean isMelagMetaSpecies() { + + boolean melagMetaSpecies = MELAG_META_SPECIES.equals(species.getSurveyCode()); + return melagMetaSpecies; + + } + + public Float getWeight(Signs signs) { + + MutableFloat mutableFloat = weightBySign.get(signs); + return mutableFloat == null ? null : mutableFloat.floatValue(); + + } + public Map<Signs, MutableFloat> getWeightBySign() { return weightBySign; } - public void addToSign(String sign, Float weight) { - Signs s = Signs.getSign(sign); - MutableFloat f = weightBySign.get(s); + public void addToSign(Signs sign, Float weight) { + MutableFloat f = weightBySign.get(sign); if (f == null) { f = new MutableFloat(); - weightBySign.put(s, f); + weightBySign.put(sign, f); } f.add(weight); } + public void removeSign(Signs sign) { + weightBySign.remove(sign); + } + @Override public int hashCode() { int speciesHashCode = species != null ? species.hashCode() : 0; @@ -211,5 +119,4 @@ } return true; } - } Modified: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java =================================================================== --- branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java 2014-05-13 20:52:44 UTC (rev 1762) +++ branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java 2014-05-14 12:03:51 UTC (rev 1763) @@ -95,7 +95,7 @@ protected CaracteristicQualitativeValue unsortedCaracteristic; - protected Map<PupitriCatch.Signs, CaracteristicQualitativeValue> signsToCaracteristicValue; + protected Map<Signs, CaracteristicQualitativeValue> signsToCaracteristicValue; @Override public void setServiceContext(TuttiServiceContext context) { @@ -107,7 +107,7 @@ TuttiEnumerationFile enumerationFile = persistenceService.getEnumerationFile(); - signsToCaracteristicValue = Maps.newEnumMap(PupitriCatch.Signs.class); + signsToCaracteristicValue = Maps.newEnumMap(Signs.class); { // sorted/unsorted caracteristic Caracteristic caracteristic = @@ -120,16 +120,16 @@ { // sex category Caracteristic caracteristic = persistenceService.getSexCaracteristic(); - PupitriCatch.Signs.DEFAULT.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); - PupitriCatch.Signs.FEMALE.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); - PupitriCatch.Signs.MALE.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + Signs.DEFAULT.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + Signs.FEMALE.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + Signs.MALE.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); } { // size category Caracteristic caracteristic = persistenceService.getSizeCategoryCaracteristic(); - PupitriCatch.Signs.SMALL.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); - PupitriCatch.Signs.MEDIUM.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); - PupitriCatch.Signs.BIG.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + Signs.SMALL.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + Signs.MEDIUM.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + Signs.BIG.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); } } @@ -155,6 +155,9 @@ // there is some matching rows to import + result.prepareMelag(); + + savePupitriImportResult(result, operation, catchBatch); } @@ -411,7 +414,7 @@ boolean splitSpecies = isSplitSpecies(pupitriCatch); - Map<PupitriCatch.Signs, MutableFloat> weightBySign = + Map<Signs, MutableFloat> weightBySign = pupitriCatch.getWeightBySign(); if (splitSpecies) { @@ -430,9 +433,9 @@ String parentBatchId = batch.getId(); - for (Map.Entry<PupitriCatch.Signs, MutableFloat> entry : weightBySign.entrySet()) { + for (Map.Entry<Signs, MutableFloat> entry : weightBySign.entrySet()) { - PupitriCatch.Signs signs = entry.getKey(); + Signs signs = entry.getKey(); float catchWeight = entry.getValue().floatValue(); Integer categoryId = signs.getCategory(enumerationFile); @@ -473,24 +476,24 @@ persistenceService.saveCatchBatch(catchBatch); } - public static final Set<PupitriCatch.Signs> DEFAULT_SIGNS = Sets.newHashSet( - PupitriCatch.Signs.DEFAULT + public static final Set<Signs> DEFAULT_SIGNS = Sets.newHashSet( + Signs.DEFAULT ); - public static final Set<PupitriCatch.Signs> UNSORTED_SIGNS = Sets.newHashSet( - PupitriCatch.Signs.UNSORTED + public static final Set<Signs> UNSORTED_SIGNS = Sets.newHashSet( + Signs.UNSORTED ); - public static final Set<PupitriCatch.Signs> SEX_SIGNS = Sets.newHashSet( - PupitriCatch.Signs.DEFAULT, - PupitriCatch.Signs.MALE, - PupitriCatch.Signs.FEMALE + public static final Set<Signs> SEX_SIGNS = Sets.newHashSet( + Signs.DEFAULT, + Signs.MALE, + Signs.FEMALE ); - public static final Set<PupitriCatch.Signs> SIZE_SIGNS = Sets.newHashSet( - PupitriCatch.Signs.SMALL, - PupitriCatch.Signs.MEDIUM, - PupitriCatch.Signs.BIG + public static final Set<Signs> SIZE_SIGNS = Sets.newHashSet( + Signs.SMALL, + Signs.MEDIUM, + Signs.BIG ); @@ -509,9 +512,9 @@ */ private boolean isSplitSpecies(PupitriCatch speciesCatch) { boolean result; - Map<PupitriCatch.Signs, MutableFloat> weightBySign = + Map<Signs, MutableFloat> weightBySign = speciesCatch.getWeightBySign(); - Set<PupitriCatch.Signs> signs = + Set<Signs> signs = Sets.newHashSet(weightBySign.keySet()); if (DEFAULT_SIGNS.equals(signs)) { Modified: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java =================================================================== --- branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java 2014-05-13 20:52:44 UTC (rev 1762) +++ branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java 2014-05-14 12:03:51 UTC (rev 1763) @@ -24,8 +24,16 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import org.apache.commons.lang3.mutable.MutableFloat; + import java.io.File; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; +import java.util.Set; /** * Result of a pupitri import. @@ -55,11 +63,34 @@ private Float carrouselSortedWeight; - private List<PupitriCatch> catches; + private final List<PupitriCatch> catches; + /** + * Total weight of all entries of species {@code MELA-GNE}. + * + * @since 3.4.2 + */ + private MutableFloat melagTotalWeight; + + /** + * Total weight of all entries of sorted species of melag (sign = {@code T}). + * + * @since 3.4.2 + */ + private MutableFloat melagSortedWeight; + + /** + * Set of all species in the melag (sign = {@code T}). + * + * @since 3.4.2 + */ + private final Set<Species> melagSpecies; + public PupitriImportResult(File trunkFile, File carrousselFile) { this.trunkFile = trunkFile; this.carrousselFile = carrousselFile; + catches = new ArrayList<>(); + melagSpecies = new HashSet<>(); } public boolean isFishingOperationFound() { @@ -102,6 +133,38 @@ return carrouselSortedWeight; } + public List<PupitriCatch> getCatches() { + return catches; + } + + public Float getMelagTotalWeight() { + return melagTotalWeight == null ? null : melagTotalWeight.floatValue(); + } + + public Float getMelagSortedWeight() { + return melagSortedWeight == null ? null : melagSortedWeight.floatValue(); + } + + public Set<Species> getMelagSpecies() { + return melagSpecies; + } + + /** + * @return {@code true} if there is a total melga weight defined (at least one species MELA-GNE found). + * @since 3.4.2 + */ + public boolean isFoundTotalMelag() { + return melagTotalWeight != null; + } + + /** + * @return {@code true} if at least one species has a sorted melag weight. + * @since 3.4.2 + */ + public boolean isFoundSortedMelag() { + return melagSortedWeight != null; + } + void incrementNbTrunkImported() { this.nbTrunkImported++; } @@ -135,10 +198,98 @@ } void setCatches(List<PupitriCatch> catches) { - this.catches = catches; + for (PupitriCatch aCatch : catches) { + addCatch(aCatch); + } } - List<PupitriCatch> getCatches() { - return catches; + void addCatch(PupitriCatch aCatch) { + + catches.add(aCatch); + + if (aCatch.isMelagMetaSpecies()) { + + + // add weight to melag + addMelagTotalWeight(aCatch.getWeight(Signs.DEFAULT)); + + } + + if (aCatch.isForMelag()) { + + // add species as a melag one + melagSpecies.add(aCatch.getSpecies()); + + // add weight to sorted melag + addMelagSortedWeight(aCatch.getWeight(Signs.MELAG)); + + } + } + + void addMelagTotalWeight(float weight) { + + if (melagTotalWeight == null) { + melagTotalWeight = new MutableFloat(); + } + melagTotalWeight.add(weight); + + } + + void addMelagSortedWeight(float weight) { + + if (melagSortedWeight == null) { + melagSortedWeight = new MutableFloat(); + } + melagSortedWeight.add(weight); + + } + + void prepareMelag() { + + boolean useMelag = isFoundTotalMelag() && isFoundSortedMelag(); + + float melagRatio = 1f; + + if (useMelag) { + melagRatio = melagSortedWeight.floatValue() * melagTotalWeight.floatValue(); + } + + Iterator<PupitriCatch> iterator = catches.iterator(); + while (iterator.hasNext()) { + PupitriCatch aCatch = iterator.next(); + + if (useMelag && aCatch.isMelagMetaSpecies()) { + + // remove the MELA-GNE species from import + iterator.remove(); + continue; + + } + + if (aCatch.isForMelag()) { + + if (useMelag) { + + // compute the weight from melag + + Float sampleWeight = aCatch.getWeight(Signs.MELAG); + Float weight = TuttiEntities.roundKiloGram(sampleWeight / melagRatio); + aCatch.addToSign(Signs.DEFAULT, weight); + aCatch.removeSign(Signs.MELAG); + + } else { + + // move the melag weight as a default weight + + Float weight = aCatch.getWeight(Signs.MELAG); + aCatch.addToSign(Signs.DEFAULT, weight); + aCatch.removeSign(Signs.MELAG); + + } + } + + } + + } } Added: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/Signs.java =================================================================== --- branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/Signs.java (rev 0) +++ branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/Signs.java 2014-05-14 12:03:51 UTC (rev 1763) @@ -0,0 +1,143 @@ +package fr.ifremer.tutti.service.pupitri; + +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.service.TuttiEnumerationFile; + +import java.util.Map; + +/** + * Created on 5/14/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 3.4.2 + */ +public enum Signs { + + DEFAULT("0") { + @Override + public Integer getCategory(TuttiEnumerationFile enumerationFile) { + return enumerationFile.PMFM_ID_SEX; + } + + @Override + public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { + return enumerationFile.QUALITATIVE_SEX_UNDEFINED_ID; + } + }, + UNSORTED("H") { + @Override + public Integer getCategory(TuttiEnumerationFile enumerationFile) { + // special case, there is no cateogry possible here + return null; + } + + @Override + public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { + // special case, there is no cateogry possible here + return null; + } + }, + MALE("1") { + @Override + public Integer getCategory(TuttiEnumerationFile enumerationFile) { + return enumerationFile.PMFM_ID_SEX; + } + + @Override + public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { + return enumerationFile.QUALITATIVE_SEX_MALE_ID; + } + }, + FEMALE("2") { + @Override + public Integer getCategory(TuttiEnumerationFile enumerationFile) { + return enumerationFile.PMFM_ID_SEX; + } + + @Override + public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { + return enumerationFile.QUALITATIVE_SEX_FEMALE_ID; + } + }, + SMALL("P") { + @Override + public Integer getCategory(TuttiEnumerationFile enumerationFile) { + return enumerationFile.PMFM_ID_SIZE_CATEGORY; + } + + @Override + public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { + return enumerationFile.QUALITATIVE_SIZE_SMALL_ID; + } + }, + MEDIUM("M") { + @Override + public Integer getCategory(TuttiEnumerationFile enumerationFile) { + return enumerationFile.PMFM_ID_SIZE_CATEGORY; + } + + @Override + public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { + return enumerationFile.QUALITATIVE_SIZE_MEDIUM_ID; + } + }, + BIG("G") { + @Override + public Integer getCategory(TuttiEnumerationFile enumerationFile) { + return enumerationFile.PMFM_ID_SIZE_CATEGORY; + } + + @Override + public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { + return enumerationFile.QUALITATIVE_SIZE_BIG_ID; + } + }, + MELAG("T") { + @Override + public Integer getCategory(TuttiEnumerationFile enumerationFile) { + // special case, there is no cateogry possible here + return null; + } + + @Override + public Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile) { + // special case, there is no cateogry possible here + return null; + } + }; + + private String sign; + + Signs(String sign) { + this.sign = sign; + } + + public String getSign() { + return sign; + } + + public static Signs getSign(String sign) { + Signs result = null; + for (Signs s : values()) { + if (s.sign.equals(sign)) { + result = s; + break; + } + } + return result; + } + + public abstract Integer getCategory(TuttiEnumerationFile enumerationFile); + + public abstract Integer getQualitativeValueId(TuttiEnumerationFile enumerationFile); + + public void registerSign(TuttiEnumerationFile enumerationFile, + Caracteristic caracteristic, + Map<Signs, CaracteristicQualitativeValue> map) { + Integer valueId = getQualitativeValueId(enumerationFile); + CaracteristicQualitativeValue result = TuttiEntities.getQualitativeValue(caracteristic, valueId); + map.put(this, result); + } +} Property changes on: branches/tutti-3.4.x/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/Signs.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: branches/tutti-3.4.x/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportServiceEvo5062Test.java =================================================================== --- branches/tutti-3.4.x/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportServiceEvo5062Test.java (rev 0) +++ branches/tutti-3.4.x/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportServiceEvo5062Test.java 2014-05-14 12:03:51 UTC (rev 1763) @@ -0,0 +1,153 @@ +package fr.ifremer.tutti.service.pupitri; + +import com.google.common.collect.Sets; +import fr.ifremer.tutti.TuttiConfigurationOption; +import fr.ifremer.tutti.persistence.entities.data.BatchContainer; +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.ServiceDbResource; +import fr.ifremer.tutti.service.TuttiServiceContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; +import org.nuiton.decorator.Decorator; + +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +/** + * Created on 5/14/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 3.4.2 + */ +public class PupitriImportServiceEvo5062Test { + + /** Logger. */ + private static final Log log = LogFactory.getLog(PupitriImportServiceEvo5062Test.class); + + @ClassRule + public static final ServiceDbResource dbResource = + ServiceDbResource.writeDb("dbExport"); + + public static final String PROGRAM_ID = "CAM-TEST_ELEVATION"; + + public static final String CRUISE_ID = "100003"; + + public static final String OPERATION_1_ID = "100112"; + + public static final String OPERATION_2_ID = "100113"; + + public static final String OPERATION_3_ID = "100115"; + + protected PupitriImportExportService service; + + protected PersistenceService persistenceService; + + protected DecoratorService decoratorService; + + protected ServiceDbResource.DataContext dataContext; + + @Before + public void setUp() throws Exception { + + TuttiServiceContext serviceContext = dbResource.getServiceContext(); + + persistenceService = serviceContext.getService(PersistenceService.class); + + decoratorService = serviceContext.getService(DecoratorService.class); + + dbResource.openDataContext(); + + service = serviceContext.getService(PupitriImportExportService.class); + + dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_ID, 3, + OPERATION_2_ID, + OPERATION_1_ID, + OPERATION_3_ID); + } + + @Test + public void importPupitri() throws IOException { + + File trunk = dbResource.copyClassPathResource("pupitri/evo-5062.tnk", "pupitri.tnk"); + File carroussel = dbResource.copyClassPathResource("pupitri/evo-5062.car", "pupitri.car"); + File protocol = dbResource.copyClassPathResource("pupitri/evo-5062.tuttiProtocol", "evo-5062.tuttiProtocol"); + dbResource.getConfig().getApplicationConfig().setOption(TuttiConfigurationOption.DB_PROTOCOL_DIRECTORY.getKey(), protocol.getParentFile().getAbsolutePath()); + TuttiProtocol protocol1 = persistenceService.getProtocol("evo-5062"); + persistenceService.setProtocol(protocol1); + + FishingOperation operation = dataContext.operations.get(1); + CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(operation.getId()); + catchBatch.setFishingOperation(operation); + + BatchContainer<SpeciesBatch> rootSpeciesBatch = persistenceService.getRootSpeciesBatch(operation.getId(), null); + Assert.assertEquals(3, rootSpeciesBatch.sizeChildren()); + + int nbNotAdded = service.importPupitri(trunk, carroussel, operation, catchBatch).getNbCarrousselNotImported(); + Assert.assertEquals(0, nbNotAdded); + BatchContainer<SpeciesBatch> rootSpeciesBatchAfter = persistenceService.getRootSpeciesBatch(operation.getId(), null); + Assert.assertEquals(9, rootSpeciesBatchAfter.sizeChildren()); + + Set<Integer> unexpectedSpecies = Sets.newHashSet( + ); + Set<Integer> expectedSpecies = Sets.newHashSet( + + 18237, // EUPH-AUX + 16994, // MERL-MCC + 17116, // TRAC-TRU + 16816, // ENGR-ENC + 17374, // EUTR-GUR + 17226, // SCOM-SCO + 17007, // MICR-POU + 16869 // MYCT-PUN + ); + + Set<Integer> alreadyFound = new HashSet<>(); + + Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class); + + for (SpeciesBatch speciesBatch : rootSpeciesBatchAfter.getChildren()) { + + Species species = speciesBatch.getSpecies(); + Integer speciesId = species.getIdAsInt(); + if (alreadyFound.contains(speciesId)) { + + // already found + continue; + + } + + boolean remove = expectedSpecies.remove(speciesId); + if (log.isInfoEnabled()) { + log.info("Species : " + speciesId + " : " + speciesDecorator.toString(species)); + } + if (remove) { + + // ok mark it as safe specieId + alreadyFound.add(speciesId); + + } + + if (!remove) { + unexpectedSpecies.add(speciesId); + if (log.isWarnEnabled()) { + log.warn("Unexpected Species " + speciesId); + } + } + } + + Assert.assertTrue("Expected species not found: " + expectedSpecies, expectedSpecies.isEmpty()); + Assert.assertTrue("Unexpected species found: " + unexpectedSpecies, unexpectedSpecies.isEmpty()); + } +} \ No newline at end of file Property changes on: branches/tutti-3.4.x/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportServiceEvo5062Test.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Copied: branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.car (from rev 1758, branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5060.car) =================================================================== --- branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.car (rev 0) +++ branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.car 2014-05-14 12:03:51 UTC (rev 1763) @@ -0,0 +1,29 @@ +$TSMES,27/11/13,13:14:46.647,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0018.0, +$TSMES,27/11/13,13:16:26.243,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0011.9, +$TSMES,27/11/13,13:16:41.355,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0013.2, +$TSMES,27/11/13,13:17:21.436,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0016.9, +$TSMES,27/11/13,13:17:36.955,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0013.6, +$TSMES,27/11/13,13:19:05.279,BLCAR, 0,A,1,001,EUPH-AUX,H,VAT,0011.7, (lettre H = hors vrac) +$TSMES,27/11/13,13:19:39.641,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0015.5, +$TSMES,27/11/13,13:20:06.166,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0014.9, +$TSMES,27/11/13,13:20:23.156,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0014.3, +$TSMES,27/11/13,13:21:04.512,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0013.9, +$TSMES,27/11/13,13:23:22.732,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0015.6, +$TSMES,27/11/13,13:23:54.472,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0011.7, +$TSMES,27/11/13,13:25:04.666,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0014.7, +$TSMES,27/11/13,13:26:06.042,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0013.9, +$TSMES,27/11/13,13:27:00.467,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0010.4, +$TSMES,27/11/13,13:28:00.475,BLCAR, 0,A,1,002,MELA-NGE,0,VAT,0013.7, +$TSMES,27/11/13,13:28:27.717,BLCAR, 0,A,1,002,MERL-MCC,G,VAT,0008.4, (du merlu gros) +$TSMES,27/11/13,13:29:02.786,BLCAR, 0,A,1,002,MERL-MCC,G,VAT,0006.6, (du merlu gros) +$TSMES,27/11/13,13:30:08.665,BLCAR, 0,A,1,001,TRAC-TRU,0,VAT,0007.9, +$TSMES,27/11/13,13:30:30.398,BLCAR, 0,A,1,001,MERL-MCC,P,VAT,0010.1, (du merlu petit) +$TSMES,27/11/13,13:31:17.004,BLCAR, 0,A,1,001,ENGR-ENC,0,VAT,0000.4, +$TSMES,27/11/13,13:32:57.554,BLCAR, 0,A,1,001,EUTR-GUR,0,VAT,0000.4, +$TSMES,27/11/13,13:33:49.235,BLCAR, 0,A,1,001,SCOM-SCO,0,VAT,0000.7, +$TSMES,27/11/13,13:34:20.335,BLCAR, 0,A,1,002,MICR-POU,T,VAT,0014.9, (lettre T pour du poutassou trié dans le mélange) +$TSMES,27/11/13,13:34:46.793,BLCAR, 0,A,1,002,MICR-POU,T,VAT,0019.0, (lettre T pour du poutassou trié dans le mélange) +$TSMES,27/11/13,13:36:40.963,BLCAR, 0,A,1,002,MICR-POU,T,VAT,0014.8, (lettre T pour du poutassou trié dans le mélange) +$TSMES,27/11/13,13:37:18.484,BLCAR, 0,A,1,002,MICR-POU,T,VAT,0011.1, (lettre T pour du poutassou trié dans le mélange) +$TSMES,27/11/13,13:38:26.381,BLCAR, 0,A,1,002,EUPH-AUX,T,VAT,0009.6, (lettre T pour des euphausiacés triés dans le mélange) +$TSMES,27/11/13,13:49:51.688,BLCAR, 0,A,1,001,MYCT-PUN,T,VAT,0001.1, (lettre T pour des myctophidés triés dans le mélange) \ No newline at end of file Copied: branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.tnk (from rev 1758, branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5060.tnk) =================================================================== --- branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.tnk (rev 0) +++ branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.tnk 2014-05-14 12:03:51 UTC (rev 1763) @@ -0,0 +1,32 @@ +$TSMES,27/11/13,09:08:45.130,BLTNK, 0,A,1,VAT,0045.4, +$TSMES,27/11/13,09:10:10.522,BLTNK, 0,A,1,VAT,0045.0, +$TSMES,27/11/13,09:12:14.730,BLTNK, 0,A,1,VAT,0043.9, +$TSMES,27/11/13,09:14:06.033,BLTNK, 0,A,1,VAT,0044.0, +$TSMES,27/11/13,09:16:08.907,BLTNK, 0,A,1,VAT,0042.4, +$TSMES,27/11/13,09:17:47.515,BLTNK, 0,A,1,VAT,0044.3, +$TSMES,27/11/13,09:19:44.039,BLTNK, 0,A,1,VAT,0043.6, +$TSMES,27/11/13,09:21:49.166,BLTNK, 0,A,1,VAT,0044.2, +$TSMES,27/11/13,09:26:57.681,BLTNK, 0,A,1,VAT,0045.9, +$TSMES,27/11/13,09:29:20.020,BLTNK, 0,A,1,VAT,0045.8, +$TSMES,27/11/13,09:30:37.535,BLTNK, 0,A,1,VAT,0047.0, +$TSMES,27/11/13,09:32:16.153,BLTNK, 0,A,1,VAT,0046.6, +$TSMES,27/11/13,09:33:30.882,BLTNK, 0,A,1,VAT,0044.4, +$TSMES,27/11/13,09:34:50.649,BLTNK, 0,A,1,VAT,0044.5, +$TSMES,27/11/13,09:36:36.933,BLTNK, 0,A,1,VAT,0043.7, +$TSMES,27/11/13,09:37:53.424,BLTNK, 0,A,1,VAT,0046.4, +$TSMES,27/11/13,09:41:40.944,BLTNK, 0,A,1,VAT,0048.6, +$TSMES,27/11/13,09:43:33.377,BLTNK, 0,A,1,VAT,0046.4, +$TSMES,27/11/13,09:44:46.487,BLTNK, 0,A,1,VAT,0046.4, +$TSMES,27/11/13,09:46:12.192,BLTNK, 0,A,1,VAT,0045.2, +$TSMES,27/11/13,09:47:34.846,BLTNK, 0,A,1,VAT,0045.4, +$TSMES,27/11/13,09:48:55.920,BLTNK, 0,A,1,VAT,0048.4, +$TSMES,27/11/13,09:51:12.724,BLTNK, 0,A,1,VAT,0046.4, +$TSMES,27/11/13,09:54:14.063,BLTNK, 0,A,1,VAT,0040.4, +$TSMES,27/11/13,09:56:11.000,BLTNK, 0,A,1,VAT,0044.2, +$TSMES,27/11/13,09:57:38.344,BLTNK, 0,A,1,VAT,0047.3, +$TSMES,27/11/13,09:59:23.603,BLTNK, 0,A,1,VAT,0047.6, +$TSMES,27/11/13,10:00:51.868,BLTNK, 0,A,1,VAT,0047.9, +$TSMES,27/11/13,10:02:29.655,BLTNK, 0,A,1,VAT,0044.2, +$TSMES,27/11/13,10:04:14.101,BLTNK, 0,A,1,VAT,0045.9, +$TSMES,27/11/13,10:06:08.886,BLTNK, 0,A,1,VAT,0043.2, +$TSMES,27/11/13,10:08:35.000,BLTNK, 0,A,1,VAT,0007.5, \ No newline at end of file Copied: branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.tuttiProtocol (from rev 1758, branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5060.tuttiProtocol) =================================================================== --- branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.tuttiProtocol (rev 0) +++ branches/tutti-3.4.x/tutti-service/src/test/resources/pupitri/evo-5062.tuttiProtocol 2014-05-14 12:03:51 UTC (rev 1763) @@ -0,0 +1,154 @@ +id: c6ee2088-9720-46c0-b8d2-8f21c902676f +name: Protocole EVHOE 2013 +benthos: +comment: Protocole pour les tests 2013 avec Jean Jacques Rivoalen +gearUseFeaturePmfmId: +- 131 +- 828 +- 884 +- 965 +lengthClassesPmfmId: +- 306 +- 622 +- 307 +- 302 +- 299 +- 1394 +- 1417 +- 1425 +- 1426 +- 1427 +- 283 +- 284 +- 285 +- 294 +- 295 +- 300 +- 301 +- 304 +- 318 +- 319 +- 322 +- 323 +- 661 +- 662 +species: +- !SpeciesProtocol + id: 056a7ad4-934c-4d69-b068-1a2dd64012cb + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: [] + speciesReferenceTaxonId: 2786 + speciesSurveyCode: EUPH-AUX + weightEnabled: true +- !SpeciesProtocol + id: 5f7e400c-6a03-4092-9ccf-0031823b3a14 + calcifySampleEnabled: true + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: + - 198 + - 196 + speciesReferenceTaxonId: 1540 + speciesSurveyCode: MERL-MCC + weightEnabled: true +- !SpeciesProtocol + id: dc5738bb-ed38-4814-a016-9fabfd833212 + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: + - 198 + speciesReferenceTaxonId: 1662 + speciesSurveyCode: TRAC-TRU + weightEnabled: true +- !SpeciesProtocol + id: e4577b1e-18d1-459c-acff-04aedf4e917d + calcifySampleEnabled: true + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 307 + mandatorySampleCategoryId: [] + speciesReferenceTaxonId: 1362 + speciesSurveyCode: ENGR-ENC + weightEnabled: true +- !SpeciesProtocol + id: 4076fe7e-01fe-4164-820a-47b50dfa8e02 + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: [] + speciesReferenceTaxonId: 1920 + speciesSurveyCode: EUTR-GUR + weightEnabled: true +- !SpeciesProtocol + id: 16f4a094-1904-4e50-aff9-1f2dcab3a909 + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: + - 198 + speciesReferenceTaxonId: 1772 + speciesSurveyCode: SCOM-SCO + weightEnabled: true +- !SpeciesProtocol + id: d5887f0e-bd99-4f66-a967-8fcff8224b32 + calcifySampleEnabled: true + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: + - 198 + - 196 + speciesReferenceTaxonId: 1553 + speciesSurveyCode: MICR-POU + weightEnabled: true +- !SpeciesProtocol + id: 944db3c6-d870-4f03-8abc-9a985a6feb65 + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: [] + speciesReferenceTaxonId: 1415 + speciesSurveyCode: MYCT-PUN + weightEnabled: true +- !SpeciesProtocol + id: 2a8122cf-d238-4820-a7b9-eacaf1f302bd + calcifySampleEnabled: true + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: [] + speciesReferenceTaxonId: 1551 + speciesSurveyCode: MELA-NGE + weightEnabled: true +- !SpeciesProtocol + id: 0de3f5c9-0ca9-4a7c-84aa-323d9eaa7f7f + countIfNoFrequencyEnabled: true + mandatorySampleCategoryId: [] + speciesReferenceTaxonId: 872 + speciesSurveyCode: ACAN-PEL + weightEnabled: true +- !SpeciesProtocol + id: ddffa4c9-cbb5-447f-a829-e2ac0cfea0f5 + countIfNoFrequencyEnabled: true + lengthStepPmfmId: 306 + mandatorySampleCategoryId: [] + speciesReferenceTaxonId: 1732 + speciesSurveyCode: ACANPAL + weightEnabled: true +vesselUseFeaturePmfmId: +- 173 +- 194 +- 230 +- 782 +- 843 +- 844 +- 846 +- 847 +- 848 +- 849 +- 850 +- 851 +- 857 +- 858 +- 859 +- 861 +- 862 +- 863 +- 881 +- 882 +- 883 \ No newline at end of file