/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.renderers;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
/**
* A generic writer that formats input items into rows and columns per the
* provided column descriptors.
*
* @author Brian Remedios
* @param <T>
*/
public class CSVWriter<T extends Object> {
private final String separator; // e.g., the comma
private final String lineSeparator; // cr
private final List<ColumnDescriptor<T>> columns;
public CSVWriter(List<ColumnDescriptor<T>> theColumns, String theSeparator, String theLineSeparator) {
columns = theColumns;
separator = theSeparator;
lineSeparator = theLineSeparator;
}
public void writeTitles(Writer writer) throws IOException {
StringBuilder buf = new StringBuilder(300);
for (int i = 0; i < columns.size() - 1; i++) {
quoteAndCommify(buf, columns.get(i).title);
}
quote(buf, columns.get(columns.size() - 1).title);
buf.append(lineSeparator);
writer.write(buf.toString());
}
public void writeData(Writer writer, Iterator<T> items) throws IOException {
int count = 1;
StringBuilder buf = new StringBuilder(300);
T rv;
final int lastColumnIdx = columns.size() - 1;
while (items.hasNext()) {
buf.setLength(0);
rv = items.next();
for (int i = 0; i < lastColumnIdx; i++) {
quoteAndCommify(buf, columns.get(i).accessor.get(count, rv, separator));
}
quote(buf, columns.get(lastColumnIdx).accessor.get(count, rv, separator));
buf.append(lineSeparator);
writer.write(buf.toString());
count++;
}
}
private void quote(StringBuilder buffer, String s) {
if (s == null) {
return;
}
buffer.append('"').append(s).append('"');
}
private void quoteAndCommify(StringBuilder buffer, String s) {
quote(buffer, s);
buffer.append(separator);
}
}