Skip to content
Snippets Groups Projects
Commit 84d7e5ca authored by Christopher Bohn's avatar Christopher Bohn :thinking:
Browse files

CsvFile (née CSVReaderWriter) now instantiable class, not utility class

parent 623a8304
Branches
Tags
No related merge requests found
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<archive> <archive>
<manifest> <manifest>
<addClasspath>true</addClasspath> <addClasspath>true</addClasspath>
<mainClass>edu.unl.cse.csv_io.CSVReaderWriter</mainClass> <mainClass>edu.unl.cse.csv_io.CsvFile</mainClass>
</manifest> </manifest>
</archive> </archive>
</configuration> </configuration>
......
package edu.unl.cse.csv_io;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
public abstract class AbstractFormattedFile implements FormattedFile {
protected final String filename;
private Set<String> fields;
protected AbstractFormattedFile(String filename) {
this.filename = filename;
fields = new LinkedHashSet<>();
}
public Set<String> getFields() {
return Collections.unmodifiableSet(fields);
}
@SuppressWarnings("unused")
protected boolean addField(String fieldName) {
return fields.add(fieldName);
}
@SuppressWarnings("UnusedReturnValue")
protected boolean addAllFields(Set<String> possiblyNewFields) {
return fields.addAll(possiblyNewFields);
}
}
...@@ -14,27 +14,20 @@ import java.net.URL; ...@@ -14,27 +14,20 @@ import java.net.URL;
import java.util.*; import java.util.*;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class CSVReaderWriter { public class CsvFile extends AbstractFormattedFile implements FormattedFile {
CsvFile(String filename) {
@SuppressWarnings("WeakerAccess") super("csv/" + filename + ".csv");
public static Set<Map<String, String>> readCSVasSet(String filename) {
Set<Map<String, String>> csvSet = null;
try (InputStreamReader inputStreamReader = new InputStreamReader(Objects.requireNonNull(
CSVReaderWriter.class.getClassLoader().getResourceAsStream("csv/" + filename)))) {
csvSet = (Set<Map<String, String>>) parseCSV(inputStreamReader, new HashSet<>());
} catch (NullPointerException nullPointerException) {
System.err.println("Check spelling of file " + filename + ".");
} catch (IOException ioException) {
System.err.println("Error loading " + filename + ". " + ioException);
}
return csvSet;
} }
public static List<Map<String, String>> readCSVasList(String filename) { @Override
public Collection<Map<String, String>> readFile() {
List<Map<String, String>> csvList = null; List<Map<String, String>> csvList = null;
try (InputStreamReader inputStreamReader = new InputStreamReader(Objects.requireNonNull( try (InputStreamReader inputStreamReader = new InputStreamReader(Objects.requireNonNull(
CSVReaderWriter.class.getClassLoader().getResourceAsStream("csv/" + filename)))) { CsvFile.class.getClassLoader().getResourceAsStream(filename)))) {
csvList = (List<Map<String, String>>) parseCSV(inputStreamReader, new LinkedList<>()); csvList = (List<Map<String, String>>) parseCSV(inputStreamReader, new LinkedList<>());
for(Map<String,String> row:csvList) {
addAllFields(row.keySet());
}
} catch (NullPointerException nullPointerException) { } catch (NullPointerException nullPointerException) {
System.err.println("Check spelling of file " + filename + "."); System.err.println("Check spelling of file " + filename + ".");
} catch (IOException ioException) { } catch (IOException ioException) {
...@@ -43,8 +36,7 @@ public class CSVReaderWriter { ...@@ -43,8 +36,7 @@ public class CSVReaderWriter {
return csvList; return csvList;
} }
private static Collection<Map<String, String>> parseCSV(Reader reader, Collection<Map<String, String>> parseCSV(Reader reader, Collection<Map<String, String>> destination) {
Collection<Map<String, String>> destination) {
Map<String, String> line; Map<String, String> line;
try { try {
CSVReaderHeaderAware csvReader = new CSVReaderHeaderAwareBuilder(reader).build(); CSVReaderHeaderAware csvReader = new CSVReaderHeaderAwareBuilder(reader).build();
...@@ -61,9 +53,10 @@ public class CSVReaderWriter { ...@@ -61,9 +53,10 @@ public class CSVReaderWriter {
return destination; return destination;
} }
public static boolean writeCSV(String filename, Collection<Map<String, String>> data) { @Override
public boolean writeFile(Collection<Map<String, String>> data) {
boolean wroteFile = true; boolean wroteFile = true;
ClassLoader classLoader = CSVReaderWriter.class.getClassLoader(); ClassLoader classLoader = CsvFile.class.getClassLoader();
URL resource = classLoader.getResource("csv/" + filename); URL resource = classLoader.getResource("csv/" + filename);
if (resource == null) { if (resource == null) {
try { try {
...@@ -94,7 +87,7 @@ public class CSVReaderWriter { ...@@ -94,7 +87,7 @@ public class CSVReaderWriter {
return wroteFile; return wroteFile;
} }
static void placeCSVonWriter(Collection<Map<String, String>> data, Writer writer) { void placeCSVonWriter(Collection<Map<String, String>> data, Writer writer) {
CSVWriter csvWriter = new CSVWriter(writer); CSVWriter csvWriter = new CSVWriter(writer);
List<String[]> allLines = new LinkedList<>(); List<String[]> allLines = new LinkedList<>();
String[] fieldNames = getFieldNames(data); String[] fieldNames = getFieldNames(data);
...@@ -112,12 +105,11 @@ public class CSVReaderWriter { ...@@ -112,12 +105,11 @@ public class CSVReaderWriter {
csvWriter.writeAll(allLines, false); csvWriter.writeAll(allLines, false);
} }
private static String[] getFieldNames(Collection<Map<String, String>> data) { private String[] getFieldNames(Collection<Map<String, String>> data) {
Set<String> fieldNames = new HashSet<>();
for (Map<String, String> row : data) { for (Map<String, String> row : data) {
fieldNames.addAll(row.keySet()); addAllFields(row.keySet());
} }
List<String> fieldList = new ArrayList<>(fieldNames); List<String> fieldList = new ArrayList<>(getFields());
String[] fieldArray = new String[fieldList.size()]; String[] fieldArray = new String[fieldList.size()];
fieldArray = fieldList.toArray(fieldArray); fieldArray = fieldList.toArray(fieldArray);
return fieldArray; return fieldArray;
...@@ -176,27 +168,4 @@ public class CSVReaderWriter { ...@@ -176,27 +168,4 @@ public class CSVReaderWriter {
collection.addAll(preliminaryCollection); collection.addAll(preliminaryCollection);
return collection; return collection;
} }
/* LEGACY METHODS */
public static Set<Map<String, String>> readCSV(String filename) {
return readCSVasSet(filename);
}
static Set<Map<String, String>> parseCSV(InputStream inputStream) {
return (Set<Map<String, String>>) parseCSV(new InputStreamReader(inputStream), new HashSet<>());
}
static void placeCSVonStream(Collection<Map<String, String>> data, OutputStream outputStream) throws IOException {
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
placeCSVonWriter(data, writer);
writer.close();
}
/*
public static void main(String[] args) {
Set<Map<String, String>> demo = readCSV("demo.csv");
boolean success = writeCSV("out.csv", demo);
System.out.println(success ? "Wrote file!" : "Didn't write file");
}
*/
} }
package edu.unl.cse.csv_io;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
@SuppressWarnings("unused")
public interface FormattedFile {
// TODO: change from Map<String,String> to Map<String,Object>, where Object is constrained to String, Long, Boolean, or List<String>
Collection<Map<String, String>> readFile();
boolean writeFile(Collection<Map<String, String>> data);
Set<String> getFields();
}
...@@ -11,14 +11,15 @@ import static org.junit.Assert.*; ...@@ -11,14 +11,15 @@ import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.CoreMatchers.*;
@SuppressWarnings("unchecked") // pee-yew! @SuppressWarnings("unchecked") // pee-yew!
public class CSVReaderWriterTest { public class CsvFileTest {
private static InputStream inputStream;
private static OutputStream outputStream; private static OutputStream outputStream;
private static Reader reader;
private static Writer writer; private static Writer writer;
private CsvFile csvFile;
private static void placeCSVStringOnInputStream(String[][] data) { private static void placeCSVStringOnInputStream(String[][] data) {
String CSVString = createCSVString(data); String CSVString = createCSVString(data);
inputStream = new ByteArrayInputStream(CSVString.getBytes()); reader = new InputStreamReader(new ByteArrayInputStream(CSVString.getBytes()));
} }
private static String createCSVString(String[][] data) { private static String createCSVString(String[][] data) {
...@@ -37,6 +38,7 @@ public class CSVReaderWriterTest { ...@@ -37,6 +38,7 @@ public class CSVReaderWriterTest {
public void setUp() { public void setUp() {
outputStream = new ByteArrayOutputStream(); outputStream = new ByteArrayOutputStream();
writer = new OutputStreamWriter(outputStream); writer = new OutputStreamWriter(outputStream);
csvFile = new CsvFile("");
} }
@After @After
...@@ -53,8 +55,8 @@ public class CSVReaderWriterTest { ...@@ -53,8 +55,8 @@ public class CSVReaderWriterTest {
String[][] data = {headers, row}; String[][] data = {headers, row};
// Output // Output
placeCSVStringOnInputStream(data); placeCSVStringOnInputStream(data);
Set<Map<String, String>> result; Collection<Map<String, String>> result;
result = CSVReaderWriter.parseCSV(inputStream); result = csvFile.parseCSV(reader, new HashSet<>());
// Oracle -- Header // Oracle -- Header
Set<String> expectedKeys = new HashSet<>(Arrays.asList(headers)); Set<String> expectedKeys = new HashSet<>(Arrays.asList(headers));
// Oracle -- Rows // Oracle -- Rows
...@@ -77,8 +79,8 @@ public class CSVReaderWriterTest { ...@@ -77,8 +79,8 @@ public class CSVReaderWriterTest {
String[][] data = {headers, rows[0], rows[1]}; String[][] data = {headers, rows[0], rows[1]};
// Output // Output
placeCSVStringOnInputStream(data); placeCSVStringOnInputStream(data);
Set<Map<String, String>> result; Collection<Map<String, String>> result;
result = CSVReaderWriter.parseCSV(inputStream); result = csvFile.parseCSV(reader, new HashSet<>());
// Oracle -- Header // Oracle -- Header
Set<String> expectedKeys = new HashSet<>(Arrays.asList(headers)); Set<String> expectedKeys = new HashSet<>(Arrays.asList(headers));
// Oracle -- Rows // Oracle -- Rows
...@@ -105,8 +107,8 @@ public class CSVReaderWriterTest { ...@@ -105,8 +107,8 @@ public class CSVReaderWriterTest {
String[][] data = {headers}; String[][] data = {headers};
// Output // Output
placeCSVStringOnInputStream(data); placeCSVStringOnInputStream(data);
Set<Map<String, String>> result; Collection<Map<String, String>> result;
result = CSVReaderWriter.parseCSV(inputStream); result = csvFile.parseCSV(reader, new HashSet<>());
// Oracle // Oracle
int expectedResultSize = 0; int expectedResultSize = 0;
// Compare // Compare
...@@ -120,8 +122,8 @@ public class CSVReaderWriterTest { ...@@ -120,8 +122,8 @@ public class CSVReaderWriterTest {
String[][] data = {}; String[][] data = {};
// Output // Output
placeCSVStringOnInputStream(data); placeCSVStringOnInputStream(data);
Set<Map<String, String>> result; Collection<Map<String, String>> result;
result = CSVReaderWriter.parseCSV(inputStream); result = csvFile.parseCSV(reader, new HashSet<>());
// Oracle // Oracle
int expectedResultSize = 0; int expectedResultSize = 0;
// Compare // Compare
...@@ -137,8 +139,8 @@ public class CSVReaderWriterTest { ...@@ -137,8 +139,8 @@ public class CSVReaderWriterTest {
String[][] data = {headers, rows[0], rows[1], rows[2]}; String[][] data = {headers, rows[0], rows[1], rows[2]};
// Output // Output
placeCSVStringOnInputStream(data); placeCSVStringOnInputStream(data);
Set<Map<String, String>> result; Collection<Map<String, String>> result;
result = CSVReaderWriter.parseCSV(inputStream); result = csvFile.parseCSV(reader, new HashSet<>());
// Oracle -- Header // Oracle -- Header
Set<String> expectedKeys = new HashSet<>(Arrays.asList(headers)); Set<String> expectedKeys = new HashSet<>(Arrays.asList(headers));
// Oracle -- Rows // Oracle -- Rows
...@@ -181,7 +183,8 @@ public class CSVReaderWriterTest { ...@@ -181,7 +183,8 @@ public class CSVReaderWriterTest {
Collections.reverse(Arrays.asList(rows[1])); Collections.reverse(Arrays.asList(rows[1]));
String expectedCSVStringOption2 = createCSVString(data); String expectedCSVStringOption2 = createCSVString(data);
// Output // Output
CSVReaderWriter.placeCSVonStream(input, outputStream); csvFile.placeCSVonWriter(input, writer);
writer.flush();
String output = outputStream.toString(); String output = outputStream.toString();
// Compare // Compare
assertTrue(expectedCSVStringOption1.equals(output) || expectedCSVStringOption2.equals(output)); assertTrue(expectedCSVStringOption1.equals(output) || expectedCSVStringOption2.equals(output));
...@@ -210,7 +213,7 @@ public class CSVReaderWriterTest { ...@@ -210,7 +213,7 @@ public class CSVReaderWriterTest {
Collections.reverse(Arrays.asList(formattedRow2)); Collections.reverse(Arrays.asList(formattedRow2));
String expectedCSVStringOption2 = createCSVString(data); String expectedCSVStringOption2 = createCSVString(data);
// Output // Output
CSVReaderWriter.placeCSVonWriter(input, writer); csvFile.placeCSVonWriter(input, writer);
writer.flush(); writer.flush();
String output = outputStream.toString(); String output = outputStream.toString();
// Compare // Compare
...@@ -226,7 +229,7 @@ public class CSVReaderWriterTest { ...@@ -226,7 +229,7 @@ public class CSVReaderWriterTest {
// Oracle // Oracle
String expectedOutput = "foo bar \"baz plugh\""; String expectedOutput = "foo bar \"baz plugh\"";
// Output // Output
String actualOutput = CSVReaderWriter.createDelimitedCollection(inputList, " "); String actualOutput = CsvFile.createDelimitedCollection(inputList, " ");
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
...@@ -239,7 +242,7 @@ public class CSVReaderWriterTest { ...@@ -239,7 +242,7 @@ public class CSVReaderWriterTest {
// Oracle // Oracle
String expectedOutput = "foo"; String expectedOutput = "foo";
// Output // Output
String actualOutput = CSVReaderWriter.createDelimitedCollection(input, " "); String actualOutput = CsvFile.createDelimitedCollection(input, " ");
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
...@@ -251,7 +254,7 @@ public class CSVReaderWriterTest { ...@@ -251,7 +254,7 @@ public class CSVReaderWriterTest {
// Oracle // Oracle
String expectedOutput = ""; String expectedOutput = "";
// Output // Output
String actualOutput = CSVReaderWriter.createDelimitedCollection(input, " "); String actualOutput = CsvFile.createDelimitedCollection(input, " ");
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
...@@ -264,7 +267,7 @@ public class CSVReaderWriterTest { ...@@ -264,7 +267,7 @@ public class CSVReaderWriterTest {
String[] expectedOutputArray = {"one", "two", "three", "four"}; String[] expectedOutputArray = {"one", "two", "three", "four"};
Collection<String> expectedOutput = Arrays.asList(expectedOutputArray); Collection<String> expectedOutput = Arrays.asList(expectedOutputArray);
// Output // Output
Collection<String> actualOutput = CSVReaderWriter.createFreeCollection(input, " ", new ArrayList<>()); Collection<String> actualOutput = CsvFile.createFreeCollection(input, " ", new ArrayList<>());
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
...@@ -277,7 +280,7 @@ public class CSVReaderWriterTest { ...@@ -277,7 +280,7 @@ public class CSVReaderWriterTest {
String[] expectedOutputArray = {"one"}; String[] expectedOutputArray = {"one"};
Collection<String> expectedOutput = Arrays.asList(expectedOutputArray); Collection<String> expectedOutput = Arrays.asList(expectedOutputArray);
// Output // Output
Collection<String> actualOutput = CSVReaderWriter.createFreeCollection(input, " ", new ArrayList<>()); Collection<String> actualOutput = CsvFile.createFreeCollection(input, " ", new ArrayList<>());
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
...@@ -289,7 +292,7 @@ public class CSVReaderWriterTest { ...@@ -289,7 +292,7 @@ public class CSVReaderWriterTest {
// Oracle // Oracle
Collection<String> expectedOutput = new ArrayList<>(); Collection<String> expectedOutput = new ArrayList<>();
// Output // Output
Collection<String> actualOutput = CSVReaderWriter.createFreeCollection(input, " ", new ArrayList<>()); Collection<String> actualOutput = CsvFile.createFreeCollection(input, " ", new ArrayList<>());
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
assertNotNull(actualOutput); assertNotNull(actualOutput);
...@@ -303,7 +306,7 @@ public class CSVReaderWriterTest { ...@@ -303,7 +306,7 @@ public class CSVReaderWriterTest {
// Oracle // Oracle
Collection<String> expectedOutput = new ArrayList<>(); Collection<String> expectedOutput = new ArrayList<>();
// Output // Output
Collection<String> actualOutput = CSVReaderWriter.createFreeCollection(input, " ", new ArrayList<>()); Collection<String> actualOutput = CsvFile.createFreeCollection(input, " ", new ArrayList<>());
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
assertNotNull(actualOutput); assertNotNull(actualOutput);
...@@ -318,7 +321,7 @@ public class CSVReaderWriterTest { ...@@ -318,7 +321,7 @@ public class CSVReaderWriterTest {
String[] expectedOutputArray = {"one", "two", "three", "four", "five", "six"}; String[] expectedOutputArray = {"one", "two", "three", "four", "five", "six"};
Collection<String> expectedOutput = Arrays.asList(expectedOutputArray); Collection<String> expectedOutput = Arrays.asList(expectedOutputArray);
// Output // Output
Collection<String> actualOutput = CSVReaderWriter.createFreeCollection(input, " ", new ArrayList<>()); Collection<String> actualOutput = CsvFile.createFreeCollection(input, " ", new ArrayList<>());
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
...@@ -331,7 +334,7 @@ public class CSVReaderWriterTest { ...@@ -331,7 +334,7 @@ public class CSVReaderWriterTest {
String[] expectedOutputArray = {"one", "two three", "four five", "six"}; String[] expectedOutputArray = {"one", "two three", "four five", "six"};
Collection<String> expectedOutput = Arrays.asList(expectedOutputArray); Collection<String> expectedOutput = Arrays.asList(expectedOutputArray);
// Output // Output
Collection<String> actualOutput = CSVReaderWriter.createFreeCollection(input, " ", new ArrayList<>()); Collection<String> actualOutput = CsvFile.createFreeCollection(input, " ", new ArrayList<>());
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
...@@ -344,7 +347,7 @@ public class CSVReaderWriterTest { ...@@ -344,7 +347,7 @@ public class CSVReaderWriterTest {
String[] expectedOutputArray = {"one", "two", "three\"", "four", "five", "six"}; String[] expectedOutputArray = {"one", "two", "three\"", "four", "five", "six"};
Collection<String> expectedOutput = Arrays.asList(expectedOutputArray); Collection<String> expectedOutput = Arrays.asList(expectedOutputArray);
// Output // Output
Collection<String> actualOutput = CSVReaderWriter.createFreeCollection(input, " ", new ArrayList<>()); Collection<String> actualOutput = CsvFile.createFreeCollection(input, " ", new ArrayList<>());
// Compare // Compare
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment