]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/templates/GraphTemplate.java
abf1a768860d31cdba64004d3feb128f8216f144
[simantics/platform.git] / bundles / org.simantics.graph.compiler / src / org / simantics / graph / compiler / internal / templates / GraphTemplate.java
1 package org.simantics.graph.compiler.internal.templates;\r
2 \r
3 import gnu.trove.map.hash.TIntIntHashMap;\r
4 import gnu.trove.map.hash.TObjectIntHashMap;\r
5 \r
6 import java.util.Arrays;\r
7 import java.util.Collection;\r
8 \r
9 import org.simantics.graph.compiler.ExternalFileLoader;\r
10 import org.simantics.graph.compiler.internal.store.LocationStore;\r
11 import org.simantics.graph.query.IGraph;\r
12 import org.simantics.graph.representation.External;\r
13 import org.simantics.graph.representation.Identity;\r
14 import org.simantics.graph.representation.Root;\r
15 import org.simantics.graph.representation.TransferableGraph1;\r
16 import org.simantics.graph.representation.Value;\r
17 import org.simantics.graph.store.GraphStore;\r
18 import org.simantics.graph.store.IdentityStore;\r
19 import org.simantics.graph.store.StatementStore;\r
20 import org.simantics.graph.store.ValueStore;\r
21 import org.simantics.ltk.Location;\r
22 import org.simantics.ltk.Problem;\r
23 \r
24 public class GraphTemplate implements ITemplate {\r
25         int[] prototypeResources;\r
26         int[] parameterMapping;\r
27         int[] statements;\r
28         Value[] values;\r
29         \r
30         public GraphTemplate(GraphStore store, String[] parameters, TransferableGraph1 tg) {\r
31                 prototypeResources = new int[tg.resourceCount];\r
32                 Arrays.fill(prototypeResources, -1);\r
33                 \r
34                 this.values = tg.values;\r
35                 this.statements = tg.statements;\r
36                 this.parameterMapping = new int[parameters.length];\r
37                 TObjectIntHashMap<String> pmap = new TObjectIntHashMap<String>();\r
38                 for(int i=0;i<parameters.length;++i)\r
39                         pmap.put(parameters[i], i);\r
40                 \r
41                 for(Identity id : tg.identities) {\r
42                         if(id.definition instanceof Root) {\r
43                                 Root def = (Root)id.definition;\r
44                                 if(pmap.containsKey(def.name))\r
45                                         parameterMapping[pmap.get(def.name)] = id.resource;\r
46                                 else\r
47                                         prototypeResources[id.resource] = store.identities.getRoot(def.name);\r
48                         }\r
49                         else if(id.definition instanceof External) {\r
50                                 External def = (External)id.definition;\r
51                                 prototypeResources[id.resource] =\r
52                                         store.identities.getChild(\r
53                                                         prototypeResources[def.parent], \r
54                                                         def.name);\r
55                         }\r
56                         else\r
57                                 throw new RuntimeException("Invalid template");\r
58                 }\r
59         }\r
60         \r
61         @Override\r
62         public void apply(IGraph graph, GraphStore store, int[] parameters, ExternalFileLoader fileLoader, Collection<Problem> problems) {\r
63                 if(parameters.length != parameterMapping.length) {\r
64                         Location location = store.getStore(LocationStore.class)\r
65                                 .getLocation(parameters[0]);\r
66                         problems.add(new Problem(location, "A template applied with wrong number of parameters."));\r
67                         return;\r
68                 }\r
69                 int[] resources = Arrays.copyOf(prototypeResources, prototypeResources.length);\r
70                 for(int i=0;i<parameterMapping.length;++i)\r
71                         resources[parameterMapping[i]] = parameters[i];\r
72                 \r
73                 IdentityStore identities = store.identities;\r
74                 for(int i=0;i<resources.length;++i)\r
75                         if(resources[i] < 0)\r
76                                 resources[i] = identities.newResource();\r
77                 \r
78                 StatementStore statementStore = store.statements;\r
79                 for(int i=0;i<statements.length;i+=4) {\r
80                         statementStore.add(\r
81                                         resources[statements[i]],\r
82                                         resources[statements[i+1]],\r
83                                         resources[statements[i+3]]\r
84                         );\r
85                 }\r
86                 \r
87                 ValueStore valueStore = store.values;\r
88                 for(Value value : values) {\r
89                         valueStore.setValue(resources[value.resource], value.value);\r
90                 }\r
91         }\r
92 \r
93         public void map(TIntIntHashMap map) {\r
94                 for(int i=0;i<prototypeResources.length;++i) {\r
95                         int temp = prototypeResources[i];\r
96                         if(temp >= 0 && map.contains(temp))\r
97                                 prototypeResources[i] = map.get(temp);\r
98                 }\r
99         }       \r
100 }\r