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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling.requests;
\r
14 import java.util.ArrayDeque;
\r
15 import java.util.Deque;
\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
43 * If the specified progress monitor indicates cancellation, the request will
\r
44 * return <code>null</code>.
\r
46 * @author Tuukka Lehtonen
\r
48 public class CollectionRequest implements Read<CollectionResult> {
\r
50 private static final boolean DEBUG = false;
\r
52 IProgressMonitor monitor;
\r
53 PageDesc defaultPageDesc;
\r
57 StructuralResource2 sr;
\r
59 ModelingResources mr;
\r
60 SimulationResource SIMU;
\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
68 String safeGetName(Resource r) throws DatabaseException {
\r
69 return g.syncRequest(new GetName(r));
\r
72 // Collection<String> getPartOfGroups(Resource diagram) throws DatabaseException {
\r
73 // Resource r = diagram;
\r
74 // Deque<String> result = new ArrayDeque<String>();
\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
89 public CollectionResult perform(ReadGraph g) throws DatabaseException {
\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
98 final CollectionResult result = new CollectionResult();
\r
99 final Deque<Node> roots = new ArrayDeque<Node>();
\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
105 Resource composite = g.getPossibleObject(r, SIMU.HasConfiguration);
\r
106 Resource diagram = composite != null ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;
\r
109 System.out.println("Model root");
\r
111 if (composite != null) {
\r
112 Node node = new Node(null, safeGetName(r), diagram, composite, r);
\r
114 result.roots.add(roots.peekLast());
\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
127 Node node = new Node(null, safeGetName(r), null, r);
\r
129 result.roots.add(roots.peekLast());
\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
140 System.out.println("Configuration root: " + name);
\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
147 name = safeGetName(r);
\r
149 System.out.println("Composite root: " + name);
\r
152 Resource diagram = g.getPossibleObject(r, mr.CompositeToDiagram);
\r
153 diagram = (diagram != null && g.isInstanceOf(diagram, dr.Composite)) ? diagram : null;
\r
156 Node node = new Node(null, name, diagram, r);
\r
158 result.roots.add(roots.peekLast());
\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
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
178 System.out.println("Symbol root: " + name);
\r
181 Node node = new Node(null, name, composite, r);
\r
183 result.roots.add(roots.peekLast());
\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
197 final SubMonitor mon = SubMonitor.convert(monitor);
\r
199 g.syncRequest(new ReadRequest() {
\r
201 public void run(ReadGraph graph) throws DatabaseException {
\r
202 for (Node node : roots) {
\r
203 loadComposites(graph, node);
\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
214 mon.setWorkRemaining(1000);
\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
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
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
240 ILog log = Platform.getLog(Platform.getBundle(Plugin.PLUGIN_ID));
\r
242 // Assign a page size description for each node.
\r
243 for (Node node : result.diagramList) {
\r
244 if (monitor.isCanceled())
\r
246 mon.setWorkRemaining(10000);
\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
261 if (monitor.isCanceled())
\r
267 static class GetName extends ResourceRead<String> {
\r
269 public GetName(Resource resource) {
\r
274 public String perform(ReadGraph graph) throws DatabaseException {
\r
276 return NameLabelUtil.modalName(graph, resource);
\r
277 } catch (AdaptionException e) {
\r
278 return NameUtils.getSafeName(graph, resource);
\r