package com.revolsys.record.io.format.tsv;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import com.revolsys.io.map.IteratorMapReader;
import com.revolsys.io.map.MapReader;
import com.revolsys.io.map.MapWriter;
import com.revolsys.io.map.MapWriterFactory;
import com.revolsys.record.Record;
import com.revolsys.record.RecordFactory;
import com.revolsys.record.io.AbstractRecordIoFactory;
import com.revolsys.record.io.RecordReader;
import com.revolsys.record.io.RecordWriter;
import com.revolsys.record.io.RecordWriterFactory;
import com.revolsys.record.io.format.csv.CsvMapIterator;
import com.revolsys.record.io.format.csv.CsvMapWriter;
import com.revolsys.record.io.format.csv.CsvRecordReader;
import com.revolsys.record.io.format.csv.CsvRecordWriter;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.spring.resource.Resource;
import com.revolsys.util.Exceptions;
public class Tsv extends AbstractRecordIoFactory implements RecordWriterFactory, MapWriterFactory {
public static final String DESCRIPTION = "Tab-Separated Values";
public static final char FIELD_SEPARATOR = '\t';
public static final String FILE_EXTENSION = "tsv";
public static final String MIME_TYPE = "text/tab-separated-values";
public static final char QUOTE_CHARACTER = '"';
public static MapReader mapReader(final Object source) {
final Resource resource = Resource.getResource(source);
try {
final CsvMapIterator iterator = new CsvMapIterator(resource, FIELD_SEPARATOR);
return new IteratorMapReader(iterator);
} catch (final IOException e) {
throw Exceptions.wrap(e);
}
}
public static RecordWriter newRecordWriter(final RecordDefinition recordDefinition,
final Writer writer, final boolean useQuotes, final boolean ewkt) {
return new CsvRecordWriter(recordDefinition, writer, Tsv.FIELD_SEPARATOR, useQuotes, ewkt);
}
public static TsvWriter plainWriter(final Object source) {
if (source == null) {
throw new NullPointerException("source must not be null");
} else {
final Resource resource = Resource.getResource(source);
final Writer writer = resource.newWriter();
return plainWriter(writer);
}
}
public static TsvWriter plainWriter(final Writer writer) {
return new TsvWriter(writer);
}
public Tsv() {
super(Tsv.DESCRIPTION);
addMediaTypeAndFileExtension(Tsv.MIME_TYPE, Tsv.FILE_EXTENSION);
}
@Override
public boolean isReadFromZipFileSupported() {
return true;
}
@Override
public MapReader newMapReader(final Resource resource) {
return mapReader(resource);
}
@Override
public MapWriter newMapWriter(final Writer out) {
return new CsvMapWriter(out, Tsv.FIELD_SEPARATOR, true);
}
@Override
public RecordReader newRecordReader(final Resource resource,
final RecordFactory<? extends Record> recordFactory) {
return new CsvRecordReader(resource, recordFactory, Tsv.FIELD_SEPARATOR);
}
@Override
public RecordWriter newRecordWriter(final RecordDefinition recordDefinition,
final Resource resource) {
return new CsvRecordWriter(recordDefinition, resource, Tsv.FIELD_SEPARATOR, true, true);
}
@Override
public RecordWriter newRecordWriter(final String baseName,
final RecordDefinition recordDefinition, final OutputStream outputStream,
final Charset charset) {
final OutputStreamWriter writer = new OutputStreamWriter(outputStream, charset);
return new CsvRecordWriter(recordDefinition, writer, Tsv.FIELD_SEPARATOR, true, true);
}
}