Author: bleny Date: 2012-02-06 12:34:26 +0100 (Mon, 06 Feb 2012) New Revision: 2293 Url: http://nuiton.org/repositories/revision/nuiton-utils/2293 Log: tentative de builder csv mieux Added: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/CsvModel.java trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/MyModelBuilder.java trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/MyModelBuilderTest.java Modified: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBean.java Added: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/CsvModel.java =================================================================== --- trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/CsvModel.java (rev 0) +++ trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/CsvModel.java 2012-02-06 11:34:26 UTC (rev 2293) @@ -0,0 +1,50 @@ +package org.nuiton.util.csv; + +import java.util.List; + +public class CsvModel<E> implements ImportExportModel<E> { + + public interface Factory<E> { + E newEmpty(); + } + + protected char separator; + + protected Iterable<ImportableColumn<E, Object>> columnsForImport; + + protected Iterable<ExportableColumn<E, Object>> columnsForExport; + + protected Factory<E> factory; + + public CsvModel(char separator, Iterable<ImportableColumn<E, Object>> columnsForImport, Iterable<ExportableColumn<E, Object>> columnsForExport, Factory<E> factory) { + this.separator = separator; + this.columnsForImport = columnsForImport; + this.columnsForExport = columnsForExport; + this.factory = factory; + } + + @Override + public char getSeparator() { + return separator; + } + + @Override + public void pushCsvHeaderNames(List<String> headerNames) { + // + } + + @Override + public E newEmptyInstance() { + return factory.newEmpty(); + } + + @Override + public Iterable<ImportableColumn<E, Object>> getColumnsForImport() { + return columnsForImport; + } + + @Override + public Iterable<ExportableColumn<E, Object>> getColumnsForExport() { + return columnsForExport; + } +} Added: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/MyModelBuilder.java =================================================================== --- trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/MyModelBuilder.java (rev 0) +++ trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/MyModelBuilder.java 2012-02-06 11:34:26 UTC (rev 2293) @@ -0,0 +1,141 @@ +package org.nuiton.util.csv; + +import java.util.LinkedList; +import java.util.List; + +public class MyModelBuilder<E> { + + protected char separator; + + protected List<ImportableColumn<E, Object>> columnsForImport = new LinkedList<ImportableColumn<E, Object>>(); + + protected List<ExportableColumn<E, Object>> columnsForExport = new LinkedList<ExportableColumn<E, Object>>(); + + public BuildOrAddColumnStep newEmptyModel(char separator) { + this.separator = separator; + return new BuildOrAddColumnStep(); + } + + public class BuildOrAddColumnStep<E> { + + public ChooseImportStrategyForColumnStep<E> addColumn(String columnName) { + return new ChooseImportStrategyForColumnStep(columnName); + } + + public CsvModel<E> buildModelForExport() { + return new CsvModel<E>(separator, (Iterable) columnsForImport, (Iterable) columnsForExport, null); + } + + public CsvModel<E> buildModelForImport(CsvModel.Factory<E> emptyEFactory) { + return new CsvModel<E>(separator, (Iterable) columnsForImport, (Iterable) columnsForExport, (CsvModel.Factory) emptyEFactory); + } + } + + public class ChooseImportStrategyForColumnStep<E> { + + protected String columnName; + + public ChooseImportStrategyForColumnStep(String columnName) { + this.columnName = columnName; + } + + public ChooseExportStrategyForColumnStep<E> ignoreAtImport() { + Column<E, Object> importableColumn = Column.newImportableColumn(columnName, null, null, true); + return new ChooseExportStrategyForColumnStep(columnName, importableColumn); + } + + public ChooseExportStrategyForColumnStep<E> mandatoryAtImport(String propertyName) { + return mandatoryAtImport(propertyName, Common.STRING); + } + + public <T> ChooseExportStrategyForColumnStep<E> mandatoryAtImport(String propertyName, ValueParser<T> valueParser) { + return mandatoryAtImport(valueParser, new Common.BeanProperty<E, T>(propertyName)); + } + + public ChooseExportStrategyForColumnStep<E> mandatoryAtImport(ValueSetter<E, String> valueSetter) { + return mandatoryAtImport(Common.STRING, valueSetter); + } + + public <T> ChooseExportStrategyForColumnStep<E> mandatoryAtImport(ValueParser<T> valueParser, ValueSetter<E, T> valueSetter) { + Column<E, T> importableColumn = Column.newImportableColumn(columnName, valueParser, valueSetter, false); + return new ChooseExportStrategyForColumnStep(columnName, importableColumn); + } + + public ChooseExportStrategyForColumnStep<E> optionalAtImport(String propertyName) { + return optionalAtImport(propertyName, Common.STRING); + } + + public <T> ChooseExportStrategyForColumnStep<E> optionalAtImport(String propertyName, ValueParser<T> valueParser) { + return optionalAtImport(valueParser, new Common.BeanProperty<E, T>(propertyName)); + } + + public ChooseExportStrategyForColumnStep<E> optionalAtImport(ValueSetter<E, String> valueSetter) { + return optionalAtImport(Common.STRING, valueSetter); + } + + public <T> ChooseExportStrategyForColumnStep<E> optionalAtImport(ValueParser<T> valueParser, ValueSetter<E, T> valueSetter) { + // FIXME 20111225 ici comme la colonne est optionnel elle est simplement ignorée, lacune + Column<E, T> importableColumn = Column.newImportableColumn(columnName, valueParser, valueSetter, false); + return new ChooseExportStrategyForColumnStep(columnName, importableColumn); + } + + } + + public class ChooseExportStrategyForColumnStep<E> { + + protected String columnName; + + protected Column<E, Object> importableColumn; + + public ChooseExportStrategyForColumnStep(String columnName, Column<E, Object> importableColumn) { + this.columnName = columnName; + this.importableColumn = importableColumn; + } + + public AddColumnStep<E> ignoredAtExport() { + Column<E, Object> exportableColumn = Column.newExportableColumn(columnName, null, null, true); + return new AddColumnStep(importableColumn, exportableColumn); + } + + public AddColumnStep<E> writeAtExport(String propertyName) { + return writeAtExport(propertyName, Common.STRING); + } + + public AddColumnStep<E> writeAtExport(ValueGetter<E, String> valueGetter) { + return writeAtExport(valueGetter, Common.STRING); + } + + public <T> AddColumnStep<E> writeAtExport(String propertyName, ValueFormatter<T> valueFormatter) { + return writeAtExport( new Common.BeanProperty<E, T>(propertyName), valueFormatter); + } + + public <T> AddColumnStep<E> writeAtExport(ValueGetter<E, T> valueGetter, ValueFormatter<T> valueFormatter) { + ExportableColumn<E, T> exportableColumn = Column.newExportableColumn(columnName, valueGetter, valueFormatter, false); + return new AddColumnStep<E>((ImportableColumn) importableColumn, (ExportableColumn) exportableColumn); + } + } + + public class AddColumnStep<E> { + + protected ImportableColumn<E, Object> importableColumn; + + protected ExportableColumn<E, Object> exportableColumn; + + public AddColumnStep(ImportableColumn<E, Object> importableColumn, ExportableColumn<E, Object> exportableColumn) { + this.importableColumn = importableColumn; + this.exportableColumn = exportableColumn; + } + + public BuildOrAddColumnStep<E> add() { + return addIf(true); + } + + public BuildOrAddColumnStep<E> addIf(boolean condition) { + if (condition) { + columnsForImport.add((ImportableColumn) importableColumn); + columnsForExport.add((ExportableColumn) exportableColumn); + } + return new BuildOrAddColumnStep<E>(); + } + } +} Added: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/MyModelBuilderTest.java =================================================================== --- trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/MyModelBuilderTest.java (rev 0) +++ trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/MyModelBuilderTest.java 2012-02-06 11:34:26 UTC (rev 2293) @@ -0,0 +1,45 @@ +package org.nuiton.util.csv; + +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +public class MyModelBuilderTest { + + @Test + public void testNewEmptyModel() throws Exception { + + String content = "DATE;NUMBER;TITLE\n" + + "25/12/2011;18;\"1ère ligne\"\n" + + "26/12/2011;19;\"2ème ligne\"\n" + + "27/12/2011;21;\"3ème ligne\""; + + CsvModel.Factory<RowBean> emptyRowBeanFactory = new CsvModel.Factory<RowBean>() { + @Override + public RowBean newEmpty() { + return new RowBean(); + } + }; + + MyModelBuilder<RowBean> modelBuilder = new MyModelBuilder<RowBean>(); + CsvModel<RowBean> model = modelBuilder.newEmptyModel(';') + .addColumn("DATE") + .mandatoryAtImport("date", Common.DAY) + .writeAtExport("date", Common.DAY) + .add() + .addColumn("TITLE") + .mandatoryAtImport("title") + .ignoredAtExport() + .add() + .addColumn("NUMBER") + .mandatoryAtImport("number", Common.INTEGER) + .ignoredAtExport() + .add() + .buildModelForImport(emptyRowBeanFactory); + + Import<RowBean> rowBeans = Import.newImport(model, IOUtils.toInputStream(content, "UTF-8")); + for (RowBean rowBean : rowBeans) { + System.out.println(rowBean); + } + } + +} Modified: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBean.java =================================================================== --- trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBean.java 2012-01-26 14:26:52 UTC (rev 2292) +++ trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBean.java 2012-02-06 11:34:26 UTC (rev 2293) @@ -63,4 +63,13 @@ result = 31 * result + number.hashCode(); return result; } + + @Override + public String toString() { + return "RowBean{" + + "date=" + date + + ", title='" + title + '\'' + + ", number=" + number + + '}'; + } }