1 package org.codehaus.plexus;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.util.Collection;
20 import java.util.Iterator;
21 import java.util.LinkedHashSet;
22 import java.util.LinkedList;
23 import java.util.Queue;
24 import java.util.Set;
25
26 import org.codehaus.plexus.classworlds.ClassWorld;
27 import org.codehaus.plexus.classworlds.realm.ClassRealm;
28
29 public class ClassRealmUtil {
30
31 public static Set<ClassRealm> getContextRealms(ClassWorld world) {
32 Set<ClassRealm> realms = new LinkedHashSet<ClassRealm>();
33
34 for (ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
35 classLoader != null;
36 classLoader = classLoader.getParent()) {
37 if (classLoader instanceof ClassRealm) {
38 realms.add((ClassRealm) classLoader);
39
40 Queue<ClassRealm> queue = new LinkedList<ClassRealm>();
41 queue.add((ClassRealm) classLoader);
42
43 while (!queue.isEmpty()) {
44 ClassRealm realm = queue.remove();
45
46 Collection<ClassRealm> importRealms = realm.getImportRealms();
47 for (ClassRealm importRealm : importRealms) {
48 if (realms.add(importRealm)) {
49 queue.add(importRealm);
50 }
51 }
52
53 ClassRealm parentRealm = realm.getParentRealm();
54 if (parentRealm != null && realms.add(parentRealm)) {
55 queue.add(parentRealm);
56 }
57 }
58 }
59 }
60
61 if (world != null) {
62 for (Iterator<ClassRealm> it = realms.iterator(); it.hasNext(); ) {
63 ClassRealm realm = it.next();
64 if (realm.getWorld() != world) {
65 it.remove();
66 }
67 }
68 }
69
70 return realms;
71 }
72 }