1 10 11 package org.mule.registry; 12 13 import java.io.File ; 14 import java.net.MalformedURLException ; 15 import java.net.URL ; 16 import java.net.URLClassLoader ; 17 import java.security.SecureClassLoader ; 18 import java.util.ArrayList ; 19 import java.util.HashMap ; 20 import java.util.Iterator ; 21 import java.util.List ; 22 import java.util.Map ; 23 24 27 public class ClassLoaderFactory 28 { 29 30 private static ClassLoaderFactory factory; 31 private Map sharedClassLoaders; 32 33 public static ClassLoaderFactory getInstance() 34 { 35 if (factory == null) 36 { 37 factory = new ClassLoaderFactory(); 38 } 39 return factory; 40 } 41 42 private ClassLoaderFactory() 43 { 44 this.sharedClassLoaders = new HashMap (); 45 } 46 47 public ClassLoader createComponentClassLoader(RegistryComponent component) throws MalformedURLException 48 { 49 DelegatingClassLoader dcl = new DelegatingClassLoader(); 50 Library[] libraries = component.getLibraries(); 51 for (int i = 0; i < libraries.length; i++) 52 { 53 dcl.addClassLoader(getSharedClassLoader(libraries[i])); 54 } 55 URL [] urls = getUrlsFrom(component.getInstallRoot(), component.getClassPathElements()); 56 boolean isParentFirst = component.isClassLoaderParentFirst(); 57 JbiClassLoader ccl = new JbiClassLoader(urls, dcl, isParentFirst); 58 return ccl; 59 } 60 61 private ClassLoader getSharedClassLoader(Library library) throws MalformedURLException 62 { 63 ClassLoader cl = (ClassLoader )this.sharedClassLoaders.get(library.getName()); 64 if (cl == null) 65 { 66 URL [] urls = getUrlsFrom(library.getInstallRoot(), library.getClassPathElements()); 67 boolean isParentFirst = library.isClassLoaderParentFirst(); 68 cl = new JbiClassLoader(urls, null, isParentFirst); 69 this.sharedClassLoaders.put(library.getName(), cl); 70 } 71 return cl; 72 } 73 74 private URL [] getUrlsFrom(String root, List paths) throws MalformedURLException 75 { 76 URL [] urls = new URL [paths.size()]; 77 for (int i = 0; i < urls.length; i++) 78 { 79 String cpElement = (String )paths.get(i); 80 urls[i] = new File (root, cpElement).toURL(); 81 } 82 return urls; 83 } 84 85 91 public static class JbiClassLoader extends URLClassLoader 92 { 93 94 private boolean parentFirst; 95 96 public JbiClassLoader(URL [] urls, ClassLoader parent, boolean parentFirst) 97 { 98 super(urls, parent); 99 this.parentFirst = parentFirst; 100 } 101 102 protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException 103 { 104 Class clazz = findLoadedClass(name); 106 if (clazz == null) 107 { 108 if (this.parentFirst) 109 { 110 try 111 { 112 clazz = getParent().loadClass(name); 113 } 114 catch (ClassNotFoundException cnfe) 115 { 116 clazz = findClass(name); 117 } 118 } 119 else 120 { 121 try 122 { 123 clazz = findClass(name); 124 } 125 catch (ClassNotFoundException e) 126 { 127 clazz = getParent().loadClass(name); 128 } 129 } 130 } 131 if (resolve) 132 { 133 resolveClass(clazz); 134 } 135 return clazz; 136 } 137 } 138 139 144 public static class DelegatingClassLoader extends SecureClassLoader 145 { 146 private List loaders; 147 148 public DelegatingClassLoader() 149 { 150 this.loaders = new ArrayList (); 151 } 152 153 public void addClassLoader(ClassLoader loader) 154 { 155 if (loader == null) 156 { 157 throw new IllegalArgumentException ("loader can not be null"); 158 } 159 loaders.add(loader); 160 } 161 162 protected Class findClass(String name) throws ClassNotFoundException 163 { 164 for (Iterator iter = this.loaders.iterator(); iter.hasNext();) 165 { 166 ClassLoader loader = (ClassLoader )iter.next(); 167 try 168 { 169 return loader.loadClass(name); 170 } 171 catch (ClassNotFoundException e) 172 { 173 } 175 } 176 throw new ClassNotFoundException (name); 177 } 178 } 179 180 } 181 | Popular Tags |