Author: fdesbois Date: 2011-12-08 11:04:13 +0100 (Thu, 08 Dec 2011) New Revision: 2252 Url: http://nuiton.org/repositories/revision/nuiton-utils/2252 Log: #1846 : Little improvements Modified: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Import.java trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/ImportToMap.java trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_en_GB.properties trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_es_ES.properties trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_fr_FR.properties trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ImportTest.java Modified: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Import.java =================================================================== --- trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Import.java 2011-12-08 02:59:10 UTC (rev 2251) +++ trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Import.java 2011-12-08 10:04:13 UTC (rev 2252) @@ -84,10 +84,20 @@ return new Import<E>(model, inputStream); } - public static <E> Import<E> newImport(ImportModel<E> model, Reader reader) { + public static <E> Import<E> newImport(ImportModel<E> model, + Reader reader) { return new Import<E>(model, reader); } + /** + * Define iterator over import. First of all, the input stream will be + * validated based on defined model. Iteration will be done on all csv + * rows except first headers line. + * + * @return the Iterator used for csv iteration + * @see #prepareAndValidate() + * @see Iterable#iterator() + */ @Override public Iterator<E> iterator() { @@ -127,7 +137,7 @@ String value = readValue(field, lineNumber); // contravariance ftw - Object parsedValue = parserValue(field, lineNumber, value); + Object parsedValue = parseValue(field, lineNumber, value); // set value to element setValue(field, lineNumber, element, parsedValue); @@ -151,6 +161,15 @@ reader.close(); } + /** + * Read the first mandatory headers line and validate it with the input + * model. This will check if headers are unique, known by the model and + * if mandatory headers exist in the file. During this phase, the model + * will retrieve headers value with {@link + * ImportModel#pushCsvHeaderNames(java.util.List)} call. + * + * @since 2.4.1 + */ public void prepareAndValidate() { if (validate) { @@ -176,7 +195,6 @@ checkUniqueModelColumnNames(); // check that given headers from csv file are all known - checkHeaderNamesAreAllKnown(headers); // check all mandatories column are on csv header @@ -184,7 +202,7 @@ } protected <T> String readValue(ImportableColumn<E, T> field, - int lineNumber) { + int lineNumber) { try { String value = reader.get(field.getHeaderName()); return value; @@ -196,8 +214,9 @@ } } - protected <T> T parserValue(ImportableColumn<E, T> field, - int lineNumber, String value) { + protected <T> T parseValue(ImportableColumn<E, T> field, + int lineNumber, + String value) { try { T parsedValue = field.parseValue(value); return parsedValue; @@ -284,34 +303,35 @@ throw new ImportRuntimeException(validationMessage); } - Set<String> headerNames = new HashSet<String>(); - for (ImportableColumn<E, ?> importableColumn : - model.getColumnsForImport()) { - String headerName = importableColumn.getHeaderName(); - boolean alreadyUsed = !headerNames.add(headerName); - if (alreadyUsed) { - throw new ImportRuntimeException( - "model contains multiple columnsForImport named '" + - headerName + "'"); - } - } + // XXX-fdesbois-2011-12-08 : this code is redundant with checkUniqueModelColumnNames() method +// Set<String> headerNames = new HashSet<String>(); +// for (ImportableColumn<E, ?> importableColumn : +// model.getColumnsForImport()) { +// String headerName = importableColumn.getHeaderName(); +// boolean alreadyUsed = !headerNames.add(headerName); +// if (alreadyUsed) { +// throw new ImportRuntimeException( +// "model contains multiple columnsForImport named '" + +// headerName + "'"); +// } +// } } protected String[] getHeaders() throws ImportRuntimeException { try { boolean canReadHeaders = reader.readHeaders(); if (!canReadHeaders) { - throw new ImportRuntimeException("can't read headers"); + throw new ImportRuntimeException(_("csv.import.error.unableToReadHeaders")); } } catch (IOException e) { - throw new ImportRuntimeException("can't read headers"); + throw new ImportRuntimeException(_("csv.import.error.unableToReadHeaders"), e); } try { String[] result = reader.getHeaders(); return result; - } catch (IOException eee) { - throw new ImportRuntimeException("can't get headers", eee); + } catch (IOException e) { + throw new ImportRuntimeException(_("csv.import.error.unableToReadHeaders"), e); } } @@ -335,7 +355,8 @@ return allMandatoryHeaders; } - protected Import(ImportModel<E> model, InputStream inputStream) { + protected Import(ImportModel<E> model, + InputStream inputStream) { if (inputStream == null) { throw new NullPointerException("inputStream is null"); } @@ -344,7 +365,8 @@ reader.setTrimWhitespace(true); } - protected Import(ImportModel<E> model, Reader reader) { + protected Import(ImportModel<E> model, + Reader reader) { if (reader == null) { throw new NullPointerException("reader is null"); } @@ -365,9 +387,6 @@ try { boolean hasNext = reader.readRecord(); return hasNext; -// if (emptyFile) { -// throw new ImportRuntimeException("CSV file has no line"); -// } } catch (IOException e) { reader.close(); throw new ImportRuntimeException(_("csv.import.error.unableToReadLine", 1), e); Modified: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/ImportToMap.java =================================================================== --- trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/ImportToMap.java 2011-12-08 02:59:10 UTC (rev 2251) +++ trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/ImportToMap.java 2011-12-08 10:04:13 UTC (rev 2252) @@ -99,7 +99,7 @@ String value = readValue(field, lineNumber); // contravariance ftw - Object parsedValue = parserValue(field, lineNumber, value); + Object parsedValue = parseValue(field, lineNumber, value); // set value to element setValue(field, lineNumber, element, parsedValue); Modified: trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_en_GB.properties =================================================================== --- trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_en_GB.properties 2011-12-08 02:59:10 UTC (rev 2251) +++ trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_en_GB.properties 2011-12-08 10:04:13 UTC (rev 2252) @@ -2,6 +2,7 @@ csv.import.error.missingMandatoryHeaders=The mandatory fields %s are missing csv.import.error.unableToParseValue=Unable to parse value '%s' (column '%s', line %s) csv.import.error.unableToReadField=Unable to read value of column '%s' at line %s +csv.import.error.unableToReadHeaders=Unable to read headers csv.import.error.unableToReadLine=Unable to read line %s csv.import.error.unableToSetValue=Unable to set value '%s' (object '%s', line %s, column '%s') csv.import.error.unrecognizedHeaders=Fields %s are not recognized. Accepted fields are %s. Modified: trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_es_ES.properties =================================================================== --- trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_es_ES.properties 2011-12-08 02:59:10 UTC (rev 2251) +++ trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_es_ES.properties 2011-12-08 10:04:13 UTC (rev 2252) @@ -2,6 +2,7 @@ csv.import.error.missingMandatoryHeaders=The mandatory fields %s are missing csv.import.error.unableToParseValue=Unable to parse value '%s' (column '%s', line %s) csv.import.error.unableToReadField=Unable to read value of column '%s' at line %s +csv.import.error.unableToReadHeaders=Unable to read headers csv.import.error.unableToReadLine=Unable to read line %s csv.import.error.unableToSetValue=Unable to set value '%s' (object'%s', line %s, column '%s') csv.import.error.unrecognizedHeaders=Fields %s are not recognized. Accepted fields are %s. Modified: trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_fr_FR.properties =================================================================== --- trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_fr_FR.properties 2011-12-08 02:59:10 UTC (rev 2251) +++ trunk/nuiton-csv/src/main/resources/i18n/nuiton-csv_fr_FR.properties 2011-12-08 10:04:13 UTC (rev 2252) @@ -2,6 +2,7 @@ csv.import.error.missingMandatoryHeaders=Les champs obligatoires %s sont manquants csv.import.error.unableToParseValue=Erreur lors de l'interprétation de la valeur '%s' (colonne '%s', ligne %s) csv.import.error.unableToReadField=Impossible de lire la colonne '%s' à la ligne %s +csv.import.error.unableToReadHeaders=Impossible de lire les en-têtes de colonnes csv.import.error.unableToReadLine=Impossible de lire la ligne %s csv.import.error.unableToSetValue=Impossible d'enregistrer la valeur '%s' (objet '%s', ligne %s, column '%s') csv.import.error.unrecognizedHeaders=Les champs %s ne sont pas reconnus. Les champs possibles sont %s. 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 2011-12-08 02:59:10 UTC (rev 2251) +++ trunk/nuiton-csv/src/test/java/org/nuiton/util/csv/ImportTest.java 2011-12-08 10:04:13 UTC (rev 2252) @@ -39,7 +39,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Date; -import java.util.Iterator; import java.util.List; /** @@ -108,10 +107,9 @@ try { Import<Row> rowImport = Import.newImport(model, csvStream); try { - Iterator<Row> it = rowImport.iterator(); List<Row> result = new ArrayList<Row>(); - while (it.hasNext()) { - result.add(it.next()); + for (Row row : rowImport) { + result.add(row); } return result; } finally {
participants (1)
-
fdesbois@users.nuiton.org