| 1 | |
|
| 2 | |
|
| 3 | |
|
| 4 | |
|
| 5 | |
|
| 6 | |
|
| 7 | |
|
| 8 | |
|
| 9 | |
|
| 10 | |
|
| 11 | |
|
| 12 | |
|
| 13 | |
|
| 14 | |
|
| 15 | |
|
| 16 | |
|
| 17 | |
|
| 18 | |
|
| 19 | |
|
| 20 | |
|
| 21 | |
|
| 22 | |
|
| 23 | |
|
| 24 | |
|
| 25 | |
|
| 26 | |
|
| 27 | |
|
| 28 | |
|
| 29 | |
|
| 30 | |
|
| 31 | |
package argos.deploy; |
| 32 | |
|
| 33 | |
import java.io.File; |
| 34 | |
import java.net.MalformedURLException; |
| 35 | |
import java.net.URL; |
| 36 | |
import java.net.URLClassLoader; |
| 37 | |
import java.util.ArrayList; |
| 38 | |
import java.util.List; |
| 39 | |
import java.util.logging.Level; |
| 40 | |
import java.util.logging.Logger; |
| 41 | |
|
| 42 | |
import argos.metadata.ServiceMetaInfo; |
| 43 | |
|
| 44 | |
public final class JarClassloader extends URLClassLoader implements JarClassloaderMBean { |
| 45 | 0 | private static final Logger logger = Logger.getLogger(JarClassloader.class.getName()); |
| 46 | |
public static final String DYNAMIC_PROXY = "DynamicProxy.jar"; |
| 47 | |
public static final String DYNAMIC_PROXY_CLASS_NAME = "argos.proxy.DynamicProxy"; |
| 48 | |
|
| 49 | |
private URLClassLoader componentClassLoader; |
| 50 | |
|
| 51 | |
public JarClassloader(URL[] files) { |
| 52 | 0 | this(files, ClassLoader.getSystemClassLoader()); |
| 53 | 0 | } |
| 54 | |
|
| 55 | |
private JarClassloader(URL[] files, ClassLoader loader) { |
| 56 | 0 | super(new URL[]{}); |
| 57 | |
try { |
| 58 | 0 | addURL(new URL("file:" + (new File(DYNAMIC_PROXY)).getAbsolutePath())); |
| 59 | |
} |
| 60 | 0 | catch(MalformedURLException e) { |
| 61 | 0 | logger.log(Level.SEVERE, "Unable to load " + DYNAMIC_PROXY + " into classpath", e); |
| 62 | 0 | } |
| 63 | 0 | componentClassLoader = new URLClassLoader(files, loader); |
| 64 | 0 | } |
| 65 | |
|
| 66 | |
public static JarClassloader getInstance(ServiceMetaInfo service) { |
| 67 | 0 | return getInstance(service, null); |
| 68 | |
} |
| 69 | |
|
| 70 | |
@Override |
| 71 | |
public Class<?> findClass(String className) throws ClassNotFoundException { |
| 72 | 0 | if(!className.equals(DYNAMIC_PROXY_CLASS_NAME)) { |
| 73 | 0 | return componentClassLoader.loadClass(className); |
| 74 | |
} |
| 75 | |
else { |
| 76 | 0 | return super.findClass(className); |
| 77 | |
} |
| 78 | |
} |
| 79 | |
|
| 80 | |
@Override |
| 81 | |
public Class<?> loadClass(String className) throws ClassNotFoundException { |
| 82 | 0 | if(!className.equals(DYNAMIC_PROXY_CLASS_NAME)) { |
| 83 | 0 | return componentClassLoader.loadClass(className); |
| 84 | |
} |
| 85 | |
else { |
| 86 | 0 | return super.loadClass(className); |
| 87 | |
} |
| 88 | |
} |
| 89 | |
|
| 90 | |
@Override |
| 91 | |
public URL findResource(String name) { |
| 92 | 0 | if(!name.equals(DYNAMIC_PROXY_CLASS_NAME)) { |
| 93 | 0 | return componentClassLoader.findResource(name); |
| 94 | |
} |
| 95 | |
else { |
| 96 | 0 | return super.findResource(name); |
| 97 | |
} |
| 98 | |
} |
| 99 | |
|
| 100 | |
@Override |
| 101 | |
public URL getResource(String name) { |
| 102 | 0 | if(!name.equals(DYNAMIC_PROXY_CLASS_NAME)) { |
| 103 | 0 | return componentClassLoader.getResource(name); |
| 104 | |
} |
| 105 | |
else { |
| 106 | 0 | return super.getResource(name); |
| 107 | |
} |
| 108 | |
} |
| 109 | |
|
| 110 | |
public static JarClassloader getInstance(ServiceMetaInfo service, ClassLoader classLoader) { |
| 111 | |
|
| 112 | 0 | List<File> files = new ArrayList<File>(); |
| 113 | 0 | files.add(service.getTempFile()); |
| 114 | 0 | for(File newFile : service.getLibraries()) { |
| 115 | 0 | files.add(newFile); |
| 116 | |
} |
| 117 | |
|
| 118 | |
|
| 119 | 0 | URL[] urls = new URL[files.size()]; |
| 120 | 0 | for(int i = 0; i < files.size(); i++) { |
| 121 | |
try { |
| 122 | 0 | urls[i] = new URL("file:" + files.get(i).getAbsolutePath()); |
| 123 | |
} |
| 124 | 0 | catch (MalformedURLException e) { |
| 125 | 0 | logger.log(Level.SEVERE, "Unable to load jar into classpath: " + |
| 126 | |
files.get(i).getAbsolutePath(), e); |
| 127 | 0 | } |
| 128 | |
} |
| 129 | |
|
| 130 | |
|
| 131 | 0 | if(classLoader == null) { |
| 132 | 0 | return new JarClassloader(urls); |
| 133 | |
} |
| 134 | |
else { |
| 135 | 0 | return new JarClassloader(urls, classLoader); |
| 136 | |
} |
| 137 | |
} |
| 138 | |
} |