/*
* Copyright (c) 2004-2005 Progress Software Corporation. All rights reserved.
* http://www.progress.com
*
* <%=ConfigurationManager.AppSettings["SS"]%>
* http://www.stylusstudio.com/
*
* Convert to XML CSV Adapter Java Source Code
*
* This code is part of <%=ConfigurationManager.AppSettings["SS"]%>'s Non-XML Adapter interface. Only
* licensed users of <%=ConfigurationManager.AppSettings["SS"]%> XML Professional Edition may use this
* code. For those licensed users, this code may be used as a basis for
* designing your own classes for use with <%=ConfigurationManager.AppSettings["SS"]%>.
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.xerces.dom.DocumentImpl;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.stylusstudio.adapter.AdapterBase;
import com.stylusstudio.adapter.AdapterHandler;
import com.stylusstudio.adapter.InvalidFormatException;
public class CSV extends AdapterBase
{
public String getExtensions() {
return "csv";
}
public String getUrlName() {
return "Comma";
}
public String getDescription() {
return "Comma Separated Values";
}
static public final char m_comma = ',';
// Just change m_comma to '\t' to turn it into a Tab Separated Value adapter
// or ':' for a Colon Separated Value adapter, or whatever you desire.
public void toXML(InputStream in, OutputStream out) throws IOException, InvalidFormatException
{
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
Document doc = new DocumentImpl();
Element root = doc.createElement("table");
doc.appendChild(root);
Element row, col;
char c;
StringBuffer text;
char quote;
int escape;
char prevc, prevquote;
while ((line = br.readLine()) != null) {
row = doc.createElement("row");
root.appendChild(row);
quote = 0;
escape = 0;
text = new StringBuffer();
c = 0;
prevquote = 0;
for (int i = 0; i < line.length(); i++) {
prevc = c;
c = line.charAt(i);
if (escape > 0) {
escape--;
}
else
if (c == '\\') {
escape = 1; // a backslash escapes any character within the line
continue;
}
else
if (quote == 0 && prevquote == c && prevc == c) {
prevquote = c;
quote = c; // a doubled quote within a string escapes it
}
else
if (quote == 0 && (c == '"' || c == '\'')) {
prevquote = quote;
quote = c;
continue;
}
else
if (c == quote) {
prevquote = quote;
quote = 0;
continue;
}
else
if (c == m_comma && quote == 0) {
col = doc.createElement("column");
if (text != null)
col.appendChild(doc.createTextNode(text.toString()));
row.appendChild(col);
text = new StringBuffer();
continue;
}
text.append(c);
}
if (text != null) {
col = doc.createElement("column");
col.appendChild(doc.createTextNode(text.toString()));
row.appendChild(col);
}
}
OutputFormat format = new OutputFormat(doc);
format.setIndent(4);
format.setLineSeparator(getEndOfLine());
XMLSerializer serial = new XMLSerializer(out, format);
serial.serialize(doc);
out.flush();
}
public void fromXML(InputStream in, OutputStream out) throws IOException, InvalidFormatException
{
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(in, new CommaHandler(out));
}
catch (Exception e) {
exception(e);
}
}
private class CommaHandler extends AdapterHandler {
private BufferedWriter m_out;
private int m_depth = 0;
private StringBuffer m_text = null;
private boolean m_first = true;
public CommaHandler(OutputStream out) {
m_out = new BufferedWriter(new OutputStreamWriter(out));
}
public void startElement(String uri, String local, String qName, Attributes atts) throws SAXException {
m_depth++;
if (m_depth == 2) // start row
m_first = true;
else
if (m_depth == 3) // start column
m_text = new StringBuffer();
}
public void endElement(String uri, String local, String qName) throws SAXException {
if (m_depth == 2) { // finish row
try {
m_out.write(getEndOfLine());
} catch (IOException ioe) {
exception(ioe);
}
}
else
if (m_depth == 3) { // finish column
String text = m_text.toString();
if (text.indexOf(m_comma) != -1 || text.indexOf('"') != -1 || text.indexOf('\'') != -1) {
if (text.indexOf('"') != -1)
text = text.replaceAll("\"", "\"\"");
text = '"' + text + '"';
}
try {
if (!m_first)
m_out.write(m_comma);
m_out.write(text);
} catch (IOException ioe) {
exception(ioe);
}
m_first = false;
m_text = null;
}
m_depth--;
}
public void characters(char[] text, int start, int length) throws SAXException {
if (m_text != null)
m_text.append(text, start, length);
}
public void endDocument() throws SAXException {
try {
m_out.flush();
}
catch (IOException ioe) {
exception(ioe);
}
}
}
}