1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package edu.internet2.middleware.grouper.app.graph;
18
19 import edu.internet2.middleware.grouper.Composite;
20 import edu.internet2.middleware.grouper.Group;
21 import edu.internet2.middleware.grouper.GrouperSession;
22 import edu.internet2.middleware.grouper.Stem;
23 import edu.internet2.middleware.grouper.app.loader.GrouperLoader;
24 import edu.internet2.middleware.grouper.app.loader.ldap.LoaderLdapUtils;
25 import edu.internet2.middleware.grouper.app.visualization.StyleObjectType;
26 import edu.internet2.middleware.grouper.attr.assign.AttributeAssign;
27 import edu.internet2.middleware.grouper.exception.GrouperSessionException;
28 import edu.internet2.middleware.grouper.misc.CompositeType;
29 import edu.internet2.middleware.grouper.misc.GrouperObject;
30 import edu.internet2.middleware.grouper.misc.GrouperObjectSubjectWrapper;
31 import edu.internet2.middleware.grouper.misc.GrouperSessionHandler;
32
33 import org.apache.commons.lang3.builder.EqualsBuilder;
34 import org.apache.commons.lang3.builder.HashCodeBuilder;
35
36 import java.util.HashSet;
37 import java.util.LinkedList;
38 import java.util.List;
39 import java.util.Set;
40
41
42
43
44
45
46
47
48
49
50 public class GraphNode {
51 private GrouperObject grouperObject;
52 private long allMemberCount;
53 private long directMemberCount;
54 private List<String> objectTypeNames;
55
56 private boolean stem;
57 private boolean group;
58 private boolean subject;
59 private boolean loaderGroup;
60 private boolean simpleLoaderGroup;
61 private boolean provisionerTarget;
62 private boolean intersectGroup;
63 private boolean complementGroup;
64 private boolean startNode;
65 private StyleObjectType styleObjectType;
66
67 private boolean visitedParents;
68 private boolean visitedChildren;
69 private boolean startedProcessingParentPaths;
70 private boolean startedProcessingChildPaths;
71
72 private long distanceFromStartNode;
73 private Set<GraphNode> parentNodes;
74 private Set<GraphNode> childNodes;
75
76
77
78
79
80
81
82
83 public GraphNode(GrouperObject grouperObject, boolean isStartNode) {
84 startNode = isStartNode;
85 this.grouperObject = grouperObject;
86
87 parentNodes = new HashSet<GraphNode>();
88 childNodes = new HashSet<GraphNode>();
89
90 determineObjectTypes();
91 }
92
93
94
95
96
97
98 public GraphNode(GrouperObject grouperObject) {
99 this(grouperObject, false);
100 }
101
102
103
104
105
106
107
108 @Override
109 public boolean equals(Object obj) {
110 if (this == obj)
111 return true;
112 if (obj == null)
113 return false;
114 if (getClass() != obj.getClass())
115 return false;
116 GraphNode/../../../../../edu/internet2/middleware/grouper/app/graph/GraphNode.html#GraphNode">GraphNode other = (GraphNode) obj;
117
118 return new EqualsBuilder()
119 .append(this.grouperObject, other.grouperObject)
120 .isEquals();
121 }
122
123
124
125
126
127
128 @Override
129 public int hashCode() {
130 return new HashCodeBuilder()
131 .append( this.grouperObject)
132 .toHashCode();
133 }
134
135 private void determineObjectTypes() {
136
137
138 this.stem = false;
139 this.group = false;
140 this.subject = false;
141 this.loaderGroup = false;
142 this.simpleLoaderGroup = false;
143 this.intersectGroup = false;
144 this.complementGroup = false;
145 this.provisionerTarget = false;
146
147 if (grouperObject instanceof Group) {
148 final Group./../../../../../edu/internet2/middleware/grouper/Group.html#Group">Group theGroup = (Group)grouperObject;
149 this.group = true;
150
151 GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() {
152
153 @Override
154 public Object callback(GrouperSession grouperSession) throws GrouperSessionException {
155
156 if (RelationGraph.getSqlLoaderAttributeDefName() != null
157 && theGroup.getAttributeDelegate().retrieveAssignment(null, RelationGraph.getSqlLoaderAttributeDefName(), false, false)!=null) {
158 GraphNode.this.loaderGroup = true;
159
160 if ("SQL_SIMPLE".equals(theGroup.getAttribute(GrouperLoader.GROUPER_LOADER_TYPE))) {
161 GraphNode.this.simpleLoaderGroup = true;
162 }
163 }
164
165 else {
166 AttributeAssign ldapAttributeAssign = theGroup.getAttributeDelegate().retrieveAssignment(null, LoaderLdapUtils.grouperLoaderLdapAttributeDefName(), false, false);
167 if (ldapAttributeAssign != null) {
168 GraphNode.this.loaderGroup = true;
169
170 if ("LDAP_SIMPLE".equals(ldapAttributeAssign.getAttributeValueDelegate().retrieveValueString(LoaderLdapUtils.grouperLoaderLdapTypeName()))) {
171 GraphNode.this.simpleLoaderGroup = true;
172 }
173
174 }
175 }
176
177 return null;
178 }
179 });
180
181
182 if (theGroup.hasComposite()) {
183 Composite composite = theGroup.getComposite(true);
184 if (composite.getType().equals(CompositeType.COMPLEMENT)) {
185 this.complementGroup = true;
186 } else if (composite.getType().equals(CompositeType.INTERSECTION)) {
187 this.intersectGroup = true;
188 }
189 }
190
191 }
192
193 if (grouperObject instanceof Stem) {
194 this.stem = true;
195 }
196
197 if (grouperObject instanceof GrouperObjectSubjectWrapper) {
198 this.subject = true;
199 }
200
201 if (grouperObject instanceof GrouperObjectProvisionerWrapper) {
202 this.provisionerTarget = true;
203 }
204
205
206 if (simpleLoaderGroup) {
207 styleObjectType = isStartNode() ? StyleObjectType.START_SIMPLE_LOADER_GROUP : StyleObjectType.SIMPLE_LOADER_GROUP;
208 } else if (loaderGroup) {
209 styleObjectType = isStartNode() ? StyleObjectType.START_LOADER_GROUP : StyleObjectType.LOADER_GROUP;
210 } else if (provisionerTarget) {
211 styleObjectType = StyleObjectType.PROVISIONER;
212 } else if (intersectGroup) {
213 styleObjectType = StyleObjectType.INTERSECT_GROUP;
214 } else if (complementGroup) {
215 styleObjectType = StyleObjectType.COMPLEMENT_GROUP;
216 } else if (group) {
217 styleObjectType = isStartNode() ? StyleObjectType.START_GROUP : StyleObjectType.GROUP;
218 } else if (stem) {
219 styleObjectType = isStartNode() ? StyleObjectType.START_STEM : StyleObjectType.STEM;
220 } else if (subject) {
221 styleObjectType = isStartNode() ? StyleObjectType.START_SUBJECT : StyleObjectType.SUBJECT;
222 } else if (provisionerTarget) {
223 styleObjectType = StyleObjectType.PROVISIONER;
224 } else {
225 styleObjectType = StyleObjectType.DEFAULT;
226 }
227
228 }
229
230
231
232
233
234
235 public GrouperObject getGrouperObject() {
236 return grouperObject;
237 }
238
239
240
241
242
243
244 public long getAllMemberCount() {
245 return allMemberCount;
246 }
247
248
249
250
251
252
253 public List<String> getObjectTypeNames() {
254 return objectTypeNames;
255 }
256
257
258
259
260
261
262 public long getDirectMemberCount() {
263 return directMemberCount;
264 }
265
266
267
268
269
270
271 public void setAllMemberCount(long allMemberCount) {
272 this.allMemberCount = allMemberCount;
273 }
274
275
276
277
278
279
280 public void setDirectMemberCount(long directMemberCount) {
281 this.directMemberCount = directMemberCount;
282 }
283
284
285
286
287
288
289 public void setObjectTypeNames(List<String> objectTypeNames) {
290 this.objectTypeNames = objectTypeNames;
291 }
292
293
294
295
296
297
298 public void addObjectTypeName(String objectTypeName) {
299 if (this.objectTypeNames == null) {
300 this.objectTypeNames = new LinkedList<String>();
301 }
302 this.objectTypeNames.add(objectTypeName);
303 }
304
305
306
307
308
309
310 public boolean isVisited() {
311 return visitedParents && visitedChildren;
312 }
313
314
315
316
317
318
319 public boolean isVisitedParents() {
320 return visitedParents;
321 }
322
323
324
325
326
327
328 public void setVisitedParents(boolean visitedParents) {
329 this.visitedParents = visitedParents;
330 }
331
332
333
334
335
336
337 public boolean isVisitedChildren() {
338 return visitedChildren;
339 }
340
341
342
343
344
345
346 public void setVisitedChildren(boolean visitedChildren) {
347 this.visitedChildren = visitedChildren;
348 }
349
350
351
352
353
354
355 public Set<GraphNode> getParentNodes() {
356 return parentNodes;
357 }
358
359
360
361
362
363
364 public void addParentNode(GraphNode parentNode) {
365 this.parentNodes.add(parentNode);
366 }
367
368
369
370
371
372
373 public Set<GraphNode> getChildNodes() {
374 return childNodes;
375 }
376
377
378
379
380
381
382 public void addChildNode(GraphNode childNode) {
383 this.childNodes.add(childNode);
384 }
385
386
387
388
389
390
391
392
393 public long getDistanceFromStartNode() {
394 return distanceFromStartNode;
395 }
396
397
398
399
400
401
402
403 public void setDistanceFromStartNode(long distanceFromStartNode) {
404 this.distanceFromStartNode = distanceFromStartNode;
405 }
406
407
408
409
410
411
412 public boolean isStem() {
413 return stem;
414 }
415
416
417
418
419
420
421 public boolean isGroup() {
422 return group;
423 }
424
425
426
427
428
429
430 public boolean isSubject() {
431 return subject;
432 }
433
434
435
436
437
438
439
440 public boolean isLoaderGroup() {
441 return loaderGroup;
442 }
443
444
445
446
447
448
449
450 public boolean isSimpleLoaderGroup() {
451 return simpleLoaderGroup;
452 }
453
454
455
456
457
458
459 public boolean isProvisionerTarget() {
460 return provisionerTarget;
461 }
462
463
464
465
466
467
468 public boolean isIntersectGroup() {
469 return intersectGroup;
470 }
471
472
473
474
475
476
477 public boolean isComplementGroup() {
478 return complementGroup;
479 }
480
481
482
483
484
485
486 public boolean isStartNode() {
487 return startNode;
488 }
489
490
491
492
493
494 public void setStartNode(boolean startNode) {
495 boolean oldStartNode = this.startNode;
496 this.startNode = startNode;
497
498
499 if (oldStartNode != startNode) {
500 determineObjectTypes();
501 };
502 }
503
504
505
506
507
508
509 public StyleObjectType getStyleObjectType() {
510 return styleObjectType;
511 }
512
513
514
515
516
517
518 public String getGrouperObjectId() {
519
520
521
522
523
524 return this.getGrouperObject().getId();
525
526 }
527
528
529
530
531
532
533 public String getGrouperObjectName() {
534 return this.getGrouperObject().getName();
535 }
536
537 public String toString() {
538 return this.getClass().getSimpleName() + ": {" + grouperObject + ", distanceFromStartNode=" + distanceFromStartNode + "}";
539 }
540 }