r945 - in trunk: tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost tutti-service/src/main/resources/i18n tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species tutti-ui-swing/src/main/resources/i18n
Author: kmorin Date: 2013-05-14 16:31:57 +0200 (Tue, 14 May 2013) New Revision: 945 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/945 Log: refs #1873 [IMP/EXP] - Import/Export multi-postes Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AttachmentRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AttachmentRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/AbstractExportMultiPostAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/AbstractImportMultiPostAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/MultiPostImportLogDialog.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/MultiPostImportLogDialog.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/ExportMultiPostAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/ImportMultiPostAction.java 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/CatchRow.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/TuttiMultiPostImportExportService.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/content/operation/catches/benthos/BenthosBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AttachmentRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AttachmentRow.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AttachmentRow.java 2013-05-14 14:31:57 UTC (rev 945) @@ -0,0 +1,62 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; +import fr.ifremer.tutti.persistence.entities.data.Attachment; + +import java.io.File; +import java.io.Serializable; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public class AttachmentRow implements Serializable { + + public static final String ATTACHMENT_NAME = "name"; + + public static final String ATTACHMENT_BATCH_ID = "batchId"; + + public static final String ATTACHMENT_COMMENT = "comment"; + + public static final String ATTACHMENT_FILE = "file"; + + protected String name; + + protected String batchId; + + protected String comment; + + protected File file; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } +} Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AttachmentRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AttachmentRowModel.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/AttachmentRowModel.java 2013-05-14 14:31:57 UTC (rev 945) @@ -0,0 +1,57 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import fr.ifremer.tutti.service.TuttiCsvUtil; +import org.nuiton.util.csv.ValueFormatter; +import org.nuiton.util.csv.ValueParser; + +import java.io.File; +import java.text.ParseException; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public class AttachmentRowModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<AttachmentRow> { + + public AttachmentRowModel(char separator) { + this(separator, null); + } + + public AttachmentRowModel(char separator, final File directory) { + super(separator); + + newColumnForImportExport(AttachmentRow.ATTACHMENT_BATCH_ID, + AttachmentRow.ATTACHMENT_BATCH_ID); + + newColumnForImportExport(AttachmentRow.ATTACHMENT_NAME, + AttachmentRow.ATTACHMENT_NAME); + + newColumnForImportExport(AttachmentRow.ATTACHMENT_COMMENT, + AttachmentRow.ATTACHMENT_COMMENT); + + newColumnForExport(AttachmentRow.ATTACHMENT_FILE, + AttachmentRow.ATTACHMENT_FILE, + new ValueFormatter<File>() { + + @Override + public String format(File value) { + return value != null ? value.getName() : null; + } + }); + + newMandatoryColumn(AttachmentRow.ATTACHMENT_FILE, + AttachmentRow.ATTACHMENT_FILE, + new ValueParser<File>() { + @Override + public File parse(String value) throws ParseException { + return new File(directory, value); + } + }); + + } + + @Override + public AttachmentRow newEmptyInstance() { + return new AttachmentRow(); + } +} 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-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java 2013-05-14 14:31:57 UTC (rev 945) @@ -24,6 +24,9 @@ * #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; @@ -31,6 +34,8 @@ import org.nuiton.util.csv.ValueFormatter; import java.io.Serializable; +import java.util.List; +import java.util.Map; /** * Model of a catch export. @@ -38,13 +43,17 @@ * @author kmorin <morin@codelutin.com> * @since 2.2 */ -public class CatchFrequencyRowModel extends TuttiCsvUtil.AbstractTuttiExportModel<CatchFrequencyRow> { +public class CatchFrequencyRowModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<CatchFrequencyRow> { public CatchFrequencyRowModel(char separator) { + this(separator, null); + } + + public CatchFrequencyRowModel(char separator, List<Caracteristic> caracteristics) { super(separator); - newColumnForExport(CatchFrequencyRow.BATCH_ID, - CatchFrequencyRow.BATCH_ID); + newColumnForImportExport(CatchFrequencyRow.BATCH_ID, + CatchFrequencyRow.BATCH_ID); newColumnForExport(CatchFrequencyRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, CatchFrequencyRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, @@ -55,17 +64,32 @@ } }); - newColumnForExport(CatchFrequencyRow.FREQUENCY_LENGTH_STEP, - CatchFrequencyRow.FREQUENCY_LENGTH_STEP, - TuttiCsvUtil.FLOAT); + if (caracteristics == null) { + caracteristics = Lists.newArrayList(); + } + Map<String, Caracteristic> caracteristicMap = Maps.uniqueIndex(caracteristics, TuttiEntities.GET_ID); + newForeignKeyColumn(CatchFrequencyRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, + CatchFrequencyRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, + Caracteristic.class, + Caracteristic.PROPERTY_ID, + caracteristicMap); - newColumnForExport(CatchFrequencyRow.FREQUENCY_NUMBER, - CatchFrequencyRow.FREQUENCY_NUMBER, - TuttiCsvUtil.INTEGER); + newColumnForImportExport(CatchFrequencyRow.FREQUENCY_LENGTH_STEP, + CatchFrequencyRow.FREQUENCY_LENGTH_STEP, + TuttiCsvUtil.FLOAT); - newColumnForExport(CatchFrequencyRow.FREQUENCY_WEIGHT, - CatchFrequencyRow.FREQUENCY_WEIGHT, - TuttiCsvUtil.FLOAT); + newColumnForImportExport(CatchFrequencyRow.FREQUENCY_NUMBER, + CatchFrequencyRow.FREQUENCY_NUMBER, + TuttiCsvUtil.INTEGER); + newColumnForImportExport(CatchFrequencyRow.FREQUENCY_WEIGHT, + CatchFrequencyRow.FREQUENCY_WEIGHT, + TuttiCsvUtil.FLOAT); + } + + @Override + public CatchFrequencyRow newEmptyInstance() { + return new CatchFrequencyRow(); + } } \ No newline at end of file Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRow.java 2013-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRow.java 2013-05-14 14:31:57 UTC (rev 945) @@ -48,6 +48,8 @@ public static final String ID = "id"; + public static final String PARENT_ID = "parentId"; + public static final String SPECIES = "species"; public static final String SORTED_UNSORTED_SAMPLE_CATEGORY = "sortedUnsortedSampleCategory"; @@ -72,6 +74,8 @@ protected String id; + protected String parentId; + protected Species species; protected Serializable sortedUnsortedSampleCategory; @@ -102,6 +106,14 @@ this.id = id; } + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + public Species getSpecies() { return species; } 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-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java 2013-05-14 14:31:57 UTC (rev 945) @@ -34,6 +34,7 @@ import java.io.Serializable; import java.util.List; +import java.util.Map; /** * Model of a catch export. @@ -41,9 +42,14 @@ * @author kmorin <morin@codelutin.com> * @since 2.2 */ -public class CatchRowModel extends TuttiCsvUtil.AbstractTuttiExportModel<CatchRow> { +public class CatchRowModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<CatchRow> { public CatchRowModel(char separator) { + this(separator, null); + } + + public CatchRowModel(char separator, + Map<String, Species> speciesMap) { super(separator); ValueFormatter<Serializable> caracteristicValueFormatter = new ValueFormatter<Serializable>() { @@ -63,56 +69,90 @@ } }; - newColumnForExport(CatchRow.ID, + newColumnForImportExport(CatchRow.ID, CatchRow.ID); + newColumnForImportExport(CatchRow.PARENT_ID, + CatchRow.PARENT_ID); + newColumnForExport(CatchRow.SPECIES, CatchRow.SPECIES, new ValueFormatter<Species>() { - @Override - public String format(Species value) { - return value != null ? String.valueOf(value.getReferenceTaxonId()) : null; - } - }); + @Override + public String format(Species value) { + return value != null ? String.valueOf(value.getReferenceTaxonId()) : null; + } + }); + newForeignKeyColumn(CatchRow.SPECIES, + CatchRow.SPECIES, + Species.class, + Species.PROPERTY_REFERENCE_TAXON_ID, + speciesMap); + newColumnForExport(CatchRow.SORTED_UNSORTED_SAMPLE_CATEGORY, CatchRow.SORTED_UNSORTED_SAMPLE_CATEGORY, caracteristicValueFormatter); + newMandatoryColumn(CatchRow.SORTED_UNSORTED_SAMPLE_CATEGORY, + CatchRow.SORTED_UNSORTED_SAMPLE_CATEGORY, + TuttiCsvUtil.STRING); + newColumnForExport(CatchRow.SIZE_SAMPLE_CATEGORY, CatchRow.SIZE_SAMPLE_CATEGORY, caracteristicValueFormatter); + newMandatoryColumn(CatchRow.SIZE_SAMPLE_CATEGORY, + CatchRow.SIZE_SAMPLE_CATEGORY, + TuttiCsvUtil.STRING); + newColumnForExport(CatchRow.SEX_SAMPLE_CATEGORY, CatchRow.SEX_SAMPLE_CATEGORY, caracteristicValueFormatter); + newMandatoryColumn(CatchRow.SEX_SAMPLE_CATEGORY, + CatchRow.SEX_SAMPLE_CATEGORY, + TuttiCsvUtil.STRING); + newColumnForExport(CatchRow.MATURITY_SAMPLE_CATEGORY, CatchRow.MATURITY_SAMPLE_CATEGORY, caracteristicValueFormatter); + newMandatoryColumn(CatchRow.MATURITY_SAMPLE_CATEGORY, + CatchRow.MATURITY_SAMPLE_CATEGORY, + TuttiCsvUtil.STRING); + newColumnForExport(CatchRow.AGE_SAMPLE_CATEGORY, CatchRow.AGE_SAMPLE_CATEGORY, caracteristicValueFormatter); - newColumnForExport(CatchRow.CATEGORY_WEIGHT, + newMandatoryColumn(CatchRow.AGE_SAMPLE_CATEGORY, + CatchRow.AGE_SAMPLE_CATEGORY, + TuttiCsvUtil.STRING); + + newColumnForImportExport(CatchRow.CATEGORY_WEIGHT, CatchRow.CATEGORY_WEIGHT, TuttiCsvUtil.FLOAT); - newColumnForExport(CatchRow.WEIGHT, + newColumnForImportExport(CatchRow.WEIGHT, CatchRow.WEIGHT, TuttiCsvUtil.FLOAT); - newColumnForExport(CatchRow.NUMBER, + newColumnForImportExport(CatchRow.NUMBER, CatchRow.NUMBER, TuttiCsvUtil.INTEGER); - newColumnForExport(CatchRow.COMMENT, + newColumnForImportExport(CatchRow.COMMENT, CatchRow.COMMENT); - newColumnForExport(CatchRow.TO_CONFIRM, - CatchRow.TO_CONFIRM, - TuttiCsvUtil.PRIMITIVE_BOOLEAN); + newColumnForImportExport(CatchRow.TO_CONFIRM, + CatchRow.TO_CONFIRM, + TuttiCsvUtil.PRIMITIVE_BOOLEAN); } + + @Override + public CatchRow newEmptyInstance() { + return new CatchRow(); + } } \ No newline at end of file Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java 2013-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java 2013-05-14 14:31:57 UTC (rev 945) @@ -25,28 +25,32 @@ */ import com.google.common.base.Charsets; +import com.google.common.base.Function; +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.io.Files; +import fr.ifremer.tutti.TuttiIOUtil; import fr.ifremer.tutti.TuttiTechnicalException; +import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.*; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; -import fr.ifremer.tutti.service.AbstractTuttiService; -import fr.ifremer.tutti.service.DecoratorService; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.TuttiServiceContext; -import fr.ifremer.tutti.service.catches.TuttiWeightComputingService; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.*; 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.util.FileUtil; +import org.apache.commons.vfs2.AllFileSelector; +import org.apache.commons.vfs2.FileObject; import org.nuiton.util.ZipUtil; import org.nuiton.util.csv.Export; +import org.nuiton.util.csv.Import; -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; +import java.io.*; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.UUID; @@ -54,6 +58,8 @@ import static org.nuiton.i18n.I18n._; /** + * Service to export batches from a satellite post or import batches into a master post. + * * @author kmorin <kmorin@codelutin.com> * @since 2.2 */ @@ -62,6 +68,16 @@ private static final Log log = LogFactory.getLog(TuttiMultiPostImportExportService.class); + protected static final String ATTACHMENTS_DIRECTORY = "attachments"; + + protected static final String ATTACHMENTS_FILE = "attachments.csv"; + + protected static final String SPECIES_FILE = "species.csv"; + + protected static final String BENTHOS_FILE = "benthos.csv"; + + protected static final String FREQUENCIES_FILE = "frequencies.csv"; + protected PersistenceService persistenceService; protected DecoratorService decoratorService; @@ -93,36 +109,418 @@ } } + /** + * Export species batches. + * + * @param file the file to export the batches into + * @param operation the operation to export + */ public void exportSpecies(File file, FishingOperation operation) { - CatchRowModel csvModel = new CatchRowModel(csvSeparator); - CatchFrequencyRowModel csvFrequencyModel = new CatchFrequencyRowModel(csvSeparator); BatchContainer<SpeciesBatch> speciesBatchContainer = persistenceService.getRootSpeciesBatch(operation.getId()); List<CatchRow> rows = Lists.newArrayList(); List<CatchFrequencyRow> frequencyRows = Lists.newArrayList(); + List<AttachmentRow> attachmentRows = Lists.newArrayList(); for (SpeciesBatch batch : speciesBatchContainer.getChildren()) { - createSpeciesRow(batch, rows, frequencyRows); + createSpeciesRow(batch, null, rows, frequencyRows, attachmentRows); } + exportCatches(file, SPECIES_FILE, rows, frequencyRows, attachmentRows); + } + + /** + * Export benthos batches. + * + * @param file the file to export the batches into + * @param operation the operation to export + */ + public void exportBenthos(File file, FishingOperation operation) { + BatchContainer<BenthosBatch> benthosBatchContainer = + persistenceService.getRootBenthosBatch(operation.getId()); + + List<CatchRow> rows = Lists.newArrayList(); + List<CatchFrequencyRow> frequencyRows = Lists.newArrayList(); + List<AttachmentRow> attachmentRows = Lists.newArrayList(); + + for (BenthosBatch batch : benthosBatchContainer.getChildren()) { + createBenthosRow(batch, null, rows, frequencyRows, attachmentRows); + } + + exportCatches(file, BENTHOS_FILE, rows, frequencyRows, attachmentRows); + } + + /** + * Import species batches from a satellite post + * + * @param file the file to import the batches from + * @param operation the operation in which to add the batches + * @return the list of the species which have not been imported, because there were concurrent batches + */ + public Collection<SpeciesBatch> importSpecies(File file, FishingOperation operation) { + + final Map<String, SpeciesBatch> notImportedBatches = Maps.newHashMap(); + + BatchContainer<SpeciesBatch> speciesBatches = + persistenceService.getRootSpeciesBatch(operation.getId()); + + TuttiDataContext dataContext = context.getDataContext(); + List<Species> speciesList = dataContext.getReferentSpecies(); + Map<String, Species> speciesMap = TuttiEntities.splitByTaxonId(speciesList); + + // map containing the batches by their persistence id + final Map<String, SpeciesBatch> batches = Maps.newHashMap(); + + File tempDir = Files.createTempDir(); + FileObject fileObject = TuttiIOUtil.resolveFile("zip:" + file.getAbsolutePath(), + _("tutti.service.multipost.resolveArchive.error", file)); + + TuttiIOUtil.explode(fileObject, + tempDir, + new AllFileSelector(), + _("tutti.service.multipost.explodeArchive.error", file)); + + // Import batches + + File speciesFile = new File(tempDir, SPECIES_FILE); + + Reader reader = null; + try { + reader = Files.newReader(speciesFile, Charsets.UTF_8); + + } catch (FileNotFoundException e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.import.batches.error", speciesFile), e); + } + + CatchRowModel csvModel = new CatchRowModel(csvSeparator, + speciesMap); + + Import<CatchRow> importer = Import.newImport(csvModel, reader); + + for (CatchRow row : importer) { + + // create batch + SpeciesBatch batch = TuttiBeanFactory.newSpeciesBatch(); + batch.setFishingOperation(operation); + + Species species = row.getSpecies(); + batch.setSpecies(row.getSpecies()); + batch.setWeight(row.getWeight()); + batch.setNumber(row.getNumber()); + batch.setComment(row.getComment()); + batch.setSpeciesToConfirm(row.isToConfirm()); + + Object[] valueAndCategoryType = getValueAndCategoryType(row); + SampleCategoryEnum categoryType = (SampleCategoryEnum) valueAndCategoryType[0]; + Serializable value = (Serializable) valueAndCategoryType[1]; + + batch.setSampleCategoryType(categoryType); + batch.setSampleCategoryValue(value); + batch.setSampleCategoryWeight(row.getCategoryWeight()); + + // get parent batch + String parentId = row.getParentId(); + String parentPersistedId = null; + SpeciesBatch parent = null; + if (StringUtils.isNotEmpty(parentId)) { + parent = batches.get(parentId); + batch.setParentBatch(parent); + parentPersistedId = parent.getId(); + } + + SpeciesBatch existingBatch = null; + List<SpeciesBatch> batchesToBrowse; + if (parent == null) { + batchesToBrowse = speciesBatches.getChildren(); + } else { + batchesToBrowse = parent.getChildBatchs(); + } + + // check if the parent has already a batch with the caracteristic value + // and if the children batch are categorized with the same caracterstic + if (batchesToBrowse != null) { + for (SpeciesBatch sb : batchesToBrowse) { + if (sb.getSpecies().equals(species) + && (!sb.getSampleCategoryType().equals(batch.getSampleCategoryType()) + || sb.getSampleCategoryValue().equals(value))) { + + existingBatch = sb; + batches.put(row.getId(), sb); + notImportedBatches.put(row.getId(), batch); + break; + } + } + } + + if (existingBatch == null) { + batch = persistenceService.createSpeciesBatch(batch, parentPersistedId); + batches.put(row.getId(), batch); + } + } + + // Import frequencies + + File frequencyFile = new File(tempDir, FREQUENCIES_FILE); + try { + reader = Files.newReader(frequencyFile, Charsets.UTF_8); + + } catch (FileNotFoundException e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.import.frequencies.error", frequencyFile), e); + } + + CatchFrequencyRowModel frequencyModel = new CatchFrequencyRowModel(csvSeparator, + dataContext.getCaracteristics()); + + Import<CatchFrequencyRow> frequencyImporter = Import.newImport(frequencyModel, reader); + + ListMultimap<String, SpeciesBatchFrequency> frequencyMap = ArrayListMultimap.create(); + + for (CatchFrequencyRow frequencyRow : frequencyImporter) { + if (notImportedBatches.get(frequencyRow.getBatchId()) == null) { + SpeciesBatch batch = batches.get(frequencyRow.getBatchId()); + if (batch != null) { + SpeciesBatchFrequency frequency = TuttiBeanFactory.newSpeciesBatchFrequency(); + frequency.setLengthStepCaracteristic(frequencyRow.getLengthStepCaracteristic()); + frequency.setLengthStep(frequencyRow.getLengthStep()); + frequency.setNumber(frequencyRow.getNumber()); + frequency.setWeight(frequencyRow.getWeight()); + frequency.setBatch(batch); + frequencyMap.put(batch.getId(), frequency); + } + } + } + for (String batchId : frequencyMap.keySet()) { + List<SpeciesBatchFrequency> frequencies = frequencyMap.get(batchId); + persistenceService.saveSpeciesBatchFrequency(batchId, frequencies); + } + + // Import attachments + Function<AttachmentRow, Integer> getObjetcIdFunction = new Function<AttachmentRow, Integer>() { + @Override + public Integer apply(AttachmentRow input) { + Integer result = null; + if (notImportedBatches.get(input.getBatchId()) == null) { + SpeciesBatch batch = batches.get(input.getBatchId()); + if (batch != null) { + result = batch.getIdAsInt(); + } + } + return result; + } + }; + importAttachments(tempDir, getObjetcIdFunction); + + return notImportedBatches.values(); + } + + /** + * Import benthos batches from a satellite post + * + * @param file the file to import the batches from + * @param operation the operation in which to add the batches + * @return the list of the benthos which have not been imported, because there were concurrent batches + */ + public Collection<BenthosBatch> importBenthos(File file, FishingOperation operation) { + + final Map<String, BenthosBatch> notImportedBatches = Maps.newHashMap(); + + BatchContainer<BenthosBatch> benthosBatches = + persistenceService.getRootBenthosBatch(operation.getId()); + + TuttiDataContext dataContext = context.getDataContext(); + List<Species> speciesList = dataContext.getReferentSpecies(); + Map<String, Species> speciesMap = TuttiEntities.splitByTaxonId(speciesList); + + // map containing the batches by their persistence id + final Map<String, BenthosBatch> batches = Maps.newHashMap(); + + File tempDir = Files.createTempDir(); + FileObject fileObject = TuttiIOUtil.resolveFile("zip:" + file.getAbsolutePath(), + _("tutti.service.multipost.resolveArchive.error", file)); + + TuttiIOUtil.explode(fileObject, + tempDir, + new AllFileSelector(), + _("tutti.service.multipost.explodeArchive.error", file)); + + // Import batches + + File benthosFile = new File(tempDir, BENTHOS_FILE); + + Reader reader = null; + try { + reader = Files.newReader(benthosFile, Charsets.UTF_8); + + } catch (FileNotFoundException e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.import.batches.error", benthosFile), e); + } + + CatchRowModel csvModel = new CatchRowModel(csvSeparator, + speciesMap); + + Import<CatchRow> importer = Import.newImport(csvModel, reader); + + for (CatchRow row : importer) { + + // create batch + BenthosBatch batch = TuttiBeanFactory.newBenthosBatch(); + batch.setFishingOperation(operation); + + Species species = row.getSpecies(); + batch.setSpecies(row.getSpecies()); + batch.setWeight(row.getWeight()); + batch.setNumber(row.getNumber()); + batch.setComment(row.getComment()); + batch.setSpeciesToConfirm(row.isToConfirm()); + + Object[] valueAndCategoryType = getValueAndCategoryType(row); + SampleCategoryEnum categoryType = (SampleCategoryEnum) valueAndCategoryType[0]; + Serializable value = (Serializable) valueAndCategoryType[1]; + + batch.setSampleCategoryType(categoryType); + batch.setSampleCategoryValue(value); + batch.setSampleCategoryWeight(row.getCategoryWeight()); + + // get parent batch + String parentId = row.getParentId(); + String parentPersistedId = null; + BenthosBatch parent = null; + if (StringUtils.isNotEmpty(parentId)) { + parent = batches.get(parentId); + batch.setParentBatch(parent); + parentPersistedId = parent.getId(); + } + + BenthosBatch existingBatch = null; + List<BenthosBatch> batchesToBrowse; + if (parent == null) { + batchesToBrowse = benthosBatches.getChildren(); + } else { + batchesToBrowse = parent.getChildBatchs(); + } + + // check if the parent has already a batch with the caracteristic value + // and if the children batch are categorized with the same caracterstic + if (batchesToBrowse != null) { + for (BenthosBatch bb : batchesToBrowse) { + if (bb.getSpecies().equals(species) + && (!bb.getSampleCategoryType().equals(batch.getSampleCategoryType()) + || bb.getSampleCategoryValue().equals(value))) { + + existingBatch = bb; + batches.put(row.getId(), bb); + notImportedBatches.put(row.getId(), batch); + break; + } + } + } + + if (existingBatch == null) { + batch = persistenceService.createBenthosBatch(batch, parentPersistedId); + batches.put(row.getId(), batch); + } + } + + // Import frequencies + + File frequencyFile = new File(tempDir, FREQUENCIES_FILE); + try { + reader = Files.newReader(frequencyFile, Charsets.UTF_8); + + } catch (FileNotFoundException e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.import.frequencies.error", frequencyFile), e); + } + + CatchFrequencyRowModel frequencyModel = new CatchFrequencyRowModel(csvSeparator, + dataContext.getCaracteristics()); + + Import<CatchFrequencyRow> frequencyImporter = Import.newImport(frequencyModel, reader); + + ListMultimap<String, BenthosBatchFrequency> frequencyMap = ArrayListMultimap.create(); + + for (CatchFrequencyRow frequencyRow : frequencyImporter) { + if (notImportedBatches.get(frequencyRow.getBatchId()) == null) { + BenthosBatch batch = batches.get(frequencyRow.getBatchId()); + if (batch != null) { + BenthosBatchFrequency frequency = TuttiBeanFactory.newBenthosBatchFrequency(); + frequency.setLengthStepCaracteristic(frequencyRow.getLengthStepCaracteristic()); + frequency.setLengthStep(frequencyRow.getLengthStep()); + frequency.setNumber(frequencyRow.getNumber()); + frequency.setWeight(frequencyRow.getWeight()); + frequency.setBatch(batch); + frequencyMap.put(batch.getId(), frequency); + } + } + } + for (String batchId : frequencyMap.keySet()) { + List<BenthosBatchFrequency> frequencies = frequencyMap.get(batchId); + persistenceService.saveBenthosBatchFrequency(batchId, frequencies); + } + + // Import attachments + Function<AttachmentRow, Integer> getObjetcIdFunction = new Function<AttachmentRow, Integer>() { + @Override + public Integer apply(AttachmentRow input) { + Integer result = null; + if (notImportedBatches.get(input.getBatchId()) == null) { + BenthosBatch batch = batches.get(input.getBatchId()); + if (batch != null) { + result = batch.getIdAsInt(); + } + } + return result; + } + }; + importAttachments(tempDir, getObjetcIdFunction); + + return notImportedBatches.values(); + } + + /* + * Protected methods + */ + + protected void exportCatches(File file, + String batchFile, + List<CatchRow> rows, + List<CatchFrequencyRow> frequencyRows, + List<AttachmentRow> attachmentRows) { + CatchRowModel csvModel = new CatchRowModel(csvSeparator); + CatchFrequencyRowModel csvFrequencyModel = new CatchFrequencyRowModel(csvSeparator); + AttachmentRowModel csvAttachmentModel = new AttachmentRowModel(csvSeparator); + BufferedWriter writer = null; File directory = Files.createTempDir(); + List<File> file2zip = Lists.newArrayList(); - File speciesFile = new File(directory, "species.csv"); + File attachmentDirectory = new File(directory, ATTACHMENTS_DIRECTORY); + file2zip.add(attachmentDirectory); + for (AttachmentRow attachmentRow : attachmentRows) { + File attachmentFile = attachmentRow.getFile(); + File destFile = new File(attachmentDirectory, attachmentFile.getName()); + TuttiIOUtil.copyFile(attachmentFile, + destFile, + _("tutti.service.multipost.attachment.copy.error", attachmentFile)); + file2zip.add(destFile); + } + + File speciesFile = new File(directory, batchFile); + file2zip.add(speciesFile); try { writer = Files.newWriter(speciesFile, Charsets.UTF_8); Export export = Export.newExport(csvModel, rows); export.write(writer); writer.close(); } catch (Exception e) { - throw new TuttiTechnicalException(_("tutti.service.multipost.export.error", file), e); + throw new TuttiTechnicalException(_("tutti.service.multipost.export.batches.error", file), e); } finally { IOUtils.closeQuietly(writer); } - File frequencyFile = new File(directory, "frequencies.csv"); + File frequencyFile = new File(directory, FREQUENCIES_FILE); + file2zip.add(frequencyFile); try { writer = Files.newWriter(frequencyFile, Charsets.UTF_8); Export export = Export.newExport(csvFrequencyModel, frequencyRows); @@ -135,20 +533,41 @@ IOUtils.closeQuietly(writer); } + File attachmentFile = new File(directory, ATTACHMENTS_FILE); + file2zip.add(attachmentFile); try { - ZipUtil.compressFiles(file, directory, Lists.newArrayList(speciesFile, frequencyFile)); + writer = Files.newWriter(attachmentFile, Charsets.UTF_8); + Export export = Export.newExport(csvAttachmentModel, attachmentRows); + export.write(writer); + writer.close(); + } catch (Exception e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.export.attachments.error", attachmentFile), e); + } finally { + IOUtils.closeQuietly(writer); + } + + try { + ZipUtil.compressFiles(file, directory, file2zip); + } catch (IOException e) { throw new TuttiTechnicalException(_("tutti.service.multipost.export.error", file), e); + + } finally { + TuttiIOUtil.deleteDirectory(directory, _("tutti.service.multipost.export.deleteTempDirectory.error", file)); } } - protected void createSpeciesRow(SpeciesBatch batch, List<CatchRow> rows, List<CatchFrequencyRow> frequencyRows) { + protected void createSpeciesRow(SpeciesBatch batch, + String parentId, + List<CatchRow> rows, + List<CatchFrequencyRow> frequencyRows, + List<AttachmentRow> attachmentRows) { CatchRow row = new CatchRow(); String id = UUID.randomUUID().toString(); row.setId(id); - + row.setParentId(parentId); row.setSpecies(batch.getSpecies()); switch (batch.getSampleCategoryType()) { @@ -176,75 +595,24 @@ rows.add(row); - List<SpeciesBatchFrequency> frequencies = - persistenceService.getAllSpeciesBatchFrequency(batch.getId()); - for (SpeciesBatchFrequency frequency : frequencies) { - CatchFrequencyRow frequencyRow = new CatchFrequencyRow(); - frequencyRow.setBatchId(id); - frequencyRow.setLengthStepCaracteristic(frequency.getLengthStepCaracteristic()); - frequencyRow.setLengthStep(frequency.getLengthStep()); - frequencyRow.setNumber(frequency.getNumber()); - frequencyRow.setWeight(frequency.getWeight()); - frequencyRows.add(frequencyRow); - } + addFrequencies(id, batch.getId(), frequencyRows); + addAttachments(id, batch.getIdAsInt(), AttachementObjectTypeEnum.BATCH, attachmentRows); for (SpeciesBatch child : batch.getChildBatchs()) { - createSpeciesRow(child, rows, frequencyRows); + createSpeciesRow(child, id, rows, frequencyRows, attachmentRows); } } - public void exportBenthos(File file, FishingOperation operation) { - CatchRowModel csvModel = new CatchRowModel(csvSeparator); - CatchFrequencyRowModel csvFrequencyModel = new CatchFrequencyRowModel(csvSeparator); - - BatchContainer<BenthosBatch> benthosBatchContainer = - persistenceService.getRootBenthosBatch(operation.getId()); - - List<CatchRow> rows = Lists.newArrayList(); - List<CatchFrequencyRow> frequencyRows = Lists.newArrayList(); - - for (BenthosBatch batch : benthosBatchContainer.getChildren()) { - createBenthosRow(batch, rows, frequencyRows); - } - - BufferedWriter writer = null; - File directory = Files.createTempDir(); - - File benthosFile = new File(directory, "benthos.csv"); - try { - writer = Files.newWriter(benthosFile, Charsets.UTF_8); - Export export = Export.newExport(csvModel, rows); - export.write(writer); - writer.close(); - } catch (Exception e) { - throw new TuttiTechnicalException(_("tutti.service.multipost.export.error", file), e); - } finally { - IOUtils.closeQuietly(writer); - } - - File frequencyFile = new File(directory, "frequencies.csv"); - try { - writer = Files.newWriter(frequencyFile, Charsets.UTF_8); - Export export = Export.newExport(csvFrequencyModel, frequencyRows); - export.write(writer); - writer.close(); - - } catch (Exception e) { - throw new TuttiTechnicalException(_("tutti.service.multipost.export.frequencies.error", frequencyFile), e); - } finally { - IOUtils.closeQuietly(writer); - } - - compressZipFile(file, directory); - - } - - protected void createBenthosRow(BenthosBatch batch, List<CatchRow> rows, List<CatchFrequencyRow> frequencyRows) { + protected void createBenthosRow(BenthosBatch batch, + String parentId, + List<CatchRow> rows, + List<CatchFrequencyRow> frequencyRows, + List<AttachmentRow> attachmentRows) { CatchRow row = new CatchRow(); String id = UUID.randomUUID().toString(); row.setId(id); - + row.setParentId(parentId); row.setSpecies(batch.getSpecies()); switch (batch.getSampleCategoryType()) { @@ -272,20 +640,117 @@ rows.add(row); + addFrequencies(id, batch.getId(), frequencyRows); + addAttachments(id, batch.getIdAsInt(), AttachementObjectTypeEnum.BATCH, attachmentRows); + + for (BenthosBatch child : batch.getChildBatchs()) { + createBenthosRow(child, id, rows, frequencyRows, attachmentRows); + } + } + + protected void addFrequencies(String rowId, + String batchId, + List<CatchFrequencyRow> frequencyRows) { List<SpeciesBatchFrequency> frequencies = - persistenceService.getAllSpeciesBatchFrequency(batch.getId()); + persistenceService.getAllSpeciesBatchFrequency(batchId); for (SpeciesBatchFrequency frequency : frequencies) { CatchFrequencyRow frequencyRow = new CatchFrequencyRow(); - frequencyRow.setBatchId(id); + frequencyRow.setBatchId(rowId); frequencyRow.setLengthStepCaracteristic(frequency.getLengthStepCaracteristic()); frequencyRow.setLengthStep(frequency.getLengthStep()); frequencyRow.setNumber(frequency.getNumber()); frequencyRow.setWeight(frequency.getWeight()); frequencyRows.add(frequencyRow); } + } - for (BenthosBatch child : batch.getChildBatchs()) { - createBenthosRow(child, rows, frequencyRows); + protected void addAttachments(String batchId, + int objectId, + AttachementObjectTypeEnum objectType, + List<AttachmentRow> attachmentRows) { + List<Attachment> attachments = + persistenceService.getAllAttachments(objectType, objectId); + for (Attachment attachment : attachments) { + AttachmentRow attachmentRow = new AttachmentRow(); + attachmentRow.setBatchId(batchId); + attachmentRow.setName(attachment.getName()); + attachmentRow.setComment(attachment.getComment()); + attachmentRow.setFile(persistenceService.getAttachmentFile(attachment.getId())); + attachmentRows.add(attachmentRow); } } + + protected Object[] getValueAndCategoryType(CatchRow row) { + + String sortedUnsortedValue = (String) row.getSortedUnsortedSampleCategory(); + String sizeValue = (String) row.getSizeSampleCategory(); + String sexValue = (String) row.getSexSampleCategory(); + String maturityValue = (String) row.getMaturitySampleCategory(); + String ageValue = (String) row.getAgeSampleCategory(); + + Serializable value = null; + SampleCategoryEnum categoryType = null; + + if (StringUtils.isNotEmpty(sortedUnsortedValue)) { + Integer id = Integer.parseInt(sortedUnsortedValue); + Caracteristic caracteristic = persistenceService.getSortedUnsortedCaracteristic(); + value = TuttiEntities.getQualitativeValue(caracteristic, id); + categoryType = SampleCategoryEnum.sortedUnsorted; + + } else if (StringUtils.isNotEmpty(sizeValue)) { + Integer id = Integer.parseInt(sizeValue); + Caracteristic caracteristic = persistenceService.getSizeCategoryCaracteristic(); + value = TuttiEntities.getQualitativeValue(caracteristic, id); + categoryType = SampleCategoryEnum.size; + + } else if (StringUtils.isNotEmpty(sexValue)) { + Integer id = Integer.parseInt(sexValue); + Caracteristic caracteristic = persistenceService.getSexCaracteristic(); + value = TuttiEntities.getQualitativeValue(caracteristic, id); + categoryType = SampleCategoryEnum.sex; + + } else if (StringUtils.isNotEmpty(maturityValue)) { + Integer id = Integer.parseInt(maturityValue); + Caracteristic caracteristic = persistenceService.getMaturityCaracteristic(); + value = TuttiEntities.getQualitativeValue(caracteristic, id); + categoryType = SampleCategoryEnum.maturity; + + } else if (StringUtils.isNotEmpty(ageValue)) { + categoryType = SampleCategoryEnum.age; + value = Float.parseFloat(ageValue); + } + + return new Object[]{categoryType, value}; + } + + protected void importAttachments(File directory, Function<AttachmentRow, Integer> getObjetcIdFunction) { + File attachmentFile = new File(directory, ATTACHMENTS_FILE); + File attachmentDirectory = new File(directory, ATTACHMENTS_DIRECTORY); + Reader reader; + + try { + reader = Files.newReader(attachmentFile, Charsets.UTF_8); + + } catch (FileNotFoundException e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.import.attachments.error", attachmentFile), e); + } + + AttachmentRowModel attachmentModel = new AttachmentRowModel(csvSeparator, attachmentDirectory); + + Import<AttachmentRow> attachmentImporter = Import.newImport(attachmentModel, reader); + + for (AttachmentRow row : attachmentImporter) { + Integer objectId = getObjetcIdFunction.apply(row); + if (objectId != null) { + Attachment attachment = TuttiBeanFactory.newAttachment(); + attachment.setName(row.getName()); + attachment.setComment(row.getComment()); + attachment.setObjectType(AttachementObjectTypeEnum.BATCH); + + attachment.setObjectId(objectId); + + persistenceService.createAttachment(attachment, row.getFile()); + } + } + } } 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-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-05-14 14:31:57 UTC (rev 945) @@ -83,8 +83,20 @@ tutti.service.exportSumatra.header.station= tutti.service.exportSumatra.header.weight= tutti.service.mkDir.error= +tutti.service.multipost.attachment.copy.error= +tutti.service.multipost.explodeArchive.error= +tutti.service.multipost.export.attachments.error= +tutti.service.multipost.export.batches.error= +tutti.service.multipost.export.benthos.error= +tutti.service.multipost.export.deleteTempDirectory.error= tutti.service.multipost.export.error= tutti.service.multipost.export.frequencies.error= +tutti.service.multipost.export.species.error= +tutti.service.multipost.import.attachments.error= +tutti.service.multipost.import.batches.error= +tutti.service.multipost.import.frequencies.error= +tutti.service.multipost.import.species.error= +tutti.service.multipost.resolveArchive.error= tutti.service.operations.accidental.error.species.required= tutti.service.operations.computeWeights.benthos.error.incoherentCategoryWeight= tutti.service.operations.computeWeights.benthos.error.incoherentParentCategoryWeight= 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-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-05-14 14:31:57 UTC (rev 945) @@ -81,8 +81,17 @@ tutti.service.exportSumatra.header.station=Station tutti.service.exportSumatra.header.weight=Total tutti.service.mkDir.error=Erreur à la création du dossier %s -tutti.service.multipost.export.error= -tutti.service.multipost.export.frequencies.error= +tutti.service.multipost.attachment.copy.error=Erreur lors de l'export de la pièce-jointe %s +tutti.service.multipost.explodeArchive.error=Erreur lors de la décompression de l'archive +tutti.service.multipost.export.attachments.error=Erreur lors de l'export des pièces-jointes +tutti.service.multipost.export.batches.error=Erreur lors de l'export des lots +tutti.service.multipost.export.deleteTempDirectory.error=Erreur lors de la suppression du dossier temporaire +tutti.service.multipost.export.error=Erreur lors de la création du fichier d'export +tutti.service.multipost.export.frequencies.error=Erreur lors de l'export des mensurations +tutti.service.multipost.import.attachments.error=Erreur lors de l'import des pièces-jointes +tutti.service.multipost.import.batches.error=Erreur lors de l'import des lots +tutti.service.multipost.import.frequencies.error=Erreur lors de l'import des mensurations +tutti.service.multipost.resolveArchive.error=Erreur lors de l'ouverture de l'archive tutti.service.operations.computeWeights.error.benthos.incoherentCategoryWeight=Le poids total des mensurations d'un lot du benthos est supérieur au poids de la catégorie tutti.service.operations.computeWeights.error.benthos.incoherentParentCategoryWeight=Le poids de la catégorie d'un lot du benthos est différent de la somme des poids de ses sous-catégories tutti.service.operations.computeWeights.error.benthos.incoherentRowWeightCategory=Le poids de sous-échantillon est renseigné alors que le lot n'a pas de poids. Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/AbstractExportMultiPostAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/AbstractExportMultiPostAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/AbstractExportMultiPostAction.java 2013-05-14 14:31:57 UTC (rev 945) @@ -0,0 +1,82 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.catches.multipost.TuttiMultiPostImportExportService; +import fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.BenthosBatchUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.BenthosBatchUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.BenthosBatchUIModel; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; +import fr.ifremer.tutti.ui.swing.util.TuttiUI; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import org.jdesktop.beans.AbstractBean; + +import java.io.File; + +import static org.nuiton.i18n.I18n._; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public abstract class AbstractExportMultiPostAction<M extends AbstractBean, UI extends TuttiUI<M, ?>, H extends AbstractTuttiUIHandler<M, UI>> + extends AbstractTuttiAction<M, UI, H> { + + protected File file; + + protected FishingOperation currentOperation; + + protected TuttiMultiPostImportExportService multiPostImportExportService; + + public AbstractExportMultiPostAction(H handler) { + super(handler, false); + multiPostImportExportService = getContext().getMultiPostImportExportService(); + } + + @Override + protected boolean prepareAction() throws Exception { + + boolean doAction = super.prepareAction(); + + if (doAction) { + + EditCatchesUI catchesUI = getUI().getParentContainer(EditCatchesUI.class); + currentOperation = catchesUI.getModel().getFishingOperation(); + + String extension = getFileExtension(); + // choose file to export + file = TuttiUIUtil.saveFile( + decorate(currentOperation, DecoratorService.FILE_NAME_COMPATIBLE) + "." + extension, + getContext().getMainUI(), + getFileChooserTitle(), + getFileChooserButton(), + "^.*\\." + extension, + getFileExtensionDescription() + ); + if (file == null) { + + // user cancel + doAction = false; + } else { + + // ask user to confirm overwrite. + doAction = getHandler().askOverwriteFile(file); + } + } + return doAction; + } + + protected abstract String getFileExtension(); + protected abstract String getFileExtensionDescription(); + protected abstract String getFileChooserTitle(); + protected abstract String getFileChooserButton(); + + @Override + protected void releaseAction() { + file = null; + currentOperation = null; + super.releaseAction(); + } + +} \ No newline at end of file Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/AbstractImportMultiPostAction.java (from rev 937, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/AbstractImportMultiPostAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/AbstractImportMultiPostAction.java 2013-05-14 14:31:57 UTC (rev 945) @@ -0,0 +1,97 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.catches.multipost.TuttiMultiPostImportExportService; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationAction; +import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; +import fr.ifremer.tutti.ui.swing.util.TuttiUI; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; +import org.jdesktop.beans.AbstractBean; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.util.Collection; + +import static org.nuiton.i18n.I18n._; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public abstract class AbstractImportMultiPostAction <M extends AbstractBean, UI extends TuttiUI<M, ?>, H extends AbstractTuttiUIHandler<M, UI>> + extends AbstractTuttiAction<M, UI, H> { + + protected File file; + + protected EditFishingOperationAction editAction; + + protected TuttiMultiPostImportExportService multiPostImportExportService; + + public AbstractImportMultiPostAction(H handler) { + super(handler, false); + multiPostImportExportService = getContext().getMultiPostImportExportService(); + } + + public EditFishingOperationAction getEditAction() { + FishingOperationsUI parentUI = getUI().getParentContainer(FishingOperationsUI.class); + if (editAction == null) { + editAction = TuttiActionHelper.createLogicAction(parentUI.getHandler(), + EditFishingOperationAction.class); + } + return editAction; + } + + @Override + protected boolean prepareAction() throws Exception { + + boolean doAction = super.prepareAction(); + + if (doAction) { + + // choose file to import + file = TuttiUIUtil.chooseFile( + getContext().getMainUI(), + getFileChooserTitle(), + getFileChooserButton(), + "^.*\\." + getFileExtension(), + getFileExtensionDescription() + ); + doAction = file != null; + } + return doAction; + } + + protected abstract String getFileExtension(); + protected abstract String getFileExtensionDescription(); + protected abstract String getFileChooserTitle(); + protected abstract String getFileChooserButton(); + + @Override + protected void releaseAction() { + file = null; + super.releaseAction(); + } + + @Override + protected void doAction() throws Exception { + EditCatchesUI editCatchesUI = getUI().getParentContainer(EditCatchesUI.class); + EditCatchesUIModel editCatchesUIModel = editCatchesUI.getModel(); + + FishingOperation operation = editCatchesUIModel.getFishingOperation(); + + importBatches(operation); + + String fishingOperationText = getEditAction().getFishingOperationTitle(operation); + + getEditAction().loadCatchBatch(operation, fishingOperationText, true); + } + + protected abstract void importBatches(FishingOperation operation); + +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/MultiPostImportLogDialog.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/MultiPostImportLogDialog.css (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/MultiPostImportLogDialog.css 2013-05-14 14:31:57 UTC (rev 945) @@ -0,0 +1,25 @@ +#importMultiPostLogDialog { + title: "tutti.multiPostImportLog.title"; + modal: true; +} + +#message { + text: {_("tutti.multiPostImportLog.message")}; + border: { BorderFactory.createEmptyBorder(10, 20, 10, 20) }; + font: { javax.swing.UIManager.getFont("Label.font") }; + editable: false; + opaque: false; + wrapStyleWord: true; + lineWrap: true; + cursor: { null }; + focusable: false; +} + +#batchList { + editable: false; +} + +#closeButton { + text: "tutti.multiPostImportLog.close"; + actionIcon: close; +} \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/MultiPostImportLogDialog.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/MultiPostImportLogDialog.jaxx (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/MultiPostImportLogDialog.jaxx 2013-05-14 14:31:57 UTC (rev 945) @@ -0,0 +1,12 @@ +<JDialog id='importMultiPostLogDialog' layout='{new BorderLayout()}'> + + <JTextArea id="message" constraints='BorderLayout.NORTH'/> + + <JScrollPane constraints='BorderLayout.CENTER'> + <JTextArea id="batchList"/> + </JScrollPane> + + <JButton id="closeButton" constraints='BorderLayout.SOUTH' + onActionPerformed='dispose();'/> + +</JDialog> \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.css 2013-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.css 2013-05-14 14:31:57 UTC (rev 945) @@ -57,7 +57,7 @@ text: "tutti.editBenthosBatch.action.importMultiPost"; toolTipText: "tutti.editBenthosBatch.action.importMultiPost.tip"; i18nMnemonic: "tutti.editBenthosBatch.action.importMultiPost.mnemonic"; - /*_tuttiAction: {ImportMultiPostAction.class};*/ + _tuttiAction: {ImportMultiPostAction.class}; _help: {"tutti.editBenthosBatch.action.importMultiPost.help"}; } @@ -66,7 +66,7 @@ text: "tutti.editBenthosBatch.action.exportMultiPost"; toolTipText: "tutti.editBenthosBatch.action.exportMultiPost.tip"; i18nMnemonic: "tutti.editBenthosBatch.action.exportMultiPost.mnemonic"; - /*_tuttiAction: {ExportMultiPostAction.class};*/ + _tuttiAction: {ExportMultiPostAction.class}; _help: {"tutti.editBenthosBatch.action.exportMultiPost.help"}; } Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/ExportMultiPostAction.java (from rev 937, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/ExportMultiPostAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/ExportMultiPostAction.java 2013-05-14 14:31:57 UTC (rev 945) @@ -0,0 +1,59 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.benthos; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.catches.multipost.TuttiMultiPostImportExportService; +import fr.ifremer.tutti.ui.swing.content.operation.catches.AbstractExportMultiPostAction; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +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.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; + +import java.io.File; + +import static org.nuiton.i18n.I18n._; +import static org.nuiton.i18n.I18n.n_; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public class ExportMultiPostAction extends AbstractExportMultiPostAction<BenthosBatchUIModel, BenthosBatchUI, BenthosBatchUIHandler> { + + public ExportMultiPostAction(BenthosBatchUIHandler handler) { + super(handler); + } + + @Override + protected String getFileExtension() { + return "tuttiBenthos"; + } + + @Override + protected String getFileExtensionDescription() { + return _("tutti.common.file.tuttiBenthos"); + } + + @Override + protected String getFileChooserTitle() { + return _("tutti.editBenthosBatch.action.exportMultiPost.destinationFile.title"); + } + + @Override + protected String getFileChooserButton() { + return _("tutti.editBenthosBatch.action.exportMultiPost.destinationFile.button"); + } + + @Override + protected void doAction() throws Exception { + multiPostImportExportService.exportBenthos(file, currentOperation); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + sendMessage(_("tutti.editBenthosBatch.action.exportMultiPost.success", file)); + } +} Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/ImportMultiPostAction.java (from rev 937, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/ImportMultiPostAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/ImportMultiPostAction.java 2013-05-14 14:31:57 UTC (rev 945) @@ -0,0 +1,80 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.benthos; + +import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; +import fr.ifremer.tutti.ui.swing.content.operation.catches.AbstractImportMultiPostAction; +import fr.ifremer.tutti.ui.swing.content.operation.catches.MultiPostImportLogDialog; +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 javax.swing.*; +import java.awt.*; +import java.util.Collection; + +import static org.nuiton.i18n.I18n._; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public class ImportMultiPostAction extends AbstractImportMultiPostAction<BenthosBatchUIModel, BenthosBatchUI, BenthosBatchUIHandler> { + + protected Collection<BenthosBatch> notImportedBenthosBatches; + + public ImportMultiPostAction(BenthosBatchUIHandler handler) { + super(handler); + } + + @Override + protected String getFileExtension() { + return "tuttiBenthos"; + } + + @Override + protected String getFileExtensionDescription() { + return _("tutti.common.file.tuttiBenthos"); + } + + @Override + protected String getFileChooserTitle() { + return _("tutti.editBenthosBatch.action.importMultiPost.sourceFile.title"); + } + + @Override + protected String getFileChooserButton() { + return _("tutti.editBenthosBatch.action.importMultiPost.sourceFile.button"); + } + + @Override + protected void releaseAction() { + notImportedBenthosBatches = null; + super.releaseAction(); + } + + @Override + protected void importBatches(FishingOperation operation) { + notImportedBenthosBatches = multiPostImportExportService.importBenthos(file, operation); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + if (!notImportedBenthosBatches.isEmpty()) { + MultiPostImportLogDialog dialog = new MultiPostImportLogDialog((Dialog) getContext().getActionUI()); + + JTextArea batchList = dialog.getBatchList(); + for (BenthosBatch sb : notImportedBenthosBatches) { + batchList.append("- " + decorate(sb.getSpecies()) + " / " + decorate(sb.getSampleCategoryValue()) + "\n"); + } + + dialog.setSize(400, 300); + dialog.setLocationRelativeTo(getContext().getMainUI()); + dialog.setVisible(true); + } + + sendMessage(_("tutti.editBenthosBatch.action.importMultiPost.success", file)); + } +} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java 2013-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java 2013-05-14 14:31:57 UTC (rev 945) @@ -27,6 +27,7 @@ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.catches.multipost.TuttiMultiPostImportExportService; +import fr.ifremer.tutti.ui.swing.content.operation.catches.AbstractExportMultiPostAction; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; @@ -39,55 +40,30 @@ * @author kmorin <kmorin@codelutin.com> * @since 2.2 */ -public class ExportMultiPostAction extends AbstractTuttiAction<SpeciesBatchUIModel, SpeciesBatchUI, SpeciesBatchUIHandler> { +public class ExportMultiPostAction extends AbstractExportMultiPostAction<SpeciesBatchUIModel, SpeciesBatchUI, SpeciesBatchUIHandler> { - protected File file; - - protected FishingOperation currentOperation; - - protected TuttiMultiPostImportExportService multiPostImportExportService; - public ExportMultiPostAction(SpeciesBatchUIHandler handler) { - super(handler, false); - multiPostImportExportService = getContext().getMultiPostImportExportService(); + super(handler); } @Override - protected boolean prepareAction() throws Exception { + protected String getFileExtension() { + return "tuttiSpecies"; + } - boolean doAction = super.prepareAction(); + @Override + protected String getFileExtensionDescription() { + return _("tutti.common.file.tuttiSpecies"); + } - if (doAction) { - - EditCatchesUI catchesUI = getUI().getParentContainer(EditCatchesUI.class); - currentOperation = catchesUI.getModel().getFishingOperation(); - - // choose file to export - file = TuttiUIUtil.saveFile( - decorate(currentOperation, DecoratorService.FILE_NAME_COMPATIBLE) + ".zip", - getContext().getMainUI(), - _("tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.title"), - _("tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.button"), - "^.*\\.zip", _("tutti.common.file.zip") - ); - if (file == null) { - - // user cancel - doAction = false; - } else { - - // ask user to confirm overwrite. - doAction = getHandler().askOverwriteFile(file); - } - } - return doAction; + @Override + protected String getFileChooserTitle() { + return _("tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.title"); } @Override - protected void releaseAction() { - file = null; - currentOperation = null; - super.releaseAction(); + protected String getFileChooserButton() { + return _("tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.button"); } @Override Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java 2013-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java 2013-05-14 14:31:57 UTC (rev 945) @@ -24,19 +24,27 @@ * #L% */ -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.service.catches.multipost.TuttiMultiPostImportExportService; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationAction; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.AbstractImportMultiPostAction; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; -import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.ImportPupitriPopupUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.MultiPostImportLogDialog; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; +import jaxx.runtime.SwingUtil; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.File; +import java.util.Collection; +import java.util.List; import static org.nuiton.i18n.I18n._; @@ -44,67 +52,62 @@ * @author kmorin <kmorin@codelutin.com> * @since 2.2 */ -public class ImportMultiPostAction extends AbstractTuttiAction<SpeciesBatchUIModel, SpeciesBatchUI, SpeciesBatchUIHandler> { +public class ImportMultiPostAction extends AbstractImportMultiPostAction<SpeciesBatchUIModel, SpeciesBatchUI, SpeciesBatchUIHandler> { - protected File file; + protected Collection<SpeciesBatch> notImportedSpeciesBatches; - protected EditFishingOperationAction editAction; - public ImportMultiPostAction(SpeciesBatchUIHandler handler) { - super(handler, false); + super(handler); } - public EditFishingOperationAction getEditAction() { - FishingOperationsUI parentUI = getUI().getParentContainer(FishingOperationsUI.class); - if (editAction == null) { - editAction = TuttiActionHelper.createLogicAction(parentUI.getHandler(), - EditFishingOperationAction.class); - } - return editAction; + @Override + protected String getFileExtension() { + return "tuttiSpecies"; } @Override - protected boolean prepareAction() throws Exception { + protected String getFileExtensionDescription() { + return _("tutti.common.file.tuttiSpecies"); + } - boolean doAction = super.prepareAction(); + @Override + protected String getFileChooserTitle() { + return _("tutti.editSpeciesBatch.action.importMultiPost.sourceFile.title"); + } - if (doAction) { - - // choose file to import - file = TuttiUIUtil.chooseFile( - getContext().getMainUI(), - _("tutti.editSpeciesBatch.action.importMultiPost.sourceFile.title"), - _("tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button") - ); - - doAction = file != null; - } - return doAction; + @Override + protected String getFileChooserButton() { + return _("tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button"); } @Override protected void releaseAction() { - file = null; + notImportedSpeciesBatches = null; super.releaseAction(); } @Override - protected void doAction() throws Exception { - EditCatchesUI editCatchesUI = getUI().getParentContainer(EditCatchesUI.class); - EditCatchesUIModel editCatchesUIModel = editCatchesUI.getModel(); - - FishingOperation operation = editCatchesUIModel.getFishingOperation(); - CatchBatch catchBatch = editCatchesUIModel.getCatchBatch(); - - String fishingOperationText = getEditAction().getFishingOperationTitle(operation); - - getEditAction().loadCatchBatch(operation, fishingOperationText, true); + protected void importBatches(FishingOperation operation) { + notImportedSpeciesBatches = multiPostImportExportService.importSpecies(file, operation); } @Override public void postSuccessAction() { super.postSuccessAction(); + if (!notImportedSpeciesBatches.isEmpty()) { + MultiPostImportLogDialog dialog = new MultiPostImportLogDialog((Dialog) getContext().getActionUI()); + + JTextArea batchList = dialog.getBatchList(); + for (SpeciesBatch sb : notImportedSpeciesBatches) { + batchList.append("- " + decorate(sb.getSpecies()) + " / " + decorate(sb.getSampleCategoryValue()) + "\n"); + } + + dialog.setSize(400, 300); + dialog.setLocationRelativeTo(getContext().getMainUI()); + dialog.setVisible(true); + } + sendMessage(_("tutti.editSpeciesBatch.action.importMultiPost.success", file)); } } Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-05-14 14:31:57 UTC (rev 945) @@ -77,11 +77,14 @@ tutti.common.askSaveBeforeLeaving.title= tutti.common.cancel= tutti.common.cancel.mnemonic= +tutti.common.close= tutti.common.datefield.tip= tutti.common.file.csv= tutti.common.file.export= tutti.common.file.pdf= tutti.common.file.protocol= +tutti.common.file.tuttiBenthos= +tutti.common.file.tuttiSpecies= tutti.common.file.zip= tutti.common.selected.fishingOperation= tutti.common.selected.protocol= @@ -293,10 +296,16 @@ tutti.editBenthosBatch.action.createMelag.mnemonic= tutti.editBenthosBatch.action.createMelag.tip= tutti.editBenthosBatch.action.exportMultiPost= +tutti.editBenthosBatch.action.exportMultiPost.destinationFile.button= +tutti.editBenthosBatch.action.exportMultiPost.destinationFile.title= tutti.editBenthosBatch.action.exportMultiPost.mnemonic= +tutti.editBenthosBatch.action.exportMultiPost.success= tutti.editBenthosBatch.action.exportMultiPost.tip= tutti.editBenthosBatch.action.importMultiPost= tutti.editBenthosBatch.action.importMultiPost.mnemonic= +tutti.editBenthosBatch.action.importMultiPost.sourceFile.button= +tutti.editBenthosBatch.action.importMultiPost.sourceFile.title= +tutti.editBenthosBatch.action.importMultiPost.success= tutti.editBenthosBatch.action.importMultiPost.tip= tutti.editBenthosBatch.action.removeBatch= tutti.editBenthosBatch.action.removeBatch.mnemonic= @@ -807,6 +816,9 @@ tutti.editSpeciesBatch.action.importMultiPost= tutti.editSpeciesBatch.action.importMultiPost.destinationFile.title= tutti.editSpeciesBatch.action.importMultiPost.mnemonic= +tutti.editSpeciesBatch.action.importMultiPost.notImportedSpecies= +tutti.editSpeciesBatch.action.importMultiPost.notImportedSpeciesDialog.message= +tutti.editSpeciesBatch.action.importMultiPost.notImportedSpeciesDialog.title= tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button= tutti.editSpeciesBatch.action.importMultiPost.sourceFile.title= tutti.editSpeciesBatch.action.importMultiPost.success= @@ -1108,6 +1120,9 @@ tutti.manageTemporaryReferential.title.choose.importTemporarySpeciesFile= tutti.manageTemporaryReferential.title.choose.importTemporaryVesselFile= tutti.message.action.running= +tutti.multiPostImportLog.close= +tutti.multiPostImportLog.message= +tutti.multiPostImportLog.title= tutti.property.= tutti.property.get.error= tutti.property.set.error= Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-05-13 13:00:31 UTC (rev 944) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-05-14 14:31:57 UTC (rev 945) @@ -78,6 +78,8 @@ tutti.common.file.csv=Extension d'un fichier csv tutti.common.file.pdf=Extension d'un fichier pdf tutti.common.file.protocol=Extension d'un fichier de protocole Tutti +tutti.common.file.tuttiBenthos=Fichier d'import/export des lots de benthos +tutti.common.file.tuttiSpecies=Fichier d'import/export des lots d'espèces tutti.common.file.zip=Extension d'une archive zip tutti.common.selected.fishingOperation=l'opération de pêche sélectionnée tutti.common.selected.protocol=le protocole sélectionné @@ -288,10 +290,16 @@ tutti.editBenthosBatch.action.createMelag.mnemonic=C tutti.editBenthosBatch.action.createMelag.tip=Calcul des poids des lots appartenant à un MELAG tutti.editBenthosBatch.action.exportMultiPost=Exporter les lots de benthos +tutti.editBenthosBatch.action.exportMultiPost.destinationFile.button=Choisir le fichier pour l'export +tutti.editBenthosBatch.action.exportMultiPost.destinationFile.title=Exporter les lots du benthos tutti.editBenthosBatch.action.exportMultiPost.mnemonic=E +tutti.editBenthosBatch.action.exportMultiPost.success=Les lots du benthos ont été exportés dans le fichier %s tutti.editBenthosBatch.action.exportMultiPost.tip=Exporter les lots de benthos pour les importer sur le poste maître tutti.editBenthosBatch.action.importMultiPost=Importer des lots de benthos tutti.editBenthosBatch.action.importMultiPost.mnemonic=I +tutti.editBenthosBatch.action.importMultiPost.sourceFile.button=Choisir le fichier à importer +tutti.editBenthosBatch.action.importMultiPost.sourceFile.title=Importer des lots de benthos +tutti.editBenthosBatch.action.importMultiPost.success=Des lots de benthos ont été importés depuis le fichier %s tutti.editBenthosBatch.action.importMultiPost.tip=Importer des lots de benthos créés sur un poste satellite tutti.editBenthosBatch.action.removeBatch=Supprimer le lot tutti.editBenthosBatch.action.removeBatch.mnemonic=S @@ -505,7 +513,7 @@ tutti.editFishingOperation.action.importCasino.mnemonic=I tutti.editFishingOperation.action.importCasino.tip=Import Casino tutti.editFishingOperation.action.resetEditFishingOperation=Réinitialiser -tutti.editFishingOperation.action.resetEditFishingOperation.mnemonic= +tutti.editFishingOperation.action.resetEditFishingOperation.mnemonic=R tutti.editFishingOperation.action.resetEditFishingOperation.tip=Réinitialiser l'édition du trait tutti.editFishingOperation.action.resetFishingOperationValidState=Réinitialiser tutti.editFishingOperation.action.resetFishingOperationValidState.mnemonic=é @@ -772,13 +780,13 @@ tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.button=Choisir le fichier pour l'export tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.title=Exporter les lots d'espèces tutti.editSpeciesBatch.action.exportMultiPost.mnemonic=E -tutti.editSpeciesBatch.action.exportMultiPost.success= +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.importMultiPost=Importer des lots d'espèces tutti.editSpeciesBatch.action.importMultiPost.mnemonic=I tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button=Choisir le fichier à importer tutti.editSpeciesBatch.action.importMultiPost.sourceFile.title=Importer des lots d'espèces -tutti.editSpeciesBatch.action.importMultiPost.success= +tutti.editSpeciesBatch.action.importMultiPost.success=Des lots d'espèces ont été importés depuis le fichier %s tutti.editSpeciesBatch.action.importMultiPost.tip=Importer des lots d'espèces créés sur un poste satellite tutti.editSpeciesBatch.action.removeBatch=Supprimer le lot tutti.editSpeciesBatch.action.removeBatch.mnemonic=S @@ -1075,7 +1083,9 @@ tutti.manageTemporaryReferential.title.choose.importTemporarySpeciesFile=Importer un réferentiel Espèce tutti.manageTemporaryReferential.title.choose.importTemporaryVesselFile=Importer un réferentiel Navire tutti.message.action.running=<html>Action <strong>%s</strong> en cours d'execution...<hr/></html> -tutti.property.= +tutti.multiPostImportLog.close=Fermer +tutti.multiPostImportLog.message=Des lots n'ont pas été importés car des lots existants avaient déjà les mêmes espèces et catégorie de tri +tutti.multiPostImportLog.title=Lots non importés tutti.property.get.error=Propriété %1s non trouvée sur l'objet de type %2s tutti.property.set.error=Propriété %1s non trouvée sur l'objet de type %2s tutti.sampleOrder.caracteristicNotFound=La caractéristique d'id %s n'est pas prévue pour l'échantillonage
participants (1)
-
kmorin@users.forge.codelutin.com