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