/* * Copyright 2015 CIRDLES. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.cirdles.topsoil.app.dataset.writer; import au.com.bytecode.opencsv.CSVWriter; import org.cirdles.topsoil.app.dataset.RawData; import org.cirdles.topsoil.app.dataset.field.Field; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.Charset; import java.util.List; import static java.util.stream.Collectors.toList; /** * A {@code RawDataWriter} for writing delimited data, using a {@code CSVWriter} with a custom delimiter. * * @author John Zeringue */ public class DsvRawDataWriter implements RawDataWriter { /** * The delimiter of the data. */ private final char delimiter; /** * A {@code CSVWriter} used for writing data. */ private CSVWriter dsvWriter; /** * Constructs a new {@code DsvRawDataWriter} using the specified delimiter. * * @param delimiter char delimiter */ public DsvRawDataWriter(char delimiter) { this.delimiter = delimiter; } /** * Returns the delimiter used by this {@code DsvRawDataWriter}. * * @return char delimiter */ public char getDelimiter() { return delimiter; } /** * Writes the {@code Field}s for a {@code RawData} object. * * @param rawData RawData */ private void writeFields(RawData rawData) { String[] line = rawData.getFields().stream() .map(Field::getName) .toArray(String[]::new); dsvWriter.writeNext(line); } /** * Writes the {@code Entry}s for a {@code RawData} object. * * @param rawData RawData */ private void writeEntries(RawData rawData) { List<String[]> lines = rawData.getEntries().stream() .map(entry -> { return rawData.getFields().stream() .map(entry::get) .map(value -> value .map(Object::toString) .orElse("")) .toArray(String[]::new); }) .collect(toList()); dsvWriter.writeAll(lines); } /** {@inheritDoc} */ @Override public void write(RawData rawData, OutputStream destination) throws IOException { Writer writer = new OutputStreamWriter(destination, Charset.forName("UTF-8")); dsvWriter = new CSVWriter(writer, getDelimiter()); writeFields(rawData); writeEntries(rawData); dsvWriter.close(); dsvWriter = null; // allow dsvWriter to be garbage collected } }