package org.gbif.checklistbank.nub.validation;
import org.gbif.api.vocabulary.Rank;
import org.gbif.checklistbank.neo.NeoProperties;
import org.gbif.checklistbank.neo.traverse.StartEndHandler;
import java.util.LinkedList;
import com.google.common.collect.Lists;
import org.neo4j.graphdb.Node;
/**
* throws IllegalStateException when problems are encountered to fail fast.
*/
public class TreeRankValidation implements StartEndHandler {
private final LinkedList<Rank> parents = Lists.newLinkedList();
private boolean valid = true;
@Override
public void start(Node n) throws IllegalStateException {
Rank rank = NeoProperties.getRank(n, null);
if (rank == null) {
fail("Missing rank", n);
}
if (!parents.isEmpty()) {
Rank parent = parents.getLast();
if (!parent.higherThan(rank)) {
fail("Rank "+rank+" is not lower than parent rank "+parent, n);
}
}
parents.add(rank);
}
@Override
public void end(Node n) {
parents.removeLast();
}
public boolean isValid() {
return valid;
}
private void fail(String msg, Node n) {
valid = false;
throw new IllegalStateException(msg + " for " + n);
}
}