Author: tchemit Date: 2013-05-13 14:12:16 +0200 (Mon, 13 May 2013) New Revision: 939 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/939 Log: fixes #1875: [IMP/EXP] - Export des donn?\195?\169es de campagne : format g?\195?\169n?\195?\169rique Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/batch/BatchPersistenceHelper.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/ExportSampleCategory.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/TuttiExportService.java trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/export/TuttiExportServiceTest.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/batch/BatchPersistenceHelper.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/batch/BatchPersistenceHelper.java 2013-05-13 09:40:03 UTC (rev 938) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/batch/BatchPersistenceHelper.java 2013-05-13 12:12:16 UTC (rev 939) @@ -470,8 +470,9 @@ } public Integer convertSampleCategoryValueIntoQualitativeId(Serializable value) { - if (value == null) + if (value == null) { return null; + } Integer qualitativeValueId = null; if (value instanceof CaracteristicQualitativeValue) { CaracteristicQualitativeValue cqValue = (CaracteristicQualitativeValue) value; Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java 2013-05-13 09:40:03 UTC (rev 938) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java 2013-05-13 12:12:16 UTC (rev 939) @@ -32,11 +32,14 @@ import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Person; import org.apache.commons.beanutils.BeanUtilsBean; +import org.apache.commons.beanutils.NestedNullException; +import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.StringUtils; import org.nuiton.util.csv.Common; import org.nuiton.util.csv.ExportModel; import org.nuiton.util.csv.ExportableColumn; import org.nuiton.util.csv.ValueFormatter; +import org.nuiton.util.csv.ValueGetter; import org.nuiton.util.csv.ValueParserFormatter; import org.nuiton.util.csv.ext.AbstractExportModel; import org.nuiton.util.csv.ext.AbstractImportExportModel; @@ -135,6 +138,14 @@ return new ForeignKeyValue<E>(type, propertyName, universe); } + public <T> ExportableColumn<M, T> newNullableColumnForExport(String headerName, String propertyName, ValueFormatter<T> valueFormatter) { + return modelBuilder.newColumnForExport(headerName, new BeanNullableGetter<M, T>(propertyName), valueFormatter); + } + + public ExportableColumn<M, String> newNullableColumnForExport(String headerName, String propertyName) { + return newNullableColumnForExport(headerName, propertyName, TuttiCsvUtil.STRING); + } + } public static class StringParserFormatter extends Common.NullableParserFormatter<String> { @@ -206,6 +217,26 @@ } } + public static class BeanNullableGetter<E, T> implements ValueGetter<E, T> { + + protected String propertyName; + + BeanNullableGetter(String propertyName) { + this.propertyName = propertyName; + } + + @Override + public T get(E object) throws Exception { + T value; + try { + value = (T) PropertyUtils.getProperty(object, propertyName); + } catch (NestedNullException e) { + value = null; + } + return value; + } + } + /** * @author tchemit <chemit@codelutin.com> * @since 1.0 @@ -281,7 +312,7 @@ } public static <E> DecoratorPropertyFormatter<E> newDecoratorFormatter(Decorator<E> decorator, - String defaultNullValue) { + String defaultNullValue) { return new DecoratorPropertyFormatter<E>(decorator, defaultNullValue); } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportModel.java 2013-05-13 09:40:03 UTC (rev 938) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportModel.java 2013-05-13 12:12:16 UTC (rev 939) @@ -26,6 +26,7 @@ import fr.ifremer.tutti.persistence.entities.data.BatchContainer; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; +import fr.ifremer.tutti.persistence.entities.data.BenthosBatchFrequency; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.Program; @@ -42,6 +43,7 @@ import java.io.Serializable; import java.util.List; +import java.util.Map; /** * Model of a catch export. @@ -53,8 +55,11 @@ public static final String WEIGHT_OR_VOL_TYPE = "Poids"; - public CatchExportModel(char separator, List<SampleCategoryEnum> samplingOrder) { + Map<SampleCategoryEnum, Caracteristic> sampleCategoryToCaracteristics; + + public CatchExportModel(char separator, List<SampleCategoryEnum> samplingOrder, Map<SampleCategoryEnum, Caracteristic> sampleCategoryToCaracteristics) { super(separator); + this.sampleCategoryToCaracteristics = sampleCategoryToCaracteristics; newColumnForExport("Annee", Cruise.PROPERTY_BEGIN_DATE, TuttiCsvUtil.YEAR); newColumnForExport("Serie", Cruise.PROPERTY_PROGRAM, Program.PROPERTY_NAME); @@ -64,68 +69,42 @@ newColumnForExport("Id_Operation", FishingOperation.PROPERTY_STATION_NUMBER); newColumnForExport("NumOrdre_Station", FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER, TuttiCsvUtil.INTEGER); newColumnForExport("Navire", Cruise.PROPERTY_VESSEL, Vessel.PROPERTY_NAME); + newColumnForExport("Taxon", SpeciesBatch.PROPERTY_SPECIES + "." + Species.PROPERTY_REFERENCE_TAXON_ID, TuttiCsvUtil.INTEGER); - newColumnForExport("Taxon", CatchExportRow.SPECIES_SAMPLE_CATEGORY); - newColumnForExport("NumOrdre_Taxon_H2", CatchExportRow.SPECIES_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_RANK_ORDER, TuttiCsvUtil.INTEGER); - newColumnForExport("Tot_Taxon", CatchExportRow.SPECIES_SAMPLE_CATEGORY); - newColumnForExport("Ech_Taxon", CatchExportRow.SPECIES_SAMPLE_CATEGORY); - newColumnForExport("Type_Volume_Poids_Taxon", CatchExportRow.SPECIES_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_WEIGHT_OR_VOL_TYPE); - newColumnForExport("Unite_Volume_Poids_Taxon", CatchExportRow.SPECIES_SAMPLE_CATEGORY + "." + Caracteristic.PROPERTY_UNIT); - for (SampleCategoryEnum sampleCategoryEnum : samplingOrder) { switch (sampleCategoryEnum) { case sortedUnsorted: - newColumnForExport("Vrac/Hors_Vrac", CatchExportRow.SORTED_UNSORTED_SAMPLE_CATEGORY); - newColumnForExport("NumOrdre_Vrac_H2", CatchExportRow.SORTED_UNSORTED_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_RANK_ORDER, TuttiCsvUtil.INTEGER); - newColumnForExport("Tot_Vrac", CatchExportRow.SORTED_UNSORTED_SAMPLE_CATEGORY); - newColumnForExport("Ech_Vrac", CatchExportRow.SORTED_UNSORTED_SAMPLE_CATEGORY); - newColumnForExport("Type_Volume_Poids_Vrac", CatchExportRow.SORTED_UNSORTED_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_WEIGHT_OR_VOL_TYPE); - newColumnForExport("Unite_Volume_Poids_Vrac", CatchExportRow.SORTED_UNSORTED_SAMPLE_CATEGORY + "." + Caracteristic.PROPERTY_UNIT); + addSampleCategory("Vrac", CatchExportRow.SORTED_UNSORTED_SAMPLE_CATEGORY); break; case size: - newColumnForExport("Categorie", CatchExportRow.SIZE_SAMPLE_CATEGORY); - newColumnForExport("NumOrdre_Cat_H2", CatchExportRow.SIZE_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_RANK_ORDER, TuttiCsvUtil.INTEGER); - newColumnForExport("Tot_Cat", CatchExportRow.SIZE_SAMPLE_CATEGORY); - newColumnForExport("Ech_Cat", CatchExportRow.SIZE_SAMPLE_CATEGORY); - newColumnForExport("Type_Volume_Poids_Cat", CatchExportRow.SIZE_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_WEIGHT_OR_VOL_TYPE); - newColumnForExport("Unite_Volume_Poids_Cat", CatchExportRow.SIZE_SAMPLE_CATEGORY + "." + Caracteristic.PROPERTY_UNIT); + addSampleCategory("Cat_Tri", CatchExportRow.SIZE_SAMPLE_CATEGORY); break; case sex: - newColumnForExport("Sexe", CatchExportRow.SEX_SAMPLE_CATEGORY); - newColumnForExport("NumOrdre_Sexe_H2", CatchExportRow.SEX_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_RANK_ORDER, TuttiCsvUtil.INTEGER); - newColumnForExport("Tot_Sexe", CatchExportRow.SEX_SAMPLE_CATEGORY); - newColumnForExport("Ech_Sexe", CatchExportRow.SEX_SAMPLE_CATEGORY); - newColumnForExport("Type_Volume_Poids_Sexe", CatchExportRow.SEX_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_WEIGHT_OR_VOL_TYPE); - newColumnForExport("Unite_Volume_Poids_Sexe", CatchExportRow.SEX_SAMPLE_CATEGORY + "." + Caracteristic.PROPERTY_UNIT); + addSampleCategory("Sexe", CatchExportRow.SEX_SAMPLE_CATEGORY); break; case maturity: - newColumnForExport("Maturite", CatchExportRow.MATURITY_SAMPLE_CATEGORY); - newColumnForExport("NumOrdre_Maturite_H2", CatchExportRow.MATURITY_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_RANK_ORDER, TuttiCsvUtil.INTEGER); - newColumnForExport("Tot_Maturite", CatchExportRow.MATURITY_SAMPLE_CATEGORY); - newColumnForExport("Ech_Maturite", CatchExportRow.MATURITY_SAMPLE_CATEGORY); - newColumnForExport("Type_Volume_Poids_Maturite", CatchExportRow.MATURITY_SAMPLE_CATEGORY + "." + ExportSampleCategory.PROPERTY_WEIGHT_OR_VOL_TYPE); - newColumnForExport("Unite_Volume_Poids_Maturite", CatchExportRow.MATURITY_SAMPLE_CATEGORY + "." + Caracteristic.PROPERTY_UNIT); + addSampleCategory("Maturite", CatchExportRow.MATURITY_SAMPLE_CATEGORY); break; case age: - newColumnForExport("Age", CatchExportRow.AGE_SAMPLE_CATEGORY); - newColumnForExport("Num_Ordre_Age_H2", CatchExportRow.AGE_SAMPLE_CATEGORY); + addSampleCategory("Age", CatchExportRow.AGE_SAMPLE_CATEGORY); break; } } // mensuration - newColumnForExport("Code_Longueur", CatchExportRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, Caracteristic.PROPERTY_ID); - newColumnForExport("Taille", CatchExportRow.FREQUENCY_LENGTH_STEP); - newColumnForExport("NumOrdre_Taille_H2", CatchExportRow.FREQUENCY_RANK_ORDER, TuttiCsvUtil.INTEGER); - newColumnForExport("Poids_Classe_Taille", CatchExportRow.FREQUENCY_WEIGHT, TuttiCsvUtil.FLOAT); - newColumnForExport("Unite_Taille", CatchExportRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC + "." + Caracteristic.PROPERTY_UNIT); - newColumnForExport("Precision_Mesure", CatchExportRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC + "." + Caracteristic.PROPERTY_PRECISION, TuttiCsvUtil.FLOAT); - newColumnForExport("Nbr", CatchExportRow.FREQUENCY_NUMBER, TuttiCsvUtil.INTEGER); + newNullableColumnForExport("Code_Longueur", CatchExportRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC + "." + Caracteristic.PROPERTY_ID); + newNullableColumnForExport("Taille", CatchExportRow.FREQUENCY_LENGTH_STEP, TuttiCsvUtil.FLOAT); + newNullableColumnForExport("NumOrdre_Taille_H2", CatchExportRow.FREQUENCY_RANK_ORDER, TuttiCsvUtil.INTEGER); + newNullableColumnForExport("Poids_Classe_Taille", CatchExportRow.FREQUENCY_WEIGHT, TuttiCsvUtil.FLOAT); + newNullableColumnForExport("Unite_Taille", CatchExportRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC + "." + Caracteristic.PROPERTY_UNIT); + newNullableColumnForExport("Precision_Mesure", CatchExportRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC + "." + Caracteristic.PROPERTY_PRECISION, TuttiCsvUtil.FLOAT); + newNullableColumnForExport("Nbr", CatchExportRow.FREQUENCY_NUMBER, TuttiCsvUtil.INTEGER); - newColumnForExport("Poids_Reference", Cruise.PROPERTY_HEAD_OF_SORT_ROOM); - newColumnForExport("Coef_Final_Elevation", Cruise.PROPERTY_COMMENT); + //TODO +// newColumnForExport("Poids_Reference", Cruise.PROPERTY_HEAD_OF_SORT_ROOM); +// newColumnForExport("Coef_Final_Elevation", Cruise.PROPERTY_COMMENT); } public void prepareRows(PersistenceService persistenceService, @@ -135,35 +114,20 @@ BatchContainer<SpeciesBatch> rootSpeciesBatch, BatchContainer<BenthosBatch> rootBenthosBatch) { - for (SpeciesBatch speciesBatch : rootSpeciesBatch.getChildren()) { CatchExportRow row = new CatchExportRow(); row.setCruise(cruise); row.setFishingOperation(operation); - ExportSampleCategory<Species> speciesCategory = new ExportSampleCategory<Species>(); - speciesCategory.setCategoryValue(speciesBatch.getSpecies()); - speciesCategory.setCategoryWeight(speciesBatch.getWeight()); - speciesCategory.setComputedWeight(speciesBatch.getComputedWeight()); - speciesCategory.setNumber(speciesBatch.getNumber()); - speciesCategory.setComputedNumber(speciesBatch.getComputedNumber()); - speciesCategory.setWeightOrVolType(WEIGHT_OR_VOL_TYPE); - speciesCategory.setRankOrder(speciesBatch.getRankOrder()); - row.setSpeciesCategory(speciesCategory); + row.setSpecies(speciesBatch.getSpecies()); + prepareRows(persistenceService, row, rows, speciesBatch); } for (BenthosBatch benthosBatch : rootBenthosBatch.getChildren()) { CatchExportRow row = new CatchExportRow(); row.setCruise(cruise); row.setFishingOperation(operation); - ExportSampleCategory<Species> speciesCategory = new ExportSampleCategory<Species>(); - speciesCategory.setCategoryValue(benthosBatch.getSpecies()); - speciesCategory.setCategoryWeight(benthosBatch.getWeight()); - speciesCategory.setComputedWeight(benthosBatch.getComputedWeight()); - speciesCategory.setNumber(benthosBatch.getNumber()); - speciesCategory.setComputedNumber(benthosBatch.getComputedNumber()); - speciesCategory.setWeightOrVolType(WEIGHT_OR_VOL_TYPE); - speciesCategory.setRankOrder(benthosBatch.getRankOrder()); - row.setSpeciesCategory(speciesCategory); + row.setSpecies(benthosBatch.getSpecies()); + prepareRows(persistenceService, row, rows, benthosBatch); } } @@ -175,9 +139,14 @@ ExportSampleCategory<Serializable> sampleCategory = new ExportSampleCategory<Serializable>(); - sampleCategory.setCategoryType(speciesBatch.getSampleCategoryType()); + SampleCategoryEnum sampleCategoryType = speciesBatch.getSampleCategoryType(); + Caracteristic caracteristic = sampleCategoryToCaracteristics.get(sampleCategoryType); + sampleCategory.setCategoryCaracteristic(caracteristic); + sampleCategory.setCategoryType(sampleCategoryType); sampleCategory.setCategoryValue(speciesBatch.getSampleCategoryValue()); sampleCategory.setCategoryWeight(speciesBatch.getSampleCategoryWeight()); + sampleCategory.setSampleWeight(speciesBatch.getWeight()); + sampleCategory.setComputedWeight(speciesBatch.getSampleCategoryComputedWeight()); sampleCategory.setNumber(speciesBatch.getNumber()); sampleCategory.setComputedNumber(speciesBatch.getComputedNumber()); @@ -201,7 +170,7 @@ } else { for (SpeciesBatchFrequency batchFrequency : speciesBatchFrequency) { CatchExportRow row = currentRow.copy(); - row.setFrequency(batchFrequency); + row.setSpeciesFrequency(batchFrequency); rows.add(row); } } @@ -218,6 +187,60 @@ CatchExportRow currentRow, List<CatchExportRow> rows, BenthosBatch benthosBatch) { + + ExportSampleCategory<Serializable> sampleCategory = + new ExportSampleCategory<Serializable>(); + SampleCategoryEnum sampleCategoryType = benthosBatch.getSampleCategoryType(); + Caracteristic caracteristic = sampleCategoryToCaracteristics.get(sampleCategoryType); + sampleCategory.setCategoryCaracteristic(caracteristic); + sampleCategory.setCategoryType(sampleCategoryType); + sampleCategory.setCategoryValue(benthosBatch.getSampleCategoryValue()); + sampleCategory.setCategoryWeight(benthosBatch.getSampleCategoryWeight()); + sampleCategory.setSampleWeight(benthosBatch.getWeight()); + + sampleCategory.setComputedWeight(benthosBatch.getSampleCategoryComputedWeight()); + sampleCategory.setNumber(benthosBatch.getNumber()); + sampleCategory.setComputedNumber(benthosBatch.getComputedNumber()); + sampleCategory.setWeightOrVolType(WEIGHT_OR_VOL_TYPE); + sampleCategory.setRankOrder(benthosBatch.getRankOrder()); + + currentRow.addCategory(sampleCategory); + + if (benthosBatch.isChildBatchsEmpty()) { + + // on a leaf, get frequencies + + List<BenthosBatchFrequency> speciesBatchFrequency = + persistenceService.getAllBenthosBatchFrequency(benthosBatch.getId()); + + if (CollectionUtils.isEmpty(speciesBatchFrequency)) { + + // no frequency + // simple denombrement + rows.add(currentRow.copy()); + } else { + for (BenthosBatchFrequency batchFrequency : speciesBatchFrequency) { + CatchExportRow row = currentRow.copy(); + row.setBenthosFrequency(batchFrequency); + rows.add(row); + } + } + + } else { + + for (BenthosBatch childBatch : benthosBatch.getChildBatchs()) { + prepareRows(persistenceService, currentRow, rows, childBatch); + } + } } + protected void addSampleCategory(String headerPrefix, String categoryName) { + newNullableColumnForExport(headerPrefix, categoryName + "." + ExportSampleCategory.PROPERTY_CATEGORY_VALUE, TuttiCsvUtil.CARACTERISTIC_VALUE_FORMATTER); + newNullableColumnForExport("Num_Ordre_" + headerPrefix + "_H2", categoryName + "." + ExportSampleCategory.PROPERTY_RANK_ORDER, TuttiCsvUtil.INTEGER); + newNullableColumnForExport("Tot_" + headerPrefix, categoryName + "." + ExportSampleCategory.PROPERTY_CATEGORY_WEIGHT, TuttiCsvUtil.FLOAT); + newNullableColumnForExport("Ech_" + headerPrefix, categoryName + "." + ExportSampleCategory.PROPERTY_SAMPLE_WEIGHT, TuttiCsvUtil.FLOAT); + newNullableColumnForExport("Type_Volume_Poids_" + headerPrefix, categoryName + "." + ExportSampleCategory.PROPERTY_WEIGHT_OR_VOL_TYPE); + newNullableColumnForExport("Unite_Volume_Poids_" + headerPrefix, categoryName + "." + ExportSampleCategory.PROPERTY_CATEGORY_CARACTERISTIC + "." + Caracteristic.PROPERTY_UNIT); + } + } \ No newline at end of file Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportRow.java 2013-05-13 09:40:03 UTC (rev 938) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportRow.java 2013-05-13 12:12:16 UTC (rev 939) @@ -25,13 +25,14 @@ */ import com.google.common.collect.Maps; +import fr.ifremer.tutti.persistence.entities.data.BenthosBatchFrequency; 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.SampleCategoryEnum; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import java.io.Serializable; @@ -48,23 +49,21 @@ private static final long serialVersionUID = 1L; - public static final String FREQUENCY_LENGTH_STEP_CARACTERISTIC = "frequencyLengthStepCaracteristic"; + public static final String FREQUENCY_LENGTH_STEP = "frequency.lengthStep"; - public static final String FREQUENCY_LENGTH_STEP = "frequencyLengthStep"; + public static final String FREQUENCY_NUMBER = "frequency.number"; - public static final String FREQUENCY_WEIGHT = "frequencyWeight"; + public static final String FREQUENCY_WEIGHT = "frequency.weight"; - public static final String FREQUENCY_NUMBER = "frequencyNumber"; + public static final String FREQUENCY_LENGTH_STEP_CARACTERISTIC = "frequency.lengthStepCaracteristic"; - public static final String FREQUENCY_RANK_ORDER = "frequencyRankOrder"; + public static final String FREQUENCY_RANK_ORDER = "frequency.rankOrder"; - public static final String SPECIES_SAMPLE_CATEGORY = "speciesSampleCategory"; - public static final String SORTED_UNSORTED_SAMPLE_CATEGORY = "sortedUnsortedSampleCategory"; public static final String SIZE_SAMPLE_CATEGORY = "sizeSampleCategory"; - public static final String SEX_SAMPLE_CATEGORY = "SexSampleCategory"; + public static final String SEX_SAMPLE_CATEGORY = "sexSampleCategory"; public static final String MATURITY_SAMPLE_CATEGORY = "maturitySampleCategory"; @@ -78,8 +77,12 @@ protected final Map<SampleCategoryEnum, ExportSampleCategory> categories = Maps.newEnumMap(SampleCategoryEnum.class); - protected SpeciesBatchFrequency frequency; + protected SpeciesBatchFrequency speciesFrequency; + protected BenthosBatchFrequency benthosFrequency; + + protected Species species; + public void setCruise(Cruise cruise) { this.cruise = cruise; } @@ -96,10 +99,14 @@ categories.put(sampleCategory.getCategoryType(), sampleCategory); } - public void setFrequency(SpeciesBatchFrequency speciesFrequency) { - this.frequency = speciesFrequency; + public void setSpeciesFrequency(SpeciesBatchFrequency speciesFrequency) { + this.speciesFrequency = speciesFrequency; } + public void setBenthosFrequency(BenthosBatchFrequency benthosFrequency) { + this.benthosFrequency = benthosFrequency; + } + public Date getBeginDate() { return cruise.getBeginDate(); } @@ -132,26 +139,10 @@ return fishingOperation.getMultirigAggregation(); } - public Caracteristic getFrequencyLengthStepCaracteristic() { - return frequency == null ? null : frequency.getLengthStepCaracteristic(); + public Object getFrequency() { + return speciesFrequency == null ? benthosFrequency : speciesFrequency; } - public Float getFrequencyLengthStep() { - return frequency == null ? null : frequency.getLengthStep(); - } - - public Float getFrequencyWeight() { - return frequency == null ? null : frequency.getWeight(); - } - - public Integer getFrequencyNumber() { - return frequency == null ? null : frequency.getNumber(); - } - - public Integer getFrequencyRankOrder() { - return frequency == null ? null : frequency.getRankOrder(); - } - public ExportSampleCategory getSpeciesSampleCategory() { return speciesCategory; } @@ -176,14 +167,23 @@ return categories.get(SampleCategoryEnum.age); } + public Species getSpecies() { + return species; + } + + public void setSpecies(Species species) { + this.species = species; + } + public CatchExportRow copy() { CatchExportRow result = new CatchExportRow(); result.setCruise(cruise); result.setFishingOperation(fishingOperation); result.setSpeciesCategory(speciesCategory); result.categories.putAll(categories); - result.setFrequency(frequency); - + result.setBenthosFrequency(benthosFrequency); + result.setSpeciesFrequency(speciesFrequency); + result.setSpecies(species); return result; } } \ No newline at end of file Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/ExportSampleCategory.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/ExportSampleCategory.java 2013-05-13 09:40:03 UTC (rev 938) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/ExportSampleCategory.java 2013-05-13 12:12:16 UTC (rev 939) @@ -25,6 +25,7 @@ */ import fr.ifremer.tutti.persistence.entities.data.SampleCategory; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import java.io.Serializable; @@ -39,6 +40,8 @@ private static final long serialVersionUID = 1L; + public static final String PROPERTY_CATEGORY_CARACTERISTIC = "categoryCaracteristic"; + public static final String PROPERTY_CATEGORY_VALUE = "categoryValue"; public static final String PROPERTY_CATEGORY_WEIGHT = "categoryWeight"; @@ -51,15 +54,22 @@ public static final String PROPERTY_WEIGHT_OR_VOL_TYPE = "weightOrVolType"; - public static final String PROPERTY_RANK_ORDER= "rankOrder"; + public static final String PROPERTY_RANK_ORDER = "rankOrder"; + public static final String PROPERTY_SAMPLE_WEIGHT = "sampleWeight"; + private Integer number; private Integer computedNumber; + private Integer rankOrder; private String weightOrVolType; + private Float sampleWeight; + + private Caracteristic categoryCaracteristic; + public Integer getNumber() { return number; } @@ -91,4 +101,20 @@ public void setRankOrder(Integer rankOrder) { this.rankOrder = rankOrder; } + + public Float getSampleWeight() { + return sampleWeight; + } + + public void setSampleWeight(Float sampleWeight) { + this.sampleWeight = sampleWeight; + } + + public void setCategoryCaracteristic(Caracteristic categoryCaracteristic) { + this.categoryCaracteristic = categoryCaracteristic; + } + + public Caracteristic getCategoryCaracteristic() { + return categoryCaracteristic; + } } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/TuttiExportService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/TuttiExportService.java 2013-05-13 09:40:03 UTC (rev 938) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/TuttiExportService.java 2013-05-13 12:12:16 UTC (rev 939) @@ -27,6 +27,7 @@ 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.tutti.TuttiBusinessException; import fr.ifremer.tutti.TuttiIOUtil; @@ -97,6 +98,8 @@ protected List<SampleCategoryEnum> samplingOrder; + protected Map<SampleCategoryEnum, Caracteristic> samplingToCaracteristic; + protected Caracteristic sampleIdCaracteristic; protected Caracteristic otolitheIdCaracteristic; @@ -131,6 +134,11 @@ String countryId = context.getConfig().getExportCountryId(); country = TuttiEntities.splitById(allCountry).get(countryId); + List<Caracteristic> allCaracteristic = persistenceService.getAllCaracteristic(); + Map<String, Caracteristic> allCaracteristicById = TuttiEntities.splitById(allCaracteristic); + + samplingToCaracteristic = Maps.newEnumMap(SampleCategoryEnum.class); + Map<Integer, SampleCategoryEnum> idMapping = SampleCategoryEnum.toIdMapping(); samplingOrder = Lists.newArrayList(); @@ -138,11 +146,18 @@ // always first sampling category samplingOrder.add(SampleCategoryEnum.sortedUnsorted); + samplingToCaracteristic.put( + SampleCategoryEnum.sortedUnsorted, + allCaracteristicById.get(SampleCategoryEnum.sortedUnsorted.getFieldValue().toString())); + for (Integer categoryId : context.getConfig().getSamplingOrderIds()) { SampleCategoryEnum categoryEnum = idMapping.get(categoryId); if (SampleCategoryEnum.sortedUnsorted != categoryEnum) { samplingOrder.add(categoryEnum); } + samplingToCaracteristic.put( + categoryEnum, + allCaracteristicById.get(categoryId.toString())); } } @@ -240,7 +255,8 @@ deadOrAliveCaracteristic, genderCaracteristic, pmfmIdCaracteristic, - samplingOrder); + samplingOrder, + samplingToCaracteristic); } protected void checkCruise(ProgressionModel progressionModel, Cruise cruise) { @@ -337,7 +353,6 @@ List<SurveyExportRow> rows = Lists.newArrayList(); exportContext.surveyModel.prepareRows(rows, cruise, country); - exportContext.surveyExport.write(rows, exportContext.surveyWriter); } catch (Exception e) { throw new TuttiTechnicalException(_("tutti.service.export.survey.error"), e); @@ -382,6 +397,10 @@ try { for (FishingOperation operation : operations) { + boolean withCatchBatch = withCatch(operation); + if (!withCatchBatch) { + continue; + } List<MarineLitterExportRow> rows = Lists.newArrayList(); exportContext.marineLitterModel.prepareRows(persistenceService, rows, cruise, operation); exportContext.marineLitterExport.write(rows, exportContext.marineLitterWriter); @@ -399,6 +418,10 @@ try { for (FishingOperation operation : operations) { + boolean withCatchBatch = withCatch(operation); + if (!withCatchBatch) { + continue; + } List<IndividualObservationExportRow> rows = Lists.newArrayList(); exportContext.individualObservationModel.prepareRows(persistenceService, rows, cruise, operation); exportContext.individualObservationExport.write(rows, exportContext.individualObservationWriter); @@ -412,7 +435,6 @@ protected void exportAccidentalCatch(ExportContext exportContext, Cruise cruise, List<FishingOperation> operations) { - try { for (FishingOperation operation : operations) { @@ -433,19 +455,11 @@ for (FishingOperation operation : operations) { - String operationId = operation.getId(); - - boolean withCatchBatch = - persistenceService.isFishingOperationWithCatchBatch( - operationId); - + boolean withCatchBatch = withCatch(operation); if (!withCatchBatch) { - if (log.isWarnEnabled()) { - log.warn("Skip fishing operation " + operationId + - " since no catchBatch associated."); - } continue; } + String operationId = operation.getId(); CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation( operationId); @@ -482,6 +496,22 @@ } } + protected boolean withCatch(FishingOperation operation) { + String operationId = operation.getId(); + + boolean withCatchBatch = + persistenceService.isFishingOperationWithCatchBatch( + operationId); + + if (!withCatchBatch) { + if (log.isWarnEnabled()) { + log.warn("Skip fishing operation " + operationId + + " since no catchBatch associated."); + } + } + return withCatchBatch; + } + protected static class ExportContext implements Closeable { File surveyFile; @@ -552,7 +582,8 @@ Caracteristic deadOrAliveCaracteristic, Caracteristic genderCaracteristic, Caracteristic pmfmIdCaracteristic, - List<SampleCategoryEnum> samplingOrder) { + List<SampleCategoryEnum> samplingOrder, + Map<SampleCategoryEnum, Caracteristic> samplingToCaracteristic) { try { @@ -596,7 +627,9 @@ csvSeparator, decoratorService); marineLitterModel = new MarineLitterExportModel(csvSeparator); - catchModel = new CatchExportModel(csvSeparator, samplingOrder); + catchModel = new CatchExportModel(csvSeparator, + samplingOrder, + samplingToCaracteristic); accidentalCatchModel = new AccidentalCatchExportModel( csvSeparator, deadOrAliveCaracteristic, Modified: trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/export/TuttiExportServiceTest.java =================================================================== --- trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/export/TuttiExportServiceTest.java 2013-05-13 09:40:03 UTC (rev 938) +++ trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/export/TuttiExportServiceTest.java 2013-05-13 12:12:16 UTC (rev 939) @@ -90,7 +90,17 @@ "2013;Campagne CGFS;;A;2;1062;Catégorie de fraicheur - produit/lot - totale - Diffusion par une Halle à marée;A - Catégorie A;\n" + "2013;Campagne CGFS;;A;2;308;Nombre d'engin - engin - totale - Déclaration d'un professionnel;2.0;"; - public static final String CATCH_CONTENT = ""; + public static final String CATCH_CONTENT = + "Annee;Serie;Serie_Partielle;Engin;Poche;Id_Operation;NumOrdre_Station;Navire;Taxon;Vrac;Num_Ordre_Vrac_H2;Tot_Vrac;Ech_Vrac;Type_Volume_Poids_Vrac;Unite_Volume_Poids_Vrac;Cat_Tri;Num_Ordre_Cat_Tri_H2;Tot_Cat_Tri;Ech_Cat_Tri;Type_Volume_Poids_Cat_Tri;Unite_Volume_Poids_Cat_Tri;Sexe;Num_Ordre_Sexe_H2;Tot_Sexe;Ech_Sexe;Type_Volume_Poids_Sexe;Unite_Volume_Poids_Sexe;Maturite;Num_Ordre_Maturite_H2;Tot_Maturite;Ech_Maturite;Type_Volume_Poids_Maturite;Unite_Volume_Poids_Maturite;Age;Num_Ordre_Age_H2;Tot_Age;Ech_Age;Type_Volume_Poids_Age;Unite_Volume_Poids_Age;Code_Longueur;Taille;NumOrdre_Taille_H2;Poids_Classe_Taille;Unite_Taille;Precision_Mesure;Nbr\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Vrac;1;100.0;;Poids;;G - Gros;1;80.0;;Poids;;Mâle;1;30.0;;Poids;;1 - Stade 1;1;10.0;5.0;Poids;;NA;;;;;;307;10.0;1;;cm;0.5;5;\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Vrac;1;100.0;;Poids;;G - Gros;1;80.0;;Poids;;Mâle;1;30.0;;Poids;;1 - Stade 1;1;10.0;5.0;Poids;;NA;;;;;;307;10.5;2;;cm;0.5;2;\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Vrac;1;100.0;;Poids;;G - Gros;1;80.0;;Poids;;Mâle;1;30.0;;Poids;;1 - Stade 1;1;10.0;5.0;Poids;;NA;;;;;;307;11.0;3;;cm;0.5;1;\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Vrac;1;100.0;;Poids;;G - Gros;1;80.0;;Poids;;Mâle;1;30.0;;Poids;;3 - Stade 3;3;10.0;;Poids;;NA;;;;;;307;11.0;1;;cm;0.5;5;\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Vrac;1;100.0;;Poids;;G - Gros;1;80.0;;Poids;;Femelle;2;50.0;30.0;Poids;;3 - Stade 3;3;10.0;;Poids;;NA;;;;;;1425;10.0;1;;cm;;5;\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Vrac;1;100.0;;Poids;;G - Gros;1;80.0;;Poids;;Femelle;2;50.0;30.0;Poids;;3 - Stade 3;3;10.0;;Poids;;NA;;;;;;1425;11.0;2;;cm;;6;\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Vrac;1;100.0;;Poids;;G - Gros;1;80.0;;Poids;;Femelle;2;50.0;30.0;Poids;;3 - Stade 3;3;10.0;;Poids;;NA;;;;;;1425;12.0;3;;cm;;7;\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Vrac;1;100.0;;Poids;;M - Moyen;2;20.0;;Poids;;Femelle;2;50.0;30.0;Poids;;3 - Stade 3;3;10.0;;Poids;;NA;;;;;;;;;;;;;\n" + + "2013;Campagne CGFS;;GOV 19.7/25.9;1;A;1;GWEN DREZ;11242;Hors Vrac;1;20.0;;Poids;;NA;;;;;;NA;;;;;;NA;;;;;;NA;;;;;;;;;;;;;"; public static final String MARINE_LITTER_CONTENT = "Annee;Serie;Serie_Partielle;Engin;Poche;Id_Operation;NumOrdre_Station;Navire;MarineLitterCategory;MarineLitterSizeCategory;Number;Weight;Comment\n" + @@ -267,7 +277,7 @@ PARAMETER_CONTENT); } - //TODO + @Test public void exportCatches() throws Exception { TuttiExportService.ExportContext exportContext =