1 package org.sapia.clazzy; 2 3 import java.io.File ; 4 import java.net.MalformedURLException ; 5 import java.net.URL ; 6 import java.util.ArrayList ; 7 import java.util.Collections ; 8 import java.util.List ; 9 import java.util.ResourceBundle ; 10 11 import org.sapia.clazzy.loader.FileSystemLoader; 12 import org.sapia.clazzy.loader.JarLoader; 13 import org.sapia.clazzy.loader.Loader; 14 15 39 public class CompositeClassLoader extends BaseClassLoader implements Consts{ 40 41 private List _loaders = Collections.synchronizedList(new ArrayList ()); 42 private LoaderSelector _selector; 43 private ResourceBundle _bundle; 44 45 public CompositeClassLoader(ClassLoader parent, LoaderSelector selector) { 46 super(parent); 47 _selector = selector; 48 } 49 50 public CompositeClassLoader(LoaderSelector selector) { 51 _selector = selector; 52 } 53 54 57 public URL [] getURLs(){ 58 List urls = new ArrayList (); 59 Loader loader; 60 for(int i = 0; i < _loaders.size(); i++){ 61 loader = (Loader)_loaders.get(i); 62 if(loader instanceof URLEnabled){ 63 try{ 64 urls.add(((URLEnabled)loader).getURL()); 65 }catch(MalformedURLException e){ 66 } 67 } 68 } 69 return (URL [])urls.toArray(new URL [urls.size()]); 70 } 71 72 75 public Class findClass(String name) throws ClassNotFoundException { 76 Class clazz = null; 77 Loader loader; 78 byte[] classBytes = null; 79 String resourceName = name.replace('.', '/')+".class"; 80 synchronized(_loaders) { 81 for(int i = 0; i < _loaders.size(); i++) { 82 loader = (Loader) _loaders.get(i); 83 if(_selector.acceptsClass(name, loader)) { 84 classBytes = loader.loadBytes(resourceName); 85 if(classBytes != null){ 86 break; 87 } 88 } 89 } 90 } 91 if(classBytes == null) { 92 throw new ClassNotFoundException (name); 93 } 94 String pckg = Utils.getPackageNameFor(name); 95 if(pckg != null && getPackage(pckg) == null){ 96 definePackage(pckg, 97 PACKAGE_SPEC_TITLE, 98 PACKAGE_SPEC_VERSION, 99 PACKAGE_SPEC_VENDOR, 100 PACKAGE_IMPL_TITLE, 101 PACKAGE_IMPL_VERSION, 102 PACKAGE_IMPL_VENDOR, 103 null); 104 } 105 return super.defineClass(name, classBytes, 0, classBytes.length); 106 } 107 108 111 protected URL findResource(String name) { 112 Loader loader; 113 URL toReturn = null; 114 synchronized(_loaders) { 115 for(int i = 0; i < _loaders.size(); i++) { 116 loader = (Loader) _loaders.get(i); 117 if(_selector.acceptsResource(name, loader)) { 118 toReturn = loader.getURL(name); 119 if(toReturn != null){ 120 break; 121 } 122 } 123 } 124 } 125 return toReturn; 126 } 127 128 132 public void addLoader(Loader loader) { 133 _loaders.add(loader); 134 } 135 136 144 public void addPath(File file){ 145 if(!file.exists()){ 146 return; 147 } 148 if(file.isDirectory()){ 149 addLoader(new FileSystemLoader(file)); 150 } 151 else{ 152 addLoader(new JarLoader(file)); 153 } 154 } 155 156 159 public void close(){ 160 Loader loader; 161 for(int i = 0; i < _loaders.size(); i++){ 162 loader = (Loader)_loaders.get(i); 163 try{ 164 loader.close(); 165 }catch(Exception e){} 166 } 167 } 168 169 } 170 | Popular Tags |