1 11 package org.eclipse.core.runtime.internal.adaptor; 12 13 import java.io.IOException ; 14 import java.net.URL ; 15 import java.security.AccessController ; 16 import java.security.PrivilegedAction ; 17 import java.util.*; 18 import org.eclipse.osgi.framework.adaptor.BundleClassLoader; 19 20 public class ContextFinder extends ClassLoader implements PrivilegedAction { 21 static final class Finder extends SecurityManager { 22 public Class [] getClassContext() { 23 return super.getClassContext(); 24 } 25 } 26 private static ThreadLocal cycleDetector = new ThreadLocal (); 29 static ClassLoader finderClassLoader; 30 static Finder contextFinder; 31 static { 32 AccessController.doPrivileged(new PrivilegedAction () { 33 public Object run() { 34 finderClassLoader = ContextFinder.class.getClassLoader(); 35 contextFinder = new Finder(); 36 return null; 37 } 38 }); 39 } 40 41 public ContextFinder(ClassLoader contextClassLoader) { 42 super(contextClassLoader); 43 } 44 45 ArrayList basicFindClassLoaders() { 50 Class [] stack = contextFinder.getClassContext(); 51 ArrayList result = new ArrayList(1); 52 ClassLoader previousLoader = null; 53 for (int i = 1; i < stack.length; i++) { 54 ClassLoader tmp = stack[i].getClassLoader(); 55 if (stack[i] != ContextFinder.class && tmp != null && tmp != this) { 56 if (checkClassLoader(tmp)) { 57 if (previousLoader != tmp) { 58 result.add(tmp); 59 previousLoader = tmp; 60 } 61 } 62 if (tmp == finderClassLoader || tmp instanceof BundleClassLoader) 64 break; 65 } 66 } 67 return result; 68 } 69 70 private boolean checkClassLoader(ClassLoader classloader) { 74 if (classloader == null || classloader == getParent()) 75 return false; 76 for (ClassLoader parent = classloader.getParent(); parent != null; parent = parent.getParent()) 77 if (parent == this) 78 return false; 79 return true; 80 } 81 82 private ArrayList findClassLoaders() { 83 if (System.getSecurityManager() == null) 84 return basicFindClassLoaders(); 85 return (ArrayList) AccessController.doPrivileged(this); 86 } 87 88 public Object run() { 89 return basicFindClassLoaders(); 90 } 91 92 private boolean startLoading(String name) { 95 Set classesAndResources = (Set) cycleDetector.get(); 96 if (classesAndResources != null && classesAndResources.contains(name)) 97 return false; 98 99 if (classesAndResources == null) { 100 classesAndResources = new HashSet(3); 101 cycleDetector.set(classesAndResources); 102 } 103 classesAndResources.add(name); 104 return true; 105 } 106 107 private void stopLoading(String name) { 108 ((Set) cycleDetector.get()).remove(name); 109 } 110 111 protected Class loadClass(String arg0, boolean arg1) throws ClassNotFoundException { 112 if (startLoading(arg0) == false) 114 throw new ClassNotFoundException (arg0); 115 116 try { 117 ArrayList toConsult = findClassLoaders(); 118 for (Iterator loaders = toConsult.iterator(); loaders.hasNext();) 119 try { 120 return ((ClassLoader ) loaders.next()).loadClass(arg0); 121 } catch (ClassNotFoundException e) { 122 } 124 return super.loadClass(arg0, arg1); 125 } finally { 126 stopLoading(arg0); 127 } 128 } 129 130 public URL getResource(String arg0) { 131 if (startLoading(arg0) == false) 133 return null; 134 try { 135 ArrayList toConsult = findClassLoaders(); 136 for (Iterator loaders = toConsult.iterator(); loaders.hasNext();) { 137 URL result = ((ClassLoader ) loaders.next()).getResource(arg0); 138 if (result != null) 139 return result; 140 } 142 return super.getResource(arg0); 143 } finally { 144 stopLoading(arg0); 145 } 146 } 147 148 protected Enumeration findResources(String arg0) throws IOException { 149 if (startLoading(arg0) == false) 151 return null; 152 try { 153 ArrayList toConsult = findClassLoaders(); 154 for (Iterator loaders = toConsult.iterator(); loaders.hasNext();) { 155 Enumeration result = ((ClassLoader ) loaders.next()).getResources(arg0); 156 if (result != null && result.hasMoreElements()) 157 return result; 158 } 160 return super.findResources(arg0); 161 } finally { 162 stopLoading(arg0); 163 } 164 } 165 } 166 | Popular Tags |