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