]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graph/src/org/simantics/graph/representation/TransferableGraphUtils.java
All tgs do not reference L0.ConsistsOf and L0.HasName
[simantics/platform.git] / bundles / org.simantics.graph / src / org / simantics / graph / representation / TransferableGraphUtils.java
index 10637ad65caf0d861d52e3d1adfffdee66d5f2ca..9873f8f1eef88ce338129a110e5e1e61d2ab2a9d 100644 (file)
@@ -70,7 +70,7 @@ public class TransferableGraphUtils {
         if("http:/".equals(uri)) return identity;
         String[] tokens = uri.substring("http://".length()).split("/");
         for(String token : tokens) {
-            identity = findExternalWithNameAndParent(tg, identity.resource, token);
+            identity = findExternalWithNameAndParent(tg, identity.resource, URIStringUtils.unescape(token));
             if (identity == null) {
                 return null;
             }
@@ -78,7 +78,51 @@ public class TransferableGraphUtils {
         return identity;
         
     }
-    
+
+    /**
+     * Provided a tg and a resource uri, returns the identity of the tg if the uri_ matches the tg exactly
+     * @param tg
+     * @param uri_
+     * @return
+     */
+    public static Identity getIdentity2(TransferableGraph1 tg, String uri_) {
+        Collection<Identity> identities = TransferableGraphUtils.getRoots(tg);
+        for (Identity i : identities) {
+            Identity id = getIdentity2(tg, uri_, i);
+            if (id != null) {
+                return id;
+            }
+        }
+        return null;
+    }
+
+    /**
+     *
+     * @param tg
+     * @param uri_
+     * @param id
+     * @return
+     */
+    public static Identity getIdentity2(TransferableGraph1 tg, String uri_, Identity id) {
+        String uri = TransferableGraphUtils.getURI(tg, id.resource);
+
+        if (uri_.equals(uri)) {
+            return id;
+        }
+
+        if (uri_.startsWith(uri)) {
+            Collection<Identity> childIdentitiesOfRoot = TransferableGraphUtils.getChildren2(tg, id);
+            for (Identity i2 : childIdentitiesOfRoot) {
+                Identity id2 = getIdentity2(tg, uri_, i2);
+                if (id2 != null) {
+                    return id2;
+                }
+            }
+        }
+
+        return null;
+    }
+
     public static Identity getIdentity(TransferableGraph1 tg, int resource) {
         for(Identity id : tg.identities) {
             if(id.resource == resource) return id;
@@ -112,25 +156,27 @@ public class TransferableGraphUtils {
         }
         Identity consistsOf = findExternal(tg, "http://www.simantics.org/Layer0-1.1/ConsistsOf");
         Identity hasName = findExternal(tg, "http://www.simantics.org/Layer0-1.1/HasName");
-        for (int i = 0; i < tg.statements.length; i += 4) {
-            if (tg.statements[i] == parentResource) {
-                if (tg.statements[i + 1] == consistsOf.resource) {
-                    Identity identity = getIdentity(tg, tg.statements[i + 3]);
-                    if (identity != null) {
-                        if (identity.definition instanceof Internal) {
-                            Internal internal = (Internal) identity.definition;
-                            result.put(internal.name, identity);
-                        }
-                    } else {
-                        int possibleNameResource = getPossibleObject2(tg, tg.statements[i + 3], hasName);
-                        if (possibleNameResource != NOT_FOUND) {
-                            Value value = findValue(tg, possibleNameResource);
-                            if (value != null) {
-                                try {
-                                    String name = (String) value.value.getValue(Bindings.STRING);
-                                    result.put(name, new Identity(tg.statements[i + 3], new Internal(tg.statements[i], name)));
-                                } catch (AdaptException e) {
-                                    e.printStackTrace();
+        if(consistsOf != null && hasName != null) {
+            for (int i = 0; i < tg.statements.length; i += 4) {
+                if (tg.statements[i] == parentResource) {
+                    if (tg.statements[i + 1] == consistsOf.resource) {
+                        Identity identity = getIdentity(tg, tg.statements[i + 3]);
+                        if (identity != null) {
+                            if (identity.definition instanceof Internal) {
+                                Internal internal = (Internal) identity.definition;
+                                result.put(internal.name, identity);
+                            }
+                        } else {
+                            int possibleNameResource = getPossibleObject2(tg, tg.statements[i + 3], hasName);
+                            if (possibleNameResource != NOT_FOUND) {
+                                Value value = findValue(tg, possibleNameResource);
+                                if (value != null) {
+                                    try {
+                                        String name = (String) value.value.getValue(Bindings.STRING);
+                                        result.put(name, new Identity(tg.statements[i + 3], new Internal(tg.statements[i], name)));
+                                    } catch (AdaptException e) {
+                                        e.printStackTrace();
+                                    }
                                 }
                             }
                         }
@@ -301,14 +347,14 @@ public class TransferableGraphUtils {
                 if(definition instanceof External) {
                     External def = (External)definition;
                     if(def.parent == -1) return "http:/";
-                    else return getURI(identities, def.parent) + "/" + def.name;
+                    else return getURI(identities, def.parent) + "/" + URIStringUtils.escape(def.name);
                 } else if(definition instanceof Root) {
                     Root def = (Root)definition;
                     if(def.name.isEmpty()) return "http:/";
                     return def.name;
                 } else if (definition instanceof Internal) {
                     Internal def = (Internal)definition;
-                    return getURI(identities, def.parent) + "/" + def.name;
+                    return getURI(identities, def.parent) + "/" + URIStringUtils.escape(def.name);
                 } else {
                     return "";
                 }