]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/content/RouteGraphConnectionPartRequest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / content / RouteGraphConnectionPartRequest.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.diagram.content;\r
13 \r
14 import java.util.HashSet;\r
15 import java.util.Set;\r
16 import java.util.concurrent.ConcurrentLinkedQueue;\r
17 import java.util.concurrent.atomic.AtomicInteger;\r
18 \r
19 import org.simantics.db.AsyncReadGraph;\r
20 import org.simantics.db.Resource;\r
21 import org.simantics.db.common.request.ResourceAsyncRead;\r
22 import org.simantics.db.procedure.AsyncMultiProcedure;\r
23 import org.simantics.db.procedure.AsyncProcedure;\r
24 import org.simantics.diagram.stubs.DiagramResource;\r
25 import org.simantics.diagram.synchronization.ErrorHandler;\r
26 \r
27 /**\r
28  * @author Antti Villberg\r
29  * @author Tuukka Lehtonen\r
30  */\r
31 public class RouteGraphConnectionPartRequest extends ResourceAsyncRead<RouteGraphConnectionPartData> {\r
32 \r
33     final ErrorHandler    errorHandler;\r
34     final DiagramResource DIA;\r
35 \r
36     public RouteGraphConnectionPartRequest(ErrorHandler errorHandler, DiagramResource dia, Resource resource) {\r
37         super(resource);\r
38         this.errorHandler = errorHandler;\r
39         this.DIA = dia;\r
40     }\r
41 \r
42     @Override\r
43     public void perform(AsyncReadGraph graph, final AsyncProcedure<RouteGraphConnectionPartData> procedure) {\r
44 \r
45         final AtomicInteger ready = new AtomicInteger(3);\r
46         final RouteGraphConnectionPartData result = new RouteGraphConnectionPartData();\r
47         final HashSet<EdgeResource> connectorLinks = new HashSet<EdgeResource>();\r
48         final HashSet<EdgeResource> routeLinks = new HashSet<EdgeResource>();\r
49 \r
50         result.links = connectorLinks;\r
51         result.routeLines = new ConcurrentLinkedQueue<Resource>();\r
52         result.routePoints = new ConcurrentLinkedQueue<Resource>();\r
53 \r
54         AsyncMultiProcedure<Resource> locationProcedure = new AsyncMultiProcedure<Resource>() {\r
55 \r
56             @Override\r
57             public void exception(AsyncReadGraph graph, Throwable throwable) {\r
58                 errorHandler.error("forEachObject(connection, Has I/O) failure", throwable);\r
59             }\r
60 \r
61             @Override\r
62             public void execute(AsyncReadGraph graph, final Resource location) {\r
63 \r
64                 ready.incrementAndGet();\r
65 \r
66                 graph.forEachObject(location, DIA.AreConnected, new AsyncMultiProcedure<Resource>() {\r
67 \r
68                     @Override\r
69                     public void exception(AsyncReadGraph graph, Throwable throwable) {\r
70                         errorHandler.error("forEachObject(:I/O Connector, Are Connected) failure", throwable);\r
71                     }\r
72 \r
73                     @Override\r
74                     public void execute(AsyncReadGraph graph, Resource connectedTo) {\r
75                         synchronized (connectorLinks) {\r
76                             connectorLinks.add(new EdgeResource(location, connectedTo));\r
77                         }\r
78                     }\r
79 \r
80                     @Override\r
81                     public void finished(AsyncReadGraph graph) {\r
82                         if (ready.decrementAndGet() == 0) {\r
83                             connectorLinks.addAll(routeLinks);\r
84                             procedure.execute(graph, result);\r
85                         }\r
86                     }\r
87 \r
88                 });\r
89 \r
90             }\r
91 \r
92             @Override\r
93             public void finished(AsyncReadGraph graph) {\r
94                 if (ready.decrementAndGet() == 0) {\r
95                     connectorLinks.addAll(routeLinks);\r
96                     procedure.execute(graph, result);\r
97                 }\r
98             }\r
99 \r
100         };\r
101 \r
102         AsyncMultiProcedure<Resource> locationProcedure2 = new AsyncMultiProcedure<Resource>() {\r
103 \r
104             @Override\r
105             public void exception(AsyncReadGraph graph, Throwable throwable) {\r
106                 errorHandler.error("forEachObject(connection, Has Branch Point) failure", throwable);\r
107             }\r
108 \r
109             @Override\r
110             public void execute(AsyncReadGraph graph, final Resource location) {\r
111 \r
112                 ready.incrementAndGet();\r
113 \r
114                 graph.forTypes(location, new AsyncProcedure<Set<Resource>>() {\r
115                     @Override\r
116                     public void execute(AsyncReadGraph graph, Set<Resource> types) {\r
117                         if (types.contains(DIA.RouteLine)) {\r
118                             result.routeLines.add(location);\r
119                         } else if (types.contains(DIA.RoutePoint)) {\r
120                             result.routePoints.add(location);\r
121                         } else {\r
122                             errorHandler.error("unrecognized interior route node: " + location, new Exception("trace"));\r
123                         }\r
124 \r
125                         graph.forEachObject(location, DIA.AreConnected, new AsyncMultiProcedure<Resource>() {\r
126 \r
127                             @Override\r
128                             public void exception(AsyncReadGraph graph, Throwable throwable) {\r
129                                 errorHandler.error("forEachObject(:Branch Point, Are Connected) failure", throwable);\r
130                             }\r
131 \r
132                             @Override\r
133                             public void execute(AsyncReadGraph graph, Resource connectedTo) {\r
134                                 synchronized (routeLinks) {\r
135                                     routeLinks.add(new EdgeResource(location, connectedTo));\r
136                                 }\r
137                             }\r
138 \r
139                             @Override\r
140                             public void finished(AsyncReadGraph graph) {\r
141                                if (ready.decrementAndGet() == 0) {\r
142                                     connectorLinks.addAll(routeLinks);\r
143                                     procedure.execute(graph, result);\r
144                                 }\r
145                             }\r
146 \r
147                         });\r
148                     }\r
149                     @Override\r
150                     public void exception(AsyncReadGraph graph, Throwable throwable) {\r
151                         errorHandler.error("forEachObject(:Branch Point, Are Connected) failure", throwable);\r
152                     }\r
153                 });\r
154             }\r
155 \r
156             @Override\r
157             public void finished(AsyncReadGraph graph) {\r
158                 if (ready.decrementAndGet() == 0) {\r
159                     connectorLinks.addAll(routeLinks);\r
160                     procedure.execute(graph, result);\r
161                 }\r
162             }\r
163 \r
164         };\r
165 \r
166         AsyncMultiProcedure<Resource> locationProcedure3 = new AsyncMultiProcedure<Resource>() {\r
167 \r
168             @Override\r
169             public void exception(AsyncReadGraph graph, Throwable throwable) {\r
170                 errorHandler.error("forEachObject(connection, Has I/O) failure", throwable);\r
171             }\r
172 \r
173             @Override\r
174             public void execute(AsyncReadGraph graph, final Resource location) {\r
175 \r
176                 ready.incrementAndGet();\r
177 \r
178                 graph.forEachObject(location, DIA.AreConnected, new AsyncMultiProcedure<Resource>() {\r
179 \r
180                     @Override\r
181                     public void exception(AsyncReadGraph graph, Throwable throwable) {\r
182                         errorHandler.error("forEachObject(:I/O Connector, Are Connected) failure", throwable);\r
183                     }\r
184 \r
185                     @Override\r
186                     public void execute(AsyncReadGraph graph, Resource connectedTo) {\r
187                         synchronized (connectorLinks) {\r
188                             connectorLinks.add(new EdgeResource(connectedTo, location));\r
189                         }\r
190                     }\r
191 \r
192                     @Override\r
193                     public void finished(AsyncReadGraph graph) {\r
194                         if (ready.decrementAndGet() == 0) {\r
195                             connectorLinks.addAll(routeLinks);\r
196                             procedure.execute(graph, result);\r
197                         }\r
198                     }\r
199 \r
200                 });\r
201 \r
202             }\r
203 \r
204             @Override\r
205             public void finished(AsyncReadGraph graph) {\r
206                 if (ready.decrementAndGet() == 0) {\r
207                     connectorLinks.addAll(routeLinks);\r
208                     procedure.execute(graph, result);\r
209                 }\r
210             }\r
211 \r
212         };\r
213 \r
214         graph.forEachObject(resource, DIA.HasPlainConnector, locationProcedure);\r
215         graph.forEachObject(resource, DIA.HasInteriorRouteNode, locationProcedure2);\r
216         graph.forEachObject(resource, DIA.HasArrowConnector, locationProcedure3);\r
217 \r
218     }\r
219 \r
220 }\r