1 14 package org.jmanage.core.config; 15 16 import org.jmanage.util.StringUtils; 17 import org.jmanage.core.util.Loggers; 18 19 import java.net.URL ; 20 import java.net.URLClassLoader ; 21 import java.util.HashMap ; 22 import java.util.Map ; 23 import java.util.Collections ; 24 import java.util.logging.Logger ; 25 26 35 public class ClassLoaderRepository { 36 37 private static final Logger logger = 38 Loggers.getLogger(ClassLoaderRepository.class); 39 40 41 private static Map classLoaders = Collections.synchronizedMap(new HashMap ()); 42 43 public static ClassLoader getClassLoader(URL [] classpath, 44 boolean isCompatibleJMX){ 45 46 Key key = new Key(classpath, isCompatibleJMX); 47 ClassLoader classLoader = (ClassLoader )classLoaders.get(key); 48 if(classLoader == null){ 49 logger.fine("Creating new ClassLoader for classpath : " + 50 StringUtils.toString(classpath) + ", isCompatibleJMX=" + 51 isCompatibleJMX); 52 if(!isCompatibleJMX){ 53 classLoader = new JMXMeFirstClassLoader(classpath, 54 ModuleConfig.class.getClassLoader()); 55 }else{ 56 classLoader = new URLClassLoader (classpath, 57 ModuleConfig.class.getClassLoader()); 58 } 59 classLoaders.put(key, classLoader); 60 } 61 return classLoader; 62 } 63 64 private static class Key { 65 URL [] classpath; 66 boolean isCompatibleJMX; 67 Key(URL [] classpath, boolean isCompatibleJMX){ 68 this.classpath = classpath; 69 this.isCompatibleJMX = isCompatibleJMX; 70 } 71 72 public boolean equals(Object obj){ 73 if(obj instanceof Key){ 74 Key key = (Key)obj; 75 if(key.isCompatibleJMX == this.isCompatibleJMX 76 && compare(key.classpath, this.classpath)){ 77 return true; 78 } 79 } 80 return false; 81 } 82 83 public int hashCode(){ 84 return classpath.hashCode() * 31 + 85 Boolean.valueOf(isCompatibleJMX).hashCode(); 86 } 87 88 boolean compare(URL [] a, URL [] b){ 89 String strA = StringUtils.toString(a); 90 String strB = StringUtils.toString(b); 91 return strA.equals(strB); 92 } 93 } 94 95 private static class JMXMeFirstClassLoader extends URLClassLoader { 96 97 JMXMeFirstClassLoader(URL [] classpath, ClassLoader parent){ 98 super(classpath, parent); 99 } 100 101 protected synchronized Class loadClass(String name, boolean resolve) 102 throws ClassNotFoundException { 103 104 if(name.startsWith("javax.management.")){ 105 Class c = findLoadedClass(name); 107 if(c == null){ 108 try { 109 c = findClass(name); 110 } catch (ClassNotFoundException e) { 111 c = getParent().loadClass(name); 112 } 113 } 114 if (resolve) { 115 resolveClass(c); 116 } 117 return c; 118 } 119 return super.loadClass(name, resolve); 120 } 121 } 122 } 123 124 | Popular Tags |