]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/requests/CollectionRequest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / requests / CollectionRequest.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.modeling.requests;\r
13 \r
14 import java.util.ArrayDeque;\r
15 import java.util.Deque;\r
16 \r
17 import org.eclipse.core.runtime.ILog;\r
18 import org.eclipse.core.runtime.IProgressMonitor;\r
19 import org.eclipse.core.runtime.IStatus;\r
20 import org.eclipse.core.runtime.NullProgressMonitor;\r
21 import org.eclipse.core.runtime.Platform;\r
22 import org.eclipse.core.runtime.Status;\r
23 import org.eclipse.core.runtime.SubMonitor;\r
24 import org.simantics.NameLabelUtil;\r
25 import org.simantics.db.ReadGraph;\r
26 import org.simantics.db.Resource;\r
27 import org.simantics.db.common.request.ReadRequest;\r
28 import org.simantics.db.common.request.ResourceRead;\r
29 import org.simantics.db.common.utils.NameUtils;\r
30 import org.simantics.db.exception.AdaptionException;\r
31 import org.simantics.db.exception.DatabaseException;\r
32 import org.simantics.db.request.Read;\r
33 import org.simantics.diagram.query.DiagramRequests;\r
34 import org.simantics.diagram.stubs.DiagramResource;\r
35 import org.simantics.layer0.Layer0;\r
36 import org.simantics.modeling.ModelingResources;\r
37 import org.simantics.modeling.internal.Plugin;\r
38 import org.simantics.simulation.ontology.SimulationResource;\r
39 import org.simantics.structural.stubs.StructuralResource2;\r
40 import org.simantics.utils.page.PageDesc;\r
41 \r
42 /**\r
43  * If the specified progress monitor indicates cancellation, the request will\r
44  * return <code>null</code>.\r
45  * \r
46  * @author Tuukka Lehtonen\r
47  */\r
48 public class CollectionRequest implements Read<CollectionResult> {\r
49 \r
50     private static final boolean DEBUG = false;\r
51 \r
52     IProgressMonitor monitor;\r
53     PageDesc defaultPageDesc;\r
54     Resource[] input;\r
55     ReadGraph g;\r
56     Layer0 l0;\r
57     StructuralResource2 sr;\r
58     DiagramResource dr;\r
59     ModelingResources mr;\r
60     SimulationResource SIMU;\r
61 \r
62     public CollectionRequest(IProgressMonitor monitor, PageDesc defaultPageDesc, Resource... input) {\r
63         this.monitor = monitor != null ? monitor : new NullProgressMonitor();\r
64         this.defaultPageDesc = defaultPageDesc;\r
65         this.input = input;\r
66     }\r
67 \r
68     String safeGetName(Resource r) throws DatabaseException {\r
69         return g.syncRequest(new GetName(r));\r
70     }\r
71 \r
72 //    Collection<String> getPartOfGroups(Resource diagram) throws DatabaseException {\r
73 //        Resource r = diagram;\r
74 //        Deque<String> result = new ArrayDeque<String>();\r
75 //        loop:\r
76 //            while (true) {\r
77 //                for (Resource partOf : g.getObjects(r, b.PartOf)) {\r
78 //                    if (g.isInstanceOf(partOf, dr.DiagramLibrary)) {\r
79 //                        result.addFirst(safeGetName(partOf));\r
80 //                        r = partOf;\r
81 //                        continue loop;\r
82 //                    }\r
83 //                }\r
84 //                return result;\r
85 //            }\r
86 //    }\r
87 \r
88     @Override\r
89     public CollectionResult perform(ReadGraph g) throws DatabaseException {\r
90         this.g = g;\r
91 \r
92         l0 = Layer0.getInstance(g);\r
93         dr = DiagramResource.getInstance(g);\r
94         sr = StructuralResource2.getInstance(g);\r
95         mr = ModelingResources.getInstance(g);\r
96         SIMU = SimulationResource.getInstance(g);\r
97 \r
98         final CollectionResult result = new CollectionResult();\r
99         final Deque<Node> roots = new ArrayDeque<Node>();\r
100 \r
101         // 1. Based on input, look for the proper nodes to start browsing for diagrams.\r
102         for (Resource r : input) {\r
103             /*if (g.isInstanceOf(r, SIMU.Model)) {\r
104                 // Complete models\r
105                 Resource composite = g.getPossibleObject(r, SIMU.HasConfiguration);\r
106                 Resource diagram = composite != null ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;\r
107 \r
108                 if (DEBUG)\r
109                     System.out.println("Model root");\r
110 \r
111                 if (composite != null) {                        \r
112                         Node node = new Node(null, safeGetName(r), diagram, composite, r);\r
113                     roots.add(node);\r
114                     result.roots.add(roots.peekLast());\r
115                 }\r
116             } else*/ if (g.isInstanceOf(r, l0.IndexRoot)) {\r
117 //              for(Resource type : ModelingUtils.searchByTypeShallow(g, r, sr.ComponentType)) {\r
118 //                      Resource composite = g.getPossibleObject(type, sr.IsDefinedBy);\r
119 //                    Resource diagram = composite != null ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;\r
120 //                      if(composite != null) {\r
121 //                      Node node = new Node(null, safeGetName(r), diagram, composite, r);\r
122 //                        roots.add(node);\r
123 //                        result.roots.add(roots.peekLast());\r
124 //                      }\r
125 //              }\r
126                 \r
127                 Node node = new Node(null, safeGetName(r), null, r);\r
128                 roots.add(node);\r
129                 result.roots.add(roots.peekLast());\r
130                 \r
131             } else if (g.isInstanceOf(r, sr.Composite)) {\r
132                 // The contents of components\r
133                 String name = null;\r
134                 Resource model = g.getPossibleObject(r, SIMU.IsConfigurationOf);\r
135                 //Resource componentType = g.getPossibleObject(r, sr.Defines);\r
136                 if (model != null) {\r
137                     name = safeGetName(model);\r
138 \r
139                     if (DEBUG)\r
140                         System.out.println("Configuration root: " + name);\r
141 \r
142 //                } else if (componentType != null) {\r
143 //                    Resource singleInstance = componentType != null ? g.getPossibleObject(componentType, b.HasSingleInstance) : null;\r
144 //                    name = singleInstance != null ? safeGetName(singleInstance) : safeGetName(componentType);\r
145 //                    System.out.println("Composite of component type root: " + name);\r
146                 } else {\r
147                     name = safeGetName(r);\r
148                     if (DEBUG)\r
149                         System.out.println("Composite root: " + name);\r
150                 }\r
151 \r
152                 Resource diagram = g.getPossibleObject(r, mr.CompositeToDiagram);\r
153                 diagram = (diagram != null && g.isInstanceOf(diagram, dr.Composite)) ? diagram : null;\r
154 \r
155                 {\r
156                         Node node = new Node(null, name, diagram, r);\r
157                         roots.add(node);\r
158                         result.roots.add(roots.peekLast());\r
159                 }\r
160 //            } else if (g.isInstanceOf(r, sr.Component)) {\r
161 //                // Complete components themselves\r
162 //                Resource componentType = g.getSingleType(r, sr.Component);\r
163 //                Resource composite = g.getPossibleObject(componentType, sr.IsDefinedBy);\r
164 //                Resource diagram = (composite != null && g.isInstanceOf(composite, sr.Composite)) ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;\r
165 //                String name = safeGetName(r);\r
166 //                System.out.println("Component root: " + name);\r
167 //                roots.add(new Node(null, name, diagram, composite, r));\r
168 //                result.roots.add(roots.peekLast());\r
169             } else if (g.isInheritedFrom(r, dr.DefinedElement)) {\r
170                 // Symbols\r
171                 Resource composite = g.getPossibleObject(r, sr.IsDefinedBy);\r
172                 composite = (composite != null && g.isInstanceOf(composite, dr.Composite)) ? composite : null;\r
173                 if (composite != null) {\r
174                     Resource componentType = g.getPossibleObject(r, mr.SymbolToComponentType);\r
175                     String name = safeGetName(componentType);\r
176                     name += " Symbol";\r
177                     if (DEBUG)\r
178                         System.out.println("Symbol root: " + name);\r
179                     \r
180                     {                 \r
181                         Node node = new Node(null, name, composite, r);\r
182                             roots.add(node);\r
183                             result.roots.add(roots.peekLast());\r
184                     }\r
185                 }\r
186 //            } else if (g.isInheritedFrom(r, sr.Component)) {\r
187 //                // Reusable component types\r
188 //                Resource composite = g.getPossibleObject(r, sr.IsDefinedBy);\r
189 //                Resource diagram = (composite != null && g.isInstanceOf(composite, sr.Composite)) ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;\r
190 //                String name = safeGetName(r);\r
191 //                System.out.println("Component type root: " + name);\r
192 //                roots.add(new Node(null, name, diagram, r, composite));\r
193 //                result.roots.add(roots.peekLast());\r
194             }\r
195         }\r
196 \r
197         final SubMonitor mon = SubMonitor.convert(monitor);\r
198 \r
199         g.syncRequest(new ReadRequest() {\r
200             @Override\r
201             public void run(ReadGraph graph) throws DatabaseException {\r
202                 for (Node node : roots) {\r
203                     loadComposites(graph, node);\r
204                 }\r
205             }\r
206 \r
207             private void loadComposites(ReadGraph graph, final Node node) throws DatabaseException {\r
208                 Resource diagram = node.getDiagramResource();\r
209                 //System.out.println("loadComposites(" + diagram + ", " + node + ")");\r
210                 if (diagram != null) {\r
211                     result.addDiagram(diagram, node);\r
212 //                    node.setPartOfGroups(getPartOfGroups(diagram));\r
213                 }\r
214                 mon.setWorkRemaining(1000);\r
215 \r
216                 for(Resource r : graph.getObjects(node.getDefiningResources().resources[0], l0.ConsistsOf)) {\r
217                         if(graph.isInstanceOf(r, sr.Composite)) {\r
218                                 String compositeName = graph.syncRequest(new GetName(r));\r
219                                 Resource definingDiagram = graph.getPossibleObject(r, mr.CompositeToDiagram);\r
220                         Node n = new Node(node, compositeName, definingDiagram, r);\r
221                         loadComposites(graph, n);\r
222                         mon.worked(1);\r
223                         } else if (graph.isInstanceOf(r, l0.Library)) {\r
224                                 String compositeName = graph.syncRequest(new GetName(r));\r
225                         Node n = new Node(node, compositeName, null, r);\r
226                         loadComposites(graph, n);\r
227                         mon.worked(1);\r
228                         } else if (graph.isInheritedFrom(r, sr.Component)) {\r
229                                 String name = safeGetName(r);\r
230                                 Node n = new Node(node, name, null, r);\r
231                                 loadComposites(graph, n);\r
232                                 mon.worked(1);\r
233                   }\r
234                 }\r
235                 \r
236             }\r
237 \r
238         });\r
239 \r
240         ILog log = Platform.getLog(Platform.getBundle(Plugin.PLUGIN_ID));\r
241 \r
242         // Assign a page size description for each node.\r
243         for (Node node : result.diagramList) {\r
244             if (monitor.isCanceled())\r
245                 return null;\r
246             mon.setWorkRemaining(10000);\r
247 \r
248             try {\r
249                 PageDesc realPageDesc = g.syncRequest(DiagramRequests.getPageDesc(node.getDiagramResource(), defaultPageDesc));\r
250                 node.setPageDesc(realPageDesc);\r
251             } catch (DatabaseException e) {\r
252                 log.log(new Status(IStatus.WARNING, Plugin.PLUGIN_ID,\r
253                         "Broken page description in diagram "\r
254                         + NameUtils.getURIOrSafeNameInternal(g, node.getDiagramResource())\r
255                         + ". Reopen the diagram to fix it.", e));\r
256             }\r
257 \r
258             mon.worked(1);\r
259         }\r
260 \r
261         if (monitor.isCanceled())\r
262             return null;\r
263 \r
264         return result;\r
265     }\r
266     \r
267     static class GetName extends ResourceRead<String> {\r
268 \r
269         public GetName(Resource resource) {\r
270             super(resource);\r
271         }\r
272 \r
273         @Override\r
274         public String perform(ReadGraph graph) throws DatabaseException {\r
275             try {\r
276                 return NameLabelUtil.modalName(graph, resource);\r
277             } catch (AdaptionException e) {\r
278                 return NameUtils.getSafeName(graph, resource);\r
279             }\r
280         }\r
281 \r
282     }\r
283 \r
284 }