--- /dev/null
+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