Author: ggregory Date: Sun Oct 14 21:01:21 2012 New Revision: 1398133 URL: http://svn.apache.org/viewvc?rev=1398133&view=rev Log: Implement Quote.ALL. Bullet-proof a unit test.
Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVPrinter.java commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVPrinterTest.java Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVPrinter.java URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVPrinter.java?rev=1398133&r1=1398132&r2=1398133&view=diff ============================================================================== --- commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVPrinter.java (original) +++ commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVPrinter.java Sun Oct 14 21:01:21 2012 @@ -219,53 +219,57 @@ public class CSVPrinter { final char delimChar = format.getDelimiter(); final char quoteChar = format.getQuoteChar(); - if (len <= 0) { - // always quote an empty token that is the first - // on the line, as it may be the only thing on the - // line. If it were not quoted in that case, - // an empty line has no tokens. - if (first) { - quote = true; - } + if (format.getQuotePolicy() == Quote.ALL) { + quote = true; } else { - char c = value.charAt(pos); - - // Hmmm, where did this rule come from? - if (first && (c < '0' || (c > '9' && c < 'A') || (c > 'Z' && c < 'a') || (c > 'z'))) { - quote = true; - // } else if (c == ' ' || c == '\f' || c == '\t') { - } else if (c <= COMMENT) { - // Some other chars at the start of a value caused the parser to fail, so for now - // encapsulate if we start in anything less than '#'. We are being conservative - // by including the default comment char too. - quote = true; + if (len <= 0) { + // always quote an empty token that is the first + // on the line, as it may be the only thing on the + // line. If it were not quoted in that case, + // an empty line has no tokens. + if (first) { + quote = true; + } } else { - while (pos < end) { - c = value.charAt(pos); - if (c == LF || c == CR || c == quoteChar || c == delimChar) { - quote = true; - break; + char c = value.charAt(pos); + + // Hmmm, where did this rule come from? + if (first && (c < '0' || (c > '9' && c < 'A') || (c > 'Z' && c < 'a') || (c > 'z'))) { + quote = true; + // } else if (c == ' ' || c == '\f' || c == '\t') { + } else if (c <= COMMENT) { + // Some other chars at the start of a value caused the parser to fail, so for now + // encapsulate if we start in anything less than '#'. We are being conservative + // by including the default comment char too. + quote = true; + } else { + while (pos < end) { + c = value.charAt(pos); + if (c == LF || c == CR || c == quoteChar || c == delimChar) { + quote = true; + break; + } + pos++; } - pos++; - } - if (!quote) { - pos = end - 1; - c = value.charAt(pos); - // if (c == ' ' || c == '\f' || c == '\t') { - // Some other chars at the end caused the parser to fail, so for now - // encapsulate if we end in anything less than ' ' - if (c <= SP) { - quote = true; + if (!quote) { + pos = end - 1; + c = value.charAt(pos); + // if (c == ' ' || c == '\f' || c == '\t') { + // Some other chars at the end caused the parser to fail, so for now + // encapsulate if we end in anything less than ' ' + if (c <= SP) { + quote = true; + } } } } - } - if (!quote) { - // no encapsulation needed - write out the original value - out.append(value, start, end); - return; + if (!quote) { + // no encapsulation needed - write out the original value + out.append(value, start, end); + return; + } } // we hit something that needed encapsulation Modified: commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVPrinterTest.java URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVPrinterTest.java?rev=1398133&r1=1398132&r2=1398133&view=diff ============================================================================== --- commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVPrinterTest.java (original) +++ commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVPrinterTest.java Sun Oct 14 21:01:21 2012 @@ -77,6 +77,14 @@ public class CSVPrinterTest { } @Test + public void testPrinterQuoteAll() throws IOException { + final StringWriter sw = new StringWriter(); + final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuotePolicy(Quote.ALL)); + printer.printRecord("a", "b\nc", "d"); + assertEquals("\"a\",\"b\nc\",\"d\"" + lineSeparator, sw.toString()); + } + + @Test public void testPrinter6() throws IOException { final StringWriter sw = new StringWriter(); final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT); @@ -87,15 +95,19 @@ public class CSVPrinterTest { @Test public void testJdbcPrinter() throws IOException, ClassNotFoundException, SQLException { final StringWriter sw = new StringWriter(); - final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT); Class.forName("org.h2.Driver"); final Connection connection = DriverManager.getConnection("jdbc:h2:mem:my_test;", "sa", ""); - final Statement stmt = connection.createStatement(); - stmt.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))"); - stmt.execute("insert into TEST values(1, 'r1')"); - stmt.execute("insert into TEST values(2, 'r2')"); - printer.printRecords(stmt.executeQuery("select ID, NAME from TEST")); - assertEquals("1,r1" + lineSeparator + "2,r2" + lineSeparator, sw.toString()); + try { + final Statement stmt = connection.createStatement(); + stmt.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))"); + stmt.execute("insert into TEST values(1, 'r1')"); + stmt.execute("insert into TEST values(2, 'r2')"); + final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT); + printer.printRecords(stmt.executeQuery("select ID, NAME from TEST")); + assertEquals("1,r1" + lineSeparator + "2,r2" + lineSeparator, sw.toString()); + } finally { + connection.close(); + } } @Test