--- /dev/null
+package org.simantics.graph.representation;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+public class TransferableGraphUtils {\r
+\r
+ public static Collection<Identity> getRoots(TransferableGraph1 tg) {\r
+ \r
+ ArrayList<Identity> result = new ArrayList<Identity>();\r
+ for(Identity id : tg.identities) {\r
+ if(id.definition instanceof Root) result.add(id);\r
+ }\r
+ return result;\r
+ \r
+ }\r
+ \r
+ public static Identity findRootWithName(TransferableGraph1 tg, String name) {\r
+ \r
+ for(Identity id : tg.identities) {\r
+ if(id.definition instanceof Root) {\r
+ Root ext = (Root)id.definition;\r
+ if(ext.name.equals(name)) return id;\r
+ }\r
+ }\r
+ return null;\r
+ \r
+ }\r
+\r
+ public static Identity findExternalWithName(TransferableGraph1 tg, String name) {\r
+ \r
+ for(Identity id : tg.identities) {\r
+ if(id.definition instanceof External) {\r
+ External ext = (External)id.definition;\r
+ if(ext.name.equals(name)) return id;\r
+ }\r
+ }\r
+ return null;\r
+ \r
+ }\r
+\r
+ public static Identity findExternalWithNameAndParent(TransferableGraph1 tg, int parent, String name) {\r
+ \r
+ for(Identity id : tg.identities) {\r
+ if(id.definition instanceof External) {\r
+ External ext = (External)id.definition;\r
+ if(ext.name.equals(name) && ext.parent == parent) return id;\r
+ }\r
+ }\r
+ return null;\r
+ \r
+ }\r
+ \r
+ public static Identity findExternal(TransferableGraph1 tg, String uri) {\r
+ \r
+ Identity identity = findExternalWithName(tg, "http:/");\r
+ if(identity == null) identity = findExternalWithName(tg, "");\r
+ if(identity == null) identity = findRootWithName(tg, "");\r
+ if("http:/".equals(uri)) return identity;\r
+ String[] tokens = uri.substring("http://".length()).split("/");\r
+ for(String token : tokens) {\r
+ identity = findExternalWithNameAndParent(tg, identity.resource, token);\r
+ }\r
+ return identity;\r
+ \r
+ }\r
+ \r
+ public static Collection<Identity> getChildren(TransferableGraph1 tg, Identity parent) {\r
+ ArrayList<Identity> result = new ArrayList<Identity>();\r
+ System.err.println("children for " + parent.resource);\r
+ for(Identity id : tg.identities) {\r
+ if(id.definition instanceof Internal) {\r
+ Internal internal = (Internal)id.definition;\r
+ System.err.println("internal with parent " + internal.parent);\r
+ if(internal.parent == parent.resource) result.add(id);\r
+ }\r
+ }\r
+ findExternal(tg, "http://www.simantics.org/Layer0-1.1/ConsistsOf");\r
+ for(int i=0;i<tg.statements.length;i+=4) {\r
+ if(tg.statements[i] == parent.resource)\r
+ System.err.println("related to parent " + tg.statements[i+3]);\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ public static int getPossibleObject(TransferableGraph1 tg, Identity subject, String predicate) {\r
+ Identity p = findExternal(tg, predicate);\r
+ if(p == null) return 0;\r
+ int result = 0;\r
+ for(int i=0;i<tg.statements.length;i+=4) {\r
+ if(tg.statements[i] == subject.resource && tg.statements[i+1] == p.resource) {\r
+ if(result != 0) return 0;\r
+ result = tg.statements[i+3];\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ public static Map<Identity, String> getNames(TransferableGraph1 tg, Collection<Identity> ids) {\r
+ Map<Identity, String> result = new HashMap<Identity, String>();\r
+ for(Identity id : ids) {\r
+ if(id.definition instanceof Internal) {\r
+ Internal internal = (Internal)id.definition;\r
+ result.put(id, internal.name);\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ public static String getName(TransferableGraph1 tg, Identity id) {\r
+ return getName(id);\r
+ }\r
+\r
+ public static String getName(Identity id) {\r
+ if(id.definition instanceof Internal) {\r
+ Internal internal = (Internal)id.definition;\r
+ return internal.name;\r
+ } else if(id.definition instanceof External) {\r
+ External external = (External)id.definition;\r
+ return external.name;\r
+ } else if(id.definition instanceof Root) {\r
+ Root root = (Root)id.definition;\r
+ return root.name;\r
+ } else {\r
+ Optional optional = (Optional)id.definition;\r
+ return optional.name;\r
+ }\r
+ }\r
+\r
+ public static String getRootType(Identity id) {\r
+ if(id.definition instanceof Root) {\r
+ Root root = (Root)id.definition;\r
+ return root.type;\r
+ } else {\r
+ throw new IllegalArgumentException("Expected root, got " + id);\r
+ }\r
+ }\r
+\r
+ public static Value findValue(TransferableGraph1 tg, int subject) {\r
+ for(Value v : tg.values) {\r
+ if(v.resource == subject) return v;\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ public static String getURI(TransferableGraph1 tg, int id) {\r
+ return getURI(tg.resourceCount, tg.identities, id);\r
+ }\r
+ \r
+ public static String getURI(int resourceCount, Identity[] identities, int id) {\r
+ for(Identity identity : identities) {\r
+ if(identity.resource == id) {\r
+ IdentityDefinition definition = identity.definition;\r
+ if(definition instanceof External) {\r
+ External def = (External)definition;\r
+ if(def.parent == -1) return "http:/";\r
+ else return getURI(resourceCount, identities, def.parent) + "/" + def.name;\r
+ } else if(definition instanceof Root) {\r
+ Root def = (Root)definition;\r
+ return def.name;\r
+ } else if (definition instanceof Internal) {\r
+ Internal def = (Internal)definition;\r
+ System.err.println("External URI error: parent was internal '" + def.name + "'");\r
+ return "";\r
+ } else {\r
+ return "";\r
+ }\r
+ }\r
+ } \r
+ return "<internal reference " + id + ">:";\r
+ }\r
+ \r
+}\r