This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit fb11091ee74cb62e4f74ec971653ae23545bb173 Author: Kevin Morin <morin@codelutin.com> Date: Wed Sep 3 13:27:07 2014 +0200 refs #5411 [CAPTURE] Import BIGFIN --- .../fr/ifremer/tutti/service/TuttiCsvUtil.java | 4 + .../tutti/service/bigfin/BigfinDataRow.java | 96 ++++++ .../tutti/service/bigfin/BigfinDataRowModel.java | 122 ++++++++ .../tutti/service/bigfin/BigfinImportResult.java | 86 +++++ .../tutti/service/bigfin/BigfinImportService.java | 348 +++++++++++++++++++++ .../fr/ifremer/tutti/service/bigfin/Signs.java | 143 +++++++++ .../resources/i18n/tutti-service_en_GB.properties | 1 + .../resources/i18n/tutti-service_fr_FR.properties | 1 + .../filtered-resources/tutti-help-fr.properties | 26 +- .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 7 +- ...ortPsionAction.java => ImportBigfinAction.java} | 57 ++-- .../tutti/ui/swing/action/ImportPsionAction.java | 6 +- .../operation/catches/species/SpeciesBatchUI.css | 9 + .../operation/catches/species/SpeciesBatchUI.jaxx | 1 + .../catches/species/SpeciesBatchUIHandler.java | 11 +- .../species/split/SplitSpeciesBatchUIHandler.java | 8 +- .../resources/i18n/tutti-ui-swing_en_GB.properties | 9 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 9 + .../main/resources/icons/action-bigfin-import.png | Bin 0 -> 532 bytes 19 files changed, 882 insertions(+), 62 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java index 31493f8..58f5556 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java @@ -838,6 +838,10 @@ public class TuttiCsvUtil extends Common { // no instance } + /** + * + * @param <M> + */ public static abstract class ImportModelWithHeader<M> extends AbstractTuttiImportModel<M> { protected ImportModelWithHeader(char separator) { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinDataRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinDataRow.java new file mode 100644 index 0000000..111fe39 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinDataRow.java @@ -0,0 +1,96 @@ +package fr.ifremer.tutti.service.bigfin; + +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.Species; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class BigfinDataRow implements Serializable { + + public static final String PROPERTY_RECORD_ID = "recordId"; + public static final String PROPERTY_LENGTH = "length"; + public static final String PROPERTY_WEIGHT = "weight"; + public static final String PROPERTY_SPECIES = "species"; + public static final String PROPERTY_STATION = "station"; + public static final String PROPERTY_DT = "dt"; + public static final String PROPERTY_SZ_CLASS = "szClass"; + public static final String PROPERTY_GENDER = "gender"; + + protected String recordId; + protected float length; + protected Float weight; + protected Species species; + protected Integer station; + protected Date dt; + protected Signs szClass; + protected Signs gender; + + public String getRecordId() { + return recordId; + } + + public void setRecordId(String recordId) { + this.recordId = recordId; + } + + public float getLength() { + return length; + } + + public void setLength(float length) { + this.length = length; + } + + public Float getWeight() { + return weight; + } + + public void setWeight(Float weight) { + this.weight = weight; + } + + public Species getSpecies() { + return species; + } + + public void setSpecies(Species species) { + this.species = species; + } + + public Integer getStation() { + return station; + } + + public void setStation(Integer station) { + this.station = station; + } + + public Date getDt() { + return dt; + } + + public void setDt(Date dt) { + this.dt = dt; + } + + public Signs getSzClass() { + return szClass; + } + + public void setSzClass(Signs szClass) { + this.szClass = szClass; + } + + public Signs getGender() { + return gender; + } + + public void setGender(Signs gender) { + this.gender = gender; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinDataRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinDataRowModel.java new file mode 100644 index 0000000..d16de6d --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinDataRowModel.java @@ -0,0 +1,122 @@ +package fr.ifremer.tutti.service.bigfin; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.persistence.entities.referential.Speciess; +import fr.ifremer.tutti.service.TuttiCsvUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nuiton.csv.Common; +import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.csv.ValueParser; + +import java.text.ParseException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class BigfinDataRowModel extends TuttiCsvUtil.AbstractTuttiImportModel<BigfinDataRow> { + + public BigfinDataRowModel(char separator, + final Map<String, Species> speciesBySurveyCode) { + + super(separator); + + final Map<String, Species> foundSpecies = new HashMap<>(); + + newMandatoryColumn("length(mm)", BigfinDataRow.PROPERTY_LENGTH, Common.PRIMITIVE_FLOAT); + newMandatoryColumn("weight(g)", BigfinDataRow.PROPERTY_WEIGHT, Common.FLOAT); + +// code espèce = code campagne (saisie libre donc risque fort de mauvaise saisie) + newMandatoryColumn("species", BigfinDataRow.PROPERTY_SPECIES, new ValueParser<Object>() { + @Override + public Object parse(String value) throws ParseException { + Species result = null; + if (StringUtils.isNotBlank(value)) { + // if code already found + result = foundSpecies.get(value); + + //if not found, look for it in the survey codes + if (result == null) { + result = speciesBySurveyCode.get(value); + } + +// Si on ne trouve pas une espèce de code campagne XXXXXXX, on essaye alors avec le code XXXX-XXX et vice-versa. + if (result == null) { + String alternativeSpeciesCode = value; + int i = alternativeSpeciesCode.indexOf('-'); + if (i < 0) { + alternativeSpeciesCode = alternativeSpeciesCode.substring(0, 4) + + '-' + alternativeSpeciesCode.substring(4); + + } else { + alternativeSpeciesCode = alternativeSpeciesCode.substring(0, i) + alternativeSpeciesCode.substring(i + 1); + } + result = speciesBySurveyCode.get(alternativeSpeciesCode); + } + // record the code in the found codes + foundSpecies.put(value, result); + } + return result; + } + }); + +// n° de la station (non importé mais utile pour contrôle à l'import) + newMandatoryColumn("station", BigfinDataRow.PROPERTY_STATION, Common.INTEGER); +// date et heure de l'enregistrement (non importé mais utile pour contrôle à l'import) + newMandatoryColumn("Dt", BigfinDataRow.PROPERTY_DT, new Common.DateValue("MM/dd/yy HH:mm")); + +// sz class : si code différents de 0 1 ou 2 alors tout bloquer et donner l'id des lignes en anomalies + newMandatoryColumn("sz class", + BigfinDataRow.PROPERTY_SZ_CLASS, + new ValueParser<Signs>() { + @Override + public Signs parse(String value) throws ParseException { + Signs result = Signs.getSign(value.toUpperCase()); + if (result == null) { + throw new ParseException("Could not parse Sign value: " + value, 0); + } + return result; + } + }); + + newMandatoryColumn("gender", + BigfinDataRow.PROPERTY_GENDER, + new ValueParser<Signs>() { + @Override + public Signs parse(String value) throws ParseException { + Signs result = Signs.getSign(value.toUpperCase()); + if (result == null) { + throw new ParseException("Could not parse Sign value: " + value, 0); + } + return result; + } + }); + + newIgnoredColumn("Record_id"); + newIgnoredColumn("cruise"); + newIgnoredColumn("pan"); + newIgnoredColumn("text"); + } + + @Override + public BigfinDataRow newEmptyInstance() { + return new BigfinDataRow(); + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportResult.java new file mode 100644 index 0000000..287650e --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportResult.java @@ -0,0 +1,86 @@ +package fr.ifremer.tutti.service.bigfin; + +/* + * #%L + * Tutti :: Service + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.Lists; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * Created on 1/20/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 3.0.1 + */ +public class BigfinImportResult { + + protected final File importFile; + + protected final List<String> errors = new ArrayList<>(); + + protected int nbSortedImported; + + protected int nbUnsortedImported; + + public BigfinImportResult(File importFile) { + this.importFile = importFile; + } + + public File getImportFile() { + return importFile; + } + + public int getNbSortedImported() { + return nbSortedImported; + } + + public int getNbUnsortedImported() { + return nbUnsortedImported; + } + + public List<String> getErrors() { + return errors; + } + + void incrementNbSortedImported() { + this.nbSortedImported++; + } + + void incrementNbUnsortedImported() { + this.nbUnsortedImported++; + } + + void addError(String error) { + errors.add(error); + } + + void addErrors(List<String> errors) { + this.errors.addAll(errors); + } + + public boolean isDone() { + return errors.isEmpty(); + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportService.java new file mode 100644 index 0000000..161e14b --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/BigfinImportService.java @@ -0,0 +1,348 @@ +package fr.ifremer.tutti.service.bigfin; + +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.HashMultimap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.Sets; +import com.google.common.io.Files; +import fr.ifremer.adagio.core.dao.referential.pmfm.ObjectTypeCode2; +import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId; +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId2; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Attachment; +import fr.ifremer.tutti.persistence.entities.data.Attachments; +import fr.ifremer.tutti.persistence.entities.data.BatchContainer; +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchBean; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequencyBean; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequencys; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValues; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.psionimport.PsionImportResult; +import fr.ifremer.tutti.util.Weights; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.Import; +import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.jaxx.application.ApplicationBusinessException; + +import java.io.File; +import java.io.Reader; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class BigfinImportService extends AbstractTuttiService { + + private static final Log log = LogFactory.getLog(BigfinImportService.class); + + protected PersistenceService persistenceService; + + protected Map<Signs, CaracteristicQualitativeValue> signsToCaracteristicValue; + + protected Map<String, SpeciesProtocol> speciesProtocolBySurveyCode; + private CaracteristicQualitativeValue sortedCaracteristic; + + + @Override + public void setServiceContext(TuttiServiceContext context) { + super.setServiceContext(context); + persistenceService = getService(PersistenceService.class); + + signsToCaracteristicValue = Maps.newEnumMap(Signs.class); + + { // sorted/unsorted caracteristic + Caracteristic caracteristic = + persistenceService.getSortedUnsortedCaracteristic(); + + sortedCaracteristic = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, QualitativeValueId.SORTED_VRAC.getValue()); + } + + { // size caracteristic + Caracteristic caracteristic = persistenceService.getSizeCategoryCaracteristic(); + Signs.NOT_SIZED.registerSign(caracteristic, signsToCaracteristicValue); + Signs.SMALL.registerSign(caracteristic, signsToCaracteristicValue); + Signs.BIG.registerSign(caracteristic, signsToCaracteristicValue); + } + + { // sex caracteristic + Caracteristic caracteristic = persistenceService.getSexCaracteristic(); + Signs.NOT_SEXED.registerSign(caracteristic, signsToCaracteristicValue); + Signs.MALE.registerSign(caracteristic, signsToCaracteristicValue); + Signs.FEMALE.registerSign(caracteristic, signsToCaracteristicValue); + } + + } + + public BigfinImportResult importFile(File bigfinFile, FishingOperation operation, CatchBatch catchBatch) { + + Preconditions.checkNotNull(bigfinFile); + Preconditions.checkArgument(bigfinFile.exists(), "Bigfin file " + bigfinFile + " does not exist."); + + TuttiProtocol protocol = persistenceService.getProtocol(); + + if (protocol == null) { + throw new ApplicationBusinessException(t("tutti.service.bigfinimport.error.no.protocol")); + } + + List<Species> allReferentSpecies = persistenceService.getAllReferentSpecies(); + List<Species> allSpeciesWithSurveyCode = persistenceService.getReferentSpeciesWithSurveyCode(allReferentSpecies); + + Map<String, Species> speciesBySurveyCode = Maps.newTreeMap(); + for (Species species : allSpeciesWithSurveyCode) { + String surveyCode = species.getSurveyCode(); + if (StringUtils.isNotBlank(surveyCode)) { + speciesBySurveyCode.put(surveyCode, species); + + } else { + speciesBySurveyCode.put(species.getRefTaxCode(), species); + } + } + speciesProtocolBySurveyCode = Maps.newTreeMap(); + + for (SpeciesProtocol speciesProtocol : protocol.getSpecies()) { + if (speciesProtocol.getSpeciesSurveyCode() != null) { + speciesProtocolBySurveyCode.put(speciesProtocol.getSpeciesSurveyCode(), speciesProtocol); + + } else { + speciesProtocolBySurveyCode.put(speciesProtocol.getSpeciesReferenceTaxonId().toString(), speciesProtocol); + } + + } + + BatchContainer<SpeciesBatch> rootSpeciesBatch = persistenceService.getRootSpeciesBatch(operation.getId(), false); + Set<Species> alreadyUsedSpecies = Sets.newHashSet(); + for (SpeciesBatch speciesBatch : rootSpeciesBatch.getChildren()) { + alreadyUsedSpecies.add(speciesBatch.getSpecies()); + } + + Set<Species> speciesNotrecognized = new HashSet<>(); + Set<Species> speciesInProtocolButWithoutLengthStepPmfmId = new HashSet<>(); + + List<BigfinDataRow> rows = new ArrayList<>(); + // load model + BigfinDataRowModel importModel = new BigfinDataRowModel(';', speciesBySurveyCode); + Reader reader = null; + Import<BigfinDataRow> importer = null; + try { + reader = Files.newReader(bigfinFile, Charsets.UTF_8); + importer = Import.newImport(importModel, reader); + + for (BigfinDataRow bean : importer) { + + Species species = bean.getSpecies(); + + // check if the station is the one of the operation + // and do not check again a species that has not been recognized before + Integer station = bean.getStation(); + Date dt = bean.getDt(); + if (station != null && station.toString().equals(operation.getStationNumber()) + && dt != null && dt.after(operation.getGearShootingStartDate()) && dt.before(operation.getGearShootingEndDate())) { + + if (species == null) { +// bloquer tout si un "species" ne match pas le référentiel de Tutti : lister dans ce cas les codes non reconnus + speciesNotrecognized.add(species); + + } else { +// bloquer toute espèce reconnue du protocole mais qui n'a pas de méthode de mesure + SpeciesProtocol speciesProtocol = speciesProtocolBySurveyCode.get(species.getSurveyCode()); + if (speciesProtocol != null && speciesProtocol.getLengthStepPmfmId() == null) { + speciesInProtocolButWithoutLengthStepPmfmId.add(species); + + } else if (alreadyUsedSpecies.contains(species)) { + // TODO on fait quoi ? + + } else { + rows.add(bean); + } + } + } + } + + } catch (ImportRuntimeException e) { + throw e; + + } catch (Exception e) { + throw new ImportRuntimeException("Could not import bigfin data from file " + bigfinFile, e); + + } finally { + IOUtils.closeQuietly(importer); + IOUtils.closeQuietly(reader); + } + + BigfinImportResult result = new BigfinImportResult(bigfinFile); + + if (!speciesInProtocolButWithoutLengthStepPmfmId.isEmpty() || !speciesNotrecognized.isEmpty()) { + //TODO kmorin 20140901 return errors + + + } else { + Multimap<Species, BigfinDataRow> rowsBySpecies = Multimaps.index(rows, new Function<BigfinDataRow, Species>() { + @Override + public Species apply(BigfinDataRow bigfinDataRow) { + return bigfinDataRow.getSpecies(); + } + }); + + for (Species species : rowsBySpecies.keySet()) { + + SpeciesBatch batch = new SpeciesBatchBean(); + batch.setSpecies(species); + batch.setFishingOperation(operation); + //TODO check in text if hv + batch.setSampleCategoryId(PmfmId.SORTED_UNSORTED.getValue()); + batch.setSampleCategoryValue(sortedCaracteristic); + + batch = persistenceService.createSpeciesBatch(batch, null); + + // new sorted batch imported + result.incrementNbSortedImported(); + + Collection<BigfinDataRow> speciesRows = rowsBySpecies.get(species); + Multimap<CaracteristicQualitativeValue, BigfinDataRow> rowsBySize = + Multimaps.index(speciesRows, new Function<BigfinDataRow, CaracteristicQualitativeValue>() { + @Override + public CaracteristicQualitativeValue apply(BigfinDataRow bigfinDataRow) { + CaracteristicQualitativeValue result = signsToCaracteristicValue.get(bigfinDataRow.getSzClass()); + return result; + } + }); + + for (CaracteristicQualitativeValue size : rowsBySize.keySet()) { + SpeciesBatch sizeBatch = new SpeciesBatchBean(); + sizeBatch.setSpecies(species); + sizeBatch.setFishingOperation(operation); + sizeBatch.setSampleCategoryId(PmfmId.SIZE_CATEGORY.getValue()); + sizeBatch.setSampleCategoryValue(size); + sizeBatch = persistenceService.createSpeciesBatch(sizeBatch, batch.getId()); + + Collection<BigfinDataRow> sizeRows = rowsBySize.get(size); + Multimap<CaracteristicQualitativeValue, BigfinDataRow> rowsByGender = + Multimaps.index(sizeRows, new Function<BigfinDataRow, CaracteristicQualitativeValue>() { + @Override + public CaracteristicQualitativeValue apply(BigfinDataRow bigfinDataRow) { + CaracteristicQualitativeValue result = signsToCaracteristicValue.get(bigfinDataRow.getGender()); + return result; + } + }); + for (CaracteristicQualitativeValue gender : rowsByGender.keySet()) { + Collection<BigfinDataRow> bigfinDataRows = rowsByGender.get(gender); + SpeciesBatch genderBatch = new SpeciesBatchBean(); + genderBatch.setSpecies(species); + genderBatch.setFishingOperation(operation); + genderBatch.setSampleCategoryId(PmfmId.SEX.getValue()); + genderBatch.setSampleCategoryValue(gender); + + genderBatch = persistenceService.createSpeciesBatch(genderBatch, sizeBatch.getId()); + + List<SpeciesBatchFrequency> frequencies = createFrequencies(genderBatch, bigfinDataRows); + persistenceService.saveSpeciesBatchFrequency(genderBatch.getId(), frequencies); + + } + } + } + } + + addFileAsAttachment(bigfinFile, catchBatch); + + return result; + } + + protected List<SpeciesBatchFrequency> createFrequencies(SpeciesBatch batch, Collection<BigfinDataRow> rows) { + SpeciesProtocol speciesProtocol = speciesProtocolBySurveyCode.get(batch.getSpecies().getSurveyCode()); + Caracteristic lengthStepPmfm = persistenceService.getCaracteristic(Integer.parseInt(speciesProtocol.getLengthStepPmfmId())); + //TODO on fait quoi si c'est nul? + String unit = lengthStepPmfm.getUnit(); + Float precision = lengthStepPmfm.getPrecision(); + if (precision == null) { + precision = 1f; + } + + // board measurements are in mm + + ListMultimap<Float, Float> weightsByLengthStep = ArrayListMultimap.create(); + for (BigfinDataRow row : rows) { + Float weight = row.getWeight(); + float length = row.getLength(); + + if ("cm".equals(unit)) { + // measurement in cm asked + length = length / 10; + } + + int intValue = (int) (length * 10); + int intStep = (int) (precision * 10); + int correctIntStep = intValue - (intValue % intStep); + float lengthStep = correctIntStep / 10f; + + weightsByLengthStep.put(lengthStep, weight); + } + + List<SpeciesBatchFrequency> frequencies = new ArrayList<>(); + for (Float lengthStep : weightsByLengthStep.keySet()) { + SpeciesBatchFrequency frequency = SpeciesBatchFrequencys.newSpeciesBatchFrequency(); + frequencies.add(frequency); + + frequency.setBatch(batch); + frequency.setLengthStep(lengthStep); + frequency.setLengthStepCaracteristic(lengthStepPmfm); + + Collection<Float> weights = weightsByLengthStep.get(lengthStep); + frequency.setNumber(weights.size()); + + Float totalWeight = 0f; + for (Float weight : weights) { + if (weight != null) { + totalWeight += weight; + } + } + // convert grams to kilograms + totalWeight = Weights.roundKiloGram(totalWeight / 1000); + frequency.setWeight(totalWeight); + } + return frequencies; + } + + protected void addFileAsAttachment(File f, CatchBatch catchBatch) { + Attachment attachment = Attachments.newAttachment(); + attachment.setObjectType(ObjectTypeCode2.CATCH_BATCH); + attachment.setObjectId(Integer.valueOf(catchBatch.getId())); + attachment.setName(f.getName()); + String date = DateFormat.getDateTimeInstance().format(context.currentDate()); + String comment = t("tutti.service.bigfin.import.attachment.comment", date); + attachment.setComment(comment); + persistenceService.createAttachment(attachment, f); + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/Signs.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/Signs.java new file mode 100644 index 0000000..524884d --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/bigfin/Signs.java @@ -0,0 +1,143 @@ +package fr.ifremer.tutti.service.bigfin; + +/* + * #%L + * Tutti :: Service + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId2; +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId2; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValues; + +import java.util.Map; + +/** + * Created on 5/14/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 3.4.2 + */ +public enum Signs { + + // sexe, M= mâle ; F = femelle ; not set = non sexé + NOT_SEXED("NOT SET") { + @Override + public Integer getCategory() { + return PmfmId2.SEX.getValue(); + } + + @Override + public Integer getQualitativeValueId() { + return QualitativeValueId2.SEX_UNDEFINED.getValue(); + } + }, + MALE("M") { + @Override + public Integer getCategory() { + return PmfmId2.SEX.getValue(); + } + + @Override + public Integer getQualitativeValueId() { + return QualitativeValueId.SEX_MALE.getValue(); + } + }, + FEMALE("F") { + @Override + public Integer getCategory() { + return PmfmId2.SEX.getValue(); + } + + @Override + public Integer getQualitativeValueId() { + return QualitativeValueId.SEX_FEMALE.getValue(); + } + }, + +// classe de taille, 1 = petit ; 2 = gros ; 0 = pas de classe de taille (saisie libre donc risque fort de mauvaise saisie) + NOT_SIZED("0") { + @Override + public Integer getCategory() { + return PmfmId2.SIZE_CATEGORY.getValue(); + } + + @Override + public Integer getQualitativeValueId() { + return QualitativeValueId2.NOT_SIZED.getValue(); + } + }, + SMALL("1") { + @Override + public Integer getCategory() { + return PmfmId2.SIZE_CATEGORY.getValue(); + } + + @Override + public Integer getQualitativeValueId() { + return QualitativeValueId.SIZE_SMALL.getValue(); + } + }, + BIG("2") { + @Override + public Integer getCategory() { + return PmfmId2.SIZE_CATEGORY.getValue(); + } + + @Override + public Integer getQualitativeValueId() { + return QualitativeValueId.SIZE_BIG.getValue(); + } + }; + + private String sign; + + Signs(String sign) { + this.sign = sign; + } + + public String getSign() { + return sign; + } + + public static Signs getSign(String sign) { + Signs result = null; + for (Signs s : values()) { + if (s.sign.equals(sign)) { + result = s; + break; + } + } + return result; + } + + public abstract Integer getCategory(); + + public abstract Integer getQualitativeValueId(); + + public void registerSign(Caracteristic caracteristic, + Map<Signs, CaracteristicQualitativeValue> map) { + Integer valueId = getQualitativeValueId(); + CaracteristicQualitativeValue result = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, valueId); + map.put(this, result); + } +} diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index 60a31ec..7b41d9c 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -46,6 +46,7 @@ tutti.report.step.export.fishingOperation= tutti.report.step.generateReport= tutti.report.step.load.fishingOperation= tutti.service.arp.import.attachment.comment= +tutti.service.bigfinimport.error.no.protocol= tutti.service.compressZipFile.error= tutti.service.context.serviceInstanciation.error= tutti.service.csv.parse.entityNotFound= diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index 1cea1ff..beaca46 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -43,6 +43,7 @@ tutti.propety.vessel.nation.registrationCode=%s (nat.) tutti.report.step.export.fishingOperation=Exporter le trait sélectionné tutti.report.step.generateReport=Générer le rapport tutti.report.step.load.fishingOperation=Charger le trait sélectionné +tutti.service.bigfinimport.error.no.protocol= tutti.service.compressZipFile.error=Erreur lors de la compression du dossier %1s dans le fichier %2s tutti.service.context.serviceInstanciation.error=Erreur lors de l'instanciation du service %s tutti.service.csv.parse.entityNotFound=L'entité de type %1s avec la propriété %2s de valeur %3s n'a pas été trouvée diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index f17b3dc..1ea1e8f 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -1,28 +1,5 @@ -### -# #%L -# Tutti :: UI -# $Id:$ -# $HeadURL:$ -# %% -# Copyright (C) 2012 - 2014 Ifremer -# %% -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public -# License along with this program. If not, see -# <http://www.gnu.org/licenses/gpl-3.0.html>. -# #L% -### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Thu Jul 10 09:24:16 CEST 2014 +#Tue Sep 02 15:54:43 CEST 2014 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -283,6 +260,7 @@ tutti.editSpeciesBatch.action.createBatch.help=editFishingOperation.html\#captur tutti.editSpeciesBatch.action.createMelag.help=editFishingOperation.html\#captureEspecesActions tutti.editSpeciesBatch.action.editFrequencies.help=editFishingOperation.html\#captureEspecesActions tutti.editSpeciesBatch.action.exportMultiPost.help=editFishingOperation.html\#captureEspecesActions +tutti.editSpeciesBatch.action.importBigfin.help=editFishingOperation.html\#captureEspecesActions tutti.editSpeciesBatch.action.importMultiPost.help=editFishingOperation.html\#captureEspecesActions tutti.editSpeciesBatch.action.importPsion.help=editFishingOperation.html\#captureEspecesActions tutti.editSpeciesBatch.action.importPupitri.help=editFishingOperation.html\#captureEspecesActions diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java index 53a26f2..06c5917 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java @@ -33,6 +33,7 @@ import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.TuttiServiceContext; import fr.ifremer.tutti.service.ValidationService; +import fr.ifremer.tutti.service.bigfin.BigfinImportService; import fr.ifremer.tutti.service.catches.ValidateCruiseOperationsService; import fr.ifremer.tutti.service.catches.WeightCleaningService; import fr.ifremer.tutti.service.catches.WeightComputingService; @@ -667,10 +668,14 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage return serviceContext.getService(PupitriImportExportService.class); } - public PsionImportService getTuttiPsionImportExportService() { + public PsionImportService getTuttiPsionImportService() { return serviceContext.getService(PsionImportService.class); } + public BigfinImportService getTuttiBigfinImportService() { + return serviceContext.getService(BigfinImportService.class); + } + public ReferentialImportExportService getTuttiReferentialImportExportService() { return serviceContext.getService(ReferentialImportExportService.class); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPsionAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportBigfinAction.java similarity index 67% copy from tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPsionAction.java copy to tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportBigfinAction.java index ca6afc0..729da55 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPsionAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportBigfinAction.java @@ -22,11 +22,19 @@ package fr.ifremer.tutti.ui.swing.action; * #L% */ +import com.google.common.base.Joiner; +import com.google.common.collect.Lists; +import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId2; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.bigfin.BigfinImportResult; +import fr.ifremer.tutti.service.bigfin.BigfinImportService; import fr.ifremer.tutti.service.psionimport.PsionImportResult; import fr.ifremer.tutti.service.psionimport.PsionImportService; +import fr.ifremer.tutti.service.pupitri.PupitriImportExportService; +import fr.ifremer.tutti.service.pupitri.PupitriImportResult; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; @@ -34,35 +42,34 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.species.ImportPupitri import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUIModel; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; +import javax.swing.*; import java.io.File; +import java.util.List; import static org.nuiton.i18n.I18n.t; /** - * Created on 1/21/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 3.1 + * @author tchemit <chemit@codelutin.com> + * @since 1.0 */ -public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, SpeciesBatchUI, SpeciesBatchUIHandler> { +public class ImportBigfinAction extends AbstractTuttiAction<SpeciesBatchUIModel, SpeciesBatchUI, SpeciesBatchUIHandler> { - protected File importedTrunkFile; - - protected ImportPupitriPopupUI importPupitriDialog; + protected File importedBigfinFile; protected PersistenceService persistenceService; protected EditFishingOperationAction editAction; - protected PsionImportResult importResult; + protected BigfinImportResult importResult; - public ImportPsionAction(SpeciesBatchUIHandler handler) { + public ImportBigfinAction(SpeciesBatchUIHandler handler) { super(handler, false); persistenceService = getContext().getPersistenceService(); - importPupitriDialog = new ImportPupitriPopupUI(handler.getContext()); } + public EditFishingOperationAction getEditAction() { if (editAction == null) { FishingOperationsUI parentContainer = handler.getParentContainer(FishingOperationsUI.class); @@ -78,19 +85,19 @@ public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, if (result) { // choose file to import - importedTrunkFile = chooseFile( - t("tutti.editSpeciesBatch.action.title.choose.importPsionFile"), - t("tutti.editSpeciesBatch.action.choosePsionFile.import"), - "^.*\\.IWA", t("tutti.common.file.iwa")); + importedBigfinFile = chooseFile( + t("tutti.editSpeciesBatch.action.title.choose.importBigfinFile"), + t("tutti.editSpeciesBatch.action.chooseBigfinFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); - result = importedTrunkFile != null; + result = importedBigfinFile != null; } return result; } @Override public void doAction() throws Exception { - PsionImportService importService = getContext().getTuttiPsionImportExportService(); + BigfinImportService importService = getContext().getTuttiBigfinImportService(); EditCatchesUI parentContainer = handler.getParentContainer(EditCatchesUI.class); EditCatchesUIModel model = parentContainer.getModel(); @@ -99,9 +106,7 @@ public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, CatchBatch catchBatch = model.toEntity(); // import - importResult = importService.importFile(importedTrunkFile, - operation, - catchBatch); + importResult = importService.importFile(importedBigfinFile, operation, catchBatch); if (importResult.isDone()) { @@ -113,7 +118,7 @@ public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, @Override public void releaseAction() { super.releaseAction(); - importedTrunkFile = null; + importedBigfinFile = null; } @Override @@ -122,7 +127,7 @@ public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, if (importResult.isDone()) { - sendMessage(t("tutti.editSpeciesBatch.action.importPsion.success", + sendMessage(t("tutti.editSpeciesBatch.action.importBigfin.success", importResult.getNbSortedImported(), importResult.getNbUnsortedImported())); } else { @@ -131,12 +136,12 @@ public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, sb.append("<li>").append(s).append("</li>"); } displayWarningMessage( - t("tutti.editSpeciesBatch.action.importPsion.no.matching.fishingOperation.title"), + t("tutti.editSpeciesBatch.action.importBigfin.no.matching.fishingOperation.title"), "<html><body>" + - t("tutti.editSpeciesBatch.action.importPsion.no.matching.fishingOperation", sb.toString()) + - "</body></html>" + t("tutti.editSpeciesBatch.action.importBigfin.no.matching.fishingOperation", sb.toString()) + + "</body></html>" ); - sendMessage(t("tutti.editSpeciesBatch.action.importPsion.no.matching.data")); + sendMessage(t("tutti.editSpeciesBatch.action.importBigfin.no.matching.data")); } } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPsionAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPsionAction.java index ca6afc0..230d3e5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPsionAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportPsionAction.java @@ -30,7 +30,6 @@ import fr.ifremer.tutti.service.psionimport.PsionImportService; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.ImportPupitriPopupUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUIModel; @@ -49,8 +48,6 @@ public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, protected File importedTrunkFile; - protected ImportPupitriPopupUI importPupitriDialog; - protected PersistenceService persistenceService; protected EditFishingOperationAction editAction; @@ -60,7 +57,6 @@ public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, public ImportPsionAction(SpeciesBatchUIHandler handler) { super(handler, false); persistenceService = getContext().getPersistenceService(); - importPupitriDialog = new ImportPupitriPopupUI(handler.getContext()); } public EditFishingOperationAction getEditAction() { @@ -90,7 +86,7 @@ public class ImportPsionAction extends AbstractTuttiAction<SpeciesBatchUIModel, @Override public void doAction() throws Exception { - PsionImportService importService = getContext().getTuttiPsionImportExportService(); + PsionImportService importService = getContext().getTuttiPsionImportService(); EditCatchesUI parentContainer = handler.getParentContainer(EditCatchesUI.class); EditCatchesUIModel model = parentContainer.getModel(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css index 1cb7d30..a8652cf 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css @@ -259,6 +259,15 @@ ComputableDataEditor { _help: {"tutti.editSpeciesBatch.action.importPsion.help"}; } +#importBigfinButton { + actionIcon: bigfin-import; + text: "tutti.editSpeciesBatch.action.importBigfin"; + toolTipText: "tutti.editSpeciesBatch.action.importBigfin.tip"; + i18nMnemonic: "tutti.editSpeciesBatch.action.importBigfin.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportBigfinAction.class}; + _help: {"tutti.editSpeciesBatch.action.importBigfin.help"}; +} + #importMultiPostButton { actionIcon: import; text: "tutti.editSpeciesBatch.action.importMultiPost"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx index 56ce50c..22cef02 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx @@ -60,6 +60,7 @@ public SpeciesBatchUI(TuttiUI<?,?> parentUI) { <JToolBar id='speciesBatchTabToolBar'> <JButton id='importPupitriButton'/> <JButton id='importPsionButton'/> + <JButton id='importBigfinButton'/> <JButton id='importMultiPostButton'/> <JButton id='exportMultiPostButton'/> </JToolBar> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java index 13bfa76..469b18e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java @@ -209,11 +209,12 @@ public class SpeciesBatchUIHandler extends AbstractTuttiBatchTableUIHandler<Spec SpeciesBatchRowModel rootRow = loadBatch(aBatch, null, rows); - if (log.isDebugEnabled()) { - log.debug("Loaded root batch " + - decorate(rootRow.getSpecies(), DecoratorService.FROM_PROTOCOL) + " - " + - decorate(rootRow.getSampleCategoryById(firstCategoryId))); - } + //FIXME kmorin 20140902 NPE decorator does not exist +// if (log.isDebugEnabled()) { +// log.debug("Loaded root batch " + +// decorate(rootRow.getSpecies(), DecoratorService.FROM_PROTOCOL) + " - " + +// decorate(rootRow.getSampleCategoryById(firstCategoryId))); +// } } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java index 30eb7d1..81f326a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java @@ -431,12 +431,17 @@ public class SplitSpeciesBatchUIHandler } boolean editableCategoryValue = false; - if (category != null) { + log.debug("category " + category); + if (category != null) { + log.debug("category " + category.getLabel()); if (!category.getCaracteristic().isQualitativeValueEmpty()) { // qualitative category data = category.getCaracteristic(); + + log.debug("data " + data); + } else { editableCategoryValue = true; addFloatColumnToModel(columnModel, @@ -493,6 +498,7 @@ public class SplitSpeciesBatchUIHandler // add a row for each qualitative value for (CaracteristicQualitativeValue qualitativeValue : data.getQualitativeValue()) { + log.debug("QV: " + qualitativeValue); if (log.isDebugEnabled()) { log.debug("Add QV: " + qualitativeValue); } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 07bca9e..a99239a 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -973,6 +973,7 @@ tutti.editSpeciesBatch.action.addSampleCategory.tip= tutti.editSpeciesBatch.action.changeSampleCategory= tutti.editSpeciesBatch.action.changeSampleCategory.mnemonic= tutti.editSpeciesBatch.action.changeSampleCategory.tip= +tutti.editSpeciesBatch.action.chooseBigfinFile.import= tutti.editSpeciesBatch.action.choosePsionFile.import= tutti.editSpeciesBatch.action.createBatch= tutti.editSpeciesBatch.action.createBatch.mnemonic= @@ -992,6 +993,13 @@ tutti.editSpeciesBatch.action.exportMultiPost.tip= tutti.editSpeciesBatch.action.ichtyometer= tutti.editSpeciesBatch.action.ichtyometer.mnemonic= tutti.editSpeciesBatch.action.ichtyometer.tip= +tutti.editSpeciesBatch.action.importBigfin= +tutti.editSpeciesBatch.action.importBigfin.mnemonic= +tutti.editSpeciesBatch.action.importBigfin.no.matching.data= +tutti.editSpeciesBatch.action.importBigfin.no.matching.fishingOperation= +tutti.editSpeciesBatch.action.importBigfin.no.matching.fishingOperation.title= +tutti.editSpeciesBatch.action.importBigfin.success= +tutti.editSpeciesBatch.action.importBigfin.tip= tutti.editSpeciesBatch.action.importMultiPost= tutti.editSpeciesBatch.action.importMultiPost.mnemonic= tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button= @@ -1038,6 +1046,7 @@ tutti.editSpeciesBatch.action.renameBatch.tip= tutti.editSpeciesBatch.action.splitBatch= tutti.editSpeciesBatch.action.splitBatch.mnemonic= tutti.editSpeciesBatch.action.splitBatch.tip= +tutti.editSpeciesBatch.action.title.choose.importBigfinFile= tutti.editSpeciesBatch.action.title.choose.importPsionFile= tutti.editSpeciesBatch.error.sampleCategoryValue.notAvailable= tutti.editSpeciesBatch.field.speciesTotalInertWeight= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 5e039d0..34edbdc 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -960,6 +960,7 @@ tutti.editSpeciesBatch.action.addSampleCategory.tip=Ajouter une catégorie manqu tutti.editSpeciesBatch.action.changeSampleCategory=Modifier la catégorie tutti.editSpeciesBatch.action.changeSampleCategory.mnemonic=M tutti.editSpeciesBatch.action.changeSampleCategory.tip=Modifier la catégorie de la cellule sélectionnée +tutti.editSpeciesBatch.action.chooseBigfinFile.import=Importer tutti.editSpeciesBatch.action.choosePsionFile.import=Importer tutti.editSpeciesBatch.action.createBatch=Créer un lot pour une espèce tutti.editSpeciesBatch.action.createBatch.mnemonic=C @@ -976,6 +977,13 @@ tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.title=Exporter les tutti.editSpeciesBatch.action.exportMultiPost.mnemonic=E tutti.editSpeciesBatch.action.exportMultiPost.success=Les lots d'espèces ont été exportés dans le fichier %s tutti.editSpeciesBatch.action.exportMultiPost.tip=Exporter les lots d'espèces pour les importer sur le poste maître +tutti.editSpeciesBatch.action.importBigfin=Import Bigfin +tutti.editSpeciesBatch.action.importBigfin.mnemonic=B +tutti.editSpeciesBatch.action.importBigfin.no.matching.data= +tutti.editSpeciesBatch.action.importBigfin.no.matching.fishingOperation= +tutti.editSpeciesBatch.action.importBigfin.no.matching.fishingOperation.title= +tutti.editSpeciesBatch.action.importBigfin.success=Import Bigfin réussi \: %1s espèces importées (Vrac), %2s espèces importées (Hors-Vrac) +tutti.editSpeciesBatch.action.importBigfin.tip=Import Bigfin tutti.editSpeciesBatch.action.importMultiPost=Importer des lots d'espèces tutti.editSpeciesBatch.action.importMultiPost.mnemonic=I tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button=Choisir le fichier à importer @@ -1022,6 +1030,7 @@ tutti.editSpeciesBatch.action.renameBatch.tip=Corriger l'espèce tutti.editSpeciesBatch.action.splitBatch=Catégoriser le lot tutti.editSpeciesBatch.action.splitBatch.mnemonic=C tutti.editSpeciesBatch.action.splitBatch.tip=Catégoriser le lot courant (celui de la ligne sélectionné) +tutti.editSpeciesBatch.action.title.choose.importBigfinFile=Importer un fichier Bigfin tutti.editSpeciesBatch.action.title.choose.importPsionFile=Importer un fichier Psion tutti.editSpeciesBatch.error.sampleCategoryValue.notAvailable=La valeur %s de la catégorie %s est déjà utilisée tutti.editSpeciesBatch.field.speciesTotalInertWeight=Poids inerte trié diff --git a/tutti-ui-swing/src/main/resources/icons/action-bigfin-import.png b/tutti-ui-swing/src/main/resources/icons/action-bigfin-import.png new file mode 100644 index 0000000..cafac61 Binary files /dev/null and b/tutti-ui-swing/src/main/resources/icons/action-bigfin-import.png differ -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.