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 }