nl.strohalm.cyclos.utils.csv.CSVWriter.java Source code

Java tutorial

Introduction

Here is the source code for nl.strohalm.cyclos.utils.csv.CSVWriter.java

Source

/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
    
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
    
Cyclos is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    
 */
package nl.strohalm.cyclos.utils.csv;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import nl.strohalm.cyclos.entities.settings.LocalSettings;
import nl.strohalm.cyclos.utils.PropertyHelper;
import nl.strohalm.cyclos.utils.conversion.CoercionHelper;
import nl.strohalm.cyclos.utils.conversion.Converter;

import org.apache.commons.lang.StringUtils;

/**
 * Class used to write objects as CSV lines
 * @author luis
 */
public class CSVWriter<E> extends BaseCSVHandler<E> {

    /**
     * Creates a new instance
     */
    public static <E> CSVWriter<E> instance(final Class<E> elementClass, final LocalSettings localSettings) {
        final CSVWriter<E> writer = new CSVWriter<E>(elementClass);
        writer.setValueSeparator(
                CoercionHelper.coerce(Character.TYPE, localSettings.getCsvValueSeparator().getValue()));
        writer.setStringQuote(CoercionHelper.coerce(Character.TYPE, localSettings.getCsvStringQuote().getValue()));
        writer.setRowSeparator(localSettings.getCsvRecordSeparator().getValue());
        writer.setUseHeader(localSettings.isCsvUseHeader());
        return writer;
    }

    protected String rowSeparator;
    private boolean useHeader;

    public CSVWriter(final Class<E> elementClass) {
        super(elementClass);
    }

    public String getRowSeparator() {
        return rowSeparator;
    }

    public boolean isUseHeader() {
        return useHeader;
    }

    public void setRowSeparator(final String rowSeparator) {
        this.rowSeparator = rowSeparator;
    }

    public void setUseHeader(final boolean useHeader) {
        this.useHeader = useHeader;
    }

    /**
     * Writes an object into a {@link PrintWriter} object
     */
    public void write(final List<E> results, final PrintWriter out) {
        writeHeader(out);
        for (final E element : results) {
            writeRow(element, out);
        }
    }

    /**
     * Writes the header to the output, if header is used
     */
    public void writeHeader(final PrintWriter out) {
        List<String> row;
        if (useHeader) {
            row = new ArrayList<String>();
            for (final Column column : columns) {
                row.add(stringQuote + column.getHeader() + stringQuote);
            }
            out.print(StringUtils.join(row.iterator(), valueSeparator) + rowSeparator);
        }
    }

    /**
     * Writes a row element to the output
     */
    @SuppressWarnings("unchecked")
    public void writeRow(final E element, final PrintWriter out) {
        final List<String> row = new ArrayList<String>();
        for (final Column column : columns) {
            final Object objectValue = PropertyHelper.get(element, column.getProperty());
            final String stringValue = PropertyHelper.getAsString(objectValue,
                    (Converter<Object>) column.getConverter());
            row.add(escape(stringValue, stringQuote));
        }
        out.print(StringUtils.join(row.iterator(), valueSeparator) + rowSeparator);
    }

    private String escape(final String value, final char stringQuote) {
        final String string = StringUtils.trimToEmpty(value);
        final char[] chars = string.toCharArray();
        final int length = chars.length;
        final StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            final char c = chars[i];
            if (c == stringQuote) {
                sb.append(stringQuote).append(stringQuote);
            } else {
                sb.append(c);
            }
        }
        return stringQuote + sb.toString() + stringQuote;
    }
}