From 53e20da8f4cca7fc682654ffd861229fa046162e Mon Sep 17 00:00:00 2001 From: Iain Sproat Date: Mon, 24 May 2010 12:15:45 +0000 Subject: [PATCH] Issue 59 (part) - added CsvExporter and unit test to server side code. Not linked to UI. git-svn-id: http://google-refine.googlecode.com/svn/trunk@844 7d457c2a-affb-35e4-300a-418c747d4874 --- .../gridworks/exporters/CsvExporter.java | 86 ++++++++++++ .../tests/exporters/CsvExporterTests.java | 123 ++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 src/main/java/com/metaweb/gridworks/exporters/CsvExporter.java create mode 100644 tests/java/src/com/metaweb/gridworks/tests/exporters/CsvExporterTests.java diff --git a/src/main/java/com/metaweb/gridworks/exporters/CsvExporter.java b/src/main/java/com/metaweb/gridworks/exporters/CsvExporter.java new file mode 100644 index 000000000..d47cf713b --- /dev/null +++ b/src/main/java/com/metaweb/gridworks/exporters/CsvExporter.java @@ -0,0 +1,86 @@ +package com.metaweb.gridworks.exporters; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; +import java.util.Properties; + +import com.metaweb.gridworks.browsing.Engine; +import com.metaweb.gridworks.browsing.FilteredRows; +import com.metaweb.gridworks.browsing.RowVisitor; +import com.metaweb.gridworks.model.Project; +import com.metaweb.gridworks.model.Row; + +import au.com.bytecode.opencsv.CSVWriter; + + +public class CsvExporter implements Exporter{ + + @Override + public void export(Project project, Properties options, Engine engine, OutputStream outputStream) + throws IOException { + throw new RuntimeException("Not implemented"); + } + + @Override + public void export(Project project, Properties options, Engine engine, Writer writer) throws IOException { + { + RowVisitor visitor = new RowVisitor() { + CSVWriter csvWriter; + boolean columnHeader = true; //the first row should also add the column headers + + public RowVisitor init(CSVWriter writer) { + this.csvWriter = writer; + return this; + } + + public boolean visit(Project project, int rowIndex, Row row) { + String[] vals = null; + + if( columnHeader ){ + String[] cols = new String[project.columnModel.columns.size()]; + for(int i = 0; i < cols.length; i++){ + cols[i] = project.columnModel.columns.get(i).getName(); + } + csvWriter.writeNext(cols); + columnHeader = false; //switch off flag + } + + vals = new String[row.cells.size()]; + for(int i = 0; i < vals.length; i++){ + vals[i] = row.cells.get(i).value.toString(); + } + + csvWriter.writeNext(vals); + return false; + } + + @Override + public void start(Project project) { + // nothing to do + } + + @Override + public void end(Project project) { + // nothing to do + + } + + }.init(new CSVWriter(writer)); + + FilteredRows filteredRows = engine.getAllFilteredRows(); + filteredRows.accept(project, visitor); + } + } + + @Override + public String getContentType() { + return "application/x-unknown"; + } + + @Override + public boolean takeWriter() { + return true; + } + +} diff --git a/tests/java/src/com/metaweb/gridworks/tests/exporters/CsvExporterTests.java b/tests/java/src/com/metaweb/gridworks/tests/exporters/CsvExporterTests.java new file mode 100644 index 000000000..808a1affd --- /dev/null +++ b/tests/java/src/com/metaweb/gridworks/tests/exporters/CsvExporterTests.java @@ -0,0 +1,123 @@ +package com.metaweb.gridworks.tests.exporters; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Properties; + +import static org.mockito.Mockito.mock; + +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.metaweb.gridworks.browsing.Engine; +import com.metaweb.gridworks.exporters.CsvExporter; +import com.metaweb.gridworks.model.Cell; +import com.metaweb.gridworks.model.Column; +import com.metaweb.gridworks.model.ModelException; +import com.metaweb.gridworks.model.Project; +import com.metaweb.gridworks.model.Row; + +public class CsvExporterTests { + //dependencies + StringWriter writer; + Project project; + Engine engine; + Properties options; + + //System Under Test + CsvExporter SUT; + + @BeforeMethod + public void SetUp(){ + SUT = new CsvExporter(); + writer = new StringWriter(); + project = new Project(); + engine = new Engine(project); + options = mock(Properties.class); + } + + @AfterMethod + public void TearDown(){ + SUT = null; + writer = null; + project = null; + engine = null; + options = null; + } + + @Test + public void exportSimpleCsv(){ + CreateGrid(2, 2); + + try { + SUT.export(project, options, engine, writer); + } catch (IOException e) { + Assert.fail(); + } + + Assert.assertEquals(writer.toString(), "\"column0\",\"column1\"\n" + + "\"row0cell0\",\"row0cell1\"\n" + + "\"row1cell0\",\"row1cell1\"\n"); + + } + + @Test + public void exportCsvWithLineBreaks(){ + CreateGrid(3,3); + + project.rows.get(1).cells.set(1, new Cell("line\n\n\nbreak", null)); + try { + SUT.export(project, options, engine, writer); + } catch (IOException e) { + Assert.fail(); + } + + Assert.assertEquals(writer.toString(), "\"column0\",\"column1\",\"column2\"\n" + + "\"row0cell0\",\"row0cell1\",\"row0cell2\"\n" + + "\"row1cell0\",\"line\n\n\nbreak\",\"row1cell2\"\n" + + "\"row2cell0\",\"row2cell1\",\"row2cell2\"\n"); + } + + @Test + public void exportCsvWithQuote(){ + CreateGrid(3,3); + + project.rows.get(1).cells.set(1, new Cell("line has \"quote\"", null)); + try { + SUT.export(project, options, engine, writer); + } catch (IOException e) { + Assert.fail(); + } + + Assert.assertEquals(writer.toString(), "\"column0\",\"column1\",\"column2\"\n" + + "\"row0cell0\",\"row0cell1\",\"row0cell2\"\n" + + "\"row1cell0\",\"line has \"\"quote\"\"\",\"row1cell2\"\n" + + "\"row2cell0\",\"row2cell1\",\"row2cell2\"\n"); + } + + //helper methods + + protected void CreateColumns(int noOfColumns){ + for(int i = 0; i < noOfColumns; i++){ + try { + project.columnModel.addColumn(i, new Column(0, "column" + i), true); + } catch (ModelException e1) { + Assert.fail("Could not create column"); + } + } + } + + protected void CreateGrid(int noOfRows, int noOfColumns){ + CreateColumns(noOfColumns); + + for(int i = 0; i < noOfRows; i++){ + Row row = new Row(noOfColumns); + for(int j = 0; j < noOfColumns; j++){ + row.cells.add(new Cell("row" + i + "cell" + j, null)); + } + project.rows.add(row); + } + } +}