]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/evaluator/DBUtil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / report / evaluator / DBUtil.java
1 package org.simantics.document.linking.report.evaluator;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.Collections;\r
6 import java.util.HashMap;\r
7 import java.util.List;\r
8 import java.util.Map;\r
9 \r
10 import org.simantics.Simantics;\r
11 import org.simantics.db.ReadGraph;\r
12 import org.simantics.db.Resource;\r
13 import org.simantics.db.WriteGraph;\r
14 import org.simantics.db.common.NamedResource;\r
15 import org.simantics.db.common.request.ObjectsWithType;\r
16 import org.simantics.db.common.request.WriteRequest;\r
17 import org.simantics.db.exception.DatabaseException;\r
18 import org.simantics.db.request.Read;\r
19 import org.simantics.document.linking.ontology.DocumentLink;\r
20 import org.simantics.document.linking.report.templates.CustomizableContentProvider;\r
21 import org.simantics.document.linking.report.templates.custom.CustomizableContent;\r
22 import org.simantics.document.linking.report.templates.custom.EvaluatorCustomizableContent;\r
23 import org.simantics.layer0.Layer0;\r
24 import org.simantics.objmap.graph.IMapping;\r
25 import org.simantics.objmap.graph.Mappings;\r
26 import org.simantics.objmap.graph.schema.IMappingSchema;\r
27 import org.simantics.objmap.graph.schema.MappingSchemas;\r
28 import org.simantics.objmap.graph.schema.SimpleSchema;\r
29 \r
30 public class DBUtil {\r
31         \r
32         /**\r
33          * Loads single evaluator tree from graph.\r
34          * @param graph\r
35          * @param res\r
36          * @return\r
37          * @throws DatabaseException\r
38          */\r
39         public static EvaluatorItem load(ReadGraph graph, Resource res) throws DatabaseException{\r
40                 IMappingSchema<Resource, Object> schema = getSchema(graph); \r
41                 IMapping<Resource,Object> mapping =  Mappings.createWithoutListening(schema);\r
42                 EvaluatorItem item = (EvaluatorItem)mapping.map(graph, res);\r
43                 return item;\r
44         }\r
45         \r
46         /**\r
47          * Saves a single evaluator tree to graph.\r
48          * @param graph\r
49          * @param item\r
50          * @return\r
51          * @throws DatabaseException\r
52          */\r
53         public static Resource save(WriteGraph graph, EvaluatorItem item) throws DatabaseException{\r
54                 IMappingSchema<Resource, Object> schema = getSchema(graph); \r
55                 IMapping<Resource,Object> mapping =  Mappings.createWithoutListening(schema);\r
56                 Resource resource =  mapping.inverseMap(graph, item);\r
57                 return resource;\r
58         }\r
59         \r
60         /**\r
61          * Creates mapping schema for Evaluator tree.\r
62          * @param g\r
63          * @return\r
64          * @throws DatabaseException\r
65          */\r
66         public static IMappingSchema<Resource,Object> getSchema(ReadGraph g) throws DatabaseException{\r
67                 try {\r
68                         SimpleSchema schema = new SimpleSchema();\r
69                         schema.addLinkType(MappingSchemas.fromAnnotations(g, AlignmentHint.class));\r
70                         schema.addLinkType(MappingSchemas.fromAnnotations(g, And.class));\r
71                         schema.addLinkType(MappingSchemas.fromAnnotations(g, Constant.class));\r
72                         schema.addLinkType(MappingSchemas.fromAnnotations(g, Date.class));\r
73                         schema.addLinkType(MappingSchemas.fromAnnotations(g, EvaluatorRoot.class));\r
74                         schema.addLinkType(MappingSchemas.fromAnnotations(g, If.class));\r
75                         schema.addLinkType(MappingSchemas.fromAnnotations(g, Lines.class));\r
76                         schema.addLinkType(MappingSchemas.fromAnnotations(g, Or.class));\r
77                         schema.addLinkType(MappingSchemas.fromAnnotations(g, TextSizeHint.class));\r
78                         schema.addLinkType(MappingSchemas.fromAnnotations(g, Variable.class));\r
79                         schema.addLinkType(MappingSchemas.fromAnnotations(g, Path.class));\r
80                         \r
81                         return schema;\r
82                 } catch (IllegalAccessException e) {\r
83                         throw new DatabaseException(e);\r
84                 } catch (InstantiationException e) {\r
85                         throw new DatabaseException(e);\r
86                 }\r
87         }\r
88         \r
89         /**\r
90          * Saves evaluator tree configurations of content provider.\r
91          * @param graph\r
92          * @param provider\r
93          * @param template\r
94          * @throws DatabaseException\r
95          */\r
96         public static void save(WriteGraph graph, CustomizableContentProvider provider, Resource template) throws DatabaseException{\r
97                 Layer0 l0 = Layer0.getInstance(graph);\r
98                 DocumentLink sl = DocumentLink.getInstance(graph);\r
99                 \r
100                 Map<String, Resource> existingEvaluatorTemplates = new HashMap<String, Resource>();\r
101                 for (Resource r : graph.getObjects(template, l0.ConsistsOf)) {\r
102                         if (graph.isInstanceOf(r, sl.EvaluatorTree_Template)) {\r
103                                 String id = graph.getRelatedValue(r, l0.HasName);\r
104                                 existingEvaluatorTemplates.put(id, r);\r
105                         }\r
106                 }\r
107                 \r
108                 for (String id : provider.getContentIds()) {\r
109                         CustomizableContent content = provider.getContent(id);\r
110                         if (content instanceof EvaluatorCustomizableContent) {\r
111                                 EvaluatorCustomizableContent ecc = (EvaluatorCustomizableContent)content;\r
112                                 Resource item = save(graph, ecc.getItem());\r
113                                 \r
114                                 Resource treeTemplate = existingEvaluatorTemplates.get(id);\r
115                                 if (treeTemplate == null) {\r
116                                         treeTemplate = graph.newResource();\r
117                                         graph.claim(treeTemplate, l0.InstanceOf, sl.EvaluatorTree_Template);\r
118                                         graph.claimLiteral(treeTemplate, l0.HasName, id);\r
119                                         graph.claim(template, l0.ConsistsOf, treeTemplate);\r
120                                 } else {\r
121                                         graph.deny(treeTemplate,l0.ConsistsOf);\r
122                                 }\r
123                                 graph.claim(treeTemplate, l0.ConsistsOf, item);\r
124                         }\r
125                 }\r
126         }\r
127         \r
128         /**\r
129          * Loads evaluator tree configurations from a graph and applies them to content provider.\r
130          * @param graph\r
131          * @param template\r
132          * @param provider\r
133          * @throws DatabaseException\r
134          */\r
135         public static void load(ReadGraph graph, Resource template, CustomizableContentProvider provider) throws DatabaseException {\r
136                 Layer0 l0 = Layer0.getInstance(graph);\r
137                 DocumentLink sl = DocumentLink.getInstance(graph);\r
138         \r
139                 Map<String, Resource> existingEvaluatorTemplates = new HashMap<String, Resource>();\r
140                 for (Resource r : graph.getObjects(template, l0.ConsistsOf)) {\r
141                         if (graph.isInstanceOf(r, sl.EvaluatorTree_Template)) {\r
142                                 String id = graph.getRelatedValue(r, l0.HasName);\r
143                                 existingEvaluatorTemplates.put(id, r);\r
144                         }\r
145                 }\r
146                 \r
147                 for (String id : provider.getContentIds()) {\r
148                         Resource treeTemplate = existingEvaluatorTemplates.get(id);\r
149                         if (treeTemplate == null)\r
150                                 continue;\r
151                         \r
152                         Resource itemRes = graph.getSingleObject(treeTemplate, l0.ConsistsOf);\r
153                         EvaluatorItem item = load(graph, itemRes);\r
154                         EvaluatorCustomizableContent ecc = new EvaluatorCustomizableContent(provider.getContent(id).getCustomizationDescription());\r
155                         ecc.setItem(item);\r
156                         provider.setContent(id, ecc);\r
157                          \r
158                 }       \r
159                 \r
160         }\r
161         \r
162         public static List<NamedResource> getTemplates(final Resource library) throws DatabaseException{\r
163                 if (library == null)\r
164                         throw new IllegalArgumentException("Library cannot be null");\r
165                 List<NamedResource> templates = Simantics.getSession().syncRequest(new Read<List<NamedResource>>() {\r
166                 @Override\r
167                 public List<NamedResource> perform(ReadGraph graph) throws DatabaseException{\r
168                                 return getTemplates(graph, library);\r
169                         }\r
170                 });\r
171                 return templates;\r
172         }\r
173         \r
174         public static List<NamedResource> getTemplates(ReadGraph graph, final Resource library) throws DatabaseException{\r
175                 Layer0 l0 = Layer0.getInstance(graph);\r
176                 DocumentLink sl = DocumentLink.getInstance(graph);\r
177                 Collection<Resource> templates = graph.syncRequest(new ObjectsWithType(library, l0.ConsistsOf, sl.ReportTemplate));\r
178                 List<NamedResource> result = new ArrayList<NamedResource>(templates.size());\r
179                 for (Resource template : templates) {\r
180                         String name = graph.getRelatedValue(template, l0.HasName);\r
181                         result.add(new NamedResource(name, template));\r
182                 }\r
183 \r
184                 Collections.sort(result);\r
185                 return result;\r
186         }\r
187         \r
188         public static void save(final Resource library, final String name,final  CustomizableContentProvider provider) throws DatabaseException{\r
189                 Simantics.getSession().syncRequest(new WriteRequest() {\r
190                         \r
191                         @Override\r
192                         public void perform(WriteGraph graph) throws DatabaseException {\r
193                                 final List<NamedResource> templates = DBUtil.getTemplates(graph,library);\r
194                                 Resource template = null;\r
195                                 for (NamedResource nr : templates) {\r
196                                         if (name.equals(nr.getName())) {\r
197                                                 template = nr.getResource();\r
198                                                 break;\r
199                                         }\r
200                                 }\r
201                                 if (template == null) {\r
202                                         Layer0 l0 = Layer0.getInstance(graph);\r
203                                         DocumentLink sl = DocumentLink.getInstance(graph);\r
204                                         template = graph.newResource();\r
205                                         graph.claim(template, l0.InstanceOf, sl.ReportTemplate);\r
206                                         graph.claim(library, l0.ConsistsOf, template);\r
207                                         graph.claimLiteral(template, l0.HasName, name);\r
208                                 }\r
209                                 DBUtil.save(graph, provider, template);\r
210                         }\r
211                 });\r
212         }\r
213 \r
214 }\r