1 package org.simantics.graph.compiler.internal.templates;
\r
3 import gnu.trove.map.hash.TIntIntHashMap;
\r
4 import gnu.trove.map.hash.TObjectIntHashMap;
\r
6 import java.util.Arrays;
\r
7 import java.util.Collection;
\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
24 public class GraphTemplate implements ITemplate {
\r
25 int[] prototypeResources;
\r
26 int[] parameterMapping;
\r
30 public GraphTemplate(GraphStore store, String[] parameters, TransferableGraph1 tg) {
\r
31 prototypeResources = new int[tg.resourceCount];
\r
32 Arrays.fill(prototypeResources, -1);
\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
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
47 prototypeResources[id.resource] = store.identities.getRoot(def.name);
\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
57 throw new RuntimeException("Invalid template");
\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
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
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
78 StatementStore statementStore = store.statements;
\r
79 for(int i=0;i<statements.length;i+=4) {
\r
81 resources[statements[i]],
\r
82 resources[statements[i+1]],
\r
83 resources[statements[i+3]]
\r
87 ValueStore valueStore = store.values;
\r
88 for(Value value : values) {
\r
89 valueStore.setValue(resources[value.resource], value.value);
\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