This is an automated email from the git hooks/post-receive script. New commit to branch feature/8157 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 4cb6f60369a083fec68bea923745dc67475dc574 Author: Kevin Morin <morin@codelutin.com> Date: Tue Apr 5 16:06:49 2016 +0200 on demande au cache de créer les lignes pour l'export (refs #8157) --- .../cps/CalcifiedPiecesSamplingExportService.java | 89 +++------------------- ...ngRowModel.java => SamplingNumberRowModel.java} | 23 +++--- .../CacheExtractedKey.java} | 5 +- .../service/sampling/CruiseSamplingCache.java | 15 +++- .../sampling/CruiseSamplingInternalCache.java | 51 ++++++++----- .../resources/i18n/tutti-service_en_GB.properties | 1 + .../resources/i18n/tutti-service_fr_FR.properties | 1 + 7 files changed, 68 insertions(+), 117 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java index 7e103a6..dfb814a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingExportService.java @@ -2,15 +2,8 @@ package fr.ifremer.tutti.service.export.cps; import com.google.common.base.Charsets; import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import com.google.common.io.Files; -import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; -import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Speciess; import fr.ifremer.tutti.service.AbstractTuttiService; @@ -18,21 +11,18 @@ import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.sampling.CacheExtractedKey; +import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Export; -import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationTechnicalException; import java.io.BufferedWriter; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.TreeMap; -import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.t; @@ -68,43 +58,18 @@ public class CalcifiedPiecesSamplingExportService extends AbstractTuttiService { TuttiDataContext dataContext = context.getDataContext(); Preconditions.checkState(dataContext.isCruiseSamplingCacheLoaded()); - List<CalcifiedPiecesSamplingRow> rows = Lists.newArrayList(); + SamplingNumberRowModel csvModel = new SamplingNumberRowModel(context.getConfig().getCsvSeparator()); - CalcifiedPiecesSamplingRowModel csvModel = new CalcifiedPiecesSamplingRowModel(context.getConfig().getCsvSeparator()); + Map<String, Species> referenceSpeciesByReferenceTaxonId = Speciess.splitReferenceSpeciesByReferenceTaxonId(dataContext.getReferentSpecies()); - TuttiProtocol protocol = dataContext.getProtocol(); - - Map<Integer, Species> referenceSpeciesByReferenceTaxonId = Maps.uniqueIndex(dataContext.getReferentSpecies(), Speciess.GET_REFERECE_TAXON_ID_AS_INT); - - List<SpeciesProtocol> speciesInAlogirthm = - protocol.getSpecies().stream().filter(speciesProtocol -> !speciesProtocol.isCalcifiedPiecesSamplingDefinitionEmpty()).collect(Collectors.toList()); - - progressionModel.adaptTotal(progressionModel.getTotal() + speciesInAlogirthm.size()); - - Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class, DecoratorService.WITH_SURVEY_CODE); - - speciesInAlogirthm.forEach(speciesProtocol -> { - - Species species = referenceSpeciesByReferenceTaxonId.get(speciesProtocol.getSpeciesReferenceTaxonId()); - if (log.isDebugEnabled()) { - log.debug("export species " + species.getReferenceTaxonId() + " " + speciesDecorator.toString(species)); - } - progressionModel.increments(t("tutti.service.cpsExport.step.export.species", speciesDecorator.toString(species))); - - Collection<CalcifiedPiecesSamplingDefinition> cpsDefs = speciesProtocol.getCalcifiedPiecesSamplingDefinition(); - - cpsDefs.forEach(cpsDef -> { - if (cpsDef.isSex()) { - dataContext.getGenderValues().forEach(gender -> rows.addAll(getRows(species, cpsDef, gender))); - - } else { - rows.addAll(getRows(species, cpsDef, null)); - } - }); - }); + CruiseSamplingCache cruiseSamplingCache = context.getDataContext().getOptionalCruiseSamplingCache().get(); + List<CacheExtractedKey> rows = cruiseSamplingCache.getSamplingNumbers(referenceSpeciesByReferenceTaxonId); BufferedWriter writer = null; try { + + progressionModel.increments(t("tutti.service.cpsExport.step.toFile", file.getName())); + writer = Files.newWriter(file, Charsets.UTF_8); Export export = Export.newExport(csvModel, rows); export.write(writer); @@ -117,40 +82,4 @@ public class CalcifiedPiecesSamplingExportService extends AbstractTuttiService { } } - protected List<CalcifiedPiecesSamplingRow> getRows(Species species, CalcifiedPiecesSamplingDefinition cpsDef, CaracteristicQualitativeValue gender) { - Preconditions.checkState(context.getDataContext().isCruiseSamplingCacheLoaded()); - - Integer speciesId = species.getReferenceTaxonId(); - Boolean maturity = cpsDef.getMaturity(); - Integer maxByLenghtStep = cpsDef.getMaxByLenghtStep(); - int minSize = cpsDef.getMinSize(); - Integer maxSize = cpsDef.getMaxSize(); - - if (log.isDebugEnabled()) { - log.debug("create rows for " + speciesId + " (mat: " + maturity + ", sex: " + gender.getName() + ", max/lengthstep : " + maxByLenghtStep + ", min: " + minSize + ", max: " + maxSize + ")"); - } - - TreeMap<Integer, Integer> samplingNbByLengthStep = - context.getDataContext().getOptionalCruiseSamplingCache().get() - .getSamplingNbByLengthStepForCruise(speciesId, gender, maturity, minSize, maxSize); - - List<CalcifiedPiecesSamplingRow> rows = new ArrayList<>(); - samplingNbByLengthStep.keySet().forEach(lengthStep -> { - CalcifiedPiecesSamplingRow row = new CalcifiedPiecesSamplingRow(); - row.setSpecies(species); - row.setMaturity(maturity); - row.setSex(gender == null ? null : QualitativeValueId.fromValue(gender.getIdAsInt())); - row.setMaxByLengthStep(maxByLenghtStep); - row.setLengthStep(lengthStep); - row.setSamplingNb(samplingNbByLengthStep.getOrDefault(lengthStep, 0)); - rows.add(row); - }); - - if (log.isDebugEnabled()) { - log.debug("==> " + rows.size() + " found"); - } - - return rows; - } - } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java similarity index 62% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java index 81cb5af..8c2bbe6 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java @@ -4,6 +4,7 @@ import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.csv.AbstractTuttiImportExportModel; import fr.ifremer.tutti.service.csv.TuttiCsvUtil; +import fr.ifremer.tutti.service.sampling.CacheExtractedKey; import org.nuiton.csv.ValueFormatter; import static org.nuiton.i18n.I18n.t; @@ -12,27 +13,27 @@ import static org.nuiton.i18n.I18n.t; * @author Kevin Morin (Code Lutin) * @since 4.5 */ -public class CalcifiedPiecesSamplingRowModel extends AbstractTuttiImportExportModel<CalcifiedPiecesSamplingRow> { +public class SamplingNumberRowModel extends AbstractTuttiImportExportModel<CacheExtractedKey> { - public CalcifiedPiecesSamplingRowModel(char separator) { + public SamplingNumberRowModel(char separator) { super(separator); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.surveyCode"), CalcifiedPiecesSamplingRow.PROPERTY_SPECIES, new ValueFormatter<Species>() { + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.surveyCode"), CacheExtractedKey.PROPERTY_SPECIES, new ValueFormatter<Species>() { @Override public String format(Species species) { return String.valueOf(species.getSurveyCode()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.geniusName"), CalcifiedPiecesSamplingRow.PROPERTY_SPECIES, new ValueFormatter<Species>() { + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.geniusName"), CacheExtractedKey.PROPERTY_SPECIES, new ValueFormatter<Species>() { @Override public String format(Species species) { return String.valueOf(species.getName()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CalcifiedPiecesSamplingRow.PROPERTY_LENGTH_STEP, TuttiCsvUtil.PRIMITIVE_INTEGER); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maturity"), CalcifiedPiecesSamplingRow.PROPERTY_MATURITY, new ValueFormatter<Boolean>() { + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.lengthStep"), CacheExtractedKey.PROPERTY_LENGTH_STEP, TuttiCsvUtil.PRIMITIVE_INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maturity"), CacheExtractedKey.PROPERTY_MATURITY, new ValueFormatter<Boolean>() { @Override public String format(Boolean maturity) { @@ -42,7 +43,7 @@ public class CalcifiedPiecesSamplingRowModel extends AbstractTuttiImportExportMo return maturity ? t("tutti.maturity.mature") : t("tutti.maturity.immature"); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.gender"), CalcifiedPiecesSamplingRow.PROPERTY_SEX, new ValueFormatter<QualitativeValueId>() { + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.gender"), CacheExtractedKey.PROPERTY_SEX, new ValueFormatter<QualitativeValueId>() { @Override public String format(QualitativeValueId sex) { @@ -52,12 +53,12 @@ public class CalcifiedPiecesSamplingRowModel extends AbstractTuttiImportExportMo return t(sex.getDescription()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.samplingNb"), CalcifiedPiecesSamplingRow.PROPERTY_SAMPLING_NB, TuttiCsvUtil.PRIMITIVE_INTEGER); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maxByLengthStep"), CalcifiedPiecesSamplingRow.PROPERTY_MAX_BY_LENGTH_STEP, TuttiCsvUtil.INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.samplingNb"), CacheExtractedKey.PROPERTY_SAMPLING_NB, TuttiCsvUtil.PRIMITIVE_INTEGER); + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maxByLengthStep"), CacheExtractedKey.PROPERTY_MAX_BY_LENGTH_STEP, TuttiCsvUtil.INTEGER); } @Override - public CalcifiedPiecesSamplingRow newEmptyInstance() { - return new CalcifiedPiecesSamplingRow(); + public CacheExtractedKey newEmptyInstance() { + return new CacheExtractedKey(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java similarity index 94% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java index c719b51..7b9d064 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/CalcifiedPiecesSamplingRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.export.cps; +package fr.ifremer.tutti.service.sampling; import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.entities.referential.Species; @@ -9,8 +9,7 @@ import java.io.Serializable; * @author Kevin Morin (Code Lutin) * @since 4.5 */ -public class CalcifiedPiecesSamplingRow implements Serializable { - +public class CacheExtractedKey implements Serializable { public static final String PROPERTY_SPECIES = "species"; public static final String PROPERTY_LENGTH_STEP = "lengthStep"; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index d917ea2..cc370bd 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -47,11 +47,11 @@ import javax.swing.event.EventListenerList; import java.io.Closeable; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.TreeMap; /** * @author Kevin Morin (Code Lutin) @@ -671,7 +671,7 @@ public class CruiseSamplingCache implements Closeable { listeners.remove(SamplingListener.class, listener); } - protected Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, float lengthStep) { + public Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, float lengthStep) { Collection<CalcifiedPiecesSamplingDefinition> cpsDefinitions = cpsDefinitionsBySpecies.get(species.getReferenceTaxonId()); return cpsDefinitions.stream() .filter(cpsDef -> Objects.equals(cpsDef.getMaturity(), maturity) @@ -783,8 +783,15 @@ public class CruiseSamplingCache implements Closeable { // (key, highestSamplingCode) -> code.equals(highestSamplingCode) ? code - 1 : highestSamplingCode); } - public TreeMap<Integer, Integer> getSamplingNbByLengthStepForCruise(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity, int minSize, Integer maxSize) { - return totalCruiseCache.getSamplingNbByLengthStep(speciesId, gender, maturity, minSize, maxSize); + public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { + List<CacheExtractedKey> result = totalCruiseCache.getSamplingNumbers(speciesById); + result.forEach(key -> { + Optional<CalcifiedPiecesSamplingDefinition> cpsDef = getCalcifiedPiecesSamplingDefinition(key.getSpecies(), key.getMaturity(), key.getLengthStep()); + if (cpsDef.isPresent()) { + key.setMaxByLengthStep(cpsDef.get().getMaxByLenghtStep()); + } + }); + return result; } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java index 2c11465..a92541a 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java @@ -24,16 +24,20 @@ package fr.ifremer.tutti.service.sampling; * #L% */ +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.Closeable; import java.io.Serializable; +import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -54,11 +58,8 @@ class CruiseSamplingInternalCache implements Closeable { public static String createSamplingKey(Species species, CaracteristicQualitativeValue gender, Boolean maturity, int lengthStep) { Objects.requireNonNull(species); - return createSamplingKey(species.getReferenceTaxonId(), gender, maturity) + lengthStep; - } - - public static String createSamplingKey(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity) { - return speciesId + KEY_SEPARATOR + (gender == null ? null : gender.getId()) + KEY_SEPARATOR + maturity + KEY_SEPARATOR; + return species.getReferenceTaxonId() + KEY_SEPARATOR + (gender == null ? "" : gender.getId()) + + KEY_SEPARATOR + (maturity == null ? "" : maturity.toString()) + KEY_SEPARATOR + lengthStep; } public static String addPrefixKey(Serializable prefix, String key) { @@ -176,31 +177,43 @@ class CruiseSamplingInternalCache implements Closeable { /** * Get the number of samplings by lengthstep for a species, maturity and gender, for the lengthsteps between min size and max size - * @param speciesId - * @param gender - * @param maturity - * @param minSize - * @param maxSize * @return a map of the number of samplings for each lengthstep in millimeters */ - public TreeMap<Integer, Integer> getSamplingNbByLengthStep(int speciesId, CaracteristicQualitativeValue gender, Boolean maturity, int minSize, Integer maxSize) { - String keyPrefix = createSamplingKey(speciesId, gender, maturity); + public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { - TreeMap<Integer, Integer> result = new TreeMap<>(); Iterator<Map.Entry<String, SamplingData>> iterator = data.entrySet().iterator(); + List<CacheExtractedKey> result = new ArrayList<>(data.size()); - int keyPrefixLength = keyPrefix.length(); while (iterator.hasNext()) { Map.Entry<String, SamplingData> entry = iterator.next(); - String key = entry.getKey(); - if (key.startsWith(keyPrefix)) { - int lengthStep = Integer.parseInt(key.substring(keyPrefixLength)); - if (lengthStep >= minSize && (maxSize == null || lengthStep <= maxSize)) { - result.put(lengthStep, entry.getValue().getSamplingNb()); + if (entry.getValue() != null) { + String[] keyTokens = entry.getKey().split(KEY_SEPARATOR); + + CacheExtractedKey key = new CacheExtractedKey(); + + Species species = speciesById.get(keyTokens[0]); + key.setSpecies(species); + + if (!StringUtils.isEmpty(keyTokens[1])) { + QualitativeValueId sex = QualitativeValueId.fromValue(Integer.parseInt(keyTokens[1])); + key.setSex(sex); + } + + if (!StringUtils.isEmpty(keyTokens[2])) { + Boolean maturity = Boolean.parseBoolean(keyTokens[2]); + key.setMaturity(maturity); } + + int lengthStep = Integer.parseInt(keyTokens[3]); + key.setLengthStep(lengthStep); + + key.setSamplingNb(entry.getValue().getSamplingNb()); + + result.add(key); } + } return result; } diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index 1514c68..127895d 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -92,6 +92,7 @@ tutti.service.compressZipFile.error= tutti.service.context.serviceInstanciation.error= tutti.service.cpsExport.error= tutti.service.cpsExport.step.export.species= +tutti.service.cpsExport.step.toFile= tutti.service.csv.caracteristic.qualitativeValue.notFound= tutti.service.csv.parse.entityNotFound= tutti.service.csv.parse.foreignEntityNotFound= diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index e528d17..cd64b5c 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -84,6 +84,7 @@ tutti.service.compressZipFile.error=Erreur lors de la compression du dossier %1s tutti.service.context.serviceInstanciation.error=Erreur lors de l'instanciation du service %s tutti.service.cpsExport.error=Erreur à l'export du rapport des prélèvements tutti.service.cpsExport.step.export.species=Export des prélèvements pour l'espèce %s +tutti.service.cpsExport.step.toFile= tutti.service.csv.caracteristic.qualitativeValue.notFound=La caractéristique qualitative %s n'a pas de value d'id %s tutti.service.csv.parse.entityNotFound=L'entité de type %1s avec la propriété %2s de valeur %3s n'a pas été trouvée tutti.service.csv.parse.foreignEntityNotFound=L'entité de type %1s avec l'identifiant %3s n'a pas été trouvée -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.