--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.layer0.utils.direct;\r
+\r
+import java.util.Collection;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
+import java.util.Stack;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.uri.UnescapedChildMapOfResource;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.exception.ServiceException;\r
+import org.simantics.db.exception.ValidationException;\r
+import org.simantics.db.procedure.MultiProcedure;\r
+import org.simantics.db.procedure.SyncMultiProcedure;\r
+import org.simantics.layer0.Layer0;\r
+\r
+\r
+public final class GraphUtils {\r
+\r
+ public static Resource createScalarString(WriteGraph graph, String string) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ Resource ret = graph.newResource();\r
+ graph.claim(ret, b.InstanceOf, null, b.String);\r
+ graph.claimValue(ret, string);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createScalarInteger(WriteGraph graph, int value) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ Resource ret = graph.newResource();\r
+ graph.claim(ret, b.InstanceOf, null, b.Integer);\r
+ graph.claimValue(ret, value);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createScalarLong(WriteGraph graph, long value) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ Resource ret = graph.newResource();\r
+ graph.claim(ret, b.InstanceOf, null, b.Long);\r
+ graph.claimValue(ret, value);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createScalarFloat(WriteGraph graph, float value) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ Resource ret = graph.newResource();\r
+ graph.claim(ret, b.InstanceOf, null, b.Float);\r
+ graph.claimValue(ret, value);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createScalarBoolean(WriteGraph graph, boolean value) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ Resource ret = graph.newResource();\r
+ graph.claim(ret, b.InstanceOf, null, b.Boolean);\r
+ graph.claimValue(ret, value);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createScalarDouble(WriteGraph graph, double value) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ Resource ret = graph.newResource();\r
+ graph.claim(ret, b.InstanceOf, null, b.Double);\r
+ graph.claimValue(ret, value);\r
+ return ret;\r
+ }\r
+\r
+ public static void addRelatedScalarString(WriteGraph graph, Resource resource, Resource relation, String string) throws DatabaseException {\r
+ graph.claim(resource, relation, createScalarString(graph, string));\r
+ }\r
+\r
+ public static void addRelatedScalarInteger(WriteGraph graph, Resource resource, Resource relation, int value) throws DatabaseException {\r
+ graph.claim(resource, relation, createScalarInteger(graph, value));\r
+ }\r
+\r
+ public static Resource createDoubleArray(WriteGraph graph, double[] array, Resource type) throws DatabaseException {\r
+ Resource ret = graph.newResource();\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ graph.claim(ret, b.InstanceOf, null, type);\r
+ graph.claimValue(ret, array);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createDoubleArray(WriteGraph graph, double[] array) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ return createDoubleArray(graph, array, b.DoubleArray);\r
+ }\r
+\r
+ public static Resource createIntegerArray(WriteGraph graph, int[] array, Resource type) throws DatabaseException {\r
+ Resource ret = graph.newResource();\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ graph.claim(ret, b.InstanceOf, null, type);\r
+ graph.claimValue(ret, array);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createIntegerArray(WriteGraph graph, int[] array) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ return createIntegerArray(graph, array, b.IntegerArray);\r
+ }\r
+\r
+ public static Resource createLongArray(WriteGraph graph, long[] array, Resource type) throws DatabaseException {\r
+ Resource ret = graph.newResource();\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ graph.claim(ret, b.InstanceOf, null, type);\r
+ graph.claimValue(ret, array);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createLongArray(WriteGraph graph, long[] array) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ return createLongArray(graph, array, b.LongArray);\r
+ }\r
+\r
+ public static Resource createFloatArray(WriteGraph graph, float[] array, Resource type) throws DatabaseException {\r
+ Resource ret = graph.newResource();\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ graph.claim(ret, b.InstanceOf, null, type);\r
+ graph.claimValue(ret, array);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createFloatArray(WriteGraph graph, float[] array) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ return createFloatArray(graph, array, b.FloatArray);\r
+ }\r
+\r
+ public static Resource createBooleanArray(WriteGraph graph, boolean[] array, Resource type) throws DatabaseException {\r
+ Resource ret = graph.newResource();\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ graph.claim(ret, b.InstanceOf, null, type);\r
+ graph.claimValue(ret, array);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createBooleanArray(WriteGraph graph, boolean[] array) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ return createBooleanArray(graph, array, b.BooleanArray);\r
+ }\r
+\r
+ public static Resource createStringArray(WriteGraph graph, String[] array, Resource type) throws DatabaseException {\r
+ Resource ret = graph.newResource();\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ graph.claim(ret, b.InstanceOf, null, type);\r
+ graph.claimValue(ret, array);\r
+ return ret;\r
+ }\r
+\r
+ public static Resource createStringArray(WriteGraph graph, String[] array) throws DatabaseException {\r
+ Layer0 b = Layer0.getInstance(graph);\r
+ return createStringArray(graph, array, b.StringArray);\r
+ }\r
+\r
+ public interface ResourceTester {\r
+ boolean test(ReadGraph graph, Resource resource) throws DatabaseException ;\r
+ }\r
+\r
+ public static class AcceptAll implements ResourceTester {\r
+\r
+ @Override\r
+ public boolean test(ReadGraph graph, Resource resource) throws DatabaseException {\r
+ return true;\r
+ }\r
+\r
+ }\r
+\r
+ public static class InstanceOf implements ResourceTester {\r
+\r
+ private final Resource type;\r
+\r
+ public InstanceOf(Resource type) {\r
+ this.type = type;\r
+ }\r
+\r
+ @Override\r
+ public boolean test(ReadGraph graph, Resource resource) throws DatabaseException {\r
+ return graph.isInstanceOf(resource, type);\r
+ }\r
+\r
+ }\r
+\r
+ public static class Inherits implements ResourceTester {\r
+\r
+ private final Resource superType;\r
+\r
+ public Inherits(Resource superType) {\r
+ this.superType = superType;\r
+ }\r
+\r
+ @Override\r
+ public boolean test(ReadGraph graph, Resource resource) throws DatabaseException {\r
+ return graph.isInheritedFrom(resource, superType);\r
+ }\r
+\r
+ }\r
+\r
+ public static void findResources(ReadGraph graph, Collection<Resource> roots, Resource relation, ResourceTester tester, MultiProcedure<Resource> procedure) throws DatabaseException {\r
+\r
+ Set<Resource> visited = new HashSet<Resource>();\r
+ Stack<Resource> process = new Stack<Resource>();\r
+\r
+ process.addAll(roots);\r
+ visited.addAll(roots);\r
+\r
+ while(!process.isEmpty()) {\r
+ Resource cur = process.pop();\r
+ for(Resource r : graph.getObjects(cur, relation))\r
+ if(!visited.contains(r)) {\r
+ visited.add(r);\r
+ if(tester.test(graph, r))\r
+ procedure.execute(r);\r
+ process.add(r);\r
+ }\r
+ }\r
+\r
+ procedure.finished();\r
+\r
+ }\r
+\r
+\r
+ public static void findResources(ReadGraph graph, Collection<Resource> roots, Resource relation, ResourceTester tester, SyncMultiProcedure<Resource> procedure) throws DatabaseException {\r
+\r
+ Set<Resource> visited = new HashSet<Resource>();\r
+ Stack<Resource> process = new Stack<Resource>();\r
+\r
+ process.addAll(roots);\r
+ visited.addAll(roots);\r
+\r
+ while(!process.isEmpty()) {\r
+ Resource cur = process.pop();\r
+ for(Resource r : graph.getObjects(cur, relation))\r
+ if(!visited.contains(r)) {\r
+ visited.add(r);\r
+ if(tester.test(graph, r))\r
+ procedure.execute(graph, r);\r
+ process.add(r);\r
+ }\r
+ }\r
+\r
+ procedure.finished(graph);\r
+\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#getSafeName(ReadGraph, Resource)}\r
+ */\r
+ public static String getReadableName(ReadGraph graph, Resource resource) throws ValidationException, ServiceException {\r
+ return NameUtils.getSafeName(graph, resource);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findReservedNames(ReadGraph, String, Resource, Resource, Set)}\r
+ */\r
+ public static Set<String> findReservedNames(ReadGraph g, String proposition, Resource container, Resource consistRelation, Set<String> result) throws DatabaseException {\r
+ return NameUtils.findReservedNames(g, proposition, container, consistRelation, result);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findReservedNames(ReadGraph, String, Resource, Resource)\r
+ */\r
+ public static Set<String> findReservedNames(ReadGraph g, String proposition, Resource container, Resource consistRelation) throws DatabaseException {\r
+ return NameUtils.findReservedNames(g, proposition, container, consistRelation);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findFreshName(ReadGraph, String, Resource)}\r
+ */\r
+ public static String findFreshName(ReadGraph g, String proposition, Resource container) throws DatabaseException {\r
+ return NameUtils.findFreshName(g, proposition, container);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findFreshEscapedName(ReadGraph, String, Resource)}\r
+ */\r
+ public static String findFreshEscapedName(ReadGraph g, String proposition, Resource container) throws DatabaseException {\r
+ return NameUtils.findFreshEscapedName(g, proposition, container);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findFreshName(ReadGraph, String, Resource, Resource)}\r
+ */\r
+ public static String findFreshName(ReadGraph g, String proposition, Resource container, Resource consistRelation) throws DatabaseException {\r
+ return NameUtils.findFreshName(g, proposition, container, consistRelation);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findFreshEscapedName(ReadGraph, String, Resource, Resource)}\r
+ */\r
+ public static String findFreshEscapedName(ReadGraph g, String proposition, Resource container, Resource consistRelation) throws DatabaseException {\r
+ return NameUtils.findFreshEscapedName(g, proposition, container, consistRelation);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findFreshName(ReadGraph, String, Resource, Resource, String)}\r
+ */\r
+ public static String findFreshName(ReadGraph g, String proposition, Resource container, Resource consistRelation, String nameFormat) throws DatabaseException {\r
+ return NameUtils.findFreshName(g, proposition, container, consistRelation, nameFormat);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findFreshInstanceName(ReadGraph, Resource, Resource)}\r
+ */\r
+ public static String findFreshInstanceName(ReadGraph g, Resource type, Resource container) throws DatabaseException {\r
+ return NameUtils.findFreshInstanceName(g, type, container);\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#findFreshInstanceName(ReadGraph, Resource, Resource, Resource)}\r
+ */\r
+ public static String findFreshInstanceName(ReadGraph g, Resource type, Resource container, Resource relation) throws DatabaseException {\r
+ return NameUtils.findFreshInstanceName(g, type, container, relation);\r
+ }\r
+\r
+ public static Resource create(WriteGraph g, Resource ... predicateObjectPairs) throws DatabaseException {\r
+ assert(predicateObjectPairs.length % 2 == 0);\r
+ Resource resource = g.newResource();\r
+ for(int i=0;i<predicateObjectPairs.length;i+=2)\r
+ g.claim(resource, predicateObjectPairs[i], predicateObjectPairs[i+1]);\r
+ return resource;\r
+ }\r
+\r
+ private static Resource getObjectOrCreatePrimitiveValue(WriteGraph g, Object object) throws DatabaseException {\r
+ if (object == null)\r
+ throw new NullPointerException("null object");\r
+\r
+ Class<?> clazz = object.getClass();\r
+\r
+ if (object instanceof Resource)\r
+ return (Resource) object;\r
+\r
+ if (String.class.equals(clazz))\r
+ return createScalarString(g, (String) object);\r
+ else if (String[].class.equals(clazz))\r
+ return createStringArray(g, (String[]) object);\r
+ else if (Integer.class.equals(clazz))\r
+ return createScalarInteger(g, (Integer) object);\r
+ else if (int[].class.equals(clazz))\r
+ return createIntegerArray(g, (int[]) object);\r
+ else if (Long.class.equals(clazz))\r
+ return createScalarLong(g, (Long) object);\r
+ else if (long[].class.equals(clazz))\r
+ return createLongArray(g, (long[]) object);\r
+ else if (Float.class.equals(clazz))\r
+ return createScalarFloat(g, (Float) object);\r
+ else if (float[].class.equals(clazz))\r
+ return createFloatArray(g, (float[]) object);\r
+ else if (Double.class.equals(clazz))\r
+ return createScalarDouble(g, (Double) object);\r
+ else if (double[].class.equals(clazz))\r
+ return createDoubleArray(g, (double[]) object);\r
+ else if (Boolean.class.equals(clazz))\r
+ return createScalarBoolean(g, (Boolean) object);\r
+ else if (boolean[].class.equals(clazz))\r
+ return createBooleanArray(g, (boolean[]) object);\r
+\r
+ throw new UnsupportedOperationException("unsupported object type: " + object);\r
+ }\r
+\r
+ public static Resource create(WriteGraph g, Object ... predicateObjectPairs) throws DatabaseException {\r
+ assert(predicateObjectPairs.length % 2 == 0);\r
+ Resource resource = g.newResource();\r
+ for(int i=0;i<predicateObjectPairs.length;i+=2) {\r
+ Resource predicate = (Resource)predicateObjectPairs[i];\r
+ Object _object = predicateObjectPairs[i+1];\r
+ Resource object = getObjectOrCreatePrimitiveValue(g, _object);\r
+ g.claim(resource, predicate, object);\r
+ }\r
+ return resource;\r
+ }\r
+\r
+ public static Resource create2(WriteGraph g, Resource type, Object ... predicateObjectPairs) throws DatabaseException {\r
+ assert(predicateObjectPairs.length % 2 == 0);\r
+ assert(type != null);\r
+ Resource resource = g.newResource();\r
+ Layer0 b = Layer0.getInstance(g);\r
+ g.claim(resource, b.InstanceOf, null, type);\r
+ for(int i=0;i<predicateObjectPairs.length;i+=2) {\r
+ Resource predicate = (Resource)predicateObjectPairs[i];\r
+ Object _object = predicateObjectPairs[i+1];\r
+ Resource object = getObjectOrCreatePrimitiveValue(g, _object);\r
+ g.claim(resource, predicate, object);\r
+ }\r
+ return resource;\r
+ }\r
+\r
+ /**\r
+ * @deprecated use {@link NameUtils#toString(ReadGraph, Statement)}\r
+ */\r
+ public static String toString(ReadGraph g, Statement stm) throws DatabaseException {\r
+ return NameUtils.toString(g, stm);\r
+ }\r
+\r
+// public static Resource getPossiblePath(ReadGraph graph, Resource resource, Resource ... path) throws DatabaseException {\r
+//\r
+// for(Resource p : path) {\r
+// resource = graph.getPossibleObject(resource, p);\r
+// if(resource == null) return null;\r
+// }\r
+// return resource;\r
+//\r
+// }\r
+ \r
+ public static Resource getPossibleChild(ReadGraph g, Resource parent, String name) throws DatabaseException {\r
+ return g.syncRequest(new UnescapedChildMapOfResource(parent)).get(name);\r
+ }\r
+}\r