r1441 - in trunk: tutti-persistence/src/main/java/fr/ifremer/tutti tutti-service/src/main/java/fr/ifremer/tutti/service tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri tutti-service/src/main/resources/i18n tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species
Author: tchemit Date: 2013-12-09 21:13:47 +0100 (Mon, 09 Dec 2013) New Revision: 1441 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1441 Log: - fixes #3933: [CAPTURE] probl?\195?\168me affichage // et nb chiffres apr?\195?\168s la virgule - improve import-export code (Kevin, please try to factorize your code a little more) - fix ImportPuttri dialog open(caroussel file was not reset) Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AccidentalCatchRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CaracteristicRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/IndividualObservationRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRowModel.java trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportPupitriAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPupitriAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportPupitriPopupUIHandler.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -96,7 +96,7 @@ File.class), REPORT_LOG_DIRECTORY( "tutti.report.log.directory", - n_("tutti.config.option.report.log.file.description"), + n_("tutti.config.option.report.log.directory.description"), "${tutti.data.directory}/reportlogs", File.class), DB_DIRECTORY( 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-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -27,10 +27,14 @@ import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.TuttiEntity; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import org.apache.commons.beanutils.BeanUtilsBean; import org.apache.commons.beanutils.NestedNullException; @@ -45,6 +49,7 @@ import org.nuiton.csv.ValueParserFormatter; import org.nuiton.csv.ext.AbstractExportModel; import org.nuiton.csv.ext.AbstractImportExportModel; +import org.nuiton.csv.ext.AbstractImportModel; import org.nuiton.csv.ext.RepeatableExport; import org.nuiton.decorator.Decorator; @@ -69,6 +74,49 @@ */ public class TuttiCsvUtil extends Common { + public static final ValueFormatter<Caracteristic> CARACTERISTIC_ID_FORMATTER = new ValueFormatter<Caracteristic>() { + @Override + public String format(Caracteristic value) { + return value != null ? value.getId() : ""; + } + }; + + public static final ValueFormatter<Species> SPECIES_REFERENCE_TAXON_ID_FORMATTER = new ValueFormatter<Species>() { + @Override + public String format(Species value) { + return value != null ? String.valueOf(value.getReferenceTaxonId()) : null; + } + }; + + public static final ValueFormatter<Serializable> CARACTERISTIC_VALUE_FORMATTER2 = new ValueFormatter<Serializable>() { + @Override + public String format(Serializable value) { + String result = ""; + if (value != null) { + if (CaracteristicQualitativeValue.class.isAssignableFrom(value.getClass())) { + CaracteristicQualitativeValue cqv = (CaracteristicQualitativeValue) value; + result = cqv.getId(); + + } else { + result = String.valueOf(value); + } + } + return result; + } + }; + + public static ValueFormatter<CaracteristicQualitativeValue> CARACTERISTIC_QUALITATIVE_VALUE_FORMATTER = + new ValueFormatter<CaracteristicQualitativeValue>() { + @Override + public String format(CaracteristicQualitativeValue value) { + String result = ""; + if (value != null) { + result = value.getId(); + } + return result; + } + }; + public static abstract class AbstractTuttiImportExportModel<M> extends AbstractImportExportModel<M> { public AbstractTuttiImportExportModel(char separator) { @@ -101,6 +149,22 @@ newMandatoryColumn(propertyName, propertyName, newForeignKeyValue(entityType, foreignKeyName, universe)); } + public void newSpeciesForeignKeyColumn(String propertyName, String foreignKeyName, List<Species> species) { + if (species == null) { + species = Lists.newArrayList(); + } + Map<String, Species> universe = TuttiEntities.splitByTaxonId(species); + newForeignKeyColumn(propertyName, Species.class, foreignKeyName, universe); + } + + public <E extends TuttiEntity> void newForeignKeyColumn(String propertyName, Class<E> entityType, String foreignKeyName, List<E> list) { + if (list == null) { + list = Lists.newArrayList(); + } + Map<String, E> universe = Maps.uniqueIndex(list, TuttiEntities.GET_ID); + newMandatoryColumn(propertyName, propertyName, newForeignKeyValue(entityType, foreignKeyName, universe)); + } + public <E extends TuttiEntity> ForeignKeyValue<E> newForeignKeyValue(Class<E> type, String propertyName, Map<String, E> universe) { return new ForeignKeyValue<E>(type, propertyName, universe); } @@ -122,6 +186,41 @@ } } + public static abstract class AbstractTuttiImportModel<M> extends AbstractImportModel<M> { + + public AbstractTuttiImportModel(char separator) { + super(separator); + } + + public <E extends TuttiEntity> void newForeignKeyColumn(String headerName, String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { + newMandatoryColumn(headerName, propertyName, newForeignKeyValue(entityType, foreignKeyName, universe)); + } + + public <E extends TuttiEntity> void newForeignKeyColumn(String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { + newMandatoryColumn(propertyName, propertyName, newForeignKeyValue(entityType, foreignKeyName, universe)); + } + + public <E extends TuttiEntity> ForeignKeyValue<E> newForeignKeyValue(Class<E> type, String propertyName, Map<String, E> universe) { + return new ForeignKeyValue<E>(type, propertyName, universe); + } + + public void newNotExistingValueColumn(String propertyName, Set<String> universe) { + newNotExistingValueColumn(propertyName, propertyName, universe); + } + + public void newNotExistingValueColumn(String headerName, String propertyName, Set<String> universe) { + newMandatoryColumn(headerName, propertyName, new NotExistingKeyValue(propertyName, universe)); + } + + public void newNotExistingValueColumn(String propertyName, Set<String> universe, String errorMessage) { + newNotExistingValueColumn(propertyName, propertyName, universe, errorMessage); + } + + public void newNotExistingValueColumn(String headerName, String propertyName, Set<String> universe, String errorMessage) { + newMandatoryColumn(headerName, propertyName, new NotExistingKeyValue(propertyName, universe, errorMessage)); + } + } + public static abstract class AbstractTuttiExportModel<M> extends AbstractExportModel<M> { public AbstractTuttiExportModel(char separator) { @@ -174,9 +273,26 @@ public ExportableColumn<M, String> newIndexNullableColumnForExport(String headerName, String collectionName, int order, String propertyName) { return newIndexNullableColumnForExport(headerName, collectionName, order, propertyName, TuttiCsvUtil.STRING); } - } + public static ValueParserFormatter<Float> WEIGHT_PARSER_FORMATTER = new FloatParserFormatter(null, true) { + + @Override + public String format(Float value) { + if (value != null) { + value = TuttiEntities.roundKiloGram(value); + } + return super.format(value); + } + + @Override + protected Float parseNoneEmptyValue(String value) { + Float aFloat = super.parseNoneEmptyValue(value); + float result = TuttiEntities.roundKiloGram(aFloat); + return result; + } + }; + public static ValueParserFormatter<String> newStringParserFormatter2(String defaultValue, boolean nullAllowed) { return new StringParserFormatter2(defaultValue, nullAllowed); } @@ -646,4 +762,13 @@ protected TuttiCsvUtil() { // no instance } + + public static abstract class ImportModelWithHeader<M> extends AbstractTuttiImportModel<M> { + + protected ImportModelWithHeader(char separator) { + super(separator); + } + + public abstract String[] getHeader(); + } } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AccidentalCatchRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AccidentalCatchRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AccidentalCatchRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,17 +24,12 @@ * #L% */ -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.nuiton.csv.ValueFormatter; import java.util.List; -import java.util.Map; /** * Model of a individual observation export. @@ -55,83 +50,43 @@ List<CaracteristicQualitativeValue> deadOrAliveValues) { super(separator); - ValueFormatter<CaracteristicQualitativeValue> cqvFormatter = - new ValueFormatter<CaracteristicQualitativeValue>() { - @Override - public String format(CaracteristicQualitativeValue value) { - String result = ""; - if (value != null) { - result = value.getId(); - } - return result; - } - }; - newColumnForImportExport(AccidentalCatchRow.BATCH_ID); newColumnForExport(AccidentalCatchRow.SPECIES, - new ValueFormatter<Species>() { - @Override - public String format(Species value) { - return value != null ? String.valueOf(value.getReferenceTaxonId()) : null; - } - }); + TuttiCsvUtil.SPECIES_REFERENCE_TAXON_ID_FORMATTER); - if (species == null) { - species = Lists.newArrayList(); - } - Map<String, Species> speciesMap = TuttiEntities.splitByTaxonId(species); - newForeignKeyColumn(AccidentalCatchRow.SPECIES, - Species.class, - Species.PROPERTY_REFERENCE_TAXON_ID, - speciesMap); + newSpeciesForeignKeyColumn(AccidentalCatchRow.SPECIES, + Species.PROPERTY_REFERENCE_TAXON_ID, + species); newColumnForExport(AccidentalCatchRow.GENDER, - cqvFormatter); + TuttiCsvUtil.CARACTERISTIC_QUALITATIVE_VALUE_FORMATTER); - if (genderValues == null) { - genderValues = Lists.newArrayList(); - } - Map<String, CaracteristicQualitativeValue> genderValuesMap = - Maps.uniqueIndex(genderValues, TuttiEntities.GET_ID); newForeignKeyColumn(AccidentalCatchRow.GENDER, CaracteristicQualitativeValue.class, CaracteristicQualitativeValue.PROPERTY_ID, - genderValuesMap); + genderValues); - newColumnForImportExport(AccidentalCatchRow.WEIGHT, TuttiCsvUtil.FLOAT); + newColumnForImportExport(AccidentalCatchRow.WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); newColumnForImportExport(AccidentalCatchRow.SIZE, TuttiCsvUtil.FLOAT); newColumnForExport(AccidentalCatchRow.LENGTH_STEP_CARACTERISTIC, - new ValueFormatter<Caracteristic>() { - @Override - public String format(Caracteristic value) { - return value != null ? value.getId() : ""; - } - }); + TuttiCsvUtil.CARACTERISTIC_ID_FORMATTER); - if (lengthStepCaracteristics == null) { - lengthStepCaracteristics = Lists.newArrayList(); - } - Map<String, Caracteristic> caracteristicMap = Maps.uniqueIndex(lengthStepCaracteristics, TuttiEntities.GET_ID); newForeignKeyColumn(AccidentalCatchRow.LENGTH_STEP_CARACTERISTIC, Caracteristic.class, Caracteristic.PROPERTY_ID, - caracteristicMap); + lengthStepCaracteristics); newColumnForExport(AccidentalCatchRow.DEAD_OR_ALIVE, - cqvFormatter); + TuttiCsvUtil.CARACTERISTIC_QUALITATIVE_VALUE_FORMATTER); - if (deadOrAliveValues == null) { - deadOrAliveValues = Lists.newArrayList(); - } - Map<String, CaracteristicQualitativeValue> deadOraliveValuesMap = - Maps.uniqueIndex(deadOrAliveValues, TuttiEntities.GET_ID); newForeignKeyColumn(AccidentalCatchRow.DEAD_OR_ALIVE, CaracteristicQualitativeValue.class, CaracteristicQualitativeValue.PROPERTY_ID, - deadOraliveValuesMap); + deadOrAliveValues); newColumnForImportExport(AccidentalCatchRow.COMMENT); Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CaracteristicRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CaracteristicRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CaracteristicRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,17 +24,10 @@ * #L% */ -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.nuiton.csv.ValueFormatter; -import java.io.Serializable; import java.util.List; -import java.util.Map; /** * @author kmorin <kmorin@codelutin.com> @@ -53,43 +46,18 @@ newColumnForImportExport(CaracteristicRow.BATCH_ID); newColumnForExport(CaracteristicRow.CARACTERISTIC, - new ValueFormatter<Caracteristic>() { - @Override - public String format(Caracteristic value) { - return value != null ? value.getId() : ""; - } - }); + TuttiCsvUtil.CARACTERISTIC_ID_FORMATTER); - if (caracteristics == null) { - caracteristics = Lists.newArrayList(); - } - Map<String, Caracteristic> caracteristicMap = Maps.uniqueIndex(caracteristics, TuttiEntities.GET_ID); newForeignKeyColumn(CaracteristicRow.CARACTERISTIC, Caracteristic.class, Caracteristic.PROPERTY_ID, - caracteristicMap); + caracteristics); newColumnForExport(CaracteristicRow.VALUE, - new ValueFormatter<Serializable>() { - @Override - public String format(Serializable value) { - String result = ""; - if (value != null) { - if (CaracteristicQualitativeValue.class.isAssignableFrom(value.getClass())) { - CaracteristicQualitativeValue cqv = (CaracteristicQualitativeValue) value; - result = cqv.getId(); + TuttiCsvUtil.CARACTERISTIC_VALUE_FORMATTER2); - } else { - result = String.valueOf(value); - } - } - return result; - } - }); + newMandatoryColumn(CaracteristicRow.VALUE, TuttiCsvUtil.STRING); - newMandatoryColumn(CaracteristicRow.VALUE, - TuttiCsvUtil.STRING); - } @Override Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,15 +24,10 @@ * #L% */ -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.nuiton.csv.ValueFormatter; import java.util.List; -import java.util.Map; /** * Model of a catch export. @@ -52,21 +47,12 @@ newColumnForImportExport(CatchFrequencyRow.BATCH_ID); newColumnForExport(CatchFrequencyRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, - new ValueFormatter<Caracteristic>() { - @Override - public String format(Caracteristic value) { - return value != null ? value.getId() : ""; - } - }); + TuttiCsvUtil.CARACTERISTIC_ID_FORMATTER); - if (caracteristics == null) { - caracteristics = Lists.newArrayList(); - } - Map<String, Caracteristic> caracteristicMap = Maps.uniqueIndex(caracteristics, TuttiEntities.GET_ID); newForeignKeyColumn(CatchFrequencyRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, Caracteristic.class, Caracteristic.PROPERTY_ID, - caracteristicMap); + caracteristics); newColumnForImportExport(CatchFrequencyRow.FREQUENCY_LENGTH_STEP, TuttiCsvUtil.FLOAT); @@ -75,7 +61,7 @@ TuttiCsvUtil.INTEGER); newColumnForImportExport(CatchFrequencyRow.FREQUENCY_WEIGHT, - TuttiCsvUtil.FLOAT); + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,16 +24,10 @@ * #L% */ -import com.google.common.collect.Lists; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.nuiton.csv.ValueFormatter; -import java.io.Serializable; import java.util.List; -import java.util.Map; /** * Model of a catch export. @@ -47,63 +41,34 @@ this(separator, null); } - public CatchRowModel(char separator, - List<Species> species) { + public CatchRowModel(char separator, List<Species> species) { super(separator); - ValueFormatter<Serializable> caracteristicValueFormatter = new ValueFormatter<Serializable>() { - @Override - public String format(Serializable value) { - String result = ""; - if (value != null) { - if (CaracteristicQualitativeValue.class.isAssignableFrom(value.getClass())) { - CaracteristicQualitativeValue cqv = (CaracteristicQualitativeValue) value; - result = cqv.getId(); - - } else { - result = String.valueOf(value); - } - } - return result; - } - }; - newColumnForImportExport(CatchRow.ID); newColumnForImportExport(CatchRow.PARENT_ID); newColumnForExport(CatchRow.SPECIES, - new ValueFormatter<Species>() { - @Override - public String format(Species value) { - return value != null ? String.valueOf(value.getReferenceTaxonId()) : null; - } - }); + TuttiCsvUtil.SPECIES_REFERENCE_TAXON_ID_FORMATTER); - if (species == null) { - species = Lists.newArrayList(); - } - Map<String, Species> speciesMap = TuttiEntities.splitByTaxonId(species); - newForeignKeyColumn(CatchRow.SPECIES, - Species.class, - Species.PROPERTY_REFERENCE_TAXON_ID, - speciesMap); + newSpeciesForeignKeyColumn(CatchRow.SPECIES, + Species.PROPERTY_REFERENCE_TAXON_ID, + species); - newColumnForImportExport(CatchRow.CATEGORY_ID, TuttiCsvUtil.INTEGER); newColumnForExport(CatchRow.CATEGORY_VALUE, - caracteristicValueFormatter); + TuttiCsvUtil.CARACTERISTIC_VALUE_FORMATTER2); newMandatoryColumn(CatchRow.CATEGORY_VALUE, TuttiCsvUtil.STRING); newColumnForImportExport(CatchRow.CATEGORY_WEIGHT, - TuttiCsvUtil.FLOAT); + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); newColumnForImportExport(CatchRow.WEIGHT, - TuttiCsvUtil.FLOAT); + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); newColumnForImportExport(CatchRow.NUMBER, TuttiCsvUtil.INTEGER); Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchWeightsRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -35,9 +35,12 @@ public CatchWeightsRowModel(char separator) { super(separator); - newColumnForImportExport(CatchWeightsRow.TOTAL_SORTED_WEIGHT, TuttiCsvUtil.FLOAT); - newColumnForImportExport(CatchWeightsRow.INERT_WEIGHT, TuttiCsvUtil.FLOAT); - newColumnForImportExport(CatchWeightsRow.LIVING_NOT_ITEMIZED_WEIGHT, TuttiCsvUtil.FLOAT); + newColumnForImportExport(CatchWeightsRow.TOTAL_SORTED_WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); + newColumnForImportExport(CatchWeightsRow.INERT_WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); + newColumnForImportExport(CatchWeightsRow.LIVING_NOT_ITEMIZED_WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); } @Override Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/IndividualObservationRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/IndividualObservationRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/IndividualObservationRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,16 +24,11 @@ * #L% */ -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.nuiton.csv.ValueFormatter; import java.util.List; -import java.util.Map; /** * Model of a individual observation export. @@ -55,47 +50,26 @@ newColumnForImportExport(IndividualObservationRow.BATCH_ID); newColumnForExport(IndividualObservationRow.SPECIES, - new ValueFormatter<Species>() { - @Override - public String format(Species value) { - return value != null ? String.valueOf(value.getReferenceTaxonId()) : null; - } - }); + TuttiCsvUtil.SPECIES_REFERENCE_TAXON_ID_FORMATTER); - if (species == null) { - species = Lists.newArrayList(); - } - Map<String, Species> speciesMap = TuttiEntities.splitByTaxonId(species); - newForeignKeyColumn(IndividualObservationRow.SPECIES, - Species.class, - Species.PROPERTY_REFERENCE_TAXON_ID, - speciesMap); + newSpeciesForeignKeyColumn(IndividualObservationRow.SPECIES, + Species.PROPERTY_REFERENCE_TAXON_ID, + species); - newColumnForImportExport(IndividualObservationRow.WEIGHT, TuttiCsvUtil.FLOAT); + newColumnForImportExport(IndividualObservationRow.WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); - newColumnForImportExport(IndividualObservationRow.SIZE, TuttiCsvUtil.FLOAT); + newColumnForImportExport(IndividualObservationRow.SIZE, + TuttiCsvUtil.FLOAT); newColumnForExport(IndividualObservationRow.LENGTH_STEP_CARACTERISTIC, - new ValueFormatter<Caracteristic>() { - @Override - public String format(Caracteristic value) { - return value != null ? value.getId() : ""; - } - }); + TuttiCsvUtil.CARACTERISTIC_ID_FORMATTER); - if (lengthStepCaracteristics == null) { - lengthStepCaracteristics = Lists.newArrayList(); - } - Map<String, Caracteristic> caracteristicMap = Maps.uniqueIndex(lengthStepCaracteristics, TuttiEntities.GET_ID); newForeignKeyColumn(IndividualObservationRow.LENGTH_STEP_CARACTERISTIC, Caracteristic.class, Caracteristic.PROPERTY_ID, - caracteristicMap); + lengthStepCaracteristics); -// newColumnForImportExport(IndividualObservationRow.SAMPLING_CODE); -// -// newColumnForImportExport(IndividualObservationRow.CALCIFIED_PIECE_SAMPLING_CODE); - newColumnForImportExport(IndividualObservationRow.COMMENT); } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,15 +24,10 @@ * #L% */ -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.nuiton.csv.ValueFormatter; import java.util.List; -import java.util.Map; /** * @author kmorin <morin@codelutin.com> @@ -49,49 +44,28 @@ List<CaracteristicQualitativeValue> sizeCategoryValues) { super(separator); - if (categoryValues == null) { - categoryValues = Lists.newArrayList(); - } - Map<String, CaracteristicQualitativeValue> categoryValueMap = - Maps.uniqueIndex(categoryValues, TuttiEntities.GET_ID); - - if (sizeCategoryValues == null) { - sizeCategoryValues = Lists.newArrayList(); - } - Map<String, CaracteristicQualitativeValue> sizeCategoryValueMap = - Maps.uniqueIndex(sizeCategoryValues, TuttiEntities.GET_ID); - - ValueFormatter<CaracteristicQualitativeValue> caracteristicQualitativeValueFormatter = - new ValueFormatter<CaracteristicQualitativeValue>() { - @Override - public String format(CaracteristicQualitativeValue value) { - String result = ""; - if (value != null) { - result = value.getId(); - } - return result; - } - }; - newColumnForImportExport(MarineLitterRow.BATCH_ID); - newColumnForExport(MarineLitterRow.CATEGORY, caracteristicQualitativeValueFormatter); + newColumnForExport(MarineLitterRow.CATEGORY, + TuttiCsvUtil.CARACTERISTIC_QUALITATIVE_VALUE_FORMATTER); newForeignKeyColumn(MarineLitterRow.CATEGORY, CaracteristicQualitativeValue.class, CaracteristicQualitativeValue.PROPERTY_ID, - categoryValueMap); + categoryValues); - newColumnForExport(MarineLitterRow.SIZE_CATEGORY, caracteristicQualitativeValueFormatter); + newColumnForExport(MarineLitterRow.SIZE_CATEGORY, + TuttiCsvUtil.CARACTERISTIC_QUALITATIVE_VALUE_FORMATTER); newForeignKeyColumn(MarineLitterRow.SIZE_CATEGORY, CaracteristicQualitativeValue.class, CaracteristicQualitativeValue.PROPERTY_ID, - sizeCategoryValueMap); + sizeCategoryValues); newColumnForImportExport(MarineLitterRow.NUMBER, TuttiCsvUtil.INTEGER); - newColumnForImportExport(MarineLitterRow.WEIGHT, TuttiCsvUtil.FLOAT); + newColumnForImportExport(MarineLitterRow.WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); newColumnForImportExport(MarineLitterRow.COMMENT); } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MarineLitterWeightRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -35,7 +35,8 @@ public MarineLitterWeightRowModel(char separator) { super(separator); - newColumnForImportExport(MarineLitterWeightRow.TOTAL_WEIGHT, TuttiCsvUtil.FLOAT); + newColumnForImportExport(MarineLitterWeightRow.TOTAL_WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); } @Override Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,6 +24,8 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; + import java.io.Serializable; /** @@ -70,7 +72,9 @@ protected Float weight; - public CarrouselRow() { + public boolean acceptOperation(FishingOperation operation) { + return operationCode.equals(operation.getStationNumber()) + && rigNumber.equals(operation.getMultirigAggregation()); } public String getOperationCode() { Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -34,46 +34,53 @@ * @author kmorin <kmorin@codelutin.com> * @since 1.2 */ -public class CarrouselRowModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<CarrouselRow> { +public class CarrouselRowModel extends TuttiCsvUtil.ImportModelWithHeader<CarrouselRow> { public CarrouselRowModel(char separator) { super(separator); - // import definition - newMandatoryColumn(CarrouselRow.PROPERTY_OPERATION_CODE); newMandatoryColumn(CarrouselRow.PROPERTY_RIG_NUMBER); newMandatoryColumn(CarrouselRow.PROPERTY_SPECIES_ID, new ValueParser<String>() { + @Override public String parse(String string) throws ParseException { return StringUtils.remove(string, '-').trim(); } }); newMandatoryColumn(CarrouselRow.PROPERTY_SIGN); - newMandatoryColumn(CarrouselRow.PROPERTY_DIRECTION, new ValueParser<Directions>() { + newMandatoryColumn(CarrouselRow.PROPERTY_DIRECTION, + TuttiCsvUtil.newEnumByNameParserFormatter(Directions.class)); + newMandatoryColumn(CarrouselRow.PROPERTY_WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); - public Directions parse(String string) throws ParseException { - return Directions.valueOf(string); - } - - }); - newMandatoryColumn(CarrouselRow.PROPERTY_WEIGHT, new ValueParser<Float>() { - - public Float parse(String string) throws ParseException { - return Float.parseFloat(string); - } - - }); - newIgnoredColumn(CarrouselRow.PROPERTY_FILE_ORIGIN); newIgnoredColumn(CarrouselRow.PROPERTY_DATE); newIgnoredColumn(CarrouselRow.PROPERTY_TIME); newIgnoredColumn(CarrouselRow.PROPERTY_BALANCE_ID); newIgnoredColumn(CarrouselRow.PROPERTY_TO_CONFIRM); newIgnoredColumn(CarrouselRow.PROPERTY_BOX_TYPE); + } + @Override + public String[] getHeader() { + return new String[]{ + CarrouselRow.PROPERTY_FILE_ORIGIN, + CarrouselRow.PROPERTY_DATE, + CarrouselRow.PROPERTY_TIME, + CarrouselRow.PROPERTY_BALANCE_ID, + CarrouselRow.PROPERTY_TO_CONFIRM, + CarrouselRow.PROPERTY_OPERATION_CODE, + CarrouselRow.PROPERTY_RIG_NUMBER, + CarrouselRow.PROPERTY_BOX_TYPE, + CarrouselRow.PROPERTY_SPECIES_ID, + CarrouselRow.PROPERTY_SIGN, + CarrouselRow.PROPERTY_DIRECTION, + CarrouselRow.PROPERTY_WEIGHT + }; } + @Override public CarrouselRow newEmptyInstance() { return new CarrouselRow(); } 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-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportExportService.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -26,14 +26,13 @@ import com.google.common.base.Charsets; import com.google.common.base.Function; -import com.google.common.base.Preconditions; 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; +import fr.ifremer.shared.application.ApplicationIOUtil; import fr.ifremer.shared.application.ApplicationTechnicalException; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; @@ -51,6 +50,7 @@ import fr.ifremer.tutti.service.AbstractTuttiService; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiCsvUtil; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.TuttiServiceContext; import org.apache.commons.collections.CollectionUtils; @@ -70,12 +70,12 @@ import java.io.Serializable; import java.text.DateFormat; 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._; +import static org.nuiton.i18n.I18n.n_; /** * @author kmorin <kmorin@codelutin.com> @@ -96,16 +96,6 @@ protected CaracteristicQualitativeValue unsortedCaracteristic; -// protected CaracteristicQualitativeValue maleCaracteristic; -// -// protected CaracteristicQualitativeValue femaleCaracteristic; -// -// protected CaracteristicQualitativeValue smallCaracteristic; -// -// protected CaracteristicQualitativeValue mediumCaracteristic; -// -// protected CaracteristicQualitativeValue bigCaracteristic; - protected Map<PupitriCatch.Signs, CaracteristicQualitativeValue> signsToCaracteristicValue; @Override @@ -118,7 +108,6 @@ TuttiEnumerationFile enumerationFile = persistenceService.getEnumerationFile(); - signsToCaracteristicValue = Maps.newEnumMap(PupitriCatch.Signs.class); { // sorted/unsorted caracteristic @@ -145,7 +134,6 @@ } } - /** * @param trunkFile incoming trunk file * @param carrouselFile incoming carroussle file @@ -170,61 +158,79 @@ return result; } + public void exportSpecies(List<Species> species, File target) { + SpeciesRowModel speciesCsvModel = new SpeciesRowModel(';'); + + List<SpeciesRow> rows = Lists.newArrayList(); + + if (CollectionUtils.isNotEmpty(species)) { + rows = Lists.transform(species, new Function<Species, SpeciesRow>() { + + @Override + public SpeciesRow apply(Species input) { + SpeciesRow row = new SpeciesRow(input); +// String codeFirstPart = StringUtils.substring(input.getSurveyCode(), 0, 4); +// row.setCodeFirstPart(StringUtils.rightPad(codeFirstPart, 4)); +// String codeSecondPart = StringUtils.substring(input.getSurveyCode(), 4, 7); +// row.setCodeSecondPart(StringUtils.rightPad(codeSecondPart, 3)); +// row.setScientificName(input.getName()); + return row; + } + }); + } + + try { + Export.exportToFile(speciesCsvModel, + rows, + target, + Charsets.UTF_8, + false); + + } catch (Exception e) { + throw new ApplicationTechnicalException( + _("tutti.service.pupitri.export.species.error", target), e); + } + } + protected void addFileAsAttachment(File f, CatchBatch catchBatch) { Attachment attachment = Attachments.newAttachment(); attachment.setObjectType(AttachementObjectTypeEnum.CATCH_BATCH); attachment.setObjectId(Integer.valueOf(catchBatch.getId())); attachment.setName(f.getName()); - String date = DateFormat.getDateTimeInstance().format(new Date()); + String date = DateFormat.getDateTimeInstance().format(context.currentDate()); String comment = _("tutti.service.pupitri.import.attachment.comment", date); attachment.setComment(comment); persistenceService.createAttachment(attachment, f); } - protected void importPupitriTrunk(File file, FishingOperation operation, CatchBatch catchBatch) { + protected void importPupitriTrunk(File file, + FishingOperation operation, + CatchBatch catchBatch) { if (log.isInfoEnabled()) { log.info("Will import pupitri operation [" + operation.toString() + "] trunk from file: " + file); } - char separator = ','; - TrunkRowModel csvModel = new TrunkRowModel(separator); + // prepare import - Reader reader = null; - File fileWithHeaders = null; + float sortedWeight = 0f; + float rejectedWeight = 0f; + Import<TrunkRow> importer = null; - try { - fileWithHeaders = new File(FileUtils.getTempDirectory(), file.getName()); - String headers = TrunkRow.PROPERTY_FILE_ORIGIN + separator + - TrunkRow.PROPERTY_DATE + separator + - TrunkRow.PROPERTY_TIME + separator + - TrunkRow.PROPERTY_BALANCE_ID + separator + - TrunkRow.PROPERTY_SIGN + separator + - TrunkRow.PROPERTY_OPERATION_CODE + separator + - TrunkRow.PROPERTY_RIG_NUMBER + separator + - TrunkRow.PROPERTY_DIRECTION + separator + - TrunkRow.PROPERTY_WEIGHT; + TrunkRowModel csvModel = new TrunkRowModel(','); - FileUtils.writeLines(fileWithHeaders, Collections.singletonList(headers)); - log.info(FileUtils.readFileToString(fileWithHeaders)); - FileUtils.writeLines(fileWithHeaders, FileUtils.readLines(file), true); - log.info(FileUtils.readFileToString(fileWithHeaders)); + File fileWithHeaders = createFileWithHeaders(csvModel, file); - reader = Files.newReader(fileWithHeaders, Charsets.UTF_8); - + Reader reader = ApplicationIOUtil.newReader( + fileWithHeaders, + n_("tutti.service.puttiri.carroussel.import.error")); + try { importer = Import.newImport(csvModel, reader); - Float sortedWeight = 0f; - Float rejectedWeight = 0f; - String operationNumber = operation.getStationNumber(); - String rigNumber = operation.getMultirigAggregation(); - for (TrunkRow bean : importer) { - if (bean.getOperationCode().equals(operationNumber) - && bean.getRigNumber().equals(rigNumber)) { - + if (bean.acceptOperation(operation)) { switch (bean.getDirection()) { case VAT: sortedWeight += bean.getWeight(); @@ -234,16 +240,14 @@ rejectedWeight += bean.getWeight(); } } - } - catchBatch.setCatchTotalSortedTremisWeight(sortedWeight); - catchBatch.setCatchTotalRejectedWeight(rejectedWeight); importer.close(); reader.close(); } catch (Exception e) { - throw new ApplicationTechnicalException(_("tutti.service.pupitri.import.trunk.error", operation.toString(), file), e); + throw new ApplicationTechnicalException( + _("tutti.service.pupitri.import.trunk.error", operation.toString(), file), e); } finally { IOUtils.closeQuietly(importer); @@ -251,6 +255,10 @@ FileUtils.deleteQuietly(fileWithHeaders); } + catchBatch.setCatchTotalSortedTremisWeight( + TuttiEntities.roundKiloGram(sortedWeight)); + catchBatch.setCatchTotalRejectedWeight( + TuttiEntities.roundKiloGram(rejectedWeight)); } protected int importPupitriCarrousel(File carrouselFile, @@ -262,64 +270,50 @@ "] carrousel from file: " + carrouselFile); } - int result = 0; - Reader reader = null; - File fileWithHeaders = null; + // prepare import - Import<CarrouselRow> carrouselImporter = null; - char carrouselSeparator = ','; - CarrouselRowModel carrouselCsvModel = new CarrouselRowModel(carrouselSeparator); + //FIXME tchemit-2013-12-02 Explain what does it do ? + // get the map of species by survey code + ListMultimap<String, Species> speciesBySurveyCode = ArrayListMultimap.create(); - try { + speciesBySurveyCode.putAll( + Multimaps.index(dataContext.getReferentSpeciesWithSurveyCode(), + new Function<Species, String>() { + @Override + public String apply(Species input) { + String surveyCode = String.valueOf(input.getSurveyCode()); + int end = Math.min(surveyCode.length(), 7); + return surveyCode.substring(0, end); + } + }) + ); + speciesBySurveyCode.putAll(TuttiEntities.splitByRefTaxCode(dataContext.getReferentSpecies())); - //FIXME tchemit-2013-12-02 Explain what does it do ? - // get the map of species by survey code - ListMultimap<String, Species> speciesBySurveyCode = ArrayListMultimap.create(); + // import the batches - speciesBySurveyCode.putAll( - Multimaps.index(dataContext.getReferentSpeciesWithSurveyCode(), - new Function<Species, String>() { - @Override - public String apply(Species input) { - String surveyCode = String.valueOf(input.getSurveyCode()); - int end = Math.min(surveyCode.length(), 7); - return surveyCode.substring(0, end); - } - }) - ); - speciesBySurveyCode.putAll(TuttiEntities.splitByRefTaxCode(dataContext.getReferentSpecies())); - // import the batches - String[] header = new String[]{ - CarrouselRow.PROPERTY_FILE_ORIGIN, - CarrouselRow.PROPERTY_DATE, - CarrouselRow.PROPERTY_TIME, - CarrouselRow.PROPERTY_BALANCE_ID, - CarrouselRow.PROPERTY_TO_CONFIRM, - CarrouselRow.PROPERTY_OPERATION_CODE, - CarrouselRow.PROPERTY_RIG_NUMBER, - CarrouselRow.PROPERTY_BOX_TYPE, - CarrouselRow.PROPERTY_SPECIES_ID, - CarrouselRow.PROPERTY_SIGN, - CarrouselRow.PROPERTY_DIRECTION, - CarrouselRow.PROPERTY_WEIGHT - }; - fileWithHeaders = createFileWithHeaders(carrouselFile, header, carrouselSeparator); - reader = Files.newReader(fileWithHeaders, Charsets.UTF_8); - carrouselImporter = Import.newImport(carrouselCsvModel, reader); + int result; + Float carrouselSortedWeight = 0f; - String operationNumber = operation.getStationNumber(); - String rigNumber = operation.getMultirigAggregation(); + List<PupitriCatch> catches = Lists.newArrayList(); + Set<String> notFoundSpecies = Sets.newHashSet(); - Float carrouselSortedWeight = 0f; + Import<CarrouselRow> importer = null; - List<PupitriCatch> catches = Lists.newArrayList(); - Set<String> notFoundSpecies = Sets.newHashSet(); + CarrouselRowModel carrouselCsvModel = new CarrouselRowModel(','); - for (CarrouselRow bean : carrouselImporter) { + File fileWithHeaders = createFileWithHeaders(carrouselCsvModel, + carrouselFile); + Reader reader = ApplicationIOUtil.newReader( + fileWithHeaders, + n_("tutti.service.puttiri.carroussel.import.error")); + try { + + importer = Import.newImport(carrouselCsvModel, reader); + + for (CarrouselRow bean : importer) { // is the bean from the current operation and rig ? - if (bean.getOperationCode().equals(operationNumber) - && bean.getRigNumber().equals(rigNumber)) { + if (bean.acceptOperation(operation)) { String speciesId = bean.getSpeciesId(); List<Species> speciesList = speciesBySurveyCode.get(speciesId); @@ -355,151 +349,115 @@ } } } - result = notFoundSpecies.size(); - catchBatch.setCatchTotalSortedCarousselWeight(carrouselSortedWeight); - BatchContainer<SpeciesBatch> rootSpeciesBatch = persistenceService.getRootSpeciesBatch(operation.getId(), null); - for (SpeciesBatch batch : rootSpeciesBatch.getChildren()) { - persistenceService.deleteSpeciesBatch(batch.getId()); - } + importer.close(); + reader.close(); - TuttiEnumerationFile enumerationFile = persistenceService.getEnumerationFile(); - Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class); - for (PupitriCatch pupitriCatch : catches) { + } catch (Exception e) { + DecoratorService service = getService(DecoratorService.class); + throw new ApplicationTechnicalException( + _("tutti.service.pupitri.import.carrousel.error", carrouselFile, service.getDecorator(operation).toString(operation)), e); - Species species = pupitriCatch.getSpecies(); - CaracteristicQualitativeValue cqv = pupitriCatch.isSorted() ? - sortedCaracteristic : unsortedCaracteristic; + } finally { + IOUtils.closeQuietly(importer); + IOUtils.closeQuietly(reader); + FileUtils.deleteQuietly(fileWithHeaders); + } - boolean splitSpecies = isSplitSpecies(pupitriCatch); + result = notFoundSpecies.size(); + catchBatch.setCatchTotalSortedCarousselWeight(TuttiEntities.roundKiloGram(carrouselSortedWeight)); - Map<PupitriCatch.Signs, MutableFloat> weightBySign = - pupitriCatch.getWeightBySign(); + // delete all species batches - if (splitSpecies) { + BatchContainer<SpeciesBatch> rootSpeciesBatch = persistenceService.getRootSpeciesBatch(operation.getId(), null); + for (SpeciesBatch batch : rootSpeciesBatch.getChildren()) { + persistenceService.deleteSpeciesBatch(batch.getId()); + } - // 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); + // insert all imported species batches - batch = persistenceService.createSpeciesBatch(batch, null); + TuttiEnumerationFile enumerationFile = persistenceService.getEnumerationFile(); + Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class); + for (PupitriCatch pupitriCatch : catches) { - String parentBatchId = batch.getId(); + Species species = pupitriCatch.getSpecies(); + CaracteristicQualitativeValue cqv = pupitriCatch.isSorted() ? + sortedCaracteristic : unsortedCaracteristic; - for (Map.Entry<PupitriCatch.Signs, MutableFloat> entry : weightBySign.entrySet()) { + boolean splitSpecies = isSplitSpecies(pupitriCatch); - PupitriCatch.Signs signs = entry.getKey(); - float catchWeight = entry.getValue().floatValue(); + Map<PupitriCatch.Signs, MutableFloat> weightBySign = + pupitriCatch.getWeightBySign(); - Integer categoryId = signs.getCategory(enumerationFile); - CaracteristicQualitativeValue splitCqv = signsToCaracteristicValue.get(signs); - SpeciesBatch childBatch = createSpeciesBatch( - operation, - species, - catchWeight, - categoryId, - splitCqv - ); + if (splitSpecies) { + // create a top batch + a son for each sign + if (log.isDebugEnabled()) { + log.debug("Create a categorized batches for species " + speciesDecorator.toString(species)); + } + SpeciesBatch batch = createSpeciesBatch(operation, + species, + null, + enumerationFile.PMFM_ID_SORTED_UNSORTED, + cqv); - persistenceService.createSpeciesBatch(childBatch, parentBatchId); - } + batch = persistenceService.createSpeciesBatch(batch, null); - } else { + String parentBatchId = batch.getId(); - // 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(); - } + for (Map.Entry<PupitriCatch.Signs, MutableFloat> entry : weightBySign.entrySet()) { - SpeciesBatch batch = createSpeciesBatch(operation, - species, - totalWeight, - enumerationFile.PMFM_ID_SORTED_UNSORTED, - cqv); + PupitriCatch.Signs signs = entry.getKey(); + float catchWeight = entry.getValue().floatValue(); - persistenceService.createSpeciesBatch(batch, null); + Integer categoryId = signs.getCategory(enumerationFile); + CaracteristicQualitativeValue splitCqv = signsToCaracteristicValue.get(signs); + SpeciesBatch childBatch = createSpeciesBatch( + operation, + species, + catchWeight, + categoryId, + splitCqv + ); + + + persistenceService.createSpeciesBatch(childBatch, parentBatchId); } -// 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()); -// } -// } - } + } else { - carrouselImporter.close(); - reader.close(); + // create a unique batch with sum all weights as simple weight + if (log.isDebugEnabled()) { + log.debug("Create a unique batch for species " + speciesDecorator.toString(species)); + } + float totalWeight = 0f; + for (MutableFloat weight : weightBySign.values()) { + totalWeight += weight.floatValue(); + } - } catch (Exception e) { - DecoratorService service = getService(DecoratorService.class); - throw new ApplicationTechnicalException(_("tutti.service.pupitri.import.carrousel.error", carrouselFile, service.getDecorator(operation).toString(operation)), e);//"Could not import carrousel data [" + operation.toString() + "] from file " + carrouselFile + SpeciesBatch batch = createSpeciesBatch(operation, + species, + totalWeight, + enumerationFile.PMFM_ID_SORTED_UNSORTED, + cqv); - } finally { - IOUtils.closeQuietly(carrouselImporter); - IOUtils.closeQuietly(reader); - FileUtils.deleteQuietly(fileWithHeaders); + persistenceService.createSpeciesBatch(batch, null); + } } +// carrouselImporter.close(); +// reader.close(); +// +// } catch (Exception e) { +// DecoratorService service = getService(DecoratorService.class); +// throw new ApplicationTechnicalException(_("tutti.service.pupitri.import.carrousel.error", carrouselFile, service.getDecorator(operation).toString(operation)), e);//"Could not import carrousel data [" + operation.toString() + "] from file " + carrouselFile +// +// } finally { +// IOUtils.closeQuietly(carrouselImporter); +// IOUtils.closeQuietly(reader); +// FileUtils.deleteQuietly(fileWithHeaders); +// } + return result; } @@ -519,6 +477,7 @@ PupitriCatch.Signs.BIG ); + /** * Check that the given species catch can be split. * For the moment accept for a same catch : @@ -569,37 +528,6 @@ return result; } - - public void exportSpecies(List<Species> species, File target) { - SpeciesRowModel speciesCsvModel = new SpeciesRowModel(';'); - - List<SpeciesRow> rows = Lists.newArrayList(); - - if (CollectionUtils.isNotEmpty(species)) { - rows = Lists.transform(species, new Function<Species, SpeciesRow>() { - - public SpeciesRow apply(Species input) { - Preconditions.checkNotNull(input.getSurveyCode(), - "Unable to export a species with a null survey code : " + input); - SpeciesRow row = new SpeciesRow(); - String codeFirstPart = StringUtils.substring(input.getSurveyCode(), 0, 4); - row.setCodeFirstPart(StringUtils.rightPad(codeFirstPart, 4)); - String codeSecondPart = StringUtils.substring(input.getSurveyCode(), 4, 7); - row.setCodeSecondPart(StringUtils.rightPad(codeSecondPart, 3)); - row.setScientificName(input.getName()); - return row; - } - }); - } - - try { - Export.exportToFile(speciesCsvModel, rows, target, Charsets.UTF_8, false); - - } catch (Exception e) { - throw new ApplicationTechnicalException(_("tutti.service.pupitri.export.species.error", target), e); - } - } - protected SpeciesBatch createSpeciesBatch(FishingOperation operation, Species species, Float catchWeight, @@ -610,16 +538,22 @@ batch.setSampleCategoryId(categoryId); batch.setSampleCategoryValue(cqv); batch.setSpecies(species); - batch.setSampleCategoryWeight(catchWeight); + batch.setSampleCategoryWeight( + catchWeight == null ? null : TuttiEntities.roundKiloGram(catchWeight)); return batch; } - protected File createFileWithHeaders(File file, String[] header, char separator) throws IOException { + protected File createFileWithHeaders(TuttiCsvUtil.ImportModelWithHeader<?> model, + File file) { File fileWithHeaders = new File(FileUtils.getTempDirectory(), file.getName()); - String headers = StringUtils.join(header, separator); + String headers = StringUtils.join(model.getHeader(), model.getSeparator()); - FileUtils.writeLines(fileWithHeaders, Collections.singletonList(headers)); - FileUtils.writeLines(fileWithHeaders, FileUtils.readLines(file), true); + try { + FileUtils.writeLines(fileWithHeaders, Collections.singletonList(headers)); + FileUtils.writeLines(fileWithHeaders, FileUtils.readLines(file), true); + } catch (IOException e) { + throw new ApplicationTechnicalException("Could not create file with header " + file, e); + } return fileWithHeaders; } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRow.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRow.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,6 +24,10 @@ * #L% */ +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import org.apache.commons.lang3.StringUtils; + import java.io.Serializable; /** @@ -40,34 +44,27 @@ public static final String PROPERTY_SCIENTIFIC_NAME = "scientificName"; - protected String codeFirstPart; + protected final Species species; - protected String codeSecondPart; + public SpeciesRow(Species species) { + Preconditions.checkNotNull(species.getSurveyCode(), + "Unable to export a species with a null survey code : " + species); + this.species = species; + } - protected String scientificName; - public String getCodeFirstPart() { - return codeFirstPart; + String codeFirstPart = StringUtils.substring(species.getSurveyCode(), 0, 4); + String result = StringUtils.rightPad(codeFirstPart, 4); + return result; } - public void setCodeFirstPart(String codeFirstPart) { - this.codeFirstPart = codeFirstPart; - } - public String getCodeSecondPart() { - return codeSecondPart; + String codeSecondPart = StringUtils.substring(species.getSurveyCode(), 4, 7); + String result = StringUtils.rightPad(codeSecondPart, 3); + return result; } - public void setCodeSecondPart(String codeSecondPart) { - this.codeSecondPart = codeSecondPart; - } - public String getScientificName() { - return scientificName; + return species.getName(); } - - public void setScientificName(String scientificName) { - this.scientificName = scientificName; - } - } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -25,30 +25,20 @@ */ import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * @author kmorin <kmorin@codelutin.com> * @since 1.2 */ -public class SpeciesRowModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<SpeciesRow> { +public class SpeciesRowModel extends TuttiCsvUtil.AbstractTuttiExportModel<SpeciesRow> { - private static final Log log = LogFactory.getLog(SpeciesRowModel.class); - public SpeciesRowModel(char separator) { super(separator); - // import definition - - newColumnForImportExport(SpeciesRow.PROPERTY_CODE_FIRST_PART); - newColumnForImportExport(SpeciesRow.PROPERTY_CODE_SECOND_PART); - newColumnForImportExport(SpeciesRow.PROPERTY_SCIENTIFIC_NAME); - + newColumnForExport(SpeciesRow.PROPERTY_CODE_FIRST_PART); + newColumnForExport(SpeciesRow.PROPERTY_CODE_SECOND_PART); + newColumnForExport(SpeciesRow.PROPERTY_SCIENTIFIC_NAME); } - public SpeciesRow newEmptyInstance() { - return new SpeciesRow(); - } } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRow.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRow.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -24,6 +24,8 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; + import java.io.Serializable; /** @@ -62,7 +64,9 @@ protected Float weight; - public TrunkRow() { + public boolean acceptOperation(FishingOperation operation) { + return operationCode.equals(operation.getStationNumber()) + && rigNumber.equals(operation.getMultirigAggregation()); } public String getOperationCode() { Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRowModel.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRowModel.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -25,48 +25,47 @@ */ import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.nuiton.csv.ValueParser; -import java.text.ParseException; - /** * @author kmorin <kmorin@codelutin.com> * @since 1.2 */ -public class TrunkRowModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<TrunkRow> { +public class TrunkRowModel extends TuttiCsvUtil.ImportModelWithHeader<TrunkRow> { public TrunkRowModel(char separator) { super(separator); - // import definition - newMandatoryColumn(TrunkRow.PROPERTY_OPERATION_CODE); newMandatoryColumn(TrunkRow.PROPERTY_RIG_NUMBER); - newMandatoryColumn(TrunkRow.PROPERTY_DIRECTION, new ValueParser<Directions>() { + newMandatoryColumn(TrunkRow.PROPERTY_DIRECTION, + TuttiCsvUtil.newEnumByNameParserFormatter(Directions.class)); + newMandatoryColumn(TrunkRow.PROPERTY_WEIGHT, + TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); - public Directions parse(String string) throws ParseException { - return Directions.valueOf(string); - } - - }); - newMandatoryColumn(TrunkRow.PROPERTY_WEIGHT, new ValueParser<Float>() { - - public Float parse(String string) throws ParseException { - return Float.parseFloat(string); - } - - }); - newIgnoredColumn(TrunkRow.PROPERTY_SIGN); newIgnoredColumn(TrunkRow.PROPERTY_FILE_ORIGIN); newIgnoredColumn(TrunkRow.PROPERTY_DATE); newIgnoredColumn(TrunkRow.PROPERTY_TIME); newIgnoredColumn(TrunkRow.PROPERTY_BALANCE_ID); + } + @Override + public String[] getHeader() { + return new String[]{ + TrunkRow.PROPERTY_FILE_ORIGIN, + TrunkRow.PROPERTY_DATE, + TrunkRow.PROPERTY_TIME, + TrunkRow.PROPERTY_BALANCE_ID, + TrunkRow.PROPERTY_SIGN, + TrunkRow.PROPERTY_OPERATION_CODE, + TrunkRow.PROPERTY_RIG_NUMBER, + TrunkRow.PROPERTY_DIRECTION, + TrunkRow.PROPERTY_WEIGHT + }; } + @Override public TrunkRow newEmptyInstance() { return new TrunkRow(); } - } Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-12-09 20:13:47 UTC (rev 1441) @@ -172,6 +172,7 @@ tutti.service.pupitri.import.attachment.comment= tutti.service.pupitri.import.carrousel.error= tutti.service.pupitri.import.trunk.error= +tutti.service.puttiri.carroussel.import.error= tutti.service.referential.export.gear.error= tutti.service.referential.export.person.error= tutti.service.referential.export.species.error= Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-12-09 20:13:47 UTC (rev 1441) @@ -172,6 +172,7 @@ tutti.service.pupitri.import.attachment.comment=Import Pupitri du %s tutti.service.pupitri.import.carrousel.error=Erreur lors de l'import du fichier de carrousel %2s pour le trait %1s tutti.service.pupitri.import.trunk.error=Erreur lors de l'import du fichier de trémie %2s pour le trait %1s +tutti.service.puttiri.carroussel.import.error= tutti.service.referential.export.gear.error=Erreur lors de l'export des engins dans le fichier %s tutti.service.referential.export.person.error=Erreur lors de l'export des personnes dans le fichier %s tutti.service.referential.export.species.error=Erreur lors de l'export des espèces dans le fichier %s Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportPupitriAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportPupitriAction.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportPupitriAction.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -108,7 +108,11 @@ getContext().getTuttiPupitriImportExportService(); service.exportSpecies(speciesList, file); + } + @Override + public void postSuccessAction() { + super.postSuccessAction(); sendMessage(_("tutti.flash.info.species.exported.from.protocol", file)); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPupitriAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPupitriAction.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPupitriAction.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -60,8 +60,6 @@ protected ImportPupitriPopupUI importPupitriDialog; -// protected TuttiProtocol currentProtocol; - protected PersistenceService persistenceService; protected EditFishingOperationAction editAction; @@ -74,7 +72,6 @@ public EditFishingOperationAction getEditAction() { if (editAction == null) { - //editAction = getContext().getActionFactory().createLogicAction(getHandler().getParentUi().getHandler().getParentHandler(), FishingOperationsUI parentContainer = handler.getParentContainer(FishingOperationsUI.class); editAction = getContext().getActionFactory().createLogicAction(parentContainer.getHandler(), EditFishingOperationAction.class); @@ -110,7 +107,6 @@ ); } if (result) { -// currentProtocol = getDataContext().getProtocol(); SpeciesBatchUIModel speciesBatchUIModel = getUI().getModel(); if (speciesBatchUIModel.getRowCount() > 0) { @@ -145,7 +141,6 @@ PupitriImportExportService pupitriImportExportService = getContext().getTuttiPupitriImportExportService(); -// EditCatchesUIModel model = getUI().getHandler().getParentUi().getModel(); EditCatchesUI parentContainer = handler.getParentContainer(EditCatchesUI.class); EditCatchesUIModel model = parentContainer.getModel(); @@ -170,7 +165,6 @@ super.releaseAction(); importedTrunkFile = null; importedCarrouselFile = null; -// currentProtocol = null; } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportPupitriPopupUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportPupitriPopupUIHandler.java 2013-12-09 16:12:30 UTC (rev 1440) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportPupitriPopupUIHandler.java 2013-12-09 20:13:47 UTC (rev 1441) @@ -56,6 +56,7 @@ protected void resetFields() { ui.getTrunkFile().setSelectedFilePath(null); + ui.getCarrouselFile().setSelectedFilePath(null); } public void open() {
participants (1)
-
tchemit@users.forge.codelutin.com