package org.gbif.checklistbank.neo.printer;
import org.gbif.api.vocabulary.Rank;
import org.gbif.api.vocabulary.TaxonomicStatus;
import org.gbif.checklistbank.neo.Labels;
import org.gbif.checklistbank.neo.NeoProperties;
import org.gbif.io.TabWriter;
import java.io.IOException;
import java.io.Writer;
import com.google.common.base.Function;
import com.google.common.base.Throwables;
import org.neo4j.graphdb.Node;
/**
* Dumps a neo db in a simple tab delimited format showing the following columns:
* name, rank, status, family
* Expects no pro parte relations in the walker!
*/
public class ListPrinter implements TreePrinter {
private final Function<Node, String> getTitle;
private final TabWriter writer;
private String family;
public ListPrinter(Writer writer, Function<Node, String> getTitle) {
this.writer = new TabWriter(writer);
this.getTitle = getTitle;
}
@Override
public void close() {
}
@Override
public void start(Node n) {
try {
Rank rank = NeoProperties.getRank(n, Rank.UNRANKED);
if (Rank.FAMILY == rank) {
family = NeoProperties.getCanonicalName(n);
} else if (Rank.FAMILY.higherThan(rank)) {
String[] row = new String[4];
row[0] = getTitle.apply(n);
row[1] = rank.name().toLowerCase();
row[2] = (n.hasLabel(Labels.SYNONYM) ? TaxonomicStatus.SYNONYM.name() : TaxonomicStatus.ACCEPTED.name()).toLowerCase();
row[3] = family;
writer.write(row);
}
} catch (IOException e) {
Throwables.propagate(e);
}
}
@Override
public void end(Node n) {
}
}