From: <be...@us...> - 2011-12-12 23:31:48
|
Revision: 429 http://flatpack.svn.sourceforge.net/flatpack/?rev=429&view=rev Author: benoitx Date: 2011-12-12 23:31:41 +0000 (Mon, 12 Dec 2011) Log Message: ----------- BigDecimal should not use the engineering/E-08 formats but simple plain strings. Modified Paths: -------------- trunk/flatpack/src/main/java/net/sf/flatpack/writer/DelimiterWriter.java trunk/flatpack/src/main/java/net/sf/flatpack/writer/FixedLengthWriter.java Modified: trunk/flatpack/src/main/java/net/sf/flatpack/writer/DelimiterWriter.java =================================================================== --- trunk/flatpack/src/main/java/net/sf/flatpack/writer/DelimiterWriter.java 2011-06-23 20:39:18 UTC (rev 428) +++ trunk/flatpack/src/main/java/net/sf/flatpack/writer/DelimiterWriter.java 2011-12-12 23:31:41 UTC (rev 429) @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.math.BigDecimal; import net.sf.flatpack.structure.ColumnMetaData; import net.sf.flatpack.util.FPConstants; @@ -14,107 +15,114 @@ * @author Dirk Holmes and Holger Holger Hoffstatte */ public class DelimiterWriter extends AbstractWriter { - private char delimiter; - private char qualifier; - private List columnTitles = null; - private boolean columnTitlesWritten = false; + private char delimiter; + private char qualifier; + private List columnTitles = null; + private boolean columnTitlesWritten = false; - protected DelimiterWriter(final Map columnMapping, final java.io.Writer output, final char delimiter, final char qualifier) throws IOException { - super(output); - this.delimiter = delimiter; - this.qualifier = qualifier; + protected DelimiterWriter(final Map columnMapping, + final java.io.Writer output, final char delimiter, + final char qualifier) throws IOException { + super(output); + this.delimiter = delimiter; + this.qualifier = qualifier; - columnTitles = new ArrayList(); - final List columns = (List) columnMapping.get(FPConstants.DETAIL_ID); - final Iterator columnIter = columns.iterator(); - while (columnIter.hasNext()) { - final ColumnMetaData element = (ColumnMetaData) columnIter.next(); - columnTitles.add(element.getColName()); - } - // write the column headers - this.nextRecord(); - } + columnTitles = new ArrayList(); + final List columns = (List) columnMapping.get(FPConstants.DETAIL_ID); + final Iterator columnIter = columns.iterator(); + while (columnIter.hasNext()) { + final ColumnMetaData element = (ColumnMetaData) columnIter.next(); + columnTitles.add(element.getColName()); + } + // write the column headers + this.nextRecord(); + } - protected void writeWithDelimiter(final Object value) throws IOException { - this.write(value); - this.write(delimiter); - } + protected void writeWithDelimiter(final Object value) throws IOException { + this.write(value); + this.write(delimiter); + } - protected void write(final Object value) throws IOException { - String stringValue = ""; + protected void write(final Object value) throws IOException { + String stringValue = ""; - if (value != null) { - // TODO DO: format the value - stringValue = value.toString(); - } + if (value != null) { + // TODO DO: format the value + if (value instanceof BigDecimal) { + final BigDecimal bd = (BigDecimal) value; + stringValue = bd.signum() == 0 ? "0" : bd.toPlainString(); + } else { + stringValue = value.toString(); + } + } - final boolean needsQuoting = (stringValue.indexOf(delimiter) != -1); + final boolean needsQuoting = (stringValue.indexOf(delimiter) != -1); - if (needsQuoting) { - super.write(qualifier); - } + if (needsQuoting) { + super.write(qualifier); + } - super.write(stringValue); + super.write(stringValue); - if (needsQuoting) { - super.write(qualifier); - } - } + if (needsQuoting) { + super.write(qualifier); + } + } - protected void addColumnTitle(final String string) { - if (string == null) { - throw new IllegalArgumentException("column title may not be null"); - } - columnTitles.add(string); - } + protected void addColumnTitle(final String string) { + if (string == null) { + throw new IllegalArgumentException("column title may not be null"); + } + columnTitles.add(string); + } - protected void writeColumnTitles() throws IOException { - final Iterator titleIter = columnTitles.iterator(); - while (titleIter.hasNext()) { - final String title = (String) titleIter.next(); + protected void writeColumnTitles() throws IOException { + final Iterator titleIter = columnTitles.iterator(); + while (titleIter.hasNext()) { + final String title = (String) titleIter.next(); - if (titleIter.hasNext()) { - this.writeWithDelimiter(title); - } else { - this.write(title); - } - } - } + if (titleIter.hasNext()) { + this.writeWithDelimiter(title); + } else { + this.write(title); + } + } + } - protected void writeRow() throws IOException { - final Iterator titlesIter = columnTitles.iterator(); - while (titlesIter.hasNext()) { - final String columnTitle = (String) titlesIter.next(); - if (getRowMap() != null) { - if (titlesIter.hasNext()) { - writeWithDelimiter(getRowMap().get(columnTitle)); - } else { - write(getRowMap().get(columnTitle)); - } - } - } - } + protected void writeRow() throws IOException { + final Iterator titlesIter = columnTitles.iterator(); + while (titlesIter.hasNext()) { + final String columnTitle = (String) titlesIter.next(); + if (getRowMap() != null) { + if (titlesIter.hasNext()) { + writeWithDelimiter(getRowMap().get(columnTitle)); + } else { + write(getRowMap().get(columnTitle)); + } + } + } + } - public final void nextRecord() throws IOException { - if (!columnTitlesWritten) { - this.writeColumnTitles(); - columnTitlesWritten = true; - } else { - this.writeRow(); - } + public final void nextRecord() throws IOException { + if (!columnTitlesWritten) { + this.writeColumnTitles(); + columnTitlesWritten = true; + } else { + this.writeRow(); + } - super.nextRecord(); - } + super.nextRecord(); + } - public void printFooter() { - // TODO DO: implement footer handling - } + public void printFooter() { + // TODO DO: implement footer handling + } - public void printHeader() { - // TODO DO: implement header handling - } + public void printHeader() { + // TODO DO: implement header handling + } - protected boolean validateColumnTitle(final String columnTitle) { - return columnTitles.contains(columnTitle); - } + protected boolean validateColumnTitle(final String columnTitle) { + return columnTitles.contains(columnTitle); + } } Modified: trunk/flatpack/src/main/java/net/sf/flatpack/writer/FixedLengthWriter.java =================================================================== --- trunk/flatpack/src/main/java/net/sf/flatpack/writer/FixedLengthWriter.java 2011-06-23 20:39:18 UTC (rev 428) +++ trunk/flatpack/src/main/java/net/sf/flatpack/writer/FixedLengthWriter.java 2011-12-12 23:31:41 UTC (rev 429) @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.math.BigDecimal; import net.sf.flatpack.structure.ColumnMetaData; import net.sf.flatpack.util.FPConstants; @@ -14,108 +15,120 @@ * @author Dirk Holmes and Holger Holger Hoffstatte */ public class FixedLengthWriter extends AbstractWriter { - private static final int MAX_CHAR_TO_USE_LOOP = 8; - private final Map columnMapping; - private final char padChar; + private static final int MAX_CHAR_TO_USE_LOOP = 8; + private final Map columnMapping; + private final char padChar; - protected FixedLengthWriter(final Map parsedMapping, final java.io.Writer output, final char padChar) throws IOException { - super(output); - this.columnMapping = parsedMapping; - this.padChar = padChar; - } + protected FixedLengthWriter(final Map parsedMapping, + final java.io.Writer output, final char padChar) throws IOException { + super(output); + this.columnMapping = parsedMapping; + this.padChar = padChar; + } - public void addRecordEntry(final String columnName, final Object value) { - if (value != null) { - final ColumnMetaData metaData = this.getColumnMetaData(columnName); + public void addRecordEntry(final String columnName, final Object value) { + if (value != null) { + final ColumnMetaData metaData = this.getColumnMetaData(columnName); - final String valueString = value.toString(); - if (valueString.length() > metaData.getColLength()) { - throw new IllegalArgumentException(valueString + " exceeds the maximum length for column " + columnName + "(" - + metaData.getColLength() + ")"); - } - } - super.addRecordEntry(columnName, value); - } + final String valueString = value.toString(); + if (valueString.length() > metaData.getColLength()) { + throw new IllegalArgumentException(valueString + + " exceeds the maximum length for column " + + columnName + "(" + metaData.getColLength() + ")"); + } + } + super.addRecordEntry(columnName, value); + } - public void nextRecord() throws IOException { - final Iterator columnIter = this.getColumnMetaData().iterator(); - while (columnIter.hasNext()) { - final ColumnMetaData element = (ColumnMetaData) columnIter.next(); - final Object value = this.getRowMap().get(element.getColName()); - this.write(this.formattedValue(value, element)); - } + public void nextRecord() throws IOException { + final Iterator columnIter = this.getColumnMetaData().iterator(); + while (columnIter.hasNext()) { + final ColumnMetaData element = (ColumnMetaData) columnIter.next(); + final Object value = this.getRowMap().get(element.getColName()); + this.write(this.formattedValue(value, element)); + } - super.nextRecord(); - } + super.nextRecord(); + } - protected char[] formattedValue(final Object val, final ColumnMetaData element) { - Object value = val; - if (value == null) { - // TODO DO: maybe have a way to substitute default values here? - value = ""; - } + protected char[] formattedValue(final Object val, + final ColumnMetaData element) { + Object value = val; + if (value == null) { + // TODO DO: maybe have a way to substitute default values here? + value = ""; + } - // TODO DO: add formatting of values - final String stringValue = value.toString(); - final int stringLength = stringValue.length(); + String stringValue; + if (value instanceof BigDecimal) { + final BigDecimal bd = (BigDecimal) value; + stringValue = bd.signum() == 0 ? "0" : bd.toPlainString(); + } else { + stringValue = value.toString(); + } - final int columnLength = element.getColLength(); - final char[] formattedValue = new char[columnLength]; + final int stringLength = stringValue.length(); - /* - * Copy the contents of the original string; for Strings up to ~8-10 - * characters this loop is consistently faster than String.getChars(). Short - * Strings are usually the majority of values in fixed-width data columns. - */ - final int numCharacters = Math.min(stringLength, columnLength); - if (numCharacters < MAX_CHAR_TO_USE_LOOP) { - for (int i = 0; i < numCharacters; i++) { - formattedValue[i] = stringValue.charAt(i); - } - } else { - stringValue.getChars(0, numCharacters, formattedValue, 0); - } + final int columnLength = element.getColLength(); + final char[] formattedValue = new char[columnLength]; - if (stringLength < columnLength) { - // pad if necessary - Arrays.fill(formattedValue, stringLength, columnLength, padChar); - } + /* + * Copy the contents of the original string; for Strings up to ~8-10 + * characters this loop is consistently faster than String.getChars(). + * Short Strings are usually the majority of values in fixed-width data + * columns. + */ + final int numCharacters = Math.min(stringLength, columnLength); + if (numCharacters < MAX_CHAR_TO_USE_LOOP) { + for (int i = 0; i < numCharacters; i++) { + formattedValue[i] = stringValue.charAt(i); + } + } else { + stringValue.getChars(0, numCharacters, formattedValue, 0); + } - return formattedValue; - } + if (stringLength < columnLength) { + // pad if necessary + Arrays.fill(formattedValue, stringLength, columnLength, padChar); + } - protected boolean validateColumnTitle(final String columnTitle) { - final Map columnNameToIndex = (Map) columnMapping.get(FPConstants.COL_IDX); - return columnNameToIndex.keySet().contains(columnTitle); - } + return formattedValue; + } - public void printFooter() { - // TODO DO: implement footer handling + protected boolean validateColumnTitle(final String columnTitle) { + final Map columnNameToIndex = (Map) columnMapping + .get(FPConstants.COL_IDX); + return columnNameToIndex.keySet().contains(columnTitle); + } - } + public void printFooter() { + // TODO DO: implement footer handling - public void printHeader() { - // TODO DO: implement header handling + } - } + public void printHeader() { + // TODO DO: implement header handling - /** - * @return List of ColumnMetaData objects describing the mapping defined in the - * XML file. - */ - private List getColumnMetaData() { - return (List) columnMapping.get(FPConstants.DETAIL_ID); - } + } - private ColumnMetaData getColumnMetaData(final String columnName) { - final Iterator metaDataIter = this.getColumnMetaData().iterator(); - while (metaDataIter.hasNext()) { - final ColumnMetaData element = (ColumnMetaData) metaDataIter.next(); - if (element.getColName().equals(columnName)) { - return element; - } - } + /** + * @return List of ColumnMetaData objects describing the mapping defined in + * the XML file. + */ + private List getColumnMetaData() { + return (List) columnMapping.get(FPConstants.DETAIL_ID); + } - throw new IllegalArgumentException("Column \"" + columnName + "\" unknown"); - } + private ColumnMetaData getColumnMetaData(final String columnName) { + final Iterator metaDataIter = this.getColumnMetaData().iterator(); + while (metaDataIter.hasNext()) { + final ColumnMetaData element = (ColumnMetaData) metaDataIter.next(); + if (element.getColName().equals(columnName)) { + return element; + } + } + + throw new IllegalArgumentException("Column \"" + columnName + + "\" unknown"); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |