]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/procedures/CreateTemplates.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graph.compiler / src / org / simantics / graph / compiler / internal / procedures / CreateTemplates.java
1 package org.simantics.graph.compiler.internal.procedures;\r
2 \r
3 import gnu.trove.procedure.TIntObjectProcedure;\r
4 import gnu.trove.set.hash.THashSet;\r
5 \r
6 import java.util.Collection;\r
7 \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
19 \r
20 public class CreateTemplates implements Runnable {\r
21         \r
22         CompositeGraph graph;\r
23         GraphStore store;\r
24         Collection<Problem> problems;\r
25         \r
26         int HasTemplate;\r
27         int HasTemplateParameters;\r
28         int InstanceOf;\r
29         int StringArray;\r
30         int Graph;\r
31         \r
32         public CreateTemplates(CompositeGraph graph, GraphStore store,\r
33                         Collection<Problem> problems) {\r
34                 this.graph = graph;\r
35                 this.store = store;\r
36                 this.problems = problems;\r
37         }\r
38 \r
39         @Override\r
40         public void run() {\r
41                 TemplateDefinitionStore templateStore = store.getStore(TemplateDefinitionStore.class);\r
42                 if(templateStore == null || templateStore.isEmpty())\r
43                         return;\r
44                 \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
51                                 \r
52                 templateStore.forTemplateDefinitions(\r
53                         new TIntObjectProcedure<TemplateDefinition>() {\r
54                                 @Override\r
55                                 public boolean execute(int templateId, TemplateDefinition template) {\r
56                                         if(validateTemplate(templateId, template))\r
57                                                 writeTemplate(templateId, template);\r
58                                         return true;\r
59                                 }                                                       \r
60                         });\r
61         }       \r
62         \r
63         private boolean validateTemplate(int templateId, TemplateDefinition template) {\r
64                 THashSet<String> parameters = new THashSet<String>();\r
65                 parameters.add("");\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
79                                 }\r
80                                 problems.add(new Problem(\r
81                                                 location, \r
82                                                 "Graph template does not have parameter %" + root + "."\r
83                                         ));\r
84                                 isValid = false;\r
85                         }\r
86                 return isValid;\r
87         }       \r
88         \r
89         private void writeTemplate(int templateId,\r
90                         TemplateDefinition template) {\r
91             TransferableGraph1 tg = template.convert(graph, store, problems);\r
92 \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
97 \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
103         }\r
104 }\r