1 package org.simantics.graph.compiler.internal.procedures;
\r
3 import gnu.trove.procedure.TIntObjectProcedure;
\r
4 import gnu.trove.set.hash.THashSet;
\r
6 import java.util.Collection;
\r
8 import org.simantics.databoard.Bindings;
\r
9 import org.simantics.databoard.binding.mutable.Variant;
\r
10 import org.simantics.graph.compiler.internal.store.LocationStore;
\r
11 import org.simantics.graph.compiler.internal.templates.TemplateDefinition;
\r
12 import org.simantics.graph.compiler.internal.templates.TemplateDefinitionStore;
\r
13 import org.simantics.graph.query.CompositeGraph;
\r
14 import org.simantics.graph.query.Paths;
\r
15 import org.simantics.graph.representation.TransferableGraph1;
\r
16 import org.simantics.graph.store.GraphStore;
\r
17 import org.simantics.ltk.Location;
\r
18 import org.simantics.ltk.Problem;
\r
20 public class CreateTemplates implements Runnable {
\r
22 CompositeGraph graph;
\r
24 Collection<Problem> problems;
\r
27 int HasTemplateParameters;
\r
32 public CreateTemplates(CompositeGraph graph, GraphStore store,
\r
33 Collection<Problem> problems) {
\r
36 this.problems = problems;
\r
41 TemplateDefinitionStore templateStore = store.getStore(TemplateDefinitionStore.class);
\r
42 if(templateStore == null || templateStore.isEmpty())
\r
45 Paths paths = graph.getPaths();
\r
46 HasTemplate = store.identities.createPathToId(paths.HasTemplate);
\r
47 HasTemplateParameters = store.identities.createPathToId(paths.HasTemplateParameters);
\r
48 InstanceOf = store.identities.createPathToId(paths.InstanceOf);
\r
49 StringArray = store.identities.createPathToId(paths.StringArray);
\r
50 Graph = store.identities.createPathToId(paths.Graph);
\r
52 templateStore.forTemplateDefinitions(
\r
53 new TIntObjectProcedure<TemplateDefinition>() {
\r
55 public boolean execute(int templateId, TemplateDefinition template) {
\r
56 if(validateTemplate(templateId, template))
\r
57 writeTemplate(templateId, template);
\r
63 private boolean validateTemplate(int templateId, TemplateDefinition template) {
\r
64 THashSet<String> parameters = new THashSet<String>();
\r
66 for(String parameter : template.getParameters())
\r
67 parameters.add(parameter);
\r
68 boolean isValid = true;
\r
69 GraphStore templateStore = template.getTemplate();
\r
70 for(String root : templateStore.identities.getRoots())
\r
71 if(!parameters.contains(root)) {
\r
72 LocationStore templateLocations = templateStore.getStore(LocationStore.class);
\r
73 Location location = templateLocations == null ? null
\r
74 : templateLocations.getLocation(templateStore.identities.getRoot(root));
\r
75 if(location == null) {
\r
76 LocationStore locations = store.getStore(LocationStore.class);
\r
77 location = locations == null ? null
\r
78 : locations.getLocation(templateId);
\r
80 problems.add(new Problem(
\r
82 "Graph template does not have parameter %" + root + "."
\r
89 private void writeTemplate(int templateId,
\r
90 TemplateDefinition template) {
\r
91 TransferableGraph1 tg = template.convert(graph, store, problems);
\r
93 int templateValue = store.identities.newResource();
\r
94 store.values.setValue(templateValue, new Variant(TransferableGraph1.BINDING, tg));
\r
95 store.statements.add(templateId, HasTemplate, templateValue);
\r
96 store.statements.add(templateValue, InstanceOf, Graph);
\r
98 int parameters = store.identities.newResource();
\r
99 store.values.setValue(parameters,
\r
100 new Variant(Bindings.STRING_ARRAY, template.getParameters()));
\r
101 store.statements.add(templateId, HasTemplateParameters, parameters);
\r
102 store.statements.add(parameters, InstanceOf, StringArray);
\r