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