Author: tchemit Date: 2012-08-17 15:50:06 +0200 (Fri, 17 Aug 2012) New Revision: 2401 Url: http://nuiton.org/repositories/revision/nuiton-utils/2401 Log: fixes #2270: Add a way to import/export Enumeration in csv API (add tests) Added: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBeanEnum.java Modified: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Common.java trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ExportTest.java trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ImportTest.java trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/MyModelBuilderTest.java trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBean.java Modified: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Common.java =================================================================== --- trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Common.java 2012-08-16 15:19:43 UTC (rev 2400) +++ trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Common.java 2012-08-17 13:50:06 UTC (rev 2401) @@ -32,6 +32,7 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -104,10 +105,18 @@ return new MapProperty<E, T>(propertyName); } - public static <E , T> BeanProperty<E, T> newBeanProperty(String propertyName) { + public static <E, T> BeanProperty<E, T> newBeanProperty(String propertyName) { return new BeanProperty<E, T>(propertyName); } - + + public static <E extends Enum<E>> ValueParserFormatter<E> newEnumByNameParserFormatter(Class<E> enumType) { + return new EnumByNameParserFormatter<E>(enumType); + } + + public static <E extends Enum<E>> ValueParserFormatter<E> newEnumByOrdinalParserFormatter(Class<E> enumType) { + return new EnumByOrdinalParserFormatter<E>(enumType); + } + public static class StringValueParser implements ValueParserFormatter<String> { @Override @@ -196,6 +205,82 @@ } } + public static class EnumByNameParserFormatter<E extends Enum<E>> implements ValueParserFormatter<E> { + + + private final Class<E> enumType; + + public EnumByNameParserFormatter(Class<E> enumType) { + this.enumType = enumType; + } + + @Override + public E parse(String value) throws ParseException { + E result; + if (StringUtils.isBlank(value)) { + result = null; + } else { + result = Enum.valueOf(enumType, value); + } + return result; + } + + @Override + public String format(E date) { + String value = ""; + if (date != null) { + value = date.name(); + } + return value; + } + } + + public static class EnumByOrdinalParserFormatter<E extends Enum<E>> implements ValueParserFormatter<E> { + + private final E[] universe; + + private final int maxValue; + + public EnumByOrdinalParserFormatter(Class<E> enumType) { + universe = enumType.getEnumConstants(); + maxValue = universe.length - 1; + } + + @Override + public E parse(String value) throws ParseException { + E result; + if (StringUtils.isBlank(value)) { + result = null; + } else { + Integer ordinal = null; + try { + ordinal = Integer.valueOf(value); + } catch (NumberFormatException e) { + throw new ParseException( + "Could not parse ordinal value [" + value + "]", 0); + } + if (ordinal > maxValue) { + throw new ParseException( + "Ordinal value [" + ordinal + + "] not inbound (possible value from [0.." + + maxValue + "] for enum " + Arrays.toString(universe), + 0); + } + result = universe[ordinal]; + } + return result; + } + + @Override + public String format(E date) { + String value = ""; + if (date != null) { + value = date.name(); + } + return value; + } + } + public static class ToStringParserFormatter<E> implements ValueParserFormatter<E> { protected Map<E, String> toStrings = new HashMap<E, String>(); Modified: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ExportTest.java =================================================================== --- trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ExportTest.java 2012-08-16 15:19:43 UTC (rev 2400) +++ trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ExportTest.java 2012-08-17 13:50:06 UTC (rev 2401) @@ -54,15 +54,15 @@ @Before public void setUp() { - oneSizedSet.add(new RowBean(DateUtil.createDate(1, 12, 2011), "Batman", 1)); + oneSizedSet.add(new RowBean(DateUtil.createDate(1, 12, 2011), "Batman", 1, RowBeanEnum.ONE)); twoSizedSet.addAll(oneSizedSet); - twoSizedSet.add(new RowBean(DateUtil.createDate(2, 12, 2011), "", 7)); + twoSizedSet.add(new RowBean(DateUtil.createDate(2, 12, 2011), "", 7, RowBeanEnum.TWO)); fiveSizedSet.addAll(twoSizedSet); - fiveSizedSet.add(new RowBean(DateUtil.createDate(7, 12, 2011), "", 9)); - fiveSizedSet.add(new RowBean(DateUtil.createDate(18, 12, 2011), "", 18)); - fiveSizedSet.add(new RowBean(DateUtil.createDate(23, 12, 2011), "", 4)); + fiveSizedSet.add(new RowBean(DateUtil.createDate(7, 12, 2011), "", 9, RowBeanEnum.ZERO)); + fiveSizedSet.add(new RowBean(DateUtil.createDate(18, 12, 2011), "", 18, RowBeanEnum.ONE)); + fiveSizedSet.add(new RowBean(DateUtil.createDate(23, 12, 2011), "", 4, RowBeanEnum.TWO)); sets = Arrays.asList(new HashSet<RowBean>(), oneSizedSet, twoSizedSet, fiveSizedSet); } Modified: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ImportTest.java =================================================================== --- trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ImportTest.java 2012-08-16 15:19:43 UTC (rev 2400) +++ trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ImportTest.java 2012-08-17 13:50:06 UTC (rev 2401) @@ -53,24 +53,24 @@ @Test public void testSimpleImportWithNoData() throws Exception { - String content = "DATE;NUMBER;TITLE"; + String content = "DATE;NUMBER;TITLE;ROWBEANENUM"; List<RowBean> rows; rows = importContent(new SimpleImportModel(), content); Assert.assertEquals(0, rows.size()); - content = "DATE;NUMBER;TITLE\n"; + content = "DATE;NUMBER;TITLE;ROWBEANENUM\n"; rows = importContent(new SimpleImportModel(), content); Assert.assertEquals(0, rows.size()); } @Test public void testSimpleImportWithOneLine() throws Exception { - String content = "DATE;NUMBER;TITLE\n2011-12-05;18;\"1ère ligne\""; + String content = "DATE;NUMBER;TITLE;ROWBEANENUM\n2011-12-05;18;\"1ère ligne\";ZERO;"; List<RowBean> rows = importContent(new SimpleImportModel(), content); Assert.assertEquals(1, rows.size()); - assertRowEquals(rows.get(0), DateUtil.createDate(5, 12, 2011), 18, "1ère ligne"); + assertRowEquals(rows.get(0), DateUtil.createDate(5, 12, 2011), 18, "1ère ligne",RowBeanEnum.ZERO); } /** @@ -80,14 +80,14 @@ */ @Test public void testSimpleImport() throws Exception { - String content = "DATE;NUMBER;TITLE\n" + - "2011-12-05;18;\"1ère ligne\"\n" + - "2011-12-06;19;\"2ème ligne\"\n" + - "2011-12-07;21;\"3ème ligne\""; + String content = "DATE;NUMBER;TITLE;ROWBEANENUM\n" + + "2011-12-05;18;\"1ère ligne\";ZERO\n" + + "2011-12-06;19;\"2ème ligne\";ONE\n" + + "2011-12-07;21;\"3ème ligne\";TWO"; List<RowBean> rows = importContent(new SimpleImportModel(), content); - assertRowEquals(rows.get(0), DateUtil.createDate(5, 12, 2011), 18, "1ère ligne"); - assertRowEquals(rows.get(1), DateUtil.createDate(6, 12, 2011), 19, "2ème ligne"); - assertRowEquals(rows.get(2), DateUtil.createDate(7, 12, 2011), 21, "3ème ligne"); + assertRowEquals(rows.get(0), DateUtil.createDate(5, 12, 2011), 18, "1ère ligne",RowBeanEnum.ZERO); + assertRowEquals(rows.get(1), DateUtil.createDate(6, 12, 2011), 19, "2ème ligne",RowBeanEnum.ONE); + assertRowEquals(rows.get(2), DateUtil.createDate(7, 12, 2011), 21, "3ème ligne",RowBeanEnum.TWO); } /** @@ -97,15 +97,14 @@ */ @Test public void testColumnImport() throws Exception { - String content = "DATE;NUMBER;TITLE\n" + - "2011-12-05;18;\"1ère ligne\"\n" + - "2011-12-06;19;\"2ème ligne\"\n" + - "2011-12-07;21;\"3ème ligne\""; + String content = "DATE;NUMBER;TITLE;ROWBEANENUM\n" + + "2011-12-05;18;\"1ère ligne\";2\n" + + "2011-12-06;19;\"2ème ligne\";1\n" + + "2011-12-07;21;\"3ème ligne\";0"; List<RowBean> rows = importContent(new ColumnImportModel(), content); - assertRowEquals(rows.get(0), DateUtil.createDate(5, 12, 2011), 18, "1ère ligne"); - assertRowEquals(rows.get(1), DateUtil.createDate(6, 12, 2011), 19, "2ème ligne"); - assertRowEquals(rows.get(2), DateUtil.createDate(7, 12, 2011), 21, "3ème ligne"); - + assertRowEquals(rows.get(0), DateUtil.createDate(5, 12, 2011), 18, "1ère ligne",RowBeanEnum.TWO); + assertRowEquals(rows.get(1), DateUtil.createDate(6, 12, 2011), 19, "2ème ligne",RowBeanEnum.ONE); + assertRowEquals(rows.get(2), DateUtil.createDate(7, 12, 2011), 21, "3ème ligne",RowBeanEnum.ZERO); } protected List<RowBean> importContent(ImportModel<RowBean> model, @@ -127,10 +126,11 @@ } } - private void assertRowEquals(RowBean row, Date date, Integer number, String title) { + private void assertRowEquals(RowBean row, Date date, Integer number, String title,RowBeanEnum rowBeanEnum) { Assert.assertEquals(date, row.getDate()); Assert.assertEquals(number, row.getNumber()); Assert.assertEquals(title, row.getTitle()); + Assert.assertEquals(rowBeanEnum, row.getRowBeanEnum()); } private static class ColumnImportModel implements ImportModel<RowBean> { @@ -157,6 +157,7 @@ result.add(getTitleColumn()); result.add(getNumberColumn()); result.add(getDateColumn()); + result.add(getEnumColumn()); return result; } @@ -187,6 +188,14 @@ ); } + private Column getEnumColumn() { + return Column.newImportableColumn( + "ROWBEANENUM", + Common.newEnumByOrdinalParserFormatter(RowBeanEnum.class), + withBeanSetter("rowBeanEnum", RowBeanEnum.class), + false + ); + } @SuppressWarnings({"UnusedParameters"}) private <T> ValueSetter<RowBean, T> withBeanSetter(String propertyName, Class<T> propertyClass) { // propertyClass is not used but useful to check type @@ -232,6 +241,7 @@ result.add(getTitleImportable()); result.add(getNumberImportable()); result.add(getDateImportable()); + result.add(getEnumImportable()); return result; } @@ -331,6 +341,38 @@ } }; } + + private ImportableColumn<RowBean, Object> getEnumImportable() { + return new AbstractImportableColumn<RowBean, RowBeanEnum>() { + + @Override + public String getHeaderName() { + return "ROWBEANENUM"; + } + + @Override + public boolean isMandatory() { + return true; + } + + @Override + public boolean isIgnored() { + return false; + } + + @Override + public RowBeanEnum parseValue(String value) { + return RowBeanEnum.valueOf(value); + } + + @Override + public void update(RowBean object, + RowBeanEnum value) + throws Exception { + object.setRowBeanEnum(value); + } + }; + } } private static abstract class AbstractImportableColumn<E, F> implements ImportableColumn<E, Object> { Modified: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/MyModelBuilderTest.java =================================================================== --- trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/MyModelBuilderTest.java 2012-08-16 15:19:43 UTC (rev 2400) +++ trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/MyModelBuilderTest.java 2012-08-17 13:50:06 UTC (rev 2401) @@ -32,10 +32,10 @@ @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\""; + String content = "DATE;NUMBER;TITLE;ROWBEANENUM\n" + + "25/12/2011;18;\"1ère ligne\";ZERO\n" + + "26/12/2011;19;\"2ème ligne\";ONE\n" + + "27/12/2011;21;\"3ème ligne\";TWO"; CsvModel.Factory<RowBean> emptyRowBeanFactory = new CsvModel.Factory<RowBean>() { @Override @@ -44,8 +44,7 @@ } }; - MyModelBuilder<RowBean> modelBuilder = new MyModelBuilder<RowBean>(); - CsvModel<RowBean> model = modelBuilder.newEmptyModel(';') + CsvModel<RowBean> model = new MyModelBuilder<RowBean>().newEmptyModel(';') .addColumn("DATE") .mandatoryAtImport("date", Common.DAY) .writeAtExport("date", Common.DAY) @@ -58,6 +57,10 @@ .mandatoryAtImport("number", Common.INTEGER) .ignoredAtExport() .add() + .addColumn("ROWBEANENUM") + .mandatoryAtImport("rowBeanEnum", Common.newEnumByNameParserFormatter(RowBeanEnum.class)) + .ignoredAtExport() + .add() .buildModelForImport(emptyRowBeanFactory); Import<RowBean> rowBeans = Import.newImport(model, IOUtils.toInputStream(content, "UTF-8")); 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-08-16 15:19:43 UTC (rev 2400) +++ trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBean.java 2012-08-17 13:50:06 UTC (rev 2401) @@ -34,13 +34,16 @@ private Integer number; + private RowBeanEnum rowBeanEnum; + public RowBean() { } - public RowBean(Date date, String title, Integer number) { + public RowBean(Date date, String title, Integer number, RowBeanEnum rowBeanEnum) { this.date = date; this.title = title; this.number = number; + this.rowBeanEnum = rowBeanEnum; } public Date getDate() { @@ -67,6 +70,14 @@ this.number = number; } + public RowBeanEnum getRowBeanEnum() { + return rowBeanEnum; + } + + public void setRowBeanEnum(RowBeanEnum rowBeanEnum) { + this.rowBeanEnum = rowBeanEnum; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -76,6 +87,7 @@ if (!date.equals(row.date)) return false; if (!number.equals(row.number)) return false; + if (!rowBeanEnum.equals(row.rowBeanEnum)) return false; return title.equals(row.title); } @@ -85,6 +97,7 @@ int result = date.hashCode(); result = 31 * result + title.hashCode(); result = 31 * result + number.hashCode(); + result = 31 * result + rowBeanEnum.hashCode(); return result; } @@ -94,6 +107,7 @@ "date=" + date + ", title='" + title + '\'' + ", number=" + number + + ", rowBeanEnum=" + rowBeanEnum + '}'; } } Added: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBeanEnum.java =================================================================== --- trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBeanEnum.java (rev 0) +++ trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBeanEnum.java 2012-08-17 13:50:06 UTC (rev 2401) @@ -0,0 +1,11 @@ +package org.nuiton.util.csv; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since TODO + */ +public enum RowBeanEnum { + ZERO,ONE,TWO +} Property changes on: trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/RowBeanEnum.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native
participants (1)
-
tchemit@users.nuiton.org