package au.com.langdale.cimtoole.test;
import au.com.langdale.inference.AsyncModel;
import au.com.langdale.inference.AsyncResult;
import au.com.langdale.kena.OntModel;
import com.hp.hpl.jena.graph.Graph;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.Triple;
import com.hp.hpl.jena.reasoner.TriplePattern;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.vocabulary.RDF;
import junit.framework.TestCase;
public class TestUtility extends TestCase {
protected static TriplePattern pattern(String s, String p, String o) {
return new TriplePattern(uri(s), uri(p), literal(o));
}
protected static TriplePattern pattern(String s, String p, Node o) {
return new TriplePattern(uri(s), uri(p), o);
}
protected static Node uri(String s) {
if( s == null )
return Node.ANY;
else
return Node.createURI(s);
}
protected static Node literal(String s) {
if( s == null )
return Node.ANY;
else
return Node.createLiteral(s);
}
protected static final String ANY = null;
protected static final String A = RDF.type.getURI();
protected static Triple triple(String s, String p, String o) {
return new Triple(Node.createURI(s), Node.createURI(p), Node.createLiteral(o));
}
protected static Triple triple(String s, String p, Node o) {
return new Triple(Node.createURI(s), Node.createURI(p), o);
}
public static class Deferred implements AsyncResult {
private boolean complete;
private int count = 0;
private Triple result;
public boolean add(Triple result) {
this.result = result;
count ++;
return true;
}
public void close() {
complete = true;
}
public boolean isComplete() {
return complete;
}
public int getCount() {
return count;
}
public Triple getResult() {
return result;
}
}
public static abstract class Chain implements AsyncResult {
private TriplePattern pattern;
private AsyncResult delegate;
private int pending = 1;
private boolean more = true;
public Chain(TriplePattern pattern, AsyncResult delegate) {
this.pattern = pattern;
this.delegate = delegate;
}
private class Link implements AsyncResult {
public boolean add(Triple result) {
if(more)
more = delegate.add(result);
if( ! more )
Chain.this.close();
return more;
}
public void close() {
Chain.this.close();
}
}
public boolean add(Triple result) {
pending ++;
find(new TriplePattern(result.getObject(), pattern.getPredicate(), pattern.getObject()), new Link());
return more;
}
protected abstract void find(TriplePattern pattern, AsyncResult result);
public void close() {
pending --;
if( pending == 0)
delegate.close();
}
}
public static class ChainGraph extends Chain {
private Graph graph;
public ChainGraph(Graph graph, TriplePattern pattern, AsyncResult delegate) {
super(pattern, delegate);
this.graph = graph;
}
@Override
protected void find(TriplePattern pattern, AsyncResult result) {
TestUtility.find(graph, pattern, result);
}
}
public static class ChainReader extends Chain {
private AsyncModel reader;
public ChainReader(AsyncModel reader, TriplePattern pattern, AsyncResult delegate) {
super(pattern, delegate);
this.reader = reader;
}
@Override
protected void find(TriplePattern pattern, AsyncResult result) {
reader.find(pattern, result);
}
}
protected static Deferred find(AsyncModel reader, TriplePattern pattern) {
Deferred deferred = new Deferred();
reader.find(pattern, deferred);
return deferred;
}
protected static Deferred find(OntModel model, TriplePattern pattern) {
return find(model.getGraph(), pattern);
}
protected static Deferred find(OntModel model, TriplePattern pattern1, TriplePattern pattern2) {
return find(model.getGraph(), pattern1, pattern2);
}
protected static Deferred find(final Graph graph, TriplePattern pattern1, TriplePattern pattern2) {
Deferred deferred = new Deferred();
find(graph, pattern1, new ChainGraph( graph, pattern2, deferred));
return deferred;
}
protected static void find(OntModel model, TriplePattern pattern, AsyncResult deferred) {
find(model.getGraph(), pattern, deferred);
}
protected static Deferred find(Graph graph, TriplePattern pattern) {
Deferred deferred = new Deferred();
find(graph, pattern, deferred);
return deferred;
}
protected static void find(Graph graph, TriplePattern pattern, AsyncResult deferred) {
ExtendedIterator it = graph.find(pattern.asTripleMatch());
while (it.hasNext()) {
Triple triple = (Triple) it.next();
if( ! deferred.add(triple))
return;
}
deferred.close();
}
}