1 8 9 package mx4j.server; 10 11 import java.util.ArrayList ; 12 import javax.management.loading.MLet ; 13 14 19 public class DefaultClassLoaderRepository extends ModifiableClassLoaderRepository 20 { 21 private static final int WITHOUT = 1; 22 private static final int BEFORE = 2; 23 24 private ArrayList classLoaders = new ArrayList (); 25 26 public Class loadClass(String className) throws ClassNotFoundException 27 { 28 return loadClassWithout(null, className); 29 } 30 31 public Class loadClassWithout(ClassLoader loader, String className) throws ClassNotFoundException 32 { 33 return loadClassFromRepository(loader, className, WITHOUT); 34 } 35 36 public Class loadClassBefore(ClassLoader loader, String className) throws ClassNotFoundException 37 { 38 return loadClassFromRepository(loader, className, BEFORE); 39 } 40 41 protected void addClassLoader(ClassLoader cl) 42 { 43 if (cl == null) return; 44 45 ArrayList loaders = getClassLoaders(); 46 synchronized (loaders) 47 { 48 if (!loaders.contains(cl)) loaders.add(cl); 49 } 50 } 51 52 protected void removeClassLoader(ClassLoader cl) 53 { 54 if (cl == null) return; 55 56 ArrayList loaders = getClassLoaders(); 57 synchronized (loaders) 58 { 59 loaders.remove(cl); 60 } 61 } 62 63 protected ArrayList cloneClassLoaders() 64 { 65 ArrayList loaders = getClassLoaders(); 66 synchronized (loaders) 67 { 68 return (ArrayList )loaders.clone(); 69 } 70 } 71 72 protected ArrayList getClassLoaders() 73 { 74 return classLoaders; 75 } 76 77 private Class loadClassFromRepository(ClassLoader loader, String className, int algorithm) throws ClassNotFoundException 78 { 79 ArrayList copy = cloneClassLoaders(); 80 for (int i = 0; i < copy.size(); ++i) 81 { 82 try 83 { 84 ClassLoader cl = (ClassLoader )copy.get(i); 85 if (cl.equals(loader)) 86 { 87 if (algorithm == BEFORE) 88 break; 89 else 90 continue; 91 } 92 93 return loadClass(cl, className); 94 } 95 catch (ClassNotFoundException ignored) 96 { 97 } 98 } 99 throw new ClassNotFoundException (className); 100 } 101 102 private Class loadClass(ClassLoader loader, String className) throws ClassNotFoundException 103 { 104 if (loader.getClass() == MLet .class) return ((MLet )loader).loadClass(className, null); 107 return loader.loadClass(className); 108 } 109 110 private int getSize() 111 { 112 ArrayList loaders = getClassLoaders(); 113 synchronized (loaders) 114 { 115 return loaders.size(); 116 } 117 } 118 } 119 | Popular Tags |