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 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 this(files, ClassLoader.getSystemClassLoader());
53 }
54
55 private JarClassloader(URL[] files, ClassLoader loader) {
56 super(new URL[]{});
57 try {
58 addURL(new URL("file:" + (new File(DYNAMIC_PROXY)).getAbsolutePath()));
59 }
60 catch(MalformedURLException e) {
61 logger.log(Level.SEVERE, "Unable to load " + DYNAMIC_PROXY + " into classpath", e);
62 }
63 componentClassLoader = new URLClassLoader(files, loader);
64 }
65
66 public static JarClassloader getInstance(ServiceMetaInfo service) {
67 return getInstance(service, null);
68 }
69
70 @Override
71 public Class<?> findClass(String className) throws ClassNotFoundException {
72 if(!className.equals(DYNAMIC_PROXY_CLASS_NAME)) {
73 return componentClassLoader.loadClass(className);
74 }
75 else {
76 return super.findClass(className);
77 }
78 }
79
80 @Override
81 public Class<?> loadClass(String className) throws ClassNotFoundException {
82 if(!className.equals(DYNAMIC_PROXY_CLASS_NAME)) {
83 return componentClassLoader.loadClass(className);
84 }
85 else {
86 return super.loadClass(className);
87 }
88 }
89
90 @Override
91 public URL findResource(String name) {
92 if(!name.equals(DYNAMIC_PROXY_CLASS_NAME)) {
93 return componentClassLoader.findResource(name);
94 }
95 else {
96 return super.findResource(name);
97 }
98 }
99
100 @Override
101 public URL getResource(String name) {
102 if(!name.equals(DYNAMIC_PROXY_CLASS_NAME)) {
103 return componentClassLoader.getResource(name);
104 }
105 else {
106 return super.getResource(name);
107 }
108 }
109
110 public static JarClassloader getInstance(ServiceMetaInfo service, ClassLoader classLoader) {
111
112 List<File> files = new ArrayList<File>();
113 files.add(service.getTempFile());
114 for(File newFile : service.getLibraries()) {
115 files.add(newFile);
116 }
117
118
119 URL[] urls = new URL[files.size()];
120 for(int i = 0; i < files.size(); i++) {
121 try {
122 urls[i] = new URL("file:" + files.get(i).getAbsolutePath());
123 }
124 catch (MalformedURLException e) {
125 logger.log(Level.SEVERE, "Unable to load jar into classpath: " +
126 files.get(i).getAbsolutePath(), e);
127 }
128 }
129
130
131 if(classLoader == null) {
132 return new JarClassloader(urls);
133 }
134 else {
135 return new JarClassloader(urls, classLoader);
136 }
137 }
138 }