1 package org.molwind.graph;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import java.util.HashMap;
21 import java.util.Iterator;
22 import java.util.Map;
23 import java.util.Collection;
24 import java.util.Vector;
25 import java.io.IOException;
26 import java.io.StringWriter;
27 import java.lang.Double;
28 import java.awt.geom.Point2D;
29 import java.awt.Color;
30 import java.awt.Paint;
31
32 import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
33
34
35
36 import org.molwind.model.Relationship;
37 import org.molwind.model.WorldEntity;
38 import org.molwind.model.PlacedWorldEntity;
39
40
41 import org.apache.commons.collections15.Transformer;
42 import org.apache.commons.collections15.TransformerUtils;
43
44 import edu.uci.ics.jung.graph.SparseGraph;
45 import edu.uci.ics.jung.graph.DirectedSparseGraph;
46 import edu.uci.ics.jung.graph.DelegateTree;
47 import edu.uci.ics.jung.graph.DelegateForest;
48 import edu.uci.ics.jung.io.GraphMLWriter;
49 import edu.uci.ics.jung.graph.util.Pair;
50 import edu.uci.ics.jung.graph.util.EdgeType;
51
52 import edu.uci.ics.jung.algorithms.layout.CircleLayout;
53 import edu.uci.ics.jung.algorithms.layout.StaticLayout;
54 import edu.uci.ics.jung.algorithms.layout.SpringLayout2;
55 import edu.uci.ics.jung.algorithms.layout.AggregateLayout;
56 import edu.uci.ics.jung.algorithms.layout.KKLayout;
57 import edu.uci.ics.jung.algorithms.layout.ISOMLayout;
58 import edu.uci.ics.jung.algorithms.layout.BalloonLayout ;
59
60 import edu.uci.ics.jung.graph.Graph;
61 import edu.uci.ics.jung.visualization.BasicVisualizationServer;
62 import javax.swing.JFrame;
63 import java.awt.Dimension;
64
65
66
67
68
69
70
71
72
73 public class DefaultEntityGraph implements EntityGraph {
74
75 private SparseGraph graph;
76 private HashMap entities;
77 private Vector<Vector<EntityVertex>> graphInLayers;
78
79
80
81
82
83
84
85
86
87
88 public SparseGraph<EntityVertex,EntityEdge> getGraph() {
89
90 return graph;
91 }
92
93
94
95
96
97 public void setGraph(SparseGraph newGraph) {
98 this.graph = newGraph;
99
100 }
101
102
103
104
105
106
107 public DefaultEntityGraph() {
108 graph = new SparseGraph<EntityVertex,EntityEdge>();
109 entities = new HashMap();
110
111 }
112
113
114
115
116
117
118
119
120
121
122
123
124 public void addEntity(final String vertexId, final WorldEntity entity) {
125 DefaultEntityVertex vertex =
126 (DefaultEntityVertex) entities.get(vertexId);
127
128 if (vertex== null) {
129 vertex = new DefaultEntityVertex();
130 vertex.setId(vertexId);
131 entities.put(vertexId, vertex);
132 graph.addVertex((Object)vertex);
133 }
134
135 vertex.setEntity(entity);
136 }
137
138
139
140
141
142
143
144
145
146 public WorldEntity findEntity(final String vertexId) {
147 EntityVertex vertex = (EntityVertex) entities.get(vertexId);
148
149 if (vertex != null) {
150 return vertex.getEntity();
151 }
152
153 return null;
154 }
155
156
157
158
159
160
161
162
163
164
165
166
167 public void addEdge(final String vertexId1, final String vertexId2,
168 final Relationship relation,int weight) {
169 DefaultEntityVertex vertex1 =
170 (DefaultEntityVertex) entities.get(vertexId1);
171
172 if (vertex1 == null) {
173 vertex1 = new DefaultEntityVertex();
174 vertex1.setId(vertexId1);
175 entities.put(vertexId1, vertex1);
176 graph.addVertex(vertex1);
177 }
178
179 DefaultEntityVertex vertex2 =
180 (DefaultEntityVertex) entities.get(vertexId2);
181
182 if (vertex2 == null) {
183 vertex2 = new DefaultEntityVertex();
184 vertex2.setId(vertexId2);
185 entities.put(vertexId2, vertex2);
186 graph.addVertex(vertex2);
187 }
188 Pair<EntityVertex> endpoints = new Pair<EntityVertex>(vertex1,vertex2);
189
190 DefaultEntityEdge edge = new DefaultEntityEdge(vertex1, vertex2);
191 edge.setRelationship(relation);
192 edge.setEdgeWeight(weight);
193
194 graph.addEdge(edge,endpoints,EdgeType.DIRECTED);
195 }
196
197
198
199
200
201
202
203
204
205 public void analyze(final EntityGraphAnalyzer analyzer) {
206 Iterator it = entities.entrySet().iterator();
207
208 while (it.hasNext()) {
209 Map.Entry entry = (Map.Entry) it.next();
210 EntityVertex vertex = (EntityVertex) entry.getValue();
211
212
213 if (!analyzer.analyze(this, vertex)) {
214 break;
215 }
216 }
217 }
218
219 private boolean checkParent(EntityVertex entity,Vector<EntityVertex> vertexVector){
220 for(EntityVertex tmp:vertexVector){
221 if(tmp.getEntity().getAttribute("Index").equals(entity.getEntity().getAttribute("Mother")))
222 return true;
223 }
224 return false;
225
226 }
227
228
229
230
231
232
233
234
235 public int getLayerCount(){
236 return graphInLayers.size();
237
238 }
239
240
241
242
243
244
245
246
247
248 public EntityVertex[] getLayer(int layer){
249
250
251 Vector<EntityVertex> result=graphInLayers.get(layer);
252
253 EntityVertex[] resultArray = new EntityVertex[result.size()];
254 int i = 0;
255 for(EntityVertex vertex:result){
256 resultArray[i]= vertex;
257 i++;
258 }
259
260
261 return resultArray;
262
263 }
264
265
266
267
268
269
270
271 public void devideLayers(){
272 Vector<Vector<EntityVertex>> result = new Vector<Vector<EntityVertex>>();
273 Vector<EntityVertex> notChecked = new Vector<EntityVertex>();
274 Vector<EntityVertex> layer = new Vector<EntityVertex>();
275 Vector<EntityVertex> nextLayer;
276 Iterator it = iterator();
277 while(it.hasNext()){
278 Map.Entry entry = (Map.Entry)it.next();
279 EntityVertex vertex =(EntityVertex)entry.getValue();
280 PlacedWorldEntity entity =(PlacedWorldEntity) vertex.getEntity();
281
282 String parentId =(String) entity.getAttribute("Mother");
283 if(parentId.equals("0")){
284 layer.add(vertex);
285 }
286 else
287 notChecked.add(vertex);
288 }
289 result.add(layer);
290 while(!notChecked.isEmpty()){
291 nextLayer = new Vector<EntityVertex>();
292 for(EntityVertex entity:notChecked){
293 if(checkParent(entity,layer)){
294 nextLayer.add(entity);
295 }
296 }
297
298 for(EntityVertex entity:nextLayer){
299 notChecked.remove(entity);
300 }
301 layer=nextLayer;
302 result.add(layer);
303
304
305 }
306 for(int i = 0;i<result.size();i++){
307 for(EntityVertex v:result.get(i)){
308 PlacedWorldEntity entity =(PlacedWorldEntity) v.getEntity();
309
310 entity.setLayer(i);
311 }
312
313 }
314
315 graphInLayers = result;
316
317
318
319
320
321 }
322
323
324
325
326
327
328
329
330
331 public Iterator iterator() {
332 return entities.entrySet().iterator();
333 }
334
335
336
337
338
339
340 public String toString() {
341 GraphMLWriter gml = new GraphMLWriter();
342 StringWriter sw = new StringWriter();
343 try {
344 gml.save( graph, sw );
345 }
346 catch( IOException ioe ) {
347 ioe.printStackTrace();
348 }
349 return sw.toString();
350 }
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366 public void viewGraph(int size){
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443 Transformer<EntityVertex,Paint> vertexPaint = new Transformer<EntityVertex,Paint>() {
444 public Paint transform(EntityVertex vertex) {
445 return Color.GREEN;
446 }
447 };
448
449
450 Transformer<EntityVertex,Point2D> tr = new Transformer<EntityVertex,Point2D>(){
451 public Point2D.Double transform(EntityVertex vertex){
452 return vertex.getPosition();
453 }
454
455 };
456
457 StaticLayout<EntityVertex,EntityEdge> stLayout = new StaticLayout<EntityVertex,EntityEdge>(graph, tr);
458 BasicVisualizationServer vv2 = new BasicVisualizationServer(stLayout);
459 vv2.setPreferredSize(new Dimension(size, size));
460 vv2.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
461 vv2.setPreferredSize(new Dimension(size, size));
462 vv2.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<EntityVertex>());
463
464 JFrame frame = new JFrame("Simple Graph View");
465 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
466 frame.getContentPane().add(vv2);
467 frame.pack();
468 frame.setVisible(true);
469
470 }
471
472
473
474
475
476
477
478
479
480
481 }