]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/utils/SourceLinkUtil.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / utils / SourceLinkUtil.java
index 163d796ac0a8de2827b5223945f3c684207212f6..12c2b5b998aa0fb105f0ce3d879612634dffc9dc 100644 (file)
-package org.simantics.document.linking.utils;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.WriteGraph;\r
-import org.simantics.db.common.request.ObjectsWithType;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.adapter.Instances;\r
-import org.simantics.db.layer0.variable.Variable;\r
-import org.simantics.document.DocumentResource;\r
-import org.simantics.document.linking.ontology.DocumentLink;\r
-import org.simantics.document.linking.report.evaluator.PredefinedVariables;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.modeling.ModelingResources;\r
-import org.simantics.simulation.ontology.SimulationResource;\r
-\r
-/**\r
- * \r
- * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
- *\r
- */\r
-public class SourceLinkUtil {\r
-       \r
-       /**\r
-        * Creates a document link\r
-        * @param graph\r
-        * @param instance Object, where the link is attached\r
-        * @param relation Property relation (functional) or null.\r
-        * @param document\r
-        * @return\r
-        * @throws DatabaseException\r
-        */\r
-       public static Resource createDocumentLink(WriteGraph graph, Resource instance, Resource relation, Resource document) throws DatabaseException {\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               \r
-               Resource link = null;\r
-               DependencyCheckResult result = checkDependecies(graph, document, instance);\r
-               if (result == DependencyCheckResult.NoLocationModel)\r
-                       throw new DatabaseException("Location of document link is not part of a model.");\r
-               if (result == DependencyCheckResult.DifferentModel) {\r
-                       throw new DatabaseException("Location of document link and document are in different models, document link cannot be created.");\r
-               }\r
-               if (result == DependencyCheckResult.NoReferenceModel) {\r
-                       //referred document and location are not in the same model, create an URI reference.\r
-                       String uri = graph.getPossibleURI(document);\r
-                       if (uri != null) {\r
-                               if (relation != null && graph.isInstanceOf(relation, l0.FunctionalRelation)) {\r
-                                       link = SourceLinkUtil.createFunctionalSource(graph, uri, instance, relation);\r
-                               } else {\r
-                                       link = SourceLinkUtil.createInstanceSource(graph, uri, instance);\r
-                               }\r
-                       }\r
-               }\r
-               if (link == null) {\r
-                       if (relation != null && graph.isInstanceOf(relation, l0.FunctionalRelation)) {\r
-                               link = SourceLinkUtil.createFunctionalSource(graph, document, instance, relation);\r
-                       } else {\r
-                               link = SourceLinkUtil.createInstanceSource(graph, document, instance);\r
-                       }\r
-               }\r
-               \r
-               return link;\r
-       }\r
-       \r
-       public static Resource createDocumentLink(WriteGraph graph, Resource instance, Resource document) throws DatabaseException {\r
-           return createDocumentLink(graph, instance, null, document);\r
-       }\r
-       \r
-       public static Resource createInstanceSource(WriteGraph graph, Resource reference, Resource location) throws DatabaseException {\r
-               return createInstanceSource(graph, reference, location, "");\r
-       }\r
-\r
-       public static Resource createInstanceSource(WriteGraph graph, Resource reference, Resource location, String comment) throws DatabaseException {\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               \r
-               \r
-               \r
-               // prevent duplicate references         \r
-               Collection<Resource> sources = graph.syncRequest(new ObjectsWithType(location, sl.hasFunctionalSource, sl.InstanceSource));\r
-               for (Resource source : sources) {\r
-                       if (reference.equals(graph.getPossibleObject(source, sl.hasSourceReference)))\r
-                               return source;\r
-               }\r
-               \r
-               if (!ensureDependencies(graph, reference, location))\r
-                       return null;\r
-               \r
-               Resource source = graph.newResource();\r
-               graph.claim(source, l0.InstanceOf, sl.InstanceSource);\r
-               graph.claim(source, sl.hasSourceReference, reference);\r
-               graph.claimLiteral(source, sl.hasSourceComment, comment, Bindings.STRING);\r
-               graph.claim(location, sl.hasInstanceSource, source);\r
-               // search / indexing requires this\r
-               graph.claim(location, l0.ConsistsOf, source);\r
-               graph.claimLiteral(source, l0.HasName,UUID.randomUUID().toString(), Bindings.STRING);\r
-               return source;\r
-       }\r
-       \r
-       public static Resource createInstanceSource(WriteGraph graph, String reference, Resource location) throws DatabaseException {\r
-               return createInstanceSource(graph, reference, location, "");\r
-       }\r
-\r
-       public static Resource createInstanceSource(WriteGraph graph, String reference, Resource location, String comment) throws DatabaseException {\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               \r
-               \r
-               \r
-               // prevent duplicate references         \r
-               Collection<Resource> sources = graph.syncRequest(new ObjectsWithType(location, sl.hasFunctionalSource, sl.InstanceSource));\r
-               for (Resource source : sources) {\r
-                       if (reference.equals(graph.getPossibleRelatedValue(source, sl.hasSourceReferenceURI, Bindings.STRING)))\r
-                               return source;\r
-               }\r
-               \r
-               if (!ensureDependencies(graph, null, location))\r
-                       return null;\r
-               \r
-               Resource source = graph.newResource();\r
-               graph.claim(source, l0.InstanceOf, sl.InstanceSource);\r
-               graph.claimLiteral(source, sl.hasSourceReferenceURI, reference, Bindings.STRING);\r
-               graph.claimLiteral(source, sl.hasSourceComment, comment, Bindings.STRING);\r
-               graph.claim(location, sl.hasInstanceSource, source);\r
-               // search / indexing requires this\r
-               graph.claim(location, l0.ConsistsOf, source);\r
-               graph.claimLiteral(source, l0.HasName,UUID.randomUUID().toString(), Bindings.STRING);\r
-               return source;\r
-       }\r
-       \r
-       public static Resource createFunctionalSource(WriteGraph graph, Resource reference, Resource location, Resource relation) throws DatabaseException {\r
-               return createFunctionalSource(graph, reference, location, relation, "");\r
-       }\r
-\r
-       \r
-       public static Resource createFunctionalSource(WriteGraph graph, Resource reference, Resource location, Resource relation, String comment) throws DatabaseException {\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               \r
-               \r
-               \r
-               // prevent duplicate references\r
-               Collection<Resource> sources = graph.syncRequest(new ObjectsWithType(location, sl.hasFunctionalSource, sl.FunctionalSource));\r
-               for (Resource source : sources) {\r
-                       if (relation.equals(graph.getPossibleObject(source, sl.consernsRelation)) && \r
-                               reference.equals(graph.getPossibleObject(source, sl.hasSourceReference)))\r
-                               return null;\r
-               }\r
-               \r
-               if (!ensureDependencies(graph, reference, location))\r
-                       return null;\r
-               \r
-               Resource source = graph.newResource();\r
-               graph.claim(source, l0.InstanceOf, sl.FunctionalSource);\r
-               graph.claim(source, sl.hasSourceReference, reference);\r
-               graph.claimLiteral(source, sl.hasSourceComment, comment, Bindings.STRING);\r
-               graph.claim(source, sl.consernsRelation, relation);\r
-               \r
-               graph.claim(location, sl.hasFunctionalSource, source);\r
-               // search / indexing requires this\r
-               graph.claim(location, l0.ConsistsOf, source);\r
-               graph.claimLiteral(source, l0.HasName,UUID.randomUUID().toString(), Bindings.STRING);\r
-               return source;\r
-       }\r
-       \r
-       public static Resource createFunctionalSource(WriteGraph graph, String reference, Resource location, Resource relation) throws DatabaseException {\r
-               return createFunctionalSource(graph, reference, location, relation, "");\r
-       }\r
-\r
-       \r
-       public static Resource createFunctionalSource(WriteGraph graph, String reference, Resource location, Resource relation, String comment) throws DatabaseException {\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               \r
-               \r
-               \r
-               // prevent duplicate references\r
-               Collection<Resource> sources = graph.syncRequest(new ObjectsWithType(location, sl.hasFunctionalSource, sl.FunctionalSource));\r
-               for (Resource source : sources) {\r
-                       if (relation.equals(graph.getPossibleObject(source, sl.consernsRelation)) && \r
-                               reference.equals(graph.getPossibleRelatedValue(source, sl.hasSourceReferenceURI, Bindings.STRING)))\r
-                               return null;\r
-               }\r
-               \r
-               if (!ensureDependencies(graph, null, location))\r
-                       return null;\r
-               \r
-               Resource source = graph.newResource();\r
-               graph.claim(source, l0.InstanceOf, sl.FunctionalSource);\r
-               graph.claimLiteral(source, sl.hasSourceReferenceURI, reference, Bindings.STRING);\r
-               graph.claimLiteral(source, sl.hasSourceComment, comment, Bindings.STRING);\r
-               graph.claim(source, sl.consernsRelation, relation);\r
-               \r
-               graph.claim(location, sl.hasFunctionalSource, source);\r
-               // search / indexing requires this\r
-               graph.claim(location, l0.ConsistsOf, source);\r
-               graph.claimLiteral(source, l0.HasName,UUID.randomUUID().toString(), Bindings.STRING);\r
-               return source;\r
-       }\r
-       \r
-       public static Resource getModel(ReadGraph graph, Resource location) throws DatabaseException {\r
-               SimulationResource sim = SimulationResource.getInstance(graph);\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               List<Resource> list = new ArrayList<Resource>();\r
-               list.add(l0.PartOf);\r
-               list.add(l0.IsDependencyOf);\r
-               list.add(l0.PropertyOf);\r
-               list.add(l0.IsOwnedBy);\r
-               \r
-               Resource r = location;\r
-               Resource model = null;\r
-               while (r != null) {\r
-                       if (graph.isInstanceOf(r, sim.Model)) {\r
-                               model = r;\r
-                               break;\r
-                       }\r
-                       Resource r2 = null;\r
-                       for (Resource rel : list) {\r
-                               r2 = graph.getPossibleObject(r, rel);\r
-                               if (r2 != null)\r
-                                       break;\r
-                       }\r
-                       r = r2;\r
-               }\r
-               \r
-               return model;\r
-       }\r
-       \r
-       /**\r
-        * Ensures that the model's ontology dependencies are correct, and the reference will not create dependency between two models.\r
-        * \r
-        * @param graph\r
-        * @param reference\r
-        * @param location\r
-        * @return true, if everything is correct. \r
-        * @throws DatabaseException\r
-        */\r
-       private static boolean ensureDependencies(WriteGraph graph, Resource reference, Resource location) throws DatabaseException {\r
-\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               Resource model = getModel(graph, location);\r
-\r
-               if (model == null)\r
-                       return true;\r
-\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               Set<Resource> depencecies = new HashSet<Resource>();\r
-               depencecies.add(getOntology(graph, sl.Source));\r
-               if (reference != null) {\r
-                       Resource refModel = getModel(graph, reference);\r
-                       if (refModel != null && !refModel.equals(model))\r
-                               return false;\r
-                       for (Resource t : graph.getTypes(reference)) {\r
-                               Resource o = getOntology(graph, t);\r
-                               if (o != null)\r
-                                       depencecies.add(o);\r
-                       }\r
-               }\r
-               \r
-               Collection<Resource> linkedTo = graph.getObjects(model, l0.IsLinkedTo);\r
-               for (Resource dep : depencecies) {\r
-                       if (!linkedTo.contains(dep)) {\r
-                               graph.claim(model, l0.IsLinkedTo, dep);\r
-                       }\r
-               }\r
-               return true;\r
-       }\r
-       \r
-       private static enum DependencyCheckResult{NoLocationModel, NoReferenceModel, SameModel,DifferentModel};\r
-       \r
-       private static DependencyCheckResult checkDependecies(ReadGraph graph, Resource reference, Resource location) throws DatabaseException{\r
-               Resource model = getModel(graph, location);\r
-\r
-               if (model == null)\r
-                       return DependencyCheckResult.NoLocationModel;\r
-               Resource refModel = getModel(graph, reference);\r
-               if (refModel != null) {\r
-                       if (refModel.equals(model))\r
-                               return DependencyCheckResult.SameModel;\r
-                       return DependencyCheckResult.DifferentModel;\r
-               }\r
-               return DependencyCheckResult.NoReferenceModel;\r
-       }\r
-       \r
-       \r
-       private static Resource getOntology(ReadGraph graph, Resource type) throws DatabaseException{\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               Resource r = type;\r
-               while (r != null) {\r
-                       if (graph.isInstanceOf(r, l0.Ontology))\r
-                               return r;\r
-                       r = graph.getPossibleObject(r, l0.PartOf);\r
-               }\r
-               \r
-               r = type;\r
-               while (r != null) {\r
-                       if (graph.isInstanceOf(r, l0.Library))\r
-                               return r;\r
-                       r = graph.getPossibleObject(r, l0.PartOf);\r
-               }       \r
-               return null;\r
-       }\r
-       \r
-       public static boolean isSource(ReadGraph graph, Resource source) throws DatabaseException{\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               return (graph.isInstanceOf(source, sl.Source));\r
-       }\r
-       \r
-       public static boolean isValidSource(ReadGraph graph, Resource source) throws DatabaseException{\r
-               Resource reference = getReferredDocument(graph, source);\r
-               return isValidReference(graph, reference);\r
-       }\r
-       \r
-       public static boolean isUpToDateSource(ReadGraph graph, Resource source) throws DatabaseException{\r
-               Resource reference = getReferredDocument(graph, source);\r
-               return isUpToDateReference(graph, reference);\r
-       }\r
-       \r
-       public static Resource getReferredDocument(ReadGraph graph, Resource source) throws DatabaseException {\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               Resource document =  graph.getPossibleObject(source, sl.hasSourceReference);\r
-               if (document != null) {\r
-                       return document;\r
-               }\r
-               String URI = graph.getPossibleRelatedValue(source, sl.hasSourceReferenceURI, Bindings.STRING);\r
-               if (URI != null)\r
-                       return graph.getPossibleResource(URI);\r
-               return null;\r
-       }\r
-       \r
-       public static boolean isValidReference(ReadGraph graph, Resource reference) throws DatabaseException{\r
-               if (reference == null)\r
-                       return false;\r
-               return graph.hasStatement(reference);\r
-               \r
-       }\r
-       \r
-       public static boolean isUpToDateReference(ReadGraph graph, Resource reference) throws DatabaseException{\r
-               if (reference == null)\r
-                       return false;\r
-               DocumentResource doc = DocumentResource.getInstance(graph);\r
-               return !graph.hasStatement(reference,doc.HasNewerVersion);\r
-               \r
-       }\r
-       \r
-       public static void updateToLatest(WriteGraph graph, Resource source) throws DatabaseException {\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               DocumentResource doc = DocumentResource.getInstance(graph);\r
-               \r
-               if (!graph.isInstanceOf(source, sl.Source))\r
-                       return;\r
-               Resource reference = getReferredDocument(graph, source);\r
-               Resource newRef = reference;\r
-               while (true) {\r
-                       Resource r = graph.getPossibleObject(newRef, doc.HasNewerVersion);\r
-                       if (r != null)\r
-                               newRef = r;\r
-                       else\r
-                               break;\r
-               }\r
-               if (newRef.equals(reference))\r
-                       return;\r
-               if (graph.hasStatement(source, sl.hasSourceReference)) {\r
-                       graph.deny(source, sl.hasSourceReference,reference);\r
-                       graph.claim(source, sl.hasSourceReference, newRef);\r
-               } else if (graph.hasStatement(source,sl.hasSourceReferenceURI)) {\r
-                       graph.deny(source, sl.hasSourceReferenceURI);\r
-                       graph.claimLiteral(source, sl.hasSourceReferenceURI, graph.getURI(newRef),Bindings.STRING);\r
-               }\r
-       }\r
-       \r
-       public static Collection<Resource> findAllSources(ReadGraph graph, Resource model, Resource resource) throws DatabaseException {\r
-               DocumentLink sl = DocumentLink.getInstance(graph);\r
-               Instances instancesQuery = graph.adapt(sl.Source, Instances.class);\r
-        Collection<Resource> found = instancesQuery.find(graph, model);\r
-        Collection<Resource> result = new ArrayList<Resource>();\r
-        for (Resource source : found) {\r
-               if (graph.hasStatement(source,sl.hasSourceReference,resource) || graph.hasStatement(source, sl.hasSourceReferenceURI))\r
-                       result.add(source);\r
-        }\r
-        return result;\r
-       }\r
-       \r
-       public static String getValueString(Object value) {\r
-               if (value.getClass().isArray()) {\r
-                       if (value instanceof double[]) {\r
-                               return Arrays.toString((double[])value);\r
-                       } else if (value instanceof float[]) {\r
-                               return Arrays.toString((float[])value);\r
-                       } else if (value instanceof int[]) {\r
-                               return Arrays.toString((int[])value);\r
-                       } else if (value instanceof boolean[]) {\r
-                               return Arrays.toString((boolean[])value);\r
-                       } else if (value instanceof byte[]) {\r
-                               return Arrays.toString((byte[])value);\r
-                       } else if (value instanceof String[]) {\r
-                               return Arrays.toString((String[])value);\r
-                       } else if (value instanceof Object[]) {\r
-                               return Arrays.toString((Object[])value);\r
-                       } else {\r
-                               return "TODO: Array " + value.getClass().getSimpleName();\r
-                       }\r
-               } else {\r
-                       return value.toString();\r
-               }\r
-       }\r
-       \r
-       public static List<Resource> getPath(ReadGraph graph, Resource model, Resource obj) throws DatabaseException {\r
-               Layer0 l0 = Layer0.getInstance(graph);\r
-               List<Resource> path = new ArrayList<Resource>();\r
-               Resource r = obj;\r
-               while (r != null && !r.equals(model)) {\r
-                       path.add(0, r);\r
-                       r = graph.getPossibleObject(r, l0.PartOf);\r
-               }\r
-               return path;\r
-       }\r
-       \r
-       public static List<Resource> getDiagramPath(ReadGraph graph, Resource model, Resource obj) throws DatabaseException {\r
-               ModelingResources mod = ModelingResources.getInstance(graph);\r
-               List<Resource> path = getPath(graph, model, obj);\r
-               for (int i = path.size()-1; i >= 0; i--) {\r
-                       if (graph.hasStatement(path.get(i),mod.CompositeToDiagram))\r
-                               return path.subList(0, i+1);\r
-               }\r
-               return null;\r
-       }\r
-       \r
-       public static String getCustomizedString(ReadGraph graph, Resource document, List<String> annotationContent) throws DatabaseException{\r
-               String label = "";\r
-               Variable doc = graph.adapt(document, Variable.class);\r
-               for (String path : annotationContent) {\r
-                       if (path.startsWith("\"") && path.endsWith("\"")) {\r
-                               label += path.substring(1,path.length()-1)+ " ";\r
-                       } else {\r
-                               Variable v = PredefinedVariables.getInstance().getVariable(graph, path, null, doc);\r
-                               if (v != null) {\r
-                                       label += v.getValue(graph) + " ";\r
-                               }\r
-                       }\r
-               }\r
-               return label;\r
-       }\r
-}\r
+package org.simantics.document.linking.utils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.ObjectsWithType;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.adapter.Instances;
+import org.simantics.db.layer0.variable.Variable;
+import org.simantics.document.DocumentResource;
+import org.simantics.document.linking.ontology.DocumentLink;
+import org.simantics.document.linking.report.evaluator.PredefinedVariables;
+import org.simantics.layer0.Layer0;
+import org.simantics.modeling.ModelingResources;
+import org.simantics.simulation.ontology.SimulationResource;
+
+/**
+ * 
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
+ *
+ */
+public class SourceLinkUtil {
+       
+       /**
+        * Creates a document link
+        * @param graph
+        * @param instance Object, where the link is attached
+        * @param relation Property relation (functional) or null.
+        * @param document
+        * @return
+        * @throws DatabaseException
+        */
+       public static Resource createDocumentLink(WriteGraph graph, Resource instance, Resource relation, Resource document) throws DatabaseException {
+               Layer0 l0 = Layer0.getInstance(graph);
+               
+               Resource link = null;
+               DependencyCheckResult result = checkDependecies(graph, document, instance);
+               if (result == DependencyCheckResult.NoLocationModel)
+                       throw new DatabaseException("Location of document link is not part of a model.");
+               if (result == DependencyCheckResult.DifferentModel) {
+                       throw new DatabaseException("Location of document link and document are in different models, document link cannot be created.");
+               }
+               if (result == DependencyCheckResult.NoReferenceModel) {
+                       //referred document and location are not in the same model, create an URI reference.
+                       String uri = graph.getPossibleURI(document);
+                       if (uri != null) {
+                               if (relation != null && graph.isInstanceOf(relation, l0.FunctionalRelation)) {
+                                       link = SourceLinkUtil.createFunctionalSource(graph, uri, instance, relation);
+                               } else {
+                                       link = SourceLinkUtil.createInstanceSource(graph, uri, instance);
+                               }
+                       }
+               }
+               if (link == null) {
+                       if (relation != null && graph.isInstanceOf(relation, l0.FunctionalRelation)) {
+                               link = SourceLinkUtil.createFunctionalSource(graph, document, instance, relation);
+                       } else {
+                               link = SourceLinkUtil.createInstanceSource(graph, document, instance);
+                       }
+               }
+               
+               return link;
+       }
+       
+       public static Resource createDocumentLink(WriteGraph graph, Resource instance, Resource document) throws DatabaseException {
+           return createDocumentLink(graph, instance, null, document);
+       }
+       
+       public static Resource createInstanceSource(WriteGraph graph, Resource reference, Resource location) throws DatabaseException {
+               return createInstanceSource(graph, reference, location, "");
+       }
+
+       public static Resource createInstanceSource(WriteGraph graph, Resource reference, Resource location, String comment) throws DatabaseException {
+               Layer0 l0 = Layer0.getInstance(graph);
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               
+               
+               
+               // prevent duplicate references         
+               Collection<Resource> sources = graph.syncRequest(new ObjectsWithType(location, sl.hasFunctionalSource, sl.InstanceSource));
+               for (Resource source : sources) {
+                       if (reference.equals(graph.getPossibleObject(source, sl.hasSourceReference)))
+                               return source;
+               }
+               
+               if (!ensureDependencies(graph, reference, location))
+                       return null;
+               
+               Resource source = graph.newResource();
+               graph.claim(source, l0.InstanceOf, sl.InstanceSource);
+               graph.claim(source, sl.hasSourceReference, reference);
+               graph.claimLiteral(source, sl.hasSourceComment, comment, Bindings.STRING);
+               graph.claim(location, sl.hasInstanceSource, source);
+               // search / indexing requires this
+               graph.claim(location, l0.ConsistsOf, source);
+               graph.claimLiteral(source, l0.HasName,UUID.randomUUID().toString(), Bindings.STRING);
+               return source;
+       }
+       
+       public static Resource createInstanceSource(WriteGraph graph, String reference, Resource location) throws DatabaseException {
+               return createInstanceSource(graph, reference, location, "");
+       }
+
+       public static Resource createInstanceSource(WriteGraph graph, String reference, Resource location, String comment) throws DatabaseException {
+               Layer0 l0 = Layer0.getInstance(graph);
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               
+               
+               
+               // prevent duplicate references         
+               Collection<Resource> sources = graph.syncRequest(new ObjectsWithType(location, sl.hasFunctionalSource, sl.InstanceSource));
+               for (Resource source : sources) {
+                       if (reference.equals(graph.getPossibleRelatedValue(source, sl.hasSourceReferenceURI, Bindings.STRING)))
+                               return source;
+               }
+               
+               if (!ensureDependencies(graph, null, location))
+                       return null;
+               
+               Resource source = graph.newResource();
+               graph.claim(source, l0.InstanceOf, sl.InstanceSource);
+               graph.claimLiteral(source, sl.hasSourceReferenceURI, reference, Bindings.STRING);
+               graph.claimLiteral(source, sl.hasSourceComment, comment, Bindings.STRING);
+               graph.claim(location, sl.hasInstanceSource, source);
+               // search / indexing requires this
+               graph.claim(location, l0.ConsistsOf, source);
+               graph.claimLiteral(source, l0.HasName,UUID.randomUUID().toString(), Bindings.STRING);
+               return source;
+       }
+       
+       public static Resource createFunctionalSource(WriteGraph graph, Resource reference, Resource location, Resource relation) throws DatabaseException {
+               return createFunctionalSource(graph, reference, location, relation, "");
+       }
+
+       
+       public static Resource createFunctionalSource(WriteGraph graph, Resource reference, Resource location, Resource relation, String comment) throws DatabaseException {
+               Layer0 l0 = Layer0.getInstance(graph);
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               
+               
+               
+               // prevent duplicate references
+               Collection<Resource> sources = graph.syncRequest(new ObjectsWithType(location, sl.hasFunctionalSource, sl.FunctionalSource));
+               for (Resource source : sources) {
+                       if (relation.equals(graph.getPossibleObject(source, sl.consernsRelation)) && 
+                               reference.equals(graph.getPossibleObject(source, sl.hasSourceReference)))
+                               return null;
+               }
+               
+               if (!ensureDependencies(graph, reference, location))
+                       return null;
+               
+               Resource source = graph.newResource();
+               graph.claim(source, l0.InstanceOf, sl.FunctionalSource);
+               graph.claim(source, sl.hasSourceReference, reference);
+               graph.claimLiteral(source, sl.hasSourceComment, comment, Bindings.STRING);
+               graph.claim(source, sl.consernsRelation, relation);
+               
+               graph.claim(location, sl.hasFunctionalSource, source);
+               // search / indexing requires this
+               graph.claim(location, l0.ConsistsOf, source);
+               graph.claimLiteral(source, l0.HasName,UUID.randomUUID().toString(), Bindings.STRING);
+               return source;
+       }
+       
+       public static Resource createFunctionalSource(WriteGraph graph, String reference, Resource location, Resource relation) throws DatabaseException {
+               return createFunctionalSource(graph, reference, location, relation, "");
+       }
+
+       
+       public static Resource createFunctionalSource(WriteGraph graph, String reference, Resource location, Resource relation, String comment) throws DatabaseException {
+               Layer0 l0 = Layer0.getInstance(graph);
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               
+               
+               
+               // prevent duplicate references
+               Collection<Resource> sources = graph.syncRequest(new ObjectsWithType(location, sl.hasFunctionalSource, sl.FunctionalSource));
+               for (Resource source : sources) {
+                       if (relation.equals(graph.getPossibleObject(source, sl.consernsRelation)) && 
+                               reference.equals(graph.getPossibleRelatedValue(source, sl.hasSourceReferenceURI, Bindings.STRING)))
+                               return null;
+               }
+               
+               if (!ensureDependencies(graph, null, location))
+                       return null;
+               
+               Resource source = graph.newResource();
+               graph.claim(source, l0.InstanceOf, sl.FunctionalSource);
+               graph.claimLiteral(source, sl.hasSourceReferenceURI, reference, Bindings.STRING);
+               graph.claimLiteral(source, sl.hasSourceComment, comment, Bindings.STRING);
+               graph.claim(source, sl.consernsRelation, relation);
+               
+               graph.claim(location, sl.hasFunctionalSource, source);
+               // search / indexing requires this
+               graph.claim(location, l0.ConsistsOf, source);
+               graph.claimLiteral(source, l0.HasName,UUID.randomUUID().toString(), Bindings.STRING);
+               return source;
+       }
+       
+       public static Resource getModel(ReadGraph graph, Resource location) throws DatabaseException {
+               SimulationResource sim = SimulationResource.getInstance(graph);
+               Layer0 l0 = Layer0.getInstance(graph);
+               List<Resource> list = new ArrayList<Resource>();
+               list.add(l0.PartOf);
+               list.add(l0.IsDependencyOf);
+               list.add(l0.PropertyOf);
+               list.add(l0.IsOwnedBy);
+               
+               Resource r = location;
+               Resource model = null;
+               while (r != null) {
+                       if (graph.isInstanceOf(r, sim.Model)) {
+                               model = r;
+                               break;
+                       }
+                       Resource r2 = null;
+                       for (Resource rel : list) {
+                               r2 = graph.getPossibleObject(r, rel);
+                               if (r2 != null)
+                                       break;
+                       }
+                       r = r2;
+               }
+               
+               return model;
+       }
+       
+       /**
+        * Ensures that the model's ontology dependencies are correct, and the reference will not create dependency between two models.
+        * 
+        * @param graph
+        * @param reference
+        * @param location
+        * @return true, if everything is correct. 
+        * @throws DatabaseException
+        */
+       private static boolean ensureDependencies(WriteGraph graph, Resource reference, Resource location) throws DatabaseException {
+
+               Layer0 l0 = Layer0.getInstance(graph);
+               Resource model = getModel(graph, location);
+
+               if (model == null)
+                       return true;
+
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               Set<Resource> depencecies = new HashSet<Resource>();
+               depencecies.add(getOntology(graph, sl.Source));
+               if (reference != null) {
+                       Resource refModel = getModel(graph, reference);
+                       if (refModel != null && !refModel.equals(model))
+                               return false;
+                       for (Resource t : graph.getTypes(reference)) {
+                               Resource o = getOntology(graph, t);
+                               if (o != null)
+                                       depencecies.add(o);
+                       }
+               }
+               
+               Collection<Resource> linkedTo = graph.getObjects(model, l0.IsLinkedTo);
+               for (Resource dep : depencecies) {
+                       if (!linkedTo.contains(dep)) {
+                               graph.claim(model, l0.IsLinkedTo, dep);
+                       }
+               }
+               return true;
+       }
+       
+       private static enum DependencyCheckResult{NoLocationModel, NoReferenceModel, SameModel,DifferentModel};
+       
+       private static DependencyCheckResult checkDependecies(ReadGraph graph, Resource reference, Resource location) throws DatabaseException{
+               Resource model = getModel(graph, location);
+
+               if (model == null)
+                       return DependencyCheckResult.NoLocationModel;
+               Resource refModel = getModel(graph, reference);
+               if (refModel != null) {
+                       if (refModel.equals(model))
+                               return DependencyCheckResult.SameModel;
+                       return DependencyCheckResult.DifferentModel;
+               }
+               return DependencyCheckResult.NoReferenceModel;
+       }
+       
+       
+       private static Resource getOntology(ReadGraph graph, Resource type) throws DatabaseException{
+               Layer0 l0 = Layer0.getInstance(graph);
+               Resource r = type;
+               while (r != null) {
+                       if (graph.isInstanceOf(r, l0.Ontology))
+                               return r;
+                       r = graph.getPossibleObject(r, l0.PartOf);
+               }
+               
+               r = type;
+               while (r != null) {
+                       if (graph.isInstanceOf(r, l0.Library))
+                               return r;
+                       r = graph.getPossibleObject(r, l0.PartOf);
+               }       
+               return null;
+       }
+       
+       public static boolean isSource(ReadGraph graph, Resource source) throws DatabaseException{
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               return (graph.isInstanceOf(source, sl.Source));
+       }
+       
+       public static boolean isValidSource(ReadGraph graph, Resource source) throws DatabaseException{
+               Resource reference = getReferredDocument(graph, source);
+               return isValidReference(graph, reference);
+       }
+       
+       public static boolean isUpToDateSource(ReadGraph graph, Resource source) throws DatabaseException{
+               Resource reference = getReferredDocument(graph, source);
+               return isUpToDateReference(graph, reference);
+       }
+       
+       public static Resource getReferredDocument(ReadGraph graph, Resource source) throws DatabaseException {
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               Resource document =  graph.getPossibleObject(source, sl.hasSourceReference);
+               if (document != null) {
+                       return document;
+               }
+               String URI = graph.getPossibleRelatedValue(source, sl.hasSourceReferenceURI, Bindings.STRING);
+               if (URI != null)
+                       return graph.getPossibleResource(URI);
+               return null;
+       }
+       
+       public static boolean isValidReference(ReadGraph graph, Resource reference) throws DatabaseException{
+               if (reference == null)
+                       return false;
+               return graph.hasStatement(reference);
+               
+       }
+       
+       public static boolean isUpToDateReference(ReadGraph graph, Resource reference) throws DatabaseException{
+               if (reference == null)
+                       return false;
+               DocumentResource doc = DocumentResource.getInstance(graph);
+               return !graph.hasStatement(reference,doc.HasNewerVersion);
+               
+       }
+       
+       public static void updateToLatest(WriteGraph graph, Resource source) throws DatabaseException {
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               DocumentResource doc = DocumentResource.getInstance(graph);
+               
+               if (!graph.isInstanceOf(source, sl.Source))
+                       return;
+               Resource reference = getReferredDocument(graph, source);
+               Resource newRef = reference;
+               while (true) {
+                       Resource r = graph.getPossibleObject(newRef, doc.HasNewerVersion);
+                       if (r != null)
+                               newRef = r;
+                       else
+                               break;
+               }
+               if (newRef.equals(reference))
+                       return;
+               if (graph.hasStatement(source, sl.hasSourceReference)) {
+                       graph.deny(source, sl.hasSourceReference,reference);
+                       graph.claim(source, sl.hasSourceReference, newRef);
+               } else if (graph.hasStatement(source,sl.hasSourceReferenceURI)) {
+                       graph.deny(source, sl.hasSourceReferenceURI);
+                       graph.claimLiteral(source, sl.hasSourceReferenceURI, graph.getURI(newRef),Bindings.STRING);
+               }
+       }
+       
+       public static Collection<Resource> findAllSources(ReadGraph graph, Resource model, Resource resource) throws DatabaseException {
+               DocumentLink sl = DocumentLink.getInstance(graph);
+               Instances instancesQuery = graph.adapt(sl.Source, Instances.class);
+        Collection<Resource> found = instancesQuery.find(graph, model);
+        Collection<Resource> result = new ArrayList<Resource>();
+        for (Resource source : found) {
+               if (graph.hasStatement(source,sl.hasSourceReference,resource) || graph.hasStatement(source, sl.hasSourceReferenceURI))
+                       result.add(source);
+        }
+        return result;
+       }
+       
+       public static String getValueString(Object value) {
+               if (value.getClass().isArray()) {
+                       if (value instanceof double[]) {
+                               return Arrays.toString((double[])value);
+                       } else if (value instanceof float[]) {
+                               return Arrays.toString((float[])value);
+                       } else if (value instanceof int[]) {
+                               return Arrays.toString((int[])value);
+                       } else if (value instanceof boolean[]) {
+                               return Arrays.toString((boolean[])value);
+                       } else if (value instanceof byte[]) {
+                               return Arrays.toString((byte[])value);
+                       } else if (value instanceof String[]) {
+                               return Arrays.toString((String[])value);
+                       } else if (value instanceof Object[]) {
+                               return Arrays.toString((Object[])value);
+                       } else {
+                               return "TODO: Array " + value.getClass().getSimpleName();
+                       }
+               } else {
+                       return value.toString();
+               }
+       }
+       
+       public static List<Resource> getPath(ReadGraph graph, Resource model, Resource obj) throws DatabaseException {
+               Layer0 l0 = Layer0.getInstance(graph);
+               List<Resource> path = new ArrayList<Resource>();
+               Resource r = obj;
+               while (r != null && !r.equals(model)) {
+                       path.add(0, r);
+                       r = graph.getPossibleObject(r, l0.PartOf);
+               }
+               return path;
+       }
+       
+       public static List<Resource> getDiagramPath(ReadGraph graph, Resource model, Resource obj) throws DatabaseException {
+               ModelingResources mod = ModelingResources.getInstance(graph);
+               List<Resource> path = getPath(graph, model, obj);
+               for (int i = path.size()-1; i >= 0; i--) {
+                       if (graph.hasStatement(path.get(i),mod.CompositeToDiagram))
+                               return path.subList(0, i+1);
+               }
+               return null;
+       }
+       
+       public static String getCustomizedString(ReadGraph graph, Resource document, List<String> annotationContent) throws DatabaseException{
+               String label = "";
+               Variable doc = graph.adapt(document, Variable.class);
+               for (String path : annotationContent) {
+                       if (path.startsWith("\"") && path.endsWith("\"")) {
+                               label += path.substring(1,path.length()-1)+ " ";
+                       } else {
+                               Variable v = PredefinedVariables.getInstance().getVariable(graph, path, null, doc);
+                               if (v != null) {
+                                       label += v.getValue(graph) + " ";
+                               }
+                       }
+               }
+               return label;
+       }
+}