package org.gbif.occurrence.download.util;
import org.gbif.dwc.terms.Term;
import org.gbif.occurrence.common.TermUtils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.io.ByteStreams;
/**
* Utility class that generates a headers file for occurrence downloads.
* Header columns in general use the simple name of a term.
*/
public class HeadersFileUtil {
public static final String DEFAULT_VERBATIM_FILE_NAME = "verbatim_headers.txt";
public static final String DEFAULT_INTERPRETED_FILE_NAME = "interpreted_headers.txt";
public static final String DEFAULT_MULTIMEDIA_FILE_NAME = "multimedia_headers.txt";
public static final String HEADERS_FILE_PATH = "inc/";
private static final Joiner TAB_JOINER = Joiner.on('\t').skipNulls();
/**
* Creates the headers file.
* The output file name can be specified as argument.
* If the file names are not specified the files are generated in
* the current directory with the name "verbatim_headers.txt" and "verbatim_headers.txt".
*/
public static void generateHeadersFiles(
String verbatimFileName,
String interpretedFileName,
String multimediaFileName
) throws IOException {
generateFileHeader(verbatimFileName, DEFAULT_VERBATIM_FILE_NAME, getVerbatimTableHeader());
generateFileHeader(interpretedFileName, DEFAULT_INTERPRETED_FILE_NAME, getInterpretedTableHeader());
generateFileHeader(multimediaFileName, DEFAULT_MULTIMEDIA_FILE_NAME, getMultimediaTableHeader());
}
/**
* Utility method that generates a file that contains the header string.
*/
private static void generateFileHeader(String fileName, String defaultName, String header) throws IOException {
String outFileName = Strings.isNullOrEmpty(fileName) ? HEADERS_FILE_PATH + defaultName : fileName;
try (FileWriter fileWriter = new FileWriter(new File(outFileName))) {
fileWriter.write(header);
}
}
/**
* Utility method that generates a String that contains the column names of terms.
*/
private static String getTableHeader(Iterable<? extends Term> terms) {
List<String> headers = Lists.newArrayList();
for (Term term : terms) {
headers.add(term.simpleName());
}
return TAB_JOINER.join(headers) + '\n';
}
/**
* Appends the occurrence headers line to the output file.
*/
public static void appendInterpretedHeaders(OutputStream fileWriter) throws IOException {
appendHeaders(fileWriter, getInterpretedTableHeader());
}
/**
* Appends the occurrence headers line to the output file.
*/
public static void appendVerbatimHeaders(OutputStream fileWriter) throws IOException {
appendHeaders(fileWriter, getVerbatimTableHeader());
}
/**
* Appends the occurrence headers line to the output file.
*/
public static void appendMultimediaHeaders(OutputStream fileWriter) throws IOException {
appendHeaders(fileWriter, getMultimediaTableHeader());
}
/**
* Appends the headers line to the output file.
*/
private static void appendHeaders(OutputStream fileWriter, String headers) throws IOException {
try (InputStream headerInputStream = new ByteArrayInputStream(headers.getBytes())) {
ByteStreams.copy(headerInputStream, fileWriter);
}
}
/**
* Returns the headers names of download columns.
*/
public static String getVerbatimTableHeader() {
return getTableHeader(TermUtils.verbatimTerms());
}
/**
* Returns the headers names of download columns.
*/
public static String getInterpretedTableHeader() {
return getTableHeader(TermUtils.interpretedTerms());
}
/**
* Returns the headers names of download columns.
*/
public static String getMultimediaTableHeader() {
return getTableHeader(TermUtils.multimediaTerms());
}
public static void main(String[] args) throws IOException {
if (args.length < 3) {
throw new IllegalArgumentException(
"3 Parameters are required: verbatim, interpreted and multimedia header file names");
}
generateHeadersFiles(args[0], args[1], args[2]);
}
/**
* Empty private constructor.
*/
private HeadersFileUtil() {
// empty constructor
}
}