package org.simantics.interop.test; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.simantics.db.Resource; import org.simantics.db.Statement; public class Path { private Resource begin; private Resource end; private List statements = new ArrayList(2); public Path(Statement s) { begin = s.getSubject(); end = s.getObject(); statements.add(s); } public Path(Path p) { begin = p.begin; end = p.end; statements.addAll(p.statements); } public Resource getBegin() { return begin; } public Resource getEnd() { return end; } public List getStatements() { return statements; } public int getLength() { return statements.size(); } public boolean add(Statement s) { if (!statements.get(statements.size()-1).getObject().equals(s.getSubject())) //throw new RuntimeException("Non continuous path. " + s.getSubject() + " does not match " + statements.get(statements.size()-1).getObject()); return false; if (s.getObject().equals(begin)) return false; for (Statement stm : statements) { if (stm.getObject().equals(s.getObject())) return false; } end = s.getObject(); statements.add(s); return true; } public static Collection expand(Path path, Collection statements) { Collection result = new ArrayList(statements.size()); for (Statement s : statements) { Path p = new Path(path); p.add(s); result.add(p); } return result; } public static Collection create(Collection statements) { Collection result = new ArrayList(statements.size()); for (Statement s : statements) { Path p = new Path(s); result.add(p); } return result; } @Override public boolean equals(Object arg0) { if(!arg0.getClass().equals(getClass())) return false; Path other = (Path)arg0; if (!begin.equals(other.begin)) return false; if (!end.equals(other.end)) return false; if (statements.size() != other.statements.size()) return false; for (int i = 0; i < statements.size(); i++) { if (!statements.get(i).getPredicate().equals(other.statements.get(i).getPredicate())|| !statements.get(i).getObject().equals(other.statements.get(i).getObject())) return false; } return true; } @Override public int hashCode() { return begin.hashCode() + end.hashCode(); } @Override public String toString() { String s = ""; for (int i = 0; i < statements.size() ; i++) { s += statements.get(i).getSubject(); s += "<" + statements.get(i).getPredicate() +">"; if (i == statements.size() -1) s += statements.get(i).getObject(); } return s; } }