r1420 - in trunk: tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service tutti-persistence/src/main/resources tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri
Author: tchemit Date: 2013-12-02 19:42:53 +0100 (Mon, 02 Dec 2013) New Revision: 1420 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1420 Log: fixes #3898: [CAPTURE] probl?\195?\168me ?\195?\160 l'import pupitri sur lot cat?\195?\169goris?\195?\169 ?\195?\160 p ou g Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java trunk/tutti-persistence/src/main/resources/tutti-db-enumerations.properties trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportServiceTest.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java 2013-12-02 09:36:16 UTC (rev 1419) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java 2013-12-02 18:42:53 UTC (rev 1420) @@ -146,6 +146,9 @@ @Value("${QualitativeValueId.SEX_FEMALE}") public final Integer QUALITATIVE_SEX_FEMALE_ID = null; + @Value("${QualitativeValueId.SEX_UNDEFINED}") + public final Integer QUALITATIVE_SEX_UNDEFINED_ID = null; + @Value("${QualitativeValueId.SIZE_SMALL}") public final Integer QUALITATIVE_SIZE_SMALL_ID = null; Modified: trunk/tutti-persistence/src/main/resources/tutti-db-enumerations.properties =================================================================== --- trunk/tutti-persistence/src/main/resources/tutti-db-enumerations.properties 2013-12-02 09:36:16 UTC (rev 1419) +++ trunk/tutti-persistence/src/main/resources/tutti-db-enumerations.properties 2013-12-02 18:42:53 UTC (rev 1420) @@ -317,6 +317,7 @@ # Catégorie Sex PmfmId.SEX=196 +QualitativeValueId.SEX_UNDEFINED=299 QualitativeValueId.SEX_MALE=300 QualitativeValueId.SEX_FEMALE=301 Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java 2013-12-02 09:36:16 UTC (rev 1419) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java 2013-12-02 18:42:53 UTC (rev 1420) @@ -25,7 +25,12 @@ */ 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; import java.util.Map; @@ -39,13 +44,73 @@ private static final long serialVersionUID = 1L; public static enum Signs { - DEFAULT("0"), - MALE("1"), - FEMALE("2"), - SMALL("P"), - MEDIUM("M"), - BIG("G"); + 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; + } + }, + 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_MEDIUM_ID; + } + }; + private String sign; Signs(String sign) { @@ -62,13 +127,25 @@ } 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; - protected Map<Signs, Float> weightBySign = Maps.newHashMap(); + protected Map<Signs, MutableFloat> weightBySign = Maps.newHashMap(); public PupitriCatch(Species species, boolean sorted) { this.species = species; @@ -83,18 +160,18 @@ return sorted; } - public Map<Signs, Float> getWeightBySign() { + public Map<Signs, MutableFloat> getWeightBySign() { return weightBySign; } public void addToSign(String sign, Float weight) { Signs s = Signs.getSign(sign); - Float f = weightBySign.get(s); + MutableFloat f = weightBySign.get(s); if (f == null) { - f = 0f; + f = new MutableFloat(); + weightBySign.put(s, f); } - f += weight; - weightBySign.put(s, f); + f.add(weight); } @Override Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java 2013-12-02 09:36:16 UTC (rev 1419) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java 2013-12-02 18:42:53 UTC (rev 1420) @@ -30,6 +30,7 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Multimaps; import com.google.common.collect.Sets; import com.google.common.io.Files; @@ -56,10 +57,12 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.mutable.MutableFloat; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Export; import org.nuiton.csv.Import; +import org.nuiton.decorator.Decorator; import java.io.File; import java.io.IOException; @@ -69,6 +72,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Set; import static org.nuiton.i18n.I18n._; @@ -82,6 +86,8 @@ private static final Log log = LogFactory.getLog(PupitriImportExportService.class); + protected DecoratorService decoratorService; + protected PersistenceService persistenceService; protected TuttiDataContext dataContext; @@ -90,25 +96,31 @@ protected CaracteristicQualitativeValue unsortedCaracteristic; - protected CaracteristicQualitativeValue maleCaracteristic; +// protected CaracteristicQualitativeValue maleCaracteristic; +// +// protected CaracteristicQualitativeValue femaleCaracteristic; +// +// protected CaracteristicQualitativeValue smallCaracteristic; +// +// protected CaracteristicQualitativeValue mediumCaracteristic; +// +// protected CaracteristicQualitativeValue bigCaracteristic; - protected CaracteristicQualitativeValue femaleCaracteristic; + protected Map<PupitriCatch.Signs, CaracteristicQualitativeValue> signsToCaracteristicValue; - protected CaracteristicQualitativeValue smallCaracteristic; - - protected CaracteristicQualitativeValue mediumCaracteristic; - - protected CaracteristicQualitativeValue bigCaracteristic; - @Override public void setServiceContext(TuttiServiceContext context) { super.setServiceContext(context); persistenceService = getService(PersistenceService.class); + decoratorService = getService(DecoratorService.class); dataContext = context.getDataContext(); TuttiEnumerationFile enumerationFile = persistenceService.getEnumerationFile(); + + signsToCaracteristicValue = Maps.newEnumMap(PupitriCatch.Signs.class); + { // sorted/unsorted caracteristic Caracteristic caracteristic = persistenceService.getSortedUnsortedCaracteristic(); @@ -120,17 +132,20 @@ { // sex category Caracteristic caracteristic = persistenceService.getSexCaracteristic(); - maleCaracteristic = TuttiEntities.getQualitativeValue(caracteristic, enumerationFile.QUALITATIVE_SEX_MALE_ID); - femaleCaracteristic = TuttiEntities.getQualitativeValue(caracteristic, enumerationFile.QUALITATIVE_SEX_FEMALE_ID); + PupitriCatch.Signs.DEFAULT.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + PupitriCatch.Signs.FEMALE.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + PupitriCatch.Signs.MALE.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); } { // size category Caracteristic caracteristic = persistenceService.getSizeCategoryCaracteristic(); - smallCaracteristic = TuttiEntities.getQualitativeValue(caracteristic, enumerationFile.QUALITATIVE_SIZE_SMALL_ID); - mediumCaracteristic = TuttiEntities.getQualitativeValue(caracteristic, enumerationFile.QUALITATIVE_SIZE_MEDIUM_ID); - bigCaracteristic = TuttiEntities.getQualitativeValue(caracteristic, enumerationFile.QUALITATIVE_SIZE_BIG_ID); + + PupitriCatch.Signs.SMALL.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + PupitriCatch.Signs.MEDIUM.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); + PupitriCatch.Signs.BIG.registerSign(enumerationFile, caracteristic, signsToCaracteristicValue); } } + /** * @param trunkFile incoming trunk file * @param carrouselFile incoming carroussle file @@ -257,6 +272,7 @@ try { + //FIXME tchemit-2013-12-02 Explain what does it do ? // get the map of species by survey code ListMultimap<String, Species> speciesBySurveyCode = ArrayListMultimap.create(); @@ -348,66 +364,127 @@ } TuttiEnumerationFile enumerationFile = persistenceService.getEnumerationFile(); - + Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class); for (PupitriCatch pupitriCatch : catches) { - Float catchWeight = pupitriCatch.getWeightBySign().get(PupitriCatch.Signs.DEFAULT); + Species species = pupitriCatch.getSpecies(); CaracteristicQualitativeValue cqv = pupitriCatch.isSorted() ? sortedCaracteristic : unsortedCaracteristic; - Species species = pupitriCatch.getSpecies(); + boolean splitSpecies = isSplitSpecies(pupitriCatch); - SpeciesBatch batch = createSpeciesBatch(operation, - species, - catchWeight, - enumerationFile.PMFM_ID_SORTED_UNSORTED, - cqv); + Map<PupitriCatch.Signs, MutableFloat> weightBySign = + pupitriCatch.getWeightBySign(); - batch = persistenceService.createSpeciesBatch(batch, null); + if (splitSpecies) { - // if the batch is splitted - if (catchWeight == null) { - Integer categoryId = null; - for (PupitriCatch.Signs s : pupitriCatch.getWeightBySign().keySet()) { - CaracteristicQualitativeValue splitCqv = null; - switch (s) { - case MALE: - categoryId = enumerationFile.PMFM_ID_SEX; - splitCqv = maleCaracteristic; - break; + // create a top batch + a son for each sign + if (log.isInfoEnabled()) { + log.info("Create a categorized batches for species " + speciesDecorator.toString(species)); + } + SpeciesBatch batch = createSpeciesBatch(operation, + species, + null, + enumerationFile.PMFM_ID_SORTED_UNSORTED, + cqv); - case FEMALE: - categoryId = enumerationFile.PMFM_ID_SEX; - splitCqv = femaleCaracteristic; - break; + batch = persistenceService.createSpeciesBatch(batch, null); - case SMALL: - categoryId = enumerationFile.PMFM_ID_SIZE_CATEGORY; - splitCqv = smallCaracteristic; - break; + String parentBatchId = batch.getId(); - case MEDIUM: - categoryId = enumerationFile.PMFM_ID_SIZE_CATEGORY; - splitCqv = mediumCaracteristic; - break; + for (Map.Entry<PupitriCatch.Signs, MutableFloat> entry : weightBySign.entrySet()) { - case BIG: - categoryId = enumerationFile.PMFM_ID_SIZE_CATEGORY; - splitCqv = bigCaracteristic; - break; - } + PupitriCatch.Signs signs = entry.getKey(); + float catchWeight = entry.getValue().floatValue(); + Integer categoryId = signs.getCategory(enumerationFile); + CaracteristicQualitativeValue splitCqv = signsToCaracteristicValue.get(signs); SpeciesBatch childBatch = createSpeciesBatch( operation, species, - pupitriCatch.getWeightBySign().get(s), + catchWeight, categoryId, splitCqv ); - persistenceService.createSpeciesBatch(childBatch, batch.getId()); + + persistenceService.createSpeciesBatch(childBatch, parentBatchId); } + + } else { + + // create a unique batch with sum all weights as simple weight + if (log.isInfoEnabled()) { + log.info("Create a unique batch for species " + speciesDecorator.toString(species)); + } + float totalWeight = 0f; + for (MutableFloat weight : weightBySign.values()) { + totalWeight += weight.floatValue(); + } + + SpeciesBatch batch = createSpeciesBatch(operation, + species, + totalWeight, + enumerationFile.PMFM_ID_SORTED_UNSORTED, + cqv); + + persistenceService.createSpeciesBatch(batch, null); } + +// MutableFloat catchWeight = weightBySign.get(PupitriCatch.Signs.DEFAULT); +// +// +// SpeciesBatch batch = createSpeciesBatch(operation, +// species, +// catchWeight.floatValue(), +// enumerationFile.PMFM_ID_SORTED_UNSORTED, +// cqv); +// +// batch = persistenceService.createSpeciesBatch(batch, null); +// +// // if the batch is splitted +// if (catchWeight == null) { +// Integer categoryId = null; +// for (PupitriCatch.Signs s : weightBySign.keySet()) { +// CaracteristicQualitativeValue splitCqv = null; +// switch (s) { +// case MALE: +// categoryId = enumerationFile.PMFM_ID_SEX; +// splitCqv = maleCaracteristic; +// break; +// +// case FEMALE: +// categoryId = enumerationFile.PMFM_ID_SEX; +// splitCqv = femaleCaracteristic; +// break; +// +// case SMALL: +// categoryId = enumerationFile.PMFM_ID_SIZE_CATEGORY; +// splitCqv = smallCaracteristic; +// break; +// +// case MEDIUM: +// categoryId = enumerationFile.PMFM_ID_SIZE_CATEGORY; +// splitCqv = mediumCaracteristic; +// break; +// +// case BIG: +// categoryId = enumerationFile.PMFM_ID_SIZE_CATEGORY; +// splitCqv = bigCaracteristic; +// break; +// } +// +// SpeciesBatch childBatch = createSpeciesBatch( +// operation, +// species, +// weightBySign.get(s).floatValue(), +// categoryId, +// splitCqv +// ); +// +// persistenceService.createSpeciesBatch(childBatch, batch.getId()); +// } +// } } carrouselImporter.close(); @@ -426,7 +503,73 @@ return result; } + public static final Set<PupitriCatch.Signs> DEFAULT_SIGNS = Sets.newHashSet( + PupitriCatch.Signs.DEFAULT + ); + public static final Set<PupitriCatch.Signs> SEX_SIGNS = Sets.newHashSet( + PupitriCatch.Signs.DEFAULT, + PupitriCatch.Signs.MALE, + PupitriCatch.Signs.FEMALE + ); + + public static final Set<PupitriCatch.Signs> SIZE_SIGNS = Sets.newHashSet( + PupitriCatch.Signs.SMALL, + PupitriCatch.Signs.MEDIUM, + PupitriCatch.Signs.BIG + ); + + /** + * Check that the given species catch can be split. + * For the moment accept for a same catch : + * <ul> + * <li>Signs.DEFAULT, Signs.MALE, Signs.FEMALE</li> + * <li>Signs.SMALL, Signs.MEDIUM, Signs.BIG</li> + * </ul> + * See http://forge.codelutin.com/issues/3898 + * + * @param speciesCatch catch to cehck + * @return {@code true} if species catch is safe, {@code false} otherwise. + * @since 3.0-rc-2 + */ + private boolean isSplitSpecies(PupitriCatch speciesCatch) { + boolean result; + Map<PupitriCatch.Signs, MutableFloat> weightBySign = + speciesCatch.getWeightBySign(); + Set<PupitriCatch.Signs> signs = + Sets.newHashSet(weightBySign.keySet()); + + if (DEFAULT_SIGNS.equals(signs)) { + + // only a default sign, no split + result = false; + } else { + + // remove all sex signs + boolean contains = signs.removeAll(SEX_SIGNS); + if (contains) { + + // check there only sex signs + result = signs.isEmpty(); + } else { + + // remove all size signs + contains = signs.removeAll(SIZE_SIGNS); + if (contains) { + + // check there only size signs + result = signs.isEmpty(); + } else { + + // in all other cases, not a safe + result = false; + } + } + } + return result; + } + + public void exportSpecies(List<Species> species, File target) { SpeciesRowModel speciesCsvModel = new SpeciesRowModel(';'); Modified: trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportServiceTest.java =================================================================== --- trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportServiceTest.java 2013-12-02 09:36:16 UTC (rev 1419) +++ trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportServiceTest.java 2013-12-02 18:42:53 UTC (rev 1420) @@ -28,6 +28,8 @@ 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.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; @@ -35,6 +37,7 @@ 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; @@ -63,6 +66,8 @@ protected PersistenceService persistenceService; + protected DecoratorService decoratorService; + protected ServiceDbResource.DataContext dataContext; @Before @@ -72,6 +77,8 @@ persistenceService = serviceContext.getService(PersistenceService.class); + decoratorService = serviceContext.getService(DecoratorService.class); + dbResource.openDataContext(); service = serviceContext.getService(PupitriImportExportService.class); @@ -99,14 +106,23 @@ BatchContainer<SpeciesBatch> rootSpeciesBatchAfter = persistenceService.getRootSpeciesBatch(operation.getId(), null); Assert.assertEquals(18, rootSpeciesBatchAfter.sizeChildren()); - int index = 0; + Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class); + +// int index = 0; for (SpeciesBatch speciesBatch : rootSpeciesBatchAfter.getChildren()) { - int nbChildren = 0; - if (index == 11) { + int nbChildren; + // species 17392 has two childs (MALE - FEMALE) + if (17392 == speciesBatch.getSpecies().getIdAsInt()) { nbChildren = 2; + } else { + nbChildren = 0; + } - Assert.assertEquals("SpeciesBatch at index " + (index++) + " should have " + nbChildren + " but had " + speciesBatch.sizeChildBatchs(), nbChildren, speciesBatch.sizeChildBatchs()); +// if (index == 11) { +// nbChildren = 2; +// } + Assert.assertEquals("SpeciesBatch with species " + speciesDecorator.toString(speciesBatch.getSpecies()) + " should have with " + nbChildren + " but had " + speciesBatch.sizeChildBatchs(), nbChildren, speciesBatch.sizeChildBatchs()); } } }
participants (1)
-
tchemit@users.forge.codelutin.com