Author: bleny Date: 2011-03-11 17:30:31 +0000 (Fri, 11 Mar 2011) New Revision: 1059 Log: refactor import engine ; add export capability + tests ; use it for obsdeb sampling plan export Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Column.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Export.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ExportModel.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ExportableColumn.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableExportableColumn.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ModelBuilder.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueFormatter.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueGetter.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueGetterSetter.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueParserFormatter.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportExportModel.java trunk/wao-business/src/test/java/fr/ifremer/wao/io/csv2/ExportTest.java Removed: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableColumnImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportModel.java Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv/ExportHelper.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Import.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportModel.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/TerrestrialDivisionImportModel.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/TerrestrialLocationImportModel.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java trunk/wao-business/src/test/java/fr/ifremer/wao/io/csv2/ImportTest.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/components/IndicatorLevels.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/AbstractMappedGridDataSource.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ObsDebSamplingPlan.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/SampleRowModelFactory.java trunk/wao-ui/src/main/webapp/ObsDebSamplingPlan.tml Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -98,7 +98,7 @@ @Override protected void createBoatInfosNewColumns_1_2a(List<String> queries) { - // Evo #2060 : add new columns in BoatInfos (contactSiret, + // Evo #2060 : add new columnsForImport in BoatInfos (contactSiret, // contactAddress1, contactAddress2, contactCity, contactPostalCode) queries.add("ALTER TABLE BoatInfos ADD contactAddress1 TEXT;"); queries.add("ALTER TABLE BoatInfos ADD contactAddress2 TEXT;"); @@ -448,7 +448,7 @@ return request; } - /** Add a columns to Contact. */ + /** Add a columnsForImport to Contact. */ @Override protected void addDataReliability_1_6(List<String> queries) { queries.add(String.format("ALTER TABLE Contact ADD dataReliabilityOrdinal SMALLINT NOT NULL DEFAULT %s;", Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv/ExportHelper.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv/ExportHelper.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv/ExportHelper.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -45,7 +45,7 @@ * <pre> * - Instanciate {@link #ExportHelper(CsvWriter, int) } * (with abstract method implementations if needed). - * - Call {@link #writeHeaders() } method to prepare columns and write + * - Call {@link #writeHeaders() } method to prepare columnsForImport and write * first row in the resulting file. * - In the loop data, first use {@link #newRecord() } to prepare the current * record. @@ -68,7 +68,7 @@ /** Current record to write **/ protected String[] record; - /** Number of columns/headers in resulting export **/ + /** Number of columnsForImport/headers in resulting export **/ protected int nbHeaders; /** @@ -76,7 +76,7 @@ * write data in it. * * @param writer the CsvWriter used for record data - * @param nbHeaders number of columns in the resulting file + * @param nbHeaders number of columnsForImport in the resulting file * @throws IOException */ public ExportHelper(CsvWriter writer, int nbHeaders) throws IOException { Copied: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Column.java (from rev 1052, trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableColumnImpl.java) =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Column.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Column.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,123 @@ +/* + * #%L + * Wao :: Business + * %% + * Copyright (C) 2009 - 2011 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.wao.io.csv2; + +import java.text.ParseException; + +public class Column<E, T> implements ImportableExportableColumn<E, T> { + + protected String headerName; + + protected boolean mandatory = true; + + protected boolean ignored; + + protected ValueParser<T> valueParser; + + protected ValueFormatter<T> valueFormatter; + + protected ValueGetter<E, T> valueGetter; + + protected ValueSetter<E, T> valueSetter; + + public Column(String headerName, ValueParser<T> valueParser, ValueSetter<E, T> valueSetter, boolean ignored) { + this.headerName = headerName; + this.valueParser = valueParser; + this.valueSetter = valueSetter; + this.ignored = ignored; + } + + public Column(String headerName, ValueGetter<E, T> valueGetter, ValueFormatter<T> valueFormatter) { + this.headerName = headerName; + this.valueGetter = valueGetter; + this.valueFormatter = valueFormatter; + } + + public Column(String headerName, ValueGetterSetter<E, T> valueGetterSetter, ValueParserFormatter<T> valueParserFormatter) { + this.headerName = headerName; + this.valueGetter = valueGetterSetter; + this.valueFormatter = valueParserFormatter; + this.valueSetter = valueGetterSetter; + this.valueParser = valueParserFormatter; + } + + @Override + public String getHeaderName() { + return headerName; + } + + @Override + public boolean isMandatory() { + return mandatory; + } + + @Override + public boolean isIgnored() { + return ignored; + } + + @Override + public String formatValue(T value) { + if (valueFormatter == null) { + throw new UnsupportedOperationException("no formatter provided for " + this); + } else { + return valueFormatter.format(value); + } + } + + @Override + public T parseValue(String value) throws ParseException { + if (valueParser == null) { + throw new UnsupportedOperationException("no parser provided for " + this); + } else { + return valueParser.parse(value); + } + } + + @Override + public T getValue(E object) throws Exception { + if (valueGetter == null) { + throw new UnsupportedOperationException("no getter provided for " + this); + } else { + return valueGetter.get(object); + } + } + + @Override + public void setValue(E object, T value) throws Exception { + if ( ! isIgnored()) { + if (valueSetter == null) { + throw new UnsupportedOperationException("no setter provided"); + } else { + valueSetter.set(object, value); + } + } + } + + @Override + public String toString() { + return "{" + + "headerName='" + headerName + '\'' + + ", mandatory=" + mandatory + + ", ignored=" + ignored + + '}'; + } +} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -1,7 +1,9 @@ package fr.ifremer.wao.io.csv2; import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; +import java.lang.reflect.InvocationTargetException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -9,16 +11,21 @@ public class Common { - public static class StringValueParser implements ValueParser<String> { + public static class StringValueParser implements ValueParserFormatter<String> { @Override public String parse(String value) { return value; } + + @Override + public String format(String value) { + return value == null ? "" : value; + } } - public static final ValueParser<String> STRING_VALUE_PARSER = new StringValueParser(); + public static final ValueParserFormatter<String> STRING = new StringValueParser(); - public static class BeanProperty<E, T> implements ValueSetter<E, T> { + public static class BeanProperty<E, T> implements ValueGetterSetter<E, T> { protected String propertyName; @@ -30,13 +37,19 @@ public void set(E bean, T value) throws Exception { BeanUtils.setProperty(bean, propertyName, value); } + + @Override + public T get(E object) throws Exception { + T value = (T) PropertyUtils.getProperty(object, propertyName); + return value; + } } - public static class DateValueParser implements ValueParser<Date> { + public static class DateValue implements ValueParserFormatter<Date> { protected DateFormat dateFormat; - public DateValueParser(String dateFormatPattern) { + public DateValue(String dateFormatPattern) { this.dateFormat = new SimpleDateFormat(dateFormatPattern); } @@ -44,8 +57,13 @@ public Date parse(String value) throws ParseException { return dateFormat.parse(value); } + + @Override + public String format(Date value) { + return dateFormat.format(value); + } } - public static final ValueParser<Date> DAY_PARSER = new DateValueParser("dd/MM/yyyy"); + public static final ValueParserFormatter<Date> DAY = new DateValue("dd/MM/yyyy"); } Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Export.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Export.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Export.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,53 @@ +package fr.ifremer.wao.io.csv2; + +import org.apache.commons.io.IOUtils; +import org.nuiton.util.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.InputStream; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; + +public class Export<E> { + + private static final Logger log = LoggerFactory.getLogger(Export.class); + + protected ExportModel<E> model; + + protected Collection<E> data; + + public Export(ExportModel<E> exportModel, Collection<E> data) { + this.model = exportModel; + this.data = data; + } + + public InputStream startExport() throws Exception { + String separator = String.valueOf(model.getSeparator()); + StringBuilder csv = new StringBuilder(); + + // add headers + List<String> headerNames = new LinkedList<String>(); + for (ExportableColumn column : model.getColumnsForExport()) { + headerNames.add(column.getHeaderName()); + } + String headersLine = StringUtil.join(headerNames, separator, true); + csv.append(headersLine).append("\n"); + + if (log.isDebugEnabled()) { + log.debug("headers for export are '" + headersLine + "'"); + log.debug("will export " + data.size() + " lines"); + } + + for (E object : data) { + for (ExportableColumn column : model.getColumnsForExport()) { + Object value = column.getValue(object); + String formattedValue = column.formatValue(value); + csv.append(formattedValue).append(separator); + } + csv.append("\n"); + } + return IOUtils.toInputStream(csv); + } +} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ExportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ExportModel.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ExportModel.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,11 @@ +package fr.ifremer.wao.io.csv2; + +import java.util.Collection; + +public interface ExportModel<E> { + + char getSeparator(); + + Collection<ExportableColumn> getColumnsForExport(); + +} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ExportableColumn.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ExportableColumn.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ExportableColumn.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,11 @@ +package fr.ifremer.wao.io.csv2; + +public interface ExportableColumn<E, T> { + + String getHeaderName(); + + T getValue(E object) throws Exception; + + String formatValue(T value); + +} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Import.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Import.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Import.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -51,7 +51,7 @@ protected List<ImportableColumn> getNonIgnoredHeaders() { List<ImportableColumn> nonIgnoredHeaders = new ArrayList<ImportableColumn>(); - for (ImportableColumn field : model.getAllColumns()) { + for (ImportableColumn field : model.getColumnsForImport()) { if ( ! field.isIgnored()) { nonIgnoredHeaders.add(field); } @@ -61,7 +61,7 @@ protected List<ImportableColumn> getAllMandatoryHeaders() { List<ImportableColumn> allMandatoryHeaders = new ArrayList<ImportableColumn>(); - for (ImportableColumn field : model.getAllColumns()) { + for (ImportableColumn field : model.getColumnsForImport()) { if (field.isMandatory()) { allMandatoryHeaders.add(field); } @@ -75,10 +75,10 @@ } this.model = model; validateModel(); - this.reader = new CsvReader(inputStream, ';', Charset.forName("UTF-8")); + this.reader = new CsvReader(inputStream, model.getSeparator(), Charset.forName("UTF-8")); reader.setTrimWhitespace(true); if (log.isTraceEnabled()) { - log.trace("all headers are " + model.getAllColumns()); + log.trace("all headers are " + model.getColumnsForImport()); log.trace("all non-ignored headers are " + getNonIgnoredHeaders()); log.trace("all mandatory headers are " + getAllMandatoryHeaders()); } @@ -86,11 +86,11 @@ protected boolean validateModel() { Set<String> headerNames = new HashSet<String>(); - for (ImportableColumn importableColumn : model.getAllColumns()) { + for (ImportableColumn importableColumn : model.getColumnsForImport()) { String headerName = importableColumn.getHeaderName(); boolean alreadyUsed = ! headerNames.add(headerName); if (alreadyUsed) { - throw new IllegalArgumentException("model contains multiple columns named '" + headerName + "'"); + throw new IllegalArgumentException("model contains multiple columnsForImport named '" + headerName + "'"); } } return true; @@ -119,7 +119,7 @@ csvHeaders.add(header); } - for(ImportableColumn field : model.getAllColumns()) { + for(ImportableColumn field : model.getColumnsForImport()) { csvHeaders.remove(field.getHeaderName()); } @@ -128,7 +128,7 @@ String validationMessage = String.format( "Les champs %s ne sont pas reconnus. Les champs possibles sont %s", StringUtil.join(csvHeaders, ", " ,true), - StringUtil.join(model.getAllColumns(), ", " ,true)); + StringUtil.join(model.getColumnsForImport(), ", " ,true)); csvValidationResult.setMessage(validationMessage); } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportModel.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportModel.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -25,9 +25,11 @@ public interface ImportModel<E> { + char getSeparator(); + void pushCsvHeaderNames(List<String> headerNames); E newEmptyInstance(); - Collection<ImportableColumn> getAllColumns(); + Collection<ImportableColumn> getColumnsForImport(); } Deleted: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableColumnImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableColumnImpl.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableColumnImpl.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -1,118 +0,0 @@ -/* - * #%L - * Wao :: Business - * %% - * Copyright (C) 2009 - 2011 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ -package fr.ifremer.wao.io.csv2; - -import org.apache.commons.beanutils.BeanUtils; - -import java.text.ParseException; - -public class ImportableColumnImpl<E, T> implements ImportableColumn<E, T> { - - protected String headerName; - - protected boolean mandatory = true; - - protected boolean ignored; - - protected ValueParser<T> valueParser; - - protected ValueSetter<E, T> valueSetter; - - protected ImportableColumnImpl() {} - - /** a new <strong>ignored</strong> header */ - public static <E,T> ImportableColumnImpl<E, T> newIgnoredColumn(String headerName) { - ImportableColumnImpl<E, T> newColumn = new ImportableColumnImpl(); - newColumn.headerName = headerName; - newColumn.ignored = true; - return newColumn; - } - - /** a new <strong>mandatory</strong> header */ - public static <E> ImportableColumnImpl<E, String> newMandatoryColumn(String headerName, String propertyName) { - return newMandatoryColumn(headerName, Common.STRING_VALUE_PARSER, propertyName); - } - - public static <E, T> ImportableColumnImpl<E, T> newMandatoryColumn(String headerName, ValueParser<T> valueParser, String propertyName) { - return newMandatoryColumn(headerName, valueParser, new Common.BeanProperty<E, T>(propertyName)); - } - - public static <E> ImportableColumnImpl<E, String> newMandatoryColumn(String headerName, ValueSetter<E, String> valueSetter) { - return newMandatoryColumn(headerName, Common.STRING_VALUE_PARSER, valueSetter); - } - - public static <E,T> ImportableColumnImpl<E, T> newMandatoryColumn(String headerName, ValueParser<T> valueParser, ValueSetter<E, T> valueSetter) { - ImportableColumnImpl<E, T> newColumn = new ImportableColumnImpl(headerName, valueParser, valueSetter, false); - return newColumn; - } - - public ImportableColumnImpl(String headerName, ValueParser<T> valueParser, ValueSetter<E, T> valueSetter, boolean ignored) { - this.headerName = headerName; - this.valueParser = valueParser; - this.valueSetter = valueSetter; - this.ignored = ignored; - } - - - @Override - public String getHeaderName() { - return headerName; - } - - @Override - public boolean isMandatory() { - return mandatory; - } - - @Override - public boolean isIgnored() { - return ignored; - } - - @Override - public T parseValue(String value) throws ParseException { - if (valueParser == null) { - throw new UnsupportedOperationException("no parser provided for " + this); - } else { - return valueParser.parse(value); - } - } - - @Override - public void setValue(E object, T value) throws Exception { - if ( ! isIgnored()) { - if (valueSetter == null) { - throw new UnsupportedOperationException("no setter provided"); - } else { - valueSetter.set(object, value); - } - } - } - - @Override - public String toString() { - return "ImportableColumnImpl{" + - "headerName='" + headerName + '\'' + - ", mandatory=" + mandatory + - ", ignored=" + ignored + - '}'; - } -} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableExportableColumn.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableExportableColumn.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportableExportableColumn.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,4 @@ +package fr.ifremer.wao.io.csv2; + +public interface ImportableExportableColumn<E, T> extends ImportableColumn<E, T>, ExportableColumn<E, T> { +} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ModelBuilder.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ModelBuilder.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ModelBuilder.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,82 @@ +package fr.ifremer.wao.io.csv2; + +import java.util.Collection; +import java.util.LinkedList; + +public class ModelBuilder<E> { + + protected Collection<ImportableColumn> columnsForImport = new LinkedList<ImportableColumn>(); + + protected Collection<ExportableColumn> columnsForExport = new LinkedList<ExportableColumn>(); + + /** a new <strong>ignored</strong> header */ + public <E,T> ImportableColumn<E, T> newIgnoredColumn(String headerName) { + Column<E, T> newColumn = new Column(headerName, null, null, true); + columnsForImport.add(newColumn); + return newColumn; + } + + /** a new <strong>mandatory</strong> header */ + public ImportableColumn<E, String> newMandatoryColumn(String headerName, String propertyName) { + return newMandatoryColumn(headerName, Common.STRING, propertyName); + } + + public <T> ImportableColumn<E, T> newMandatoryColumn(String headerName, ValueParser<T> valueParser, String propertyName) { + return newMandatoryColumn(headerName, valueParser, new Common.BeanProperty<E, T>(propertyName)); + } + + public ImportableColumn<E, String> newMandatoryColumn(String headerName, ValueSetter<E, String> valueSetter) { + return newMandatoryColumn(headerName, Common.STRING, valueSetter); + } + + public <T> ImportableColumn<E, T> newMandatoryColumn(String headerName, ValueParser<T> valueParser, ValueSetter<E, T> valueSetter) { + Column<E, T> newColumn = new Column(headerName, valueParser, valueSetter, false); + columnsForImport.add(newColumn); + return newColumn; + } + + public ExportableColumn<E, String> newColumnForExport(String headerName, String propertyName) { + return newColumnForExport(headerName, propertyName, Common.STRING); + } + + public ExportableColumn<E, String> newColumnForExport(String headerName, ValueGetter<E, String> valueGetter) { + return newColumnForExport(headerName, valueGetter, Common.STRING); + } + + public <T> ExportableColumn<E, T> newColumnForExport(String headerName, String propertyName, ValueFormatter<T> valueFormatter) { + return newColumnForExport(headerName, new Common.BeanProperty<E, T>(propertyName), valueFormatter); + } + + public <T> ExportableColumn<E, T> newColumnForExport(String headerName, ValueGetter<E, T> valueGetter, ValueFormatter<T> valueFormatter) { + ExportableColumn<E, T> newColumn = new Column(headerName, valueGetter, valueFormatter); + columnsForExport.add(newColumn); + return newColumn; + } + + public ImportableExportableColumn<E, String> newColumnForImportExport(String headerName, String propertyName) { + return newColumnForImportExport(headerName, propertyName, Common.STRING); + } + + public ImportableExportableColumn<E, String> newColumnForImportExport(String headerName, ValueGetterSetter<E, String> valueGetterSetter) { + return newColumnForImportExport(headerName, valueGetterSetter, Common.STRING); + } + + public <T> ImportableExportableColumn<E, T> newColumnForImportExport(String headerName, String propertyName, ValueParserFormatter<T> valueParserFormatter) { + return newColumnForImportExport(headerName, new Common.BeanProperty<E, T>(propertyName), valueParserFormatter); + } + + public <T> ImportableExportableColumn<E, T> newColumnForImportExport(String headerName, ValueGetterSetter<E, T> valueGetterSetter, ValueParserFormatter<T> valueParserFormatter) { + ImportableExportableColumn<E, T> newColumn = new Column(headerName, valueGetterSetter, valueParserFormatter); + columnsForImport.add(newColumn); + columnsForExport.add(newColumn); + return newColumn; + } + + public Collection<ImportableColumn> getColumnsForImport() { + return columnsForImport; + } + + public Collection<ExportableColumn> getColumnsForExport() { + return columnsForExport; + } +} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueFormatter.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueFormatter.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueFormatter.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,7 @@ +package fr.ifremer.wao.io.csv2; + +public interface ValueFormatter<T> { + + String format(T value); + +} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueGetter.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueGetter.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueGetter.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,7 @@ +package fr.ifremer.wao.io.csv2; + +public interface ValueGetter<E, T> { + + T get(E object) throws Exception; + +} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueGetterSetter.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueGetterSetter.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueGetterSetter.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,4 @@ +package fr.ifremer.wao.io.csv2; + +public interface ValueGetterSetter<E, T> extends ValueGetter<E, T>, ValueSetter<E, T> { +} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueParserFormatter.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueParserFormatter.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ValueParserFormatter.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,4 @@ +package fr.ifremer.wao.io.csv2; + +public interface ValueParserFormatter<T> extends ValueParser<T>, ValueFormatter<T> { +} Copied: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportExportModel.java (from rev 1056, trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportModel.java) =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportExportModel.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportExportModel.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,189 @@ +/* + * #%L + * Wao :: Business + * %% + * Copyright (C) 2009 - 2011 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.wao.io.csv2.models; + +import fr.ifremer.wao.bean.ObsProgram; +import fr.ifremer.wao.entity.SampleRow; +import fr.ifremer.wao.entity.SampleRowImpl; +import fr.ifremer.wao.entity.TerrestrialDivision; +import fr.ifremer.wao.io.csv2.Common; +import fr.ifremer.wao.io.csv2.ExportModel; +import fr.ifremer.wao.io.csv2.ExportableColumn; +import fr.ifremer.wao.io.csv2.ImportModel; +import fr.ifremer.wao.io.csv2.ImportableColumn; +import fr.ifremer.wao.io.csv2.ModelBuilder; +import fr.ifremer.wao.io.csv2.ValueGetterSetter; +import fr.ifremer.wao.io.csv2.ValueParserFormatter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.ParseException; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * + */ +public class SamplingPlanImportExportModel implements ImportModel<SampleRow>, ExportModel<SampleRow> { + + private static final Logger log = + LoggerFactory.getLogger(SamplingPlanImportExportModel.class); + + static class ObservationUnitParserFormatter implements ValueParserFormatter<TerrestrialDivision> { + + protected Map<String, Map<String, TerrestrialDivision>> observationUnits; + + protected String currentRegionCode; + + ObservationUnitParserFormatter(Map<String, Map<String, TerrestrialDivision>> observationUnits) { + this.observationUnits = observationUnits; + } + + @Override + public TerrestrialDivision parse(String observationUnitCode) throws ParseException { + Map<String, TerrestrialDivision> uos = observationUnits.get(currentRegionCode); + if (uos == null) { + throw new IllegalArgumentException("Le code de région '" + currentRegionCode + + "' n'est pas un code valide"); + } + TerrestrialDivision observationUnit = uos.get(observationUnitCode); + if (observationUnit == null) { + throw new IllegalArgumentException("Il n'y a pas d'unité '" + observationUnitCode + + "' dans la région '" + currentRegionCode + "'"); + } + return observationUnit; + } + + @Override + public String format(TerrestrialDivision terrestrialDivision) { + return terrestrialDivision.getObservationUnitCode(); + } + + public void setCurrentRegionCode(String regionCode) { + currentRegionCode = regionCode; + } + } + + static class RegionCodeSetter implements ValueGetterSetter<SampleRow, String> { + + protected ObservationUnitParserFormatter observationUnitSetter; + + RegionCodeSetter(ObservationUnitParserFormatter observationUnitSetter) { + this.observationUnitSetter = observationUnitSetter; + } + + @Override + public String get(SampleRow sampleRow) throws Exception { + String regionCode; + if (sampleRow.getObservationUnit() == null) { + regionCode = ""; + } else { + regionCode = sampleRow.getObservationUnit().getRegionIfremerCode(); + } + return regionCode; + } + + @Override + public void set(SampleRow sampleRow, String regionCode) throws Exception { + observationUnitSetter.setCurrentRegionCode(regionCode); + } + } + + /** region ifremer code -> UO code -> TerrestrialDivision */ + protected Map<String, Map<String, TerrestrialDivision>> indexedObservationUnits; + + protected ModelBuilder<SampleRow> modelBuilder; + + /** Constructor used for export */ + public SamplingPlanImportExportModel() { + buildModel(); + } + + /** Constructor used for import */ + public SamplingPlanImportExportModel(List<TerrestrialDivision> observationUnits) { + indexObservationUnits(observationUnits); + buildModel(); + } + + @Override + public void pushCsvHeaderNames(List<String> headerNames) { + // nothing to do + } + + @Override + public char getSeparator() { + return ';'; + } + + @Override + public SampleRow newEmptyInstance() { + SampleRow newSampleRow = new SampleRowImpl(); + newSampleRow.setObsProgram(ObsProgram.OBSDEB); + return newSampleRow; + } + + protected void indexObservationUnits(List<TerrestrialDivision> observationUnits) { + indexedObservationUnits = new HashMap<String, Map<String, TerrestrialDivision>>(); + for (TerrestrialDivision terrestrialDivision : observationUnits) { + String regionCode = terrestrialDivision.getRegionIfremerCode(); + Map<String, TerrestrialDivision> unitCodesToDivision = indexedObservationUnits.get(regionCode); + if (unitCodesToDivision == null) { + unitCodesToDivision = new HashMap<String, TerrestrialDivision>(); + } + unitCodesToDivision.put(terrestrialDivision.getObservationUnitCode(), terrestrialDivision); + indexedObservationUnits.put(regionCode, unitCodesToDivision); + } + + if (log.isDebugEnabled()) { + for (Map.Entry<String, Map<String, TerrestrialDivision>> entry : indexedObservationUnits.entrySet()) { + log.debug(entry.getKey()); + for (Map.Entry<String, TerrestrialDivision> unitCodesToDivision : entry.getValue().entrySet()) { + log.debug(" -> " + unitCodesToDivision.getKey() + " -> " + unitCodesToDivision.getValue()); + } + } + } + } + + protected void buildModel() { + modelBuilder = new ModelBuilder<SampleRow>(); + modelBuilder.newColumnForImportExport("PLAN_CODE", SampleRow.PROPERTY_CODE); + modelBuilder.newColumnForImportExport("OBSERVATEUR_COD", SampleRow.PROPERTY_GROUP_NAME); + modelBuilder.newColumnForImportExport("OBSERVATION_DATE", SampleRow.PROPERTY_DAY, Common.DAY); + ObservationUnitParserFormatter observationUnitParser = new ObservationUnitParserFormatter(indexedObservationUnits); + ValueGetterSetter<SampleRow, String> regionCodeGetterSetter = new RegionCodeSetter(observationUnitParser); + modelBuilder.newColumnForImportExport("REGION_IFREMER_COD", regionCodeGetterSetter); + modelBuilder.newColumnForImportExport("UNITE_OBSERVATION_COD", SampleRow.PROPERTY_OBSERVATION_UNIT, observationUnitParser); + } + + @Override + public Collection<ImportableColumn> getColumnsForImport() { + Collection<ImportableColumn> columns = modelBuilder.getColumnsForImport(); + return columns; + } + + @Override + public Collection<ExportableColumn> getColumnsForExport() { + Collection<ExportableColumn> columns = modelBuilder.getColumnsForExport(); + return columns; + } +} Deleted: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportModel.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportModel.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -1,157 +0,0 @@ -/* - * #%L - * Wao :: Business - * %% - * Copyright (C) 2009 - 2011 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ -package fr.ifremer.wao.io.csv2.models; - -import fr.ifremer.wao.bean.ObsProgram; -import fr.ifremer.wao.entity.SampleRow; -import fr.ifremer.wao.entity.SampleRowImpl; -import fr.ifremer.wao.entity.TerrestrialDivision; -import fr.ifremer.wao.io.csv2.Common; -import fr.ifremer.wao.io.csv2.ImportModel; -import fr.ifremer.wao.io.csv2.ImportableColumn; -import fr.ifremer.wao.io.csv2.ImportableColumnImpl; -import fr.ifremer.wao.io.csv2.ValueParser; -import fr.ifremer.wao.io.csv2.ValueSetter; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.text.ParseException; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -/** - * - */ -public class SamplingPlanImportModel implements ImportModel<SampleRow> { - - - private static final Logger log = - LoggerFactory.getLogger(SamplingPlanImportModel.class); - - static class ObservationUnitParser implements ValueParser<TerrestrialDivision> { - - protected Map<String, Map<String, TerrestrialDivision>> observationUnits; - - protected String currentRegionCode; - - ObservationUnitParser(Map<String, Map<String, TerrestrialDivision>> observationUnits) { - this.observationUnits = observationUnits; - } - - @Override - public TerrestrialDivision parse(String observationUnitCode) throws ParseException { - Map<String, TerrestrialDivision> uos = observationUnits.get(currentRegionCode); - if (uos == null) { - throw new IllegalArgumentException("Le code de région '" + currentRegionCode + "' n'est pas un code valide"); - } - TerrestrialDivision observationUnit = uos.get(observationUnitCode); - if (observationUnit == null) { - throw new IllegalArgumentException("Il n'y a pas d'unité '" + observationUnitCode + "' dans cette région"); - } - return observationUnit; - } - - public void setCurrentRegionCode(String regionCode) { - currentRegionCode = regionCode; - } - } - - static class RegionCodeSetter implements ValueSetter<SampleRow, String> { - - protected ObservationUnitParser observationUnitSetter; - - RegionCodeSetter(ObservationUnitParser observationUnitSetter) { - this.observationUnitSetter = observationUnitSetter; - } - - @Override - public void set(SampleRow sampleRow, String regionCode) throws Exception { - observationUnitSetter.setCurrentRegionCode(regionCode); - } - } - - /** region ifremer code -> UO code -> TerrestrialDivision */ - protected Map<String, Map<String, TerrestrialDivision>> indexedObservationUnits; - - public SamplingPlanImportModel(List<TerrestrialDivision> observationUnits) { - - indexedObservationUnits = new HashMap<String, Map<String, TerrestrialDivision>>(); - for (TerrestrialDivision terrestrialDivision : observationUnits) { - String regionCode = terrestrialDivision.getRegionIfremerCode(); - Map<String, TerrestrialDivision> unitCodesToDivision = indexedObservationUnits.get(regionCode); - if (unitCodesToDivision == null) { - unitCodesToDivision = new HashMap<String, TerrestrialDivision>(); - } - unitCodesToDivision.put(terrestrialDivision.getObservationUnitCode(), terrestrialDivision); - indexedObservationUnits.put(regionCode, unitCodesToDivision); - } - - if (log.isDebugEnabled()) { - for (Map.Entry<String, Map<String, TerrestrialDivision>> entry : indexedObservationUnits.entrySet()) { - log.debug(entry.getKey()); - for (Map.Entry<String, TerrestrialDivision> unitCodesToDivision : entry.getValue().entrySet()) { - log.debug(" -> " + unitCodesToDivision.getKey() + " -> " + unitCodesToDivision.getValue()); - } - } - } - } - - @Override - public void pushCsvHeaderNames(List<String> headerNames) { - // nothing to do - } - - @Override - public SampleRow newEmptyInstance() { - SampleRow newSampleRow = new SampleRowImpl(); - newSampleRow.setObsProgram(ObsProgram.OBSDEB); - return newSampleRow; - } - - @Override - public Collection<ImportableColumn> getAllColumns() { - List<ImportableColumn> columns = new LinkedList<ImportableColumn>(); - columns.add(ImportableColumnImpl.newMandatoryColumn( - "PLAN_CODE", - new ValueParser<String>() { - /** null if string is empty */ - @Override - public String parse(String code) { - if (StringUtils.isEmpty(code)) { - code = null; - } - return code; - } - }, - SampleRow.PROPERTY_CODE)); - columns.add(ImportableColumnImpl.newMandatoryColumn("OBSERVATEUR_COD", SampleRow.PROPERTY_GROUP_NAME)); - columns.add(ImportableColumnImpl.newMandatoryColumn("OBSERVATION_DATE", Common.DAY_PARSER, SampleRow.PROPERTY_DAY)); - ObservationUnitParser observationUnitParser = new ObservationUnitParser(indexedObservationUnits); - ValueSetter<SampleRow, String> regionCodeSetter = new RegionCodeSetter(observationUnitParser); - columns.add(ImportableColumnImpl.<SampleRow> newMandatoryColumn("REGION_IFREMER_COD", regionCodeSetter)); - columns.add(ImportableColumnImpl.newMandatoryColumn("UNITE_OBSERVATION_COD", observationUnitParser, SampleRow.PROPERTY_OBSERVATION_UNIT)); - return columns; - } -} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/TerrestrialDivisionImportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/TerrestrialDivisionImportModel.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/TerrestrialDivisionImportModel.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -5,12 +5,10 @@ import fr.ifremer.wao.entity.TerrestrialLocation; import fr.ifremer.wao.io.csv2.ImportModel; import fr.ifremer.wao.io.csv2.ImportableColumn; -import fr.ifremer.wao.io.csv2.ImportableColumnImpl; +import fr.ifremer.wao.io.csv2.ModelBuilder; import fr.ifremer.wao.io.csv2.ValueParser; import org.apache.commons.lang.StringUtils; -import org.nuiton.util.StringUtil; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -35,6 +33,11 @@ } @Override + public char getSeparator() { + return ';'; + } + + @Override public void pushCsvHeaderNames(List<String> headerNames) { // nothing to do } @@ -45,10 +48,10 @@ } @Override - public Collection<ImportableColumn> getAllColumns() { - List<ImportableColumn> columns = new ArrayList<ImportableColumn>(); + public Collection<ImportableColumn> getColumnsForImport() { + ModelBuilder<TerrestrialDivision> modelBuilder = new ModelBuilder<TerrestrialDivision>(); - columns.add(ImportableColumnImpl.newMandatoryColumn( + modelBuilder.newMandatoryColumn( "ID_STRATE", new ValueParser<String>() { /** null if string is empty */ @@ -60,28 +63,28 @@ return code; } }, - TerrestrialDivision.PROPERTY_CODE)); - columns.add(ImportableColumnImpl.newMandatoryColumn( + TerrestrialDivision.PROPERTY_CODE); + modelBuilder.newMandatoryColumn( "REGION_IFREMER_COD", new ValueParser<String>() { /** validate region code */ @Override public String parse(String regionCode) { - if ( ! regionCodes.contains(regionCode)) { + if (!regionCodes.contains(regionCode)) { throw new IllegalArgumentException("Le code '" + regionCode + "' n'est pas un code de région valide"); } return regionCode; } }, - TerrestrialDivision.PROPERTY_REGION_IFREMER_CODE)); - columns.add(ImportableColumnImpl.newIgnoredColumn("REGION_IFREMER_LIB")); - columns.add(ImportableColumnImpl.newMandatoryColumn("ZONE_COMPETENCE_COD", TerrestrialDivision.PROPERTY_SKILL_ZONE_CODE)); - columns.add(ImportableColumnImpl.newMandatoryColumn("ZONE_COMPETENCE_LIB", TerrestrialDivision.PROPERTY_SKILL_ZONE_NAME)); - columns.add(ImportableColumnImpl.newMandatoryColumn("SOUS_POPULATION_COD", TerrestrialDivision.PROPERTY_SUB_POPULATION_CODE)); - columns.add(ImportableColumnImpl.newMandatoryColumn("SOUS_POPULATION_LIB", TerrestrialDivision.PROPERTY_SUB_POPULATION_NAME)); - columns.add(ImportableColumnImpl.newMandatoryColumn("UNITE_OBSERVATION_COD", TerrestrialDivision.PROPERTY_OBSERVATION_UNIT_CODE)); - columns.add(ImportableColumnImpl.newMandatoryColumn("UNITE_OBSERVATION_LIB", TerrestrialDivision.PROPERTY_OBSERVATION_UNIT_NAME)); - columns.add(ImportableColumnImpl.newMandatoryColumn( + TerrestrialDivision.PROPERTY_REGION_IFREMER_CODE); + modelBuilder.newIgnoredColumn("REGION_IFREMER_LIB"); + modelBuilder.newMandatoryColumn("ZONE_COMPETENCE_COD", TerrestrialDivision.PROPERTY_SKILL_ZONE_CODE); + modelBuilder.newMandatoryColumn("ZONE_COMPETENCE_LIB", TerrestrialDivision.PROPERTY_SKILL_ZONE_NAME); + modelBuilder.newMandatoryColumn("SOUS_POPULATION_COD", TerrestrialDivision.PROPERTY_SUB_POPULATION_CODE); + modelBuilder.newMandatoryColumn("SOUS_POPULATION_LIB", TerrestrialDivision.PROPERTY_SUB_POPULATION_NAME); + modelBuilder.newMandatoryColumn("UNITE_OBSERVATION_COD", TerrestrialDivision.PROPERTY_OBSERVATION_UNIT_CODE); + modelBuilder.newMandatoryColumn("UNITE_OBSERVATION_LIB", TerrestrialDivision.PROPERTY_OBSERVATION_UNIT_NAME); + modelBuilder.newMandatoryColumn( "LIEU_OBSERVATION_COD", // the value given is a code of a port, let's find and associate new ValueParser<TerrestrialLocation>() { @@ -94,11 +97,11 @@ return port; } }, - TerrestrialDivision.PROPERTY_PORT)); - columns.add(ImportableColumnImpl.newIgnoredColumn("LIEU_OBSERVATION_LIB")); - columns.add(ImportableColumnImpl.newIgnoredColumn("DATE_DEBUT")); - columns.add(ImportableColumnImpl.newIgnoredColumn("DATE_FIN")); + TerrestrialDivision.PROPERTY_PORT); + modelBuilder.newIgnoredColumn("LIEU_OBSERVATION_LIB"); + modelBuilder.newIgnoredColumn("DATE_DEBUT"); + modelBuilder.newIgnoredColumn("DATE_FIN"); - return columns; + return modelBuilder.getColumnsForImport(); } } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/TerrestrialLocationImportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/TerrestrialLocationImportModel.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/TerrestrialLocationImportModel.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -21,22 +21,27 @@ package fr.ifremer.wao.io.csv2.models; import fr.ifremer.wao.bean.LocationType; +import fr.ifremer.wao.entity.TerrestrialDivision; import fr.ifremer.wao.entity.TerrestrialLocation; import fr.ifremer.wao.entity.TerrestrialLocationImpl; -import fr.ifremer.wao.io.csv2.Common; +import fr.ifremer.wao.io.csv2.Column; import fr.ifremer.wao.io.csv2.ImportModel; import fr.ifremer.wao.io.csv2.ImportableColumn; -import fr.ifremer.wao.io.csv2.ImportableColumnImpl; +import fr.ifremer.wao.io.csv2.ModelBuilder; import fr.ifremer.wao.io.csv2.ValueParser; import fr.ifremer.wao.io.csv2.ValueSetter; import org.apache.commons.lang.StringUtils; import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class TerrestrialLocationImportModel implements ImportModel<TerrestrialLocation> { - protected List<ImportableColumn> allHeaders; + @Override + public char getSeparator() { + return ';'; + } @Override public void pushCsvHeaderNames(List<String> headerNames) { @@ -66,78 +71,79 @@ return name; } - public TerrestrialLocationImportModel() { + @Override + public Collection<ImportableColumn> getColumnsForImport() { - allHeaders = new ArrayList<ImportableColumn>(); + ModelBuilder<TerrestrialLocation> modelBuilder = new ModelBuilder<TerrestrialLocation>(); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("TLIEU_COD", - new ValueParser<LocationType>() { - @Override - public LocationType parse(String value) { - if ("6".equals(value)) { - return LocationType.PORT; - } else if ("7".equals(value)) { - return LocationType.AUCTION; + modelBuilder.newMandatoryColumn("TLIEU_COD", + new ValueParser<LocationType>() { + @Override + public LocationType parse(String value) { + if ("6".equals(value)) { + return LocationType.PORT; + } else if ("7".equals(value)) { + return LocationType.AUCTION; + } + throw new IllegalArgumentException(value + " is not a good location code"); } - throw new IllegalArgumentException(value + " is not a good location code"); + }, + new ValueSetter<TerrestrialLocation, LocationType>() { + @Override + public void set(TerrestrialLocation terrestrialLocation, LocationType value) { + terrestrialLocation.setLocationType(value); + } } - }, - new ValueSetter<TerrestrialLocation, LocationType>() { - @Override - public void set(TerrestrialLocation terrestrialLocation, LocationType value) { - terrestrialLocation.setLocationType(value); + ); + modelBuilder.newIgnoredColumn("TLIEU_LIB"); + modelBuilder.newMandatoryColumn("LIEU_COD", TerrestrialLocation.PROPERTY_CODE); + modelBuilder.newMandatoryColumn("LIEU_LIB", TerrestrialLocation.PROPERTY_NAME); + modelBuilder.newMandatoryColumn("Port", + new ValueSetter<TerrestrialLocation, String>() { + @Override + public void set(TerrestrialLocation terrestrialLocation, String value) { + terrestrialLocation.setPortCode(getCode(value)); + terrestrialLocation.setPortName(getName(value)); + } } - } - )); - allHeaders.add(ImportableColumnImpl.newIgnoredColumn("TLIEU_LIB")); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("LIEU_COD", TerrestrialLocation.PROPERTY_CODE)); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("LIEU_LIB", TerrestrialLocation.PROPERTY_NAME)); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Port", - new ValueSetter<TerrestrialLocation, String>() { - @Override - public void set(TerrestrialLocation terrestrialLocation, String value) { - terrestrialLocation.setPortCode(getCode(value)); - terrestrialLocation.setPortName(getName(value)); + ); + modelBuilder.newMandatoryColumn("Quartier maritime", + new ValueSetter<TerrestrialLocation, String>() { + @Override + public void set(TerrestrialLocation terrestrialLocation, String value) { + terrestrialLocation.setDistrictCode(getCode(value)); + terrestrialLocation.setDistrictName(getName(value)); + } } - } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Quartier maritime", - new ValueSetter<TerrestrialLocation, String>() { - @Override - public void set(TerrestrialLocation terrestrialLocation, String value) { - terrestrialLocation.setDistrictCode(getCode(value)); - terrestrialLocation.setDistrictName(getName(value)); + ); + modelBuilder.newMandatoryColumn("Département INSEE", + new ValueSetter<TerrestrialLocation, String>() { + @Override + public void set(TerrestrialLocation terrestrialLocation, String value) { + terrestrialLocation.setDepartmentCode(getCode(value)); + terrestrialLocation.setDepartmentName(getName(value)); + } } - } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Département INSEE", - new ValueSetter<TerrestrialLocation, String>() { - @Override - public void set(TerrestrialLocation terrestrialLocation, String value) { - terrestrialLocation.setDepartmentCode(getCode(value)); - terrestrialLocation.setDepartmentName(getName(value)); + ); + modelBuilder.newMandatoryColumn("Sous-région IFREMER", + new ValueSetter<TerrestrialLocation, String>() { + @Override + public void set(TerrestrialLocation terrestrialLocation, String value) { + terrestrialLocation.setSubRegionIfremerCode(getCode(value)); + terrestrialLocation.setSubRegionIfremerName(getName(value)); + } } - } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Sous-région IFREMER", - new ValueSetter<TerrestrialLocation, String>() { - @Override - public void set(TerrestrialLocation terrestrialLocation, String value) { - terrestrialLocation.setSubRegionIfremerCode(getCode(value)); - terrestrialLocation.setSubRegionIfremerName(getName(value)); + ); + modelBuilder.newMandatoryColumn("Région Ifremer", + new ValueSetter<TerrestrialLocation, String>() { + @Override + public void set(TerrestrialLocation terrestrialLocation, String value) { + terrestrialLocation.setRegionIfremerCode(getCode(value)); + terrestrialLocation.setRegionIfremerName(getName(value)); + } } - } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Région Ifremer", - new ValueSetter<TerrestrialLocation, String>() { - @Override - public void set(TerrestrialLocation terrestrialLocation, String value) { - terrestrialLocation.setRegionIfremerCode(getCode(value)); - terrestrialLocation.setRegionIfremerName(getName(value)); - } - } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Région INSEE", + ); + modelBuilder.newMandatoryColumn("Région INSEE", new ValueSetter<TerrestrialLocation, String>() { @Override public void set(TerrestrialLocation terrestrialLocation, String value) { @@ -145,8 +151,8 @@ terrestrialLocation.setRegionName(getName(value)); } } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Façade maritime", + ); + modelBuilder.newMandatoryColumn("Façade maritime", new ValueSetter<TerrestrialLocation, String>() { @Override public void set(TerrestrialLocation terrestrialLocation, String value) { @@ -154,8 +160,8 @@ terrestrialLocation.setSeaboardName(getName(value)); } } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Type de Région", + ); + modelBuilder.newMandatoryColumn("Type de Région", new ValueSetter<TerrestrialLocation, String>() { @Override public void set(TerrestrialLocation terrestrialLocation, String value) { @@ -163,8 +169,8 @@ terrestrialLocation.setRegionTypeName(getName(value)); } } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("Littoral FAO", + ); + modelBuilder.newMandatoryColumn("Littoral FAO", new ValueSetter<TerrestrialLocation, String>() { @Override public void set(TerrestrialLocation terrestrialLocation, String value) { @@ -172,20 +178,16 @@ terrestrialLocation.setCoastFAOName(getName(value)); } } - )); - allHeaders.add(ImportableColumnImpl.newMandatoryColumn("PAYS", - new ValueSetter<TerrestrialLocation, String>() { - @Override - public void set(TerrestrialLocation terrestrialLocation, String value) { - terrestrialLocation.setCountryCode(getCode(value)); - terrestrialLocation.setCountryName(getName(value)); + ); + modelBuilder.newMandatoryColumn("PAYS", + new ValueSetter<TerrestrialLocation, String>() { + @Override + public void set(TerrestrialLocation terrestrialLocation, String value) { + terrestrialLocation.setCountryCode(getCode(value)); + terrestrialLocation.setCountryName(getName(value)); + } } - } - )); + ); + return modelBuilder.getColumnsForImport(); } - - @Override - public List<ImportableColumn> getAllColumns() { - return allHeaders; - } } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -77,8 +77,10 @@ import fr.ifremer.wao.io.csv.SamplingExport; import fr.ifremer.wao.io.csv.WaoCsvHeader.FISHING_ZONE; import fr.ifremer.wao.io.csv.WaoCsvHeader.SAMPLING; +import fr.ifremer.wao.io.csv2.Export; +import fr.ifremer.wao.io.csv2.ExportModel; import fr.ifremer.wao.io.csv2.Import; -import fr.ifremer.wao.io.csv2.models.SamplingPlanImportModel; +import fr.ifremer.wao.io.csv2.models.SamplingPlanImportExportModel; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; @@ -915,146 +917,128 @@ } } -// /** -// * Prepare the Binder for Profession copy. This method is called in -// * service constructor. The copy from two Profession will be available -// * anywhere using BinderProvider.get(Profession.class).copy(source, dest); -// * -// * @see org.nuiton.util.beans.Binder -// * @see org.nuiton.util.beans.BinderProvider -// */ -// protected void prepareBinderForProfession() { -// BinderBuilder builder = new BinderBuilder(); -// builder.createBinderModel(Profession.class).addSimpleProperties( -// Profession.CODE_DCF5, -// Profession.LIBELLE, -// Profession.MESH_SIZE, -// Profession.OTHER, -// Profession.SIZE, -// Profession.SPECIES); -// BinderProvider.registerBinder(builder); -// } - @Override public InputStream executeExportSamplingPlanCsv(TopiaContext transaction, List<Object> errorArgs, ConnectedUser user, SamplingFilter filter) throws Exception { - CsvWriter writer = null; - try { - DateFormat dateFormat = SAMPLING.getDateFormat(); -// errorArgs.add(dateFormat.format(period.getFromDate())); -// errorArgs.add(dateFormat.format(period.getThruDate())); + SampleRowDAO dao = WaoDAOHelper.getSampleRowDAO(transaction); + WaoQueryBuilder builder = context.newQueryBuilder(); + WaoQueryHelper.SampleRowProperty sampleRowProperty = + builder.initializeForSampleRow(false); - File file = File.createTempFile("wao-samplingPlan-", ".csv"); - file.deleteOnExit(); + TopiaQuery query = builder.applySamplingFilter(filter). + addOrder(sampleRowProperty.code()); - FileOutputStream output = new FileOutputStream(file); - writer = new CsvWriter(output, ',', context.getCsvCharset()); + List<SampleRow> rows = dao.findAllByQuery(query); - PeriodDates period = filter.getPeriod(); - period.setPattern(SAMPLING.defaultDatePattern()); - List<String> monthHeaders = period.getFormatedMonths(); + InputStream csv; - SamplingExport export = - new SamplingExport(writer, user, monthHeaders); + if (ObsProgram.OBSDEB.equals(filter.getObsProgram())) { - export.writeHeaders(); + ExportModel<SampleRow> exportModel = new SamplingPlanImportExportModel(); + Export<SampleRow> export = new Export(exportModel, rows); + csv = export.startExport(); - // Get sampleRows from database filtered - SampleRowDAO dao = WaoDAOHelper.getSampleRowDAO(transaction); -// String sampleRowAlias = "S"; -// String sampleRowCodeProperty = -// TopiaQuery.getProperty(sampleRowAlias, SampleRow.CODE); -// TopiaQuery query = dao.createQuery(sampleRowAlias); -// filter.prepareQueryForSampling(query, sampleRowAlias); -// -// query.addOrder(sampleRowCodeProperty); + } else { - WaoQueryBuilder builder = context.newQueryBuilder(); - WaoQueryHelper.SampleRowProperty sampleRowProperty = - builder.initializeForSampleRow(false); + CsvWriter writer = null; + try { - TopiaQuery query = builder.applySamplingFilter(filter). - addOrder(sampleRowProperty.code()); + DateFormat dateFormat = SAMPLING.getDateFormat(); - List<SampleRow> rows = dao.findAllByQuery(query); + File file = File.createTempFile("wao-samplingPlan-", ".csv"); + file.deleteOnExit(); - NumberFormat numberFormat = SAMPLING.getNumberFormat(); + FileOutputStream output = new FileOutputStream(file); + writer = new CsvWriter(output, ',', context.getCsvCharset()); - for (SampleRow row : rows) { - export.newRecord(); + PeriodDates period = filter.getPeriod(); + period.setPattern(SAMPLING.defaultDatePattern()); + List<String> monthHeaders = period.getFormatedMonths(); - if (log.isDebugEnabled()) { - log.debug("add sampleRow : " + row.getCode()); - } - - export.record(SAMPLING.PLAN_CODE, row.getCode()); - Company company = row.getCompany(); + SamplingExport export = + new SamplingExport(writer, user, monthHeaders); - // Evo #2227 : Guest users don't have access to companyName - if (company != null && !user.isGuest()) { - export.record(SAMPLING.SOCIETE_NOM, company.getName()); - } + export.writeHeaders(); - // Profession can't be null - Profession profession = row.getProfession(); + NumberFormat numberFormat = SAMPLING.getNumberFormat(); - // export.record(SAMPLING.METIER_CODE_DCF5, profession.getCodeDCF5()); - export.record(SAMPLING.METIER_CODE_DCF5, StringUtil.join(row.getDCF5Code(), " et ", true)); + for (SampleRow row : rows) { + export.newRecord(); - export.record(SAMPLING.METIER_MAILLAGE, profession.getMeshSize()); - export.record(SAMPLING.METIER_TAILLE, profession.getSize()); - export.record(SAMPLING.METIER_AUTRE, profession.getOther()); - export.record(SAMPLING.METIER_LIBELLE, profession.getLibelle()); - export.record(SAMPLING.METIER_ESPECES, profession.getSpecies()); + if (log.isDebugEnabled()) { + log.debug("add sampleRow : " + row.getCode()); + } - export.record(SAMPLING.PROGRAMME_CODE, row.getProgramName()); - export.record(SAMPLING.PROGRAMME_DEBUT, dateFormat.format(row.getPeriodBegin())); - export.record(SAMPLING.PROGRAMME_FIN, dateFormat.format(row.getPeriodEnd())); + export.record(SAMPLING.PLAN_CODE, row.getCode()); + Company company = row.getCompany(); - export.record(FISHING_ZONE.PECHE_FACADE, row.getFacade()); - export.record(FISHING_ZONE.PECHE_ZONE, row.getSectors()); - export.record(SAMPLING.PECHE_AUTRE, row.getFishingZonesInfos()); + // Evo #2227 : Guest users don't have access to companyName + if (company != null && !user.isGuest()) { + export.record(SAMPLING.SOCIETE_NOM, company.getName()); + } - String divisions = ""; - String separator = FISHING_ZONE.getDistrictCodeSeparator(); - for (FishingZone zone : row.getFishingZone()) { - divisions += separator + zone.getDistrictCode(); - } + // Profession can't be null + Profession profession = row.getProfession(); - // There is at least one district in row, so no problem with substring - export.record(FISHING_ZONE.PECHE_DIVISION, divisions.substring(separator.length())); + // export.record(SAMPLING.METIER_CODE_DCF5, profession.getCodeDCF5()); + export.record(SAMPLING.METIER_CODE_DCF5, StringUtil.join(row.getDCF5Code(), " et ", true)); - export.record(SAMPLING.PLAN_NB_OBSERV, numberFormat.format(row.getNbObservants())); - export.record(SAMPLING.PLAN_DUREE_MOY, numberFormat.format(row.getAverageTideTime())); - if (row.getComment() != null) { - export.record(SAMPLING.PLAN_COMMENT, String.valueOf(row.getComment())); - } - export.record(SAMPLING.PLAN_STRATEGIE, row.getSamplingStrategy().name()); - if (row.getTerrestrialLocation() != null) { - if (row.getTerrestrialLocation().getDistrictCode() != null) { - export.record(SAMPLING.PLAN_LIEU_CODE, row.getTerrestrialLocation().getDistrictCode()); - String districtName = row.getTerrestrialLocation().getDistrictName(); - export.record(SAMPLING.PLAN_LIEU_NOM, districtName == null ? "Autre" : districtName); + export.record(SAMPLING.METIER_MAILLAGE, profession.getMeshSize()); + export.record(SAMPLING.METIER_TAILLE, profession.getSize()); + export.record(SAMPLING.METIER_AUTRE, profession.getOther()); + export.record(SAMPLING.METIER_LIBELLE, profession.getLibelle()); + export.record(SAMPLING.METIER_ESPECES, profession.getSpecies()); + + export.record(SAMPLING.PROGRAMME_CODE, row.getProgramName()); + export.record(SAMPLING.PROGRAMME_DEBUT, dateFormat.format(row.getPeriodBegin())); + export.record(SAMPLING.PROGRAMME_FIN, dateFormat.format(row.getPeriodEnd())); + + export.record(FISHING_ZONE.PECHE_FACADE, row.getFacade()); + export.record(FISHING_ZONE.PECHE_ZONE, row.getSectors()); + export.record(SAMPLING.PECHE_AUTRE, row.getFishingZonesInfos()); + + String divisions = ""; + String separator = FISHING_ZONE.getDistrictCodeSeparator(); + for (FishingZone zone : row.getFishingZone()) { + divisions += separator + zone.getDistrictCode(); } + + // There is at least one district in row, so no problem with substring + export.record(FISHING_ZONE.PECHE_DIVISION, divisions.substring(separator.length())); + + export.record(SAMPLING.PLAN_NB_OBSERV, numberFormat.format(row.getNbObservants())); + export.record(SAMPLING.PLAN_DUREE_MOY, numberFormat.format(row.getAverageTideTime())); + if (row.getComment() != null) { + export.record(SAMPLING.PLAN_COMMENT, String.valueOf(row.getComment())); + } + export.record(SAMPLING.PLAN_STRATEGIE, row.getSamplingStrategy().name()); + if (row.getTerrestrialLocation() != null) { + if (row.getTerrestrialLocation().getDistrictCode() != null) { + export.record(SAMPLING.PLAN_LIEU_CODE, row.getTerrestrialLocation().getDistrictCode()); + String districtName = row.getTerrestrialLocation().getDistrictName(); + export.record(SAMPLING.PLAN_LIEU_NOM, districtName == null ? "Autre" : districtName); + } + } + + export.recordMonths(row); + + export.writeRecord(); } - export.recordMonths(row); + csv = new FileInputStream(file); - export.writeRecord(); + } catch (Exception eee) { + throw eee; + } finally { + if (writer != null) { + writer.close(); + } } - - return new FileInputStream(file); - - } catch (Exception eee) { - throw eee; - } finally { - if (writer != null) { - writer.close(); - } } - + + return csv; } @Override @@ -1074,7 +1058,7 @@ throw new IllegalStateException("Le référentiel de stratification n'a pas été importé"); } - SamplingPlanImportModel samplingPlanImportModel = new SamplingPlanImportModel(observationUnits); + SamplingPlanImportExportModel samplingPlanImportModel = new SamplingPlanImportExportModel(observationUnits); try { Import<SampleRow> samplingPlanImport = new Import<SampleRow>(samplingPlanImportModel, input); @@ -1256,7 +1240,7 @@ * Update a SampleRow from CSV File from importSamplingPlanCsv method. * Program must be set to get beginDate and endDate for getting correct months. * SampleMonth will be created corresponding to program period. - * Careful : fixed columns set to 16 and months columns start to 13. + * Careful : fixed columnsForImport set to 16 and months columnsForImport start to 13. * The case of importing a previously exported file is Ok (the default * values is check from SAMPLING header). * Updatable fields : fishingZoneInfos, nbObservants, averageTideTime, @@ -1337,13 +1321,13 @@ - // 16 fixed columns : 13 before months and 4 after + // 16 fixed columnsForImport : 13 before months and 4 after int nbFixedColumns = 17; // Months begin at 14th column int firstMonthColumnId = 13; int nbTotalColumns = reader.getColumnCount(); - // Case for importing CSV after exporting from appli : more columns + // Case for importing CSV after exporting from appli : more columnsForImport // are exported. // Check if the previous column (12) is the lastHeader // defined in SAMPLING Added: trunk/wao-business/src/test/java/fr/ifremer/wao/io/csv2/ExportTest.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/io/csv2/ExportTest.java (rev 0) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/io/csv2/ExportTest.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -0,0 +1,85 @@ +package fr.ifremer.wao.io.csv2; + +import fr.ifremer.wao.bean.ObsProgram; +import fr.ifremer.wao.entity.SampleRow; +import fr.ifremer.wao.entity.SampleRowImpl; +import fr.ifremer.wao.entity.TerrestrialDivision; +import fr.ifremer.wao.entity.TerrestrialDivisionImpl; +import fr.ifremer.wao.io.csv2.models.SamplingPlanImportExportModel; +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.nuiton.util.DateUtil; +import org.nuiton.util.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.InputStream; +import java.util.Collection; +import java.util.LinkedList; + +public class ExportTest { + + private static final Logger log = LoggerFactory.getLogger(ExportTest.class); + + protected Collection<SampleRow> sampleRows; + + @Before + public void fillSampleRows() { + TerrestrialDivision observationUnit = new TerrestrialDivisionImpl(); + observationUnit.setObservationUnitCode("UO10"); + observationUnit.setRegionIfremerCode("MA"); + observationUnit.setObservationUnitName("Côte est"); + + SampleRow row1 = new SampleRowImpl(); + row1.setObsProgram(ObsProgram.OBSDEB); + row1.setCode("1"); + row1.setDay(DateUtil.createDate(11, 3, 2011)); + row1.setGroupName("OBS1"); + row1.setObservationUnit(observationUnit); + + SampleRow row2 = new SampleRowImpl(); + row2.setObsProgram(ObsProgram.OBSDEB); + row2.setCode("2"); + row2.setDay(DateUtil.createDate(12, 3, 2011)); + row2.setGroupName("OBS2"); + row2.setObservationUnit(observationUnit); + + sampleRows = new LinkedList<SampleRow>(); + sampleRows.add(row1); + sampleRows.add(row2); + } + + @Test + public void testExport() throws Exception { + ExportModel<SampleRow> exportModel = new SamplingPlanImportExportModel(); + Export<SampleRow> export = new Export(exportModel, sampleRows); + InputStream input = null; + + try { + input = export.startExport(); + + String csv = IOUtils.toString(input); + + if (log.isDebugEnabled()) { + log.debug("csv file is : \n" + csv); + } + + // check the no line is missing + String[] lines = StringUtil.split(csv, "\n"); + int expectedLineNumber = sampleRows.size() + 1; // +1 for header line + int actualLineNumber = lines.length; + Assert.assertEquals(expectedLineNumber, actualLineNumber); + + // check that each lines has 5 columns + for (String line : lines) { + String[] columns = StringUtil.split(line, ";"); + Assert.assertEquals(5, columns.length); + } + } finally { + IOUtils.closeQuietly(input); + } + } + +} Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/io/csv2/ImportTest.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/io/csv2/ImportTest.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/io/csv2/ImportTest.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -20,17 +20,15 @@ */ package fr.ifremer.wao.io.csv2; -import fr.ifremer.wao.bean.ObsProgram; import fr.ifremer.wao.bean.ValidationResult; import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.entity.TerrestrialDivision; import fr.ifremer.wao.entity.TerrestrialDivisionImpl; import fr.ifremer.wao.entity.TerrestrialLocation; -import fr.ifremer.wao.io.csv2.models.SamplingPlanImportModel; +import fr.ifremer.wao.io.csv2.models.SamplingPlanImportExportModel; import fr.ifremer.wao.io.csv2.models.TerrestrialLocationImportModel; import org.apache.commons.io.IOUtils; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,7 +94,7 @@ terrestrialDivisions.add(uo07); terrestrialDivisions.add(uo87); - ImportModel<SampleRow> model = new SamplingPlanImportModel(terrestrialDivisions); + ImportModel<SampleRow> model = new SamplingPlanImportExportModel(terrestrialDivisions); InputStream input = null; try { input = getClass().getResourceAsStream("/import/samplingPlan-obsdeb.csv"); Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/components/IndicatorLevels.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/components/IndicatorLevels.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/components/IndicatorLevels.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -31,7 +31,7 @@ import java.util.List; /** - * Render a table with levels as columns and two lines : level number and + * Render a table with levels as columnsForImport and two lines : level number and * lower + upper bound values. The table has a header with indicator name * and coefficient * Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/AbstractMappedGridDataSource.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/AbstractMappedGridDataSource.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/AbstractMappedGridDataSource.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -85,7 +85,7 @@ mapResults = execute(startIndex, endIndex, getSortConstraint(sortConstraints)); listResults = new ArrayList<E>(mapResults.values()); - // FIXME manage sort columns in execute ???? seems obvious --> needed for Contacts, done for Boats + // FIXME manage sort columnsForImport in execute ???? seems obvious --> needed for Contacts, done for Boats //sortResults(sortConstraints); } catch (WaoException eee) { throw new TapestryException("", eee); Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ObsDebSamplingPlan.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ObsDebSamplingPlan.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ObsDebSamplingPlan.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -1,16 +1,19 @@ package fr.ifremer.wao.ui.pages; +import fr.ifremer.wao.WaoException; import fr.ifremer.wao.bean.ConnectedUser; import fr.ifremer.wao.bean.ObsProgram; import fr.ifremer.wao.bean.SamplingFilter; import fr.ifremer.wao.bean.SamplingFilterImpl; import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.service.ServiceSampling; +import fr.ifremer.wao.ui.data.ExportStreamResponse; import fr.ifremer.wao.ui.data.RequiresAuthentication; import fr.ifremer.wao.ui.data.SampleRowDataSource; import fr.ifremer.wao.ui.services.SampleRowModelFactory; import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.StreamResponse; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.annotations.SessionState; import org.apache.tapestry5.beaneditor.BeanModel; @@ -18,6 +21,9 @@ import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.BeanModelSource; +import java.io.IOException; +import java.io.InputStream; + @RequiresAuthentication(allowedPrograms = {ObsProgram.OBSDEB}) public class ObsDebSamplingPlan { @@ -69,4 +75,21 @@ } return obsdebSamplingPlanModel; } + + /********** ACTIONS *********/ + + StreamResponse onActionFromExportSamplingPlan() { + return new ExportStreamResponse("wao-echantillonnage-obsdeb") { + @Override + public InputStream getStream() throws IOException { + InputStream csv = null; + try { + csv = serviceSampling.exportSamplingPlanCsv(connectedUser, getSamplingFilter()); + } catch (WaoException eee) { + throw new IOException(eee); + } + return csv; + } + }; + } } Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -74,7 +74,7 @@ /** add ALL properties to the bean model. */ protected void initModel() { - // order is meaningful, properties will be displayed in columns from left to right + // order is meaningful, properties will be displayed in columnsForImport from left to right addNonSortableProperty(TopiaEntity.TOPIA_CREATE_DATE, null); addNonSortableProperty(Contact.PROPERTY_MAIN_OBSERVER, getUserPropertyConduit()); Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/SampleRowModelFactory.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/SampleRowModelFactory.java 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/SampleRowModelFactory.java 2011-03-11 17:30:31 UTC (rev 1059) @@ -15,7 +15,7 @@ * Used to generate a bean model for the grid used in sampling plan showed * on page {@link fr.ifremer.wao.ui.pages.ObsDebSamplingPlan}. * - * This factory will generate a model showing the columns that the user + * This factory will generate a model showing the columnsForImport that the user * has the right to see. * * @author bleny Modified: trunk/wao-ui/src/main/webapp/ObsDebSamplingPlan.tml =================================================================== --- trunk/wao-ui/src/main/webapp/ObsDebSamplingPlan.tml 2011-03-10 15:48:59 UTC (rev 1058) +++ trunk/wao-ui/src/main/webapp/ObsDebSamplingPlan.tml 2011-03-11 17:30:31 UTC (rev 1059) @@ -1,7 +1,14 @@ <t:layout t:pageTitle="${message:wao.ui.page.SamplingPlan.title}" t:contentId="wao-obsdebsamplingplan" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> - <h1>${message:wao.ui.samplingPlan.title}</h1> + <h1 class="fleft">${message:wao.ui.samplingPlan.title}</h1> + <div class="fleft actions-top"> + <span> + <a t:type="actionlink" t:id="exportSamplingPlan"> <!-- title="${format:wao.ui.samplingPlan.export=dateFormat.format(period.fromDate),dateFormat.format(period.thruDate)}" --> + <img src="${asset:context:}/img/file-export-22px.png" alt="${message:wao.ui.action.runExport}" /> + </a> + </span> + </div> <div t:type="grid" t:source="sampleRows" t:row="sampleRow" t:model="obsdebSamplingPlanModel" t:rowsPerPage="50"> <!-- code -->