]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/templates/GraphTemplate.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graph.compiler / src / org / simantics / graph / compiler / internal / templates / GraphTemplate.java
diff --git a/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/templates/GraphTemplate.java b/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/templates/GraphTemplate.java
new file mode 100644 (file)
index 0000000..abf1a76
--- /dev/null
@@ -0,0 +1,100 @@
+package org.simantics.graph.compiler.internal.templates;\r
+\r
+import gnu.trove.map.hash.TIntIntHashMap;\r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+\r
+import java.util.Arrays;\r
+import java.util.Collection;\r
+\r
+import org.simantics.graph.compiler.ExternalFileLoader;\r
+import org.simantics.graph.compiler.internal.store.LocationStore;\r
+import org.simantics.graph.query.IGraph;\r
+import org.simantics.graph.representation.External;\r
+import org.simantics.graph.representation.Identity;\r
+import org.simantics.graph.representation.Root;\r
+import org.simantics.graph.representation.TransferableGraph1;\r
+import org.simantics.graph.representation.Value;\r
+import org.simantics.graph.store.GraphStore;\r
+import org.simantics.graph.store.IdentityStore;\r
+import org.simantics.graph.store.StatementStore;\r
+import org.simantics.graph.store.ValueStore;\r
+import org.simantics.ltk.Location;\r
+import org.simantics.ltk.Problem;\r
+\r
+public class GraphTemplate implements ITemplate {\r
+       int[] prototypeResources;\r
+       int[] parameterMapping;\r
+       int[] statements;\r
+       Value[] values;\r
+       \r
+       public GraphTemplate(GraphStore store, String[] parameters, TransferableGraph1 tg) {\r
+               prototypeResources = new int[tg.resourceCount];\r
+               Arrays.fill(prototypeResources, -1);\r
+               \r
+               this.values = tg.values;\r
+               this.statements = tg.statements;\r
+               this.parameterMapping = new int[parameters.length];\r
+               TObjectIntHashMap<String> pmap = new TObjectIntHashMap<String>();\r
+               for(int i=0;i<parameters.length;++i)\r
+                       pmap.put(parameters[i], i);\r
+               \r
+               for(Identity id : tg.identities) {\r
+                       if(id.definition instanceof Root) {\r
+                               Root def = (Root)id.definition;\r
+                               if(pmap.containsKey(def.name))\r
+                                       parameterMapping[pmap.get(def.name)] = id.resource;\r
+                               else\r
+                                       prototypeResources[id.resource] = store.identities.getRoot(def.name);\r
+                       }\r
+                       else if(id.definition instanceof External) {\r
+                               External def = (External)id.definition;\r
+                               prototypeResources[id.resource] =\r
+                                       store.identities.getChild(\r
+                                                       prototypeResources[def.parent], \r
+                                                       def.name);\r
+                       }\r
+                       else\r
+                               throw new RuntimeException("Invalid template");\r
+               }\r
+       }\r
+       \r
+       @Override\r
+       public void apply(IGraph graph, GraphStore store, int[] parameters, ExternalFileLoader fileLoader, Collection<Problem> problems) {\r
+               if(parameters.length != parameterMapping.length) {\r
+                       Location location = store.getStore(LocationStore.class)\r
+                               .getLocation(parameters[0]);\r
+                       problems.add(new Problem(location, "A template applied with wrong number of parameters."));\r
+                       return;\r
+               }\r
+               int[] resources = Arrays.copyOf(prototypeResources, prototypeResources.length);\r
+               for(int i=0;i<parameterMapping.length;++i)\r
+                       resources[parameterMapping[i]] = parameters[i];\r
+               \r
+               IdentityStore identities = store.identities;\r
+               for(int i=0;i<resources.length;++i)\r
+                       if(resources[i] < 0)\r
+                               resources[i] = identities.newResource();\r
+               \r
+               StatementStore statementStore = store.statements;\r
+               for(int i=0;i<statements.length;i+=4) {\r
+                       statementStore.add(\r
+                                       resources[statements[i]],\r
+                                       resources[statements[i+1]],\r
+                                       resources[statements[i+3]]\r
+                       );\r
+               }\r
+               \r
+               ValueStore valueStore = store.values;\r
+               for(Value value : values) {\r
+                       valueStore.setValue(resources[value.resource], value.value);\r
+               }\r
+       }\r
+\r
+       public void map(TIntIntHashMap map) {\r
+               for(int i=0;i<prototypeResources.length;++i) {\r
+                       int temp = prototypeResources[i];\r
+                       if(temp >= 0 && map.contains(temp))\r
+                               prototypeResources[i] = map.get(temp);\r
+               }\r
+       }       \r
+}\r