r2255 - trunk/nuiton-csv/src/main/java/org/nuiton/util/csv
Author: tchemit Date: 2011-12-11 19:07:30 +0100 (Sun, 11 Dec 2011) New Revision: 2255 Url: http://nuiton.org/repositories/revision/nuiton-utils/2255 Log: Add some usefull methods on Export + reformat Modified: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Export.java trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Import.java Modified: trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Export.java =================================================================== --- trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Export.java 2011-12-09 10:55:25 UTC (rev 2254) +++ trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Export.java 2011-12-11 18:07:30 UTC (rev 2255) @@ -29,13 +29,36 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.StringUtil; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; import java.io.InputStream; +import java.io.StringWriter; +import java.io.Writer; import java.util.Collection; import java.util.LinkedList; import java.util.List; /** - * TODO + * Object to realize a export from a {@link ExportModel} and some datas. + * <h2>Usefull static methods</h2> + * There is some usefull methods here to do operation in one line : + * <h3>To export to a file</h3> + * <pre> + * Export.exportToFile(model, data, file); + * </pre> + * <h3>To export to a writer</h3> + * <pre> + * Export.exportToWriter(model, data, writer); + * </pre> + * <h3>To export as a string</h3> + * <pre> + * String exportcontent = Export.exportToString(model, data); + * </pre> + * <h3>To obtain a new instance of an exporter</h3> + * <pre> + * Export<E> exporter = Export.newExport(model, data); + * </pre> * * @author bleny <leny@codelutin.com> * @author tchemit <chemit@codelutin.com> @@ -55,14 +78,42 @@ return new Export<E>(model, data); } + public static <E> void exportToFile(ExportModel<E> model, + Iterable<E> data, + File file) throws Exception { + Export<E> exporter = newExport(model, data); + exporter.exportToFile(file); + } + + public static <E> String exportToString(ExportModel<E> model, + Iterable<E> data) throws Exception { + Export<E> exporter = newExport(model, data); + return exporter.startExportAsString(); + } + + public static <E> void exportToWriter(ExportModel<E> model, + Iterable<E> data, + Writer writer) throws Exception { + Export<E> exporter = newExport(model, data); + exporter.startExport(writer); + } + protected Export(ExportModel<E> model, Iterable<E> data) { this.model = model; this.data = data; } - public String startExportAsString() throws Exception { + public void exportToFile(File file) throws Exception { + Writer writer = new BufferedWriter(new FileWriter(file)); + try { + startExport(writer); + } finally { + writer.close(); + } + } + + public void startExport(Writer writer) throws Exception { String separator = String.valueOf(model.getSeparator()); - StringBuilder csv = new StringBuilder(); // add headers List<String> headerNames = new LinkedList<String>(); @@ -70,12 +121,12 @@ headerNames.add(column.getHeaderName()); } String headersLine = StringUtil.join(headerNames, separator, true); - csv.append(headersLine).append('\n'); - + writer.write(headersLine); + writer.write('\n'); if (log.isDebugEnabled()) { log.debug("headers for export are '" + headersLine + "'"); if (data instanceof Collection) { - log.debug("will export " + ((Collection<E>)data).size() + " lines"); + log.debug("will export " + ((Collection<E>) data).size() + " lines"); } } @@ -90,17 +141,28 @@ if (formattedValue == null) { throw new NullPointerException( "column for header " + column.getHeaderName() + - " returned a null value." + column.toString()); + " returned a null value." + column.toString()); } formattedValue = StringUtil.escapeCsvValue(formattedValue, separator); - csv.append(formattedValue).append(separator); + writer.write(formattedValue); + writer.write(separator); } - csv.append('\n'); + writer.write('\n'); } - return csv.toString(); } + public String startExportAsString() throws Exception { + StringWriter writer = new StringWriter(); + try { + startExport(writer); + String result = writer.toString(); + return result; + } finally { + writer.close(); + } + } + public InputStream startExport() throws Exception { String content = startExportAsString(); return IOUtils.toInputStream(content); 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-09 10:55:25 UTC (rev 2254) +++ trunk/nuiton-csv/src/main/java/org/nuiton/util/csv/Import.java 2011-12-11 18:07:30 UTC (rev 2255) @@ -96,7 +96,6 @@ * * @return the Iterator used for csv iteration * @see #prepareAndValidate() - * @see Iterable#iterator() */ @Override public Iterator<E> iterator() { @@ -135,10 +134,10 @@ // read value from csv cell String value = readValue(field, lineNumber); - + // contravariance ftw Object parsedValue = parseValue(field, lineNumber, value); - + // set value to element setValue(field, lineNumber, element, parsedValue); } @@ -166,7 +165,7 @@ * 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. + * ImportModel#pushCsvHeaderNames(List)} call. * * @since 2.4.1 */ @@ -185,7 +184,8 @@ String[] headers = getHeaders(); if (log.isTraceEnabled()) { - log.trace("headers of the CSV file are : " + Arrays.toString(headers)); + log.trace("headers of the CSV file are : " + + Arrays.toString(headers)); } // hook to do some stuff from the model @@ -219,7 +219,7 @@ String value) { try { T parsedValue = field.parseValue(value); - return parsedValue; + return parsedValue; } catch (Exception e) { String message = _("csv.import.error.unableToParseValue", value, field.getHeaderName(), lineNumber) @@ -259,9 +259,10 @@ model.getColumnsForImport()) { validHeaderNames.add(importableColumn.getHeaderName()); } - String validationMessage = _("csv.import.error.unrecognizedHeaders", - StringUtil.join(csvHeaders, ", ", true), - StringUtil.join(validHeaderNames, ", ", true)); + String validationMessage = + _("csv.import.error.unrecognizedHeaders", + StringUtil.join(csvHeaders, ", ", true), + StringUtil.join(validHeaderNames, ", ", true)); throw new ImportRuntimeException(validationMessage); } } @@ -298,45 +299,37 @@ mandatoryHeadersNames.removeAll(csvHeaders); if (!mandatoryHeadersNames.isEmpty()) { - String validationMessage = _("csv.import.error.missingMandatoryHeaders", - StringUtil.join(mandatoryHeadersNames, ", ", true)); + String validationMessage = + _("csv.import.error.missingMandatoryHeaders", + StringUtil.join(mandatoryHeadersNames, ", ", true)); throw new ImportRuntimeException(validationMessage); } - - // 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(_("csv.import.error.unableToReadHeaders")); + throw new ImportRuntimeException( + _("csv.import.error.unableToReadHeaders")); } } catch (IOException e) { - throw new ImportRuntimeException(_("csv.import.error.unableToReadHeaders"), e); + throw new ImportRuntimeException( + _("csv.import.error.unableToReadHeaders"), e); } try { String[] result = reader.getHeaders(); return result; } catch (IOException e) { - throw new ImportRuntimeException(_("csv.import.error.unableToReadHeaders"), e); + throw new ImportRuntimeException( + _("csv.import.error.unableToReadHeaders"), e); } } protected List<ImportableColumn<E, Object>> getNonIgnoredHeaders() { - List<ImportableColumn<E, Object>> nonIgnoredHeaders = new ArrayList<ImportableColumn<E, Object>>(); + List<ImportableColumn<E, Object>> nonIgnoredHeaders = + new ArrayList<ImportableColumn<E, Object>>(); for (ImportableColumn<E, Object> field : model.getColumnsForImport()) { if (!field.isIgnored()) { nonIgnoredHeaders.add(field); @@ -346,7 +339,8 @@ } protected List<ImportableColumn<E, ?>> getAllMandatoryHeaders() { - List<ImportableColumn<E, ?>> allMandatoryHeaders = new ArrayList<ImportableColumn<E, ?>>(); + List<ImportableColumn<E, ?>> allMandatoryHeaders = + new ArrayList<ImportableColumn<E, ?>>(); for (ImportableColumn<E, ?> field : model.getColumnsForImport()) { if (field.isMandatory()) { allMandatoryHeaders.add(field); @@ -355,8 +349,7 @@ 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"); } @@ -365,8 +358,7 @@ 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"); } @@ -380,7 +372,7 @@ * was successfully read. * * @return {@code true} if line was successfully read, says in fact there is - * something after this line. + * something after this line. * @throws ImportRuntimeException if could not read line */ protected boolean readRow() throws ImportRuntimeException {
participants (1)
-
tchemit@users.nuiton.org