Author: tchemit Date: 2013-02-01 11:54:50 +0100 (Fri, 01 Feb 2013) New Revision: 285 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/285 Log: - add a control to disabled catches edit or validate when program has no zone - import / export protocol species Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesExportModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesImportModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/SpeciesRow.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportProtocolSpeciesAction.java trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml Removed: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/update/ Modified: trunk/pom.xml trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolCaracteristicImportModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/TuttiProtocolImportExportService.java trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/protocol/TuttiProtocolImportExportServiceTest.java trunk/tutti-ui-swing/pom.xml trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ImportProtocolCaracteristicAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ImportProtocolSpeciesAction.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/pom.xml 2013-02-01 10:54:50 UTC (rev 285) @@ -124,7 +124,7 @@ <!-- libraries version --> - <nuitonUtilsVersion>2.6.7-SNAPSHOT</nuitonUtilsVersion> + <nuitonUtilsVersion>2.6.7</nuitonUtilsVersion> <nuitonI18nVersion>2.5</nuitonI18nVersion> <eugenePluginVersion>2.6.1</eugenePluginVersion> Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java 2013-02-01 10:54:50 UTC (rev 285) @@ -0,0 +1,116 @@ +package fr.ifremer.tutti.service; + +/* + * #%L + * Tutti :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 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.tutti.persistence.entities.IdAware; +import org.apache.commons.lang3.StringUtils; +import org.nuiton.util.csv.ValueParserFormatter; +import org.nuiton.util.csv.ext.AbstractImportModel; + +import java.text.ParseException; +import java.util.Map; + +/** + * Helper around csv import / export in Tutti. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class TuttiCsvUtil { + + public static abstract class AbstractTuttiImportModel<M> extends AbstractImportModel<M> { + + public AbstractTuttiImportModel(char separator) { + super(separator); + } + + public <E extends IdAware> void newForeignKeyColumn(String headerName, String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { + newMandatoryColumn(headerName, propertyName, newForeignKeyValue(entityType, foreignKeyName, universe)); + } + + public <E extends IdAware> void newForeignKeyColumn(String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { + newMandatoryColumn(propertyName, propertyName, newForeignKeyValue(entityType, foreignKeyName, universe)); + } + + public <E extends IdAware> ForeignKeyValue<E> newForeignKeyValue(Class<E> type, String propertyName, Map<String, E> universe) { + return new ForeignKeyValue<E>(type, propertyName, universe); + } + } + + /** + * @param <E> + * @author tchemit <chemit@codelutin.com> + * @since 2.6.12 + */ + public static class ForeignKeyValue<E extends IdAware> implements ValueParserFormatter<E> { + + protected final String propertyName; + + protected final Class<E> entityType; + + protected final Map<String, E> universe; + + public ForeignKeyValue(Class<E> entityType, + String propertyName, + Map<String, E> universe) { + this.entityType = entityType; + this.propertyName = propertyName; + this.universe = universe; + } + + @Override + public E parse(String value) throws ParseException { + E result = null; + if (StringUtils.isNotBlank(value)) { + + // get entity from universe + result = universe.get(value); + + if (result == null) { + + // can not find entity this is a big problem for us... + throw new RuntimeException( + "Could not find entity of type " + + entityType.getSimpleName() + " with '" + + propertyName + "' = " + value); + } + } + return result; + } + + @Override + public String format(E e) { + String value = ""; + if (e != null) { + value = e.getId(); + } + return value; + } + } + + protected TuttiCsvUtil() { + // no instance + } +} Property changes on: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolCaracteristicImportModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolCaracteristicImportModel.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolCaracteristicImportModel.java 2013-02-01 10:54:50 UTC (rev 285) @@ -25,14 +25,10 @@ package fr.ifremer.tutti.service.protocol; -import fr.ifremer.tutti.persistence.entities.IdAware; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import org.apache.commons.lang3.StringUtils; +import fr.ifremer.tutti.service.TuttiCsvUtil; import org.nuiton.util.csv.Common; -import org.nuiton.util.csv.ValueParserFormatter; -import org.nuiton.util.csv.ext.AbstractImportModel; -import java.text.ParseException; import java.util.Map; /** @@ -41,7 +37,7 @@ * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -public class ProtocolCaracteristicImportModel extends AbstractImportModel<CaracteristicRow> { +public class ProtocolCaracteristicImportModel extends TuttiCsvUtil.AbstractTuttiImportModel<CaracteristicRow> { public ProtocolCaracteristicImportModel(char separator, Map<String, Caracteristic> caracteristicMap) { super(separator); @@ -67,66 +63,4 @@ return new CaracteristicRow(); } - public <E extends IdAware> void newForeignKeyColumn(String headerName, String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { - newMandatoryColumn(headerName, propertyName, newForeignKeyValue(entityType, foreignKeyName, universe)); - } - - public <E extends IdAware> void newForeignKeyColumn(String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { - newMandatoryColumn(propertyName, propertyName, newForeignKeyValue(entityType, foreignKeyName, universe)); - } - - public static <E extends IdAware> ForeignKeyValue<E> newForeignKeyValue(Class<E> type, String propertyName, Map<String, E> universe) { - return new ForeignKeyValue<E>(type, propertyName, universe); - } - - /** - * @param <E> - * @author tchemit <chemit@codelutin.com> - * @since 2.6.12 - */ - public static class ForeignKeyValue<E extends IdAware> implements ValueParserFormatter<E> { - - protected final String propertyName; - - protected final Class<E> entityType; - - protected final Map<String, E> universe; - - public ForeignKeyValue(Class<E> entityType, - String propertyName, - Map<String, E> universe) { - this.entityType = entityType; - this.propertyName = propertyName; - this.universe = universe; - } - - @Override - public E parse(String value) throws ParseException { - E result = null; - if (StringUtils.isNotBlank(value)) { - - // get entity from universe - result = universe.get(value); - - if (result == null) { - - // can not find entity this is a big problem for us... - throw new RuntimeException( - "Could not find entity of type " + - entityType.getSimpleName() + " with '" + - propertyName + "' = " + value); - } - } - return result; - } - - @Override - public String format(E e) { - String value = ""; - if (e != null) { - value = e.getId(); - } - return value; - } - } } Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesExportModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesExportModel.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesExportModel.java 2013-02-01 10:54:50 UTC (rev 285) @@ -0,0 +1,53 @@ +package fr.ifremer.tutti.service.protocol; + +/* + * #%L + * Tutti :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 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.tutti.persistence.entities.protocol.SpeciesProtocol; +import org.nuiton.util.csv.Common; +import org.nuiton.util.csv.ext.AbstractExportModel; + +/** + * Model to export {@link SpeciesProtocol}. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class ProtocolSpeciesExportModel extends AbstractExportModel<SpeciesRow> { + + public ProtocolSpeciesExportModel(char separator) { + super(separator); + + newColumnForExport(SpeciesRow.PROPERTY_ID); + newColumnForExport(SpeciesRow.PROPERTY_LENGTH_CLASS, SpeciesRow.PROPERTY_LENGTH_CLASS_ID); + newColumnForExport(SpeciesRow.PROPERTY_SIZE_ENABLED, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(SpeciesRow.PROPERTY_SEX_ENABLED, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(SpeciesRow.PROPERTY_MATURITY_ENABLED, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(SpeciesRow.PROPERTY_AGE_ENABLED, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(SpeciesRow.PROPERTY_WEIGHT_ENABLED, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(SpeciesRow.PROPERTY_COUNT_IF_NO_FREQUENCY_ENABLED, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(SpeciesRow.PROPERTY_CALCIFY_SAMPLE_ENABLED, Common.PRIMITIVE_BOOLEAN); + } + +} \ No newline at end of file Property changes on: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesExportModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesImportModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesImportModel.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesImportModel.java 2013-02-01 10:54:50 UTC (rev 285) @@ -0,0 +1,77 @@ +package fr.ifremer.tutti.service.protocol; + +/* + * #%L + * Tutti :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 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.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.TuttiCsvUtil; +import org.nuiton.util.csv.Common; + +import java.util.Map; + +/** + * Model to export {@link SpeciesProtocol}. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class ProtocolSpeciesImportModel extends TuttiCsvUtil.AbstractTuttiImportModel<SpeciesRow> { + + public ProtocolSpeciesImportModel(char separator, + Map<String, Caracteristic> caracteristicMap, + Map<String, Species> speciesMap) { + super(separator); + + newForeignKeyColumn(SpeciesRow.PROPERTY_ID, + SpeciesRow.PROPERTY_SPECIES, + Species.class, + Species.PROPERTY_ID, + speciesMap); + + newForeignKeyColumn(SpeciesRow.PROPERTY_LENGTH_CLASS, + SpeciesRow.PROPERTY_LENGTH_CLASS, + Caracteristic.class, + Caracteristic.PROPERTY_ID, + caracteristicMap); + + newMandatoryColumn(SpeciesRow.PROPERTY_SIZE_ENABLED, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(SpeciesRow.PROPERTY_SEX_ENABLED, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(SpeciesRow.PROPERTY_MATURITY_ENABLED, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(SpeciesRow.PROPERTY_AGE_ENABLED, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(SpeciesRow.PROPERTY_WEIGHT_ENABLED, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(SpeciesRow.PROPERTY_COUNT_IF_NO_FREQUENCY_ENABLED, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(SpeciesRow.PROPERTY_CALCIFY_SAMPLE_ENABLED, Common.PRIMITIVE_BOOLEAN); +// +// newIgnoredColumn(SpeciesRow.PROPERTY_PARAMETER); + } + + @Override + public SpeciesRow newEmptyInstance() { + return new SpeciesRow(); + } + + +} \ No newline at end of file Property changes on: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolSpeciesImportModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/SpeciesRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/SpeciesRow.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/SpeciesRow.java 2013-02-01 10:54:50 UTC (rev 285) @@ -0,0 +1,160 @@ +package fr.ifremer.tutti.service.protocol; + +/* + * #%L + * Tutti :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 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.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; + +import java.io.Serializable; + +/** + * Row of a {@link SpeciesProtocol} to import or export. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class SpeciesRow implements Serializable { + + private static final long serialVersionUID = 1L; + + public static final String PROPERTY_ID = "id"; + + public static final String PROPERTY_SPECIES = "species"; + + public static final String PROPERTY_SIZE_ENABLED = "sizeEnabled"; + + public static final String PROPERTY_SEX_ENABLED = "sexEnabled"; + + public static final String PROPERTY_MATURITY_ENABLED = "maturityEnabled"; + + public static final String PROPERTY_AGE_ENABLED = "ageEnabled"; + + public static final String PROPERTY_LENGTH_CLASS = "lengthClass"; + public static final String PROPERTY_LENGTH_CLASS_ID = "lengthClassId"; + + public static final String PROPERTY_WEIGHT_ENABLED = "weightEnabled"; + + public static final String PROPERTY_COUNT_IF_NO_FREQUENCY_ENABLED = "countIfNoFrequencyEnabled"; + + public static final String PROPERTY_CALCIFY_SAMPLE_ENABLED = "calcifySampleEnabled"; + + protected final SpeciesProtocol delegate; + + protected Species species; + + protected Caracteristic lengthClass; + + public SpeciesRow() { + delegate = new SpeciesProtocol(); + } + + public Species getSpecies() { + return species; + } + + public Caracteristic getLengthClass() { + return lengthClass; + } + + public void setLengthClass(Caracteristic lengthClass) { + this.lengthClass = lengthClass; + delegate.setLengthStepPmfmId(lengthClass == null ? null : lengthClass.getId()); + } + + public String getLengthClassId() { + return delegate.getLengthStepPmfmId(); + } + + public void setSpecies(Species species) { + this.species = species; + delegate.setSpeciesId(species == null ? null : species.getId()); + } + + public String getId() { + return delegate.getSpeciesId(); + } + + public boolean isSizeEnabled() { + return delegate.isSizeEnabled(); + } + + public void setSizeEnabled(boolean sizeEnabled) { + delegate.setSizeEnabled(sizeEnabled); + } + + public boolean isSexEnabled() { + return delegate.isSexEnabled(); + } + + public void setSexEnabled(boolean sexEnabled) { + delegate.setSexEnabled(sexEnabled); + } + + public boolean isMaturityEnabled() { + return delegate.isMaturityEnabled(); + } + + public void setMaturityEnabled(boolean maturityEnabled) { + delegate.setMaturityEnabled(maturityEnabled); + } + + public boolean isAgeEnabled() { + return delegate.isAgeEnabled(); + } + + public void setAgeEnabled(boolean ageEnabled) { + delegate.setAgeEnabled(ageEnabled); + } + + public boolean isWeightEnabled() { + return delegate.isWeightEnabled(); + } + + public void setWeightEnabled(boolean weightEnabled) { + delegate.setWeightEnabled(weightEnabled); + } + + public boolean isCountIfNoFrequencyEnabled() { + return delegate.isCountIfNoFrequencyEnabled(); + } + + public void setCountIfNoFrequencyEnabled(boolean countIfNoFrequencyEnabled) { + delegate.setCountIfNoFrequencyEnabled(countIfNoFrequencyEnabled); + } + + public boolean isCalcifySampleEnabled() { + return delegate.isCalcifySampleEnabled(); + } + + public void setCalcifySampleEnabled(boolean calcifySampleEnabled) { + delegate.setCalcifySampleEnabled(calcifySampleEnabled); + } + + public String getSpeciesId() { + return delegate.getSpeciesId(); + } + +} \ No newline at end of file Property changes on: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/SpeciesRow.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/TuttiProtocolImportExportService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/TuttiProtocolImportExportService.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/TuttiProtocolImportExportService.java 2013-02-01 10:54:50 UTC (rev 285) @@ -28,17 +28,22 @@ import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.TreeMultimap; import com.google.common.io.Closeables; import com.google.common.io.Files; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.AbstractTuttiService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; import org.nuiton.util.csv.Export; import org.nuiton.util.csv.Import2; import org.nuiton.util.csv.ImportRow; @@ -143,7 +148,6 @@ } public void exportAllCaracteristic(File file, - Map<String, Caracteristic> caracteristicMap) throws Exception { if (log.isInfoEnabled()) { @@ -170,7 +174,8 @@ } } - public void exportProtocolCaracteristic(File file, TuttiProtocol protocol, + public void exportProtocolCaracteristic(File file, + TuttiProtocol protocol, Map<String, Caracteristic> caracteristicMap) throws Exception { if (log.isInfoEnabled()) { @@ -182,18 +187,24 @@ List<CaracteristicRow> rows = Lists.newArrayList(); - function.setType(CaracteristicType.LENGTH_CLASS); - rows.addAll(Lists.transform(protocol.getLengthClassesPmfmId(), function)); + if (!protocol.isLengthClassesPmfmIdEmpty()) { + function.setType(CaracteristicType.LENGTH_CLASS); - function.setType(CaracteristicType.ENVIRONMENT); - rows.addAll(Lists.transform(protocol.getEnvironmentPmfmId(), function)); + rows.addAll(Lists.transform(protocol.getLengthClassesPmfmId(), function)); + } + if (!protocol.isEnvironmentPmfmIdEmpty()) { + function.setType(CaracteristicType.ENVIRONMENT); + rows.addAll(Lists.transform(protocol.getEnvironmentPmfmId(), function)); + } + if (!protocol.isGearPmfmIdEmpty()) { - function.setType(CaracteristicType.GEAR); - rows.addAll(Lists.transform(protocol.getGearPmfmId(), function)); - - function.setType(CaracteristicType.HYDROLOGY); - rows.addAll(Lists.transform(protocol.getHydrologyPmfmId(), function)); - + function.setType(CaracteristicType.GEAR); + rows.addAll(Lists.transform(protocol.getGearPmfmId(), function)); + } + if (!protocol.isHydrologyPmfmIdEmpty()) { + function.setType(CaracteristicType.HYDROLOGY); + rows.addAll(Lists.transform(protocol.getHydrologyPmfmId(), function)); + } ProtocolCaracteristicExportModel csvModel = new ProtocolCaracteristicExportModel(getCsvSeparator()); @@ -208,23 +219,111 @@ } public void importProtocolSpecies(File file, - TuttiProtocol protocol) throws IOException { + TuttiProtocol protocol, + Map<String, Caracteristic> caracteristicMap, + Map<String, Species> speciesMap) throws IOException { + if (log.isInfoEnabled()) { - log.info("Will import protocol [" + protocol.getName() + "] species from file: " + file); + log.info("Will import protocol [" + protocol.getName() + + "] species from file: " + file); } - Reader fileReader = Files.newReader(file, Charsets.UTF_8); + + + Map<String, SpeciesProtocol> ids = Maps.newLinkedHashMap(); + + if (!protocol.isSpeciesEmpty()) { + + // get existing species (will be replaced if required) + + for (SpeciesProtocol speciesProtocol : protocol.getSpecies()) { + ids.put(speciesProtocol.getSpeciesId(), speciesProtocol); + } + + } + ProtocolSpeciesImportModel csvModel = + new ProtocolSpeciesImportModel(getCsvSeparator(), + caracteristicMap, + speciesMap); + + Reader reader = Files.newReader(file, Charsets.UTF_8); try { - if (log.isInfoEnabled()) { - log.info("TODO"); + + Import2<SpeciesRow> importer = + Import2.newImport(csvModel, reader); + + try { + + Binder<SpeciesRow, SpeciesProtocol> binder = + BinderFactory.newBinder(SpeciesRow.class, + SpeciesProtocol.class); + + for (ImportRow<SpeciesRow> row : importer) { + + if (!row.isValid()) { + + //TODO deal with line error + if (log.isErrorEnabled()) { + log.error("there is some error on line " + row.getLineNumber() + ":\n" + row.getErrors()); + } + } else { + + // treat row + SpeciesRow bean = row.getBean(); + + Species species = bean.getSpecies(); + String id = species.getId(); + + SpeciesProtocol sp = new SpeciesProtocol(); + binder.copy(bean, sp); + sp.setId(id); + + ids.put(id, sp); + } + } + importer.close(); + } finally { + Closeables.closeQuietly(importer); } - fileReader.close(); + reader.close(); } catch (Exception e) { - throw new IOException("Could not import protocol [" + protocol.getName() + "] species from file " + file, e); + throw new IOException("Could not import protocol [" + protocol.getName() + "] caracteristic from file " + file, e); } finally { - Closeables.closeQuietly(fileReader); + Closeables.closeQuietly(reader); } + + List<SpeciesProtocol> values = Lists.newArrayList(ids.values()); + protocol.setSpecies(values); } + public void exportProtocolSpecies(File file, + TuttiProtocol protocol, + Map<String, Caracteristic> caracteristicMap, + Map<String, Species> speciesMap) throws Exception { + if (log.isInfoEnabled()) { + log.info("Will export species to file: " + file); + } + + List<SpeciesRow> rows = Lists.newArrayList(); + + if (!protocol.isSpeciesEmpty()) { + rows = Lists.transform(protocol.getSpecies(), new SpeciesProtocolToSpeciesRowFunction( + caracteristicMap, + speciesMap)); + } + + ProtocolSpeciesExportModel csvModel = + new ProtocolSpeciesExportModel(getCsvSeparator()); + + BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + try { + Export export = Export.newExport(csvModel, rows); + export.write(writer); + writer.close(); + } finally { + Closeables.closeQuietly(writer); + } + } + protected char getCsvSeparator() { return context.getConfig().getCsvSeparator(); } @@ -273,4 +372,35 @@ this.type = type; } } + + private static class SpeciesProtocolToSpeciesRowFunction implements Function<SpeciesProtocol, SpeciesRow> { + + private final Map<String, Species> speciesMap; + + private final Map<String, Caracteristic> caracteristicMap; + + private final Binder<SpeciesProtocol, SpeciesRow> binder; + + public SpeciesProtocolToSpeciesRowFunction(Map<String, Caracteristic> caracteristicMap, + Map<String, Species> speciesMap) { + this.speciesMap = speciesMap; + this.caracteristicMap = caracteristicMap; + this.binder = BinderFactory.newBinder(SpeciesProtocol.class, SpeciesRow.class); + } + + @Override + public SpeciesRow apply(SpeciesProtocol input) { + Species species = speciesMap.get(input.getSpeciesId()); + Preconditions.checkNotNull(species, "Could not find a species with id: " + input); + SpeciesRow result = new SpeciesRow(); + binder.copy(input, result); + String pmfmId = input.getLengthStepPmfmId(); + if (pmfmId != null) { + Caracteristic caracteristic = caracteristicMap.get(pmfmId); + result.setLengthClass(caracteristic); + } + result.setSpecies(species); + return result; + } + } } Modified: trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/protocol/TuttiProtocolImportExportServiceTest.java =================================================================== --- trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/protocol/TuttiProtocolImportExportServiceTest.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/protocol/TuttiProtocolImportExportServiceTest.java 2013-02-01 10:54:50 UTC (rev 285) @@ -31,6 +31,7 @@ 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.Species; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; import org.apache.commons.logging.Log; @@ -113,6 +114,10 @@ "4;;parameterName4;matrixName4;fractionName4;methodName4;\n" + "5;;parameterName5;matrixName5;fractionName5;methodName5;"; + public static final String PROTOCOL_SPECIES_FILE_CONTENT = + "id;lengthClass;sizeEnabled;sexEnabled;maturityEnabled;ageEnabled;weightEnabled;countIfNoFrequencyEnabled;calcifySampleEnabled\n" + + "1;1;Y;Y;Y;Y;Y;Y;Y;\n" + + "2;;N;Y;N;Y;Y;Y;Y;"; @Before public void setUp() throws Exception { @@ -224,16 +229,16 @@ @Test public void importProtocolCaracteristic() throws Exception { - File importfile = new File(datadirectory, "importProtocolCaracteristic.csv"); + File file = new File(datadirectory, "importProtocolCaracteristic.csv"); - Files.createParentDirs(importfile); + Files.createParentDirs(file); - Files.write(PROTOCOL_CARACTERISTIC_FILE_CONTENT, importfile, Charsets.UTF_8); + Files.write(PROTOCOL_CARACTERISTIC_FILE_CONTENT, file, Charsets.UTF_8); TuttiProtocol protocol = new TuttiProtocol(); Map<String, Caracteristic> caracteristicMap = createCaracteristics(); - service.importProtocolCaracteristic(importfile, + service.importProtocolCaracteristic(file, protocol, caracteristicMap); @@ -291,6 +296,77 @@ Assert.assertEquals(ALL_CARACTERISTIC_FILE_CONTENT, exportFileToString); } + @Test + public void importProtocolSpecies() throws Exception { + + File file = new File(datadirectory, "importProtocolSpecies.csv"); + + Files.createParentDirs(file); + + Files.write(PROTOCOL_SPECIES_FILE_CONTENT, file, Charsets.UTF_8); + + TuttiProtocol protocol = new TuttiProtocol(); + Map<String, Species> speciesMap = createSpecies(); + Map<String, Caracteristic> caracteristicMap = createCaracteristics(); + + service.importProtocolSpecies(file, + protocol, + caracteristicMap, + speciesMap); + + Assert.assertEquals(2, protocol.sizeSpecies()); + } + + @Test + public void exportProtocolSpecies() throws Exception { + + File file = new File(datadirectory, "exportProtocolSpecies.csv"); + + Files.createParentDirs(file); + + Map<String, Species> speciesMap = createSpecies(); + + TuttiProtocol protocol = new TuttiProtocol(); + protocol.setSpecies(Lists.<SpeciesProtocol>newArrayList()); + + SpeciesProtocol sp1 = new SpeciesProtocol(); + sp1.setSpeciesId("1"); + sp1.setAgeEnabled(true); + sp1.setSizeEnabled(true); + sp1.setMaturityEnabled(true); + sp1.setSexEnabled(true); + sp1.setWeightEnabled(true); + sp1.setCountIfNoFrequencyEnabled(true); + sp1.setCalcifySampleEnabled(true); + sp1.setLengthStepPmfmId("1"); + + protocol.addSpecies(sp1); + + SpeciesProtocol sp2 = new SpeciesProtocol(); + sp2.setSpeciesId("2"); + sp2.setAgeEnabled(true); + sp1.setSizeEnabled(true); + sp1.setMaturityEnabled(true); + sp2.setSexEnabled(true); + sp2.setWeightEnabled(true); + sp2.setCalcifySampleEnabled(true); + sp2.setCountIfNoFrequencyEnabled(true); + sp2.setLengthStepPmfmId(null); + + protocol.addSpecies(sp2); + + Assert.assertFalse(file.exists()); + service.exportProtocolSpecies(file, + protocol, + createCaracteristics(), + speciesMap); + + Assert.assertTrue(file.exists()); + + String exportFileToString = Files.toString(file, Charsets.UTF_8).trim(); + Assert.assertEquals(PROTOCOL_SPECIES_FILE_CONTENT, exportFileToString); + } + public static File getTestSpecificDirectory(Class<?> testClassName, String methodName, String classifier) { @@ -320,7 +396,7 @@ } protected Map<String, Caracteristic> createCaracteristics() { - Map<String, Caracteristic> caracteristicMap = Maps.newTreeMap(); + Map<String, Caracteristic> result = Maps.newTreeMap(); for (int i = 1; i < 6; i++) { Caracteristic c = new Caracteristic(); c.setId("" + i); @@ -328,8 +404,18 @@ c.setMatrixName("matrixName" + i); c.setFractionName("fractionName" + i); c.setMethodName("methodName" + i); - caracteristicMap.put(i + "", c); + result.put(i + "", c); } - return caracteristicMap; + return result; } + + protected Map<String, Species> createSpecies() { + Map<String, Species> result = Maps.newTreeMap(); + for (int i = 1; i < 3; i++) { + Species c = new Species(); + c.setId("" + i); + result.put(i + "", c); + } + return result; + } } Modified: trunk/tutti-ui-swing/pom.xml =================================================================== --- trunk/tutti-ui-swing/pom.xml 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/pom.xml 2013-02-01 10:54:50 UTC (rev 285) @@ -67,12 +67,14 @@ fr.ifremer.tutti.ui.swing.RunTutti </maven.jar.main.class> + <bundlePrefix>tutti-${project.version}</bundlePrefix> + <redmine.releaseFiles> - target/${project.build.finalName}-standalone.zip, - target/${project.build.finalName}-full-windows-i586.zip, - target/${project.build.finalName}-full-windows-x64.zip, - target/${project.build.finalName}-full-linux-i586.zip, - target/${project.build.finalName}-full-linux-x64.zip + target/${bundlePrefix}-standalone.zip, + target/${bundlePrefix}-full-windows-i586.zip, + target/${bundlePrefix}-full-windows-x64.zip, + target/${bundlePrefix}-full-linux-i586.zip, + target/${bundlePrefix}-full-linux-x64.zip </redmine.releaseFiles> </properties> @@ -486,11 +488,10 @@ <artifactId>maven-assembly-plugin</artifactId> <configuration> <attach>false</attach> - <finalName>tutti-${project.version}</finalName> + <finalName>${bundlePrefix}</finalName> </configuration> <executions> <execution> - <id>standalone</id> <phase>package</phase> <goals> <goal>single</goal> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css 2013-02-01 10:54:50 UTC (rev 285) @@ -95,10 +95,10 @@ #editCatchesButton { action: {editCatchesAction}; - enabled: {uiContext.isCruiseFilled()}; + enabled: {model.isValid() && uiContext.isCruiseFilled()}; } #validateCatchesButton { action: {validateCatchesAction}; - enabled: {uiContext.isCruiseFilled()}; + enabled: {model.isValid() && uiContext.isCruiseFilled()}; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx 2013-02-01 10:54:50 UTC (rev 285) @@ -32,6 +32,8 @@ fr.ifremer.tutti.ui.swing.util.ActionListCellRenderer jaxx.runtime.swing.editor.bean.BeanComboBox + jaxx.runtime.validator.swing.SwingValidatorUtil + jaxx.runtime.validator.swing.SwingValidatorMessageTableModel static org.nuiton.i18n.I18n._ </import> @@ -59,6 +61,8 @@ <SelectCruiseUIModel id='model' initializer='getContextValue(SelectCruiseUIModel.class)'/> + <SwingValidatorMessageTableModel id='errorTableModel'/> + <NewProgramAction id='newProgramAction' constructorParams='handler'/> <EditProgramAction id='editProgramAction' constructorParams='handler'/> @@ -75,6 +79,13 @@ <EditCatchesAction id='editCatchesAction' constructorParams='handler'/> <ValidateCatchesAction id='validateCatchesAction' constructorParams='handler'/> + <BeanValidator id='validator' bean='model' errorTableModel='errorTableModel' + uiClass='jaxx.runtime.validator.swing.ui.ImageValidationUI'> + <field name='program' component='programCombobox'/> + <field name='cruise' component='cruiseCombobox'/> + <field name='protocol' component='protocolCombobox'/> + </BeanValidator> + <Table fill='both' constraints='BorderLayout.CENTER'> <row> <cell anchor='west'> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java 2013-02-01 10:54:50 UTC (rev 285) @@ -74,7 +74,7 @@ @Override public SwingValidator<SelectCruiseUIModel> getValidator() { - return null; + return ui.getValidator(); } @Override @@ -273,6 +273,8 @@ ui.applyDataBinding(SelectCruiseUI.BINDING_EDIT_PROGRAM_BUTTON_ENABLED); ui.applyDataBinding(SelectCruiseUI.BINDING_EDIT_CRUISE_BUTTON_ENABLED); + + listenValidatorValid(getValidator(), model); } @Override Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel.java 2013-02-01 10:54:50 UTC (rev 285) @@ -27,7 +27,7 @@ import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import org.jdesktop.beans.AbstractSerializableBean; +import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import java.util.List; @@ -37,7 +37,7 @@ * @author tchemit <chemit@codelutin.com> * @since 0.1 */ -public class SelectCruiseUIModel extends AbstractSerializableBean { +public class SelectCruiseUIModel extends AbstractTuttiBeanUIModel<Cruise, SelectCruiseUIModel> { private static final long serialVersionUID = 1L; @@ -71,6 +71,10 @@ protected TuttiProtocol protocol; + public SelectCruiseUIModel() { + super(Cruise.class, null, null); + } + public List<Program> getPrograms() { return programs; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-02-01 10:54:50 UTC (rev 285) @@ -88,7 +88,7 @@ CaracteristicTabUIModel[] subModels = handler.getSubModels(); for (CaracteristicTabUIModel subModel : subModels) { - Class modelClass = subModel.getClass(); + Class<?> modelClass = subModel.getClass(); CaracteristicMap caracteristics = subModel.getCaracteristicMap(); if (modelClass.isAssignableFrom(EnvironmentTabUIModel.class)) { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-02-01 10:54:50 UTC (rev 285) @@ -121,7 +121,7 @@ EditCatchesUIModel model = getModel(); - listenValidatorValid(ui.getValidator(), model); + listenValidatorValid(getValidator(), model); setCustomTab(0, model); } @@ -211,6 +211,7 @@ bean.getId() + " - " + fishingOperationText); } + //TODO id can not be null batch = persistenceService.getCatchBatchFromFishingOperation(bean.getId()); model.setCatchBatch(batch); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css 2013-02-01 10:54:50 UTC (rev 285) @@ -103,11 +103,16 @@ tabPlacement: {JTabbedPane.LEFT}; } -#importSpecies{ +#importSpecies { actionIcon: import; action: {importProtocolSpeciesAction}; } +#exportSpecies { + actionIcon: export; + action: {exportProtocolSpeciesAction}; +} + #importCaracteristic { actionIcon: import; action: {importProtocolCaracteristicAction}; @@ -126,24 +131,20 @@ #gearList { property: gearPmfm; beanType: {Caracteristic.class}; - /*border: {BorderFactory.createTitledBorder(_("tutti.label.tab.fishingOperation.gearShooting"))};*/ } #environmentList { property: environmentPmfm; beanType: {Caracteristic.class}; - /*border: {BorderFactory.createTitledBorder(_("tutti.label.tab.fishingOperation.environment"))};*/ } #hydrologyList { property: hydrologyPmfm; beanType: {Caracteristic.class}; - /*border: {BorderFactory.createTitledBorder(_("tutti.label.tab.fishingOperation.hydrology"))};*/ } #lengthClassesList { property: lengthClassesPmfm; beanType: {Caracteristic.class}; - /*border: {BorderFactory.createTitledBorder(_("tutti.label.tab.fishingOperation.lengthClasses"))};*/ } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx 2013-02-01 10:54:50 UTC (rev 285) @@ -83,6 +83,9 @@ <ImportProtocolSpeciesAction id='importProtocolSpeciesAction' constructorParams='handler'/> + <ExportProtocolSpeciesAction id='exportProtocolSpeciesAction' + constructorParams='handler'/> + <SwingValidatorMessageTableModel id='errorTableModel'/> <BeanValidator id='validator' bean='model' errorTableModel='errorTableModel' @@ -124,7 +127,7 @@ </Table> </tab> - <tab title='tutti.label.tab.protocol.fishingOperation'> + <tab title='tutti.label.tab.protocol.caracteristic'> <JPanel id='caracteristicPanel' layout="{new BorderLayout()}"> <JPanel id='caracteristicActions' layout="{new GridLayout()}" constraints='BorderLayout.NORTH'> @@ -148,29 +151,16 @@ </tab> </JTabbedPane> </JPanel> - - <!--Table fill='both' weightx='1'> - <row fill='both' weighty='1'> - <cell fill='both'> - <BeanDoubleList id='gearList' genericType='Caracteristic'/> - </cell> - </row> - <row fill='both' weighty='1'> - <cell fill='both'> - <BeanDoubleList id='environmentList' genericType='Caracteristic'/> - </cell> - </row> - <row fill='both' weighty='1'> - <cell fill='both'> - <BeanDoubleList id='hydrologyList' genericType='Caracteristic'/> - </cell> - </row> - </Table--> </tab> <tab title='tutti.label.tab.protocol.species'> <JPanel id='speciesPanel' layout="{new BorderLayout()}"> - <JButton id='importSpecies' constraints='BorderLayout.NORTH'/> + <JPanel id='speciesActions' layout="{new GridLayout()}" + constraints='BorderLayout.NORTH'> + <JButton id='importSpecies'/> + <JButton id='exportSpecies'/> + </JPanel> + <Table fill='both' constraints='BorderLayout.CENTER'> <row fill='both'> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-02-01 10:54:50 UTC (rev 285) @@ -182,6 +182,14 @@ return allCaracteristic; } + public Map<String, Species> getAllSpecies() { + return allSpecies; + } + + public Map<String, Caracteristic> getAllLengthStepPmfm() { + return allLengthStepPmfm; + } + @Override public void afterInitUI() { Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportProtocolSpeciesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportProtocolSpeciesAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportProtocolSpeciesAction.java 2013-02-01 10:54:50 UTC (rev 285) @@ -0,0 +1,111 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 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.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.service.protocol.TuttiProtocolImportExportService; +import fr.ifremer.tutti.ui.swing.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.awt.event.ActionEvent; +import java.io.File; + +import static org.nuiton.i18n.I18n._; + +/** + * To export protocol species. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class ExportProtocolSpeciesAction extends AbstractTuttiAction<EditProtocolUIModel, EditProtocolUIHandler> { + + private static final long serialVersionUID = 1L; + + /** Logger. */ + private static final Log log = + LogFactory.getLog(ExportProtocolSpeciesAction.class); + + private File file; + + public ExportProtocolSpeciesAction(EditProtocolUIHandler handler) { + super(handler, + "exportProtocolSpecies", + "export", + _("tutti.action.exportProtocolSpecies"), + _("tutti.action.exportProtocolSpecies.tip"), + true + ); + } + + @Override + protected boolean prepareAction(ActionEvent event) { + + // choose file to export + file = TuttiUIUtil.chooseFile( + getContext().getMainUI(), + _("tutti.title.choose.protocolSpeciesFile"), + _("tutti.action.chooseProtocolSpeciesFile"), + null, + "^.*\\.csv", _("tutti.file.csv") + ); + boolean doAction = file != null; + if (doAction) { + super.prepareAction(event); + } + return doAction; + } + + @Override + protected void releaseAction(ActionEvent event) { + super.releaseAction(event); + file = null; + } + + @Override + protected void doAction(ActionEvent e) throws Exception { + + if (log.isInfoEnabled()) { + log.info("Will export protocol species to file: " + file); + } + + // bind to a protocol + TuttiProtocol protocol = getModel().toBean(); + + + // import + TuttiProtocolImportExportService service = + getContext().getService(TuttiProtocolImportExportService.class); + + service.exportProtocolSpecies(file, + protocol, + getHandler().getAllLengthStepPmfm(), + getHandler().getAllSpecies()); + + sendMessage("Espèces du Protocole exportés dans le fichier " + file + "."); + } +} \ No newline at end of file Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportProtocolSpeciesAction.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ImportProtocolCaracteristicAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ImportProtocolCaracteristicAction.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ImportProtocolCaracteristicAction.java 2013-02-01 10:54:50 UTC (rev 285) @@ -112,6 +112,6 @@ // rebind to model getModel().fromBean(protocol); - sendMessage("Caractéristiques du Protocole [" + protocol.getName() + "] lu depuis le fichier."); + sendMessage("Caractéristiques importées depuis le fichier "); } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ImportProtocolSpeciesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ImportProtocolSpeciesAction.java 2013-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ImportProtocolSpeciesAction.java 2013-02-01 10:54:50 UTC (rev 285) @@ -100,11 +100,14 @@ TuttiProtocolImportExportService service = getContext().getService(TuttiProtocolImportExportService.class); - service.importProtocolSpecies(file, protocol); + service.importProtocolSpecies(file, + protocol, + getHandler().getAllLengthStepPmfm(), + getHandler().getAllSpecies()); // rebind to model getModel().fromBean(protocol); - sendMessage("Espèces du Protocole [" + protocol.getName() + "] importées depuis le fichier."); + sendMessage("Espèces importées depuis le fichier " + file + "."); } } \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml (rev 0) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml 2013-02-01 10:54:50 UTC (rev 285) @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + Tutti :: UI + $Id$ + $HeadURL$ + %% + Copyright (C) 2012 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% + --> +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="program"> + + <field-validator type="required" short-circuit="true"> + <param name="fieldName">program.zone</param> + <message>tutti.validator.error.program.zone.required</message> + </field-validator> + </field> + + +</validators> Property changes on: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native 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-02-01 09:30:28 UTC (rev 284) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-01 10:54:50 UTC (rev 285) @@ -42,6 +42,8 @@ tutti.action.exportProtocol.tip=Exporter le protocole sélectionné tutti.action.exportProtocolCaracteristic=Exporter les caractéristiques tutti.action.exportProtocolCaracteristic.tip=Exporter les caractéristiques du protocole +tutti.action.exportProtocolSpecies= +tutti.action.exportProtocolSpecies.tip= tutti.action.generate=Générer tutti.action.generateCampaignName=Générer le nom tutti.action.importProtocol=Importer @@ -230,11 +232,11 @@ tutti.label.tab.plancton=Plancton tutti.label.tab.protocol.accidental=Accidental tutti.label.tab.protocol.benthos=Benthos +tutti.label.tab.protocol.caracteristic=Caractéristiques tutti.label.tab.protocol.caracteristic.environment=Environnement tutti.label.tab.protocol.caracteristic.gear=Mise en oeuvre de l'engin tutti.label.tab.protocol.caracteristic.hydrology=Paramètres hydrologiques tutti.label.tab.protocol.caracteristic.lengthClasses=Classes de taille -tutti.label.tab.protocol.fishingOperation=Trait tutti.label.tab.protocol.info=Informations générales tutti.label.tab.protocol.plankton=Plancton tutti.label.tab.protocol.species=Espèces @@ -336,6 +338,7 @@ tutti.title.choose.protocolCaracteristicImportFile=Choisir le fichier des caractéristiques à importer tutti.title.choose.protocolExportFile=Choisir le fichier où exporter le protocole tutti.title.choose.protocolImportFile=Choisir le fichier du protocole à importer +tutti.title.choose.protocolSpeciesFile= tutti.title.choose.protocolSpeciesImportFile= tutti.title.create.cruise=Créer une nouvelle campagne tutti.title.create.program=Créer une nouvelle série de campagne