1 package org.codehaus.xfire.util;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.URL;
6
7 /***
8 * This class is extremely useful for loading resources and classes in a fault tolerant manner
9 * that works across different applications servers. Do not touch this unless you're a grizzled classloading
10 * guru veteran who is going to verify any change on 6 different application servers.
11 */
12 public class ClassLoaderUtils
13 {
14 /***
15 * Load a given resource.
16 * <p/>
17 * This method will try to load the resource using the following methods (in order):
18 * <ul>
19 * <li>From Thread.currentThread().getContextClassLoader()
20 * <li>From ClassLoaderUtil.class.getClassLoader()
21 * <li>callingClass.getClassLoader()
22 * </ul>
23 *
24 * @param resourceName The name of the resource to load
25 * @param callingClass The Class object of the calling object
26 */
27 public static URL getResource(String resourceName, Class callingClass)
28 {
29 URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
30
31 if(url == null)
32 {
33 url = ClassLoaderUtils.class.getClassLoader().getResource(resourceName);
34 }
35
36 if(url == null)
37 {
38 ClassLoader cl = callingClass.getClassLoader();
39
40 if(cl != null)
41 {
42 url = cl.getResource(resourceName);
43 }
44 }
45
46 if((url == null) && (resourceName != null) && (resourceName.charAt(0) != '/'))
47 {
48 return getResource('/' + resourceName, callingClass);
49 }
50
51 return url;
52 }
53
54 /***
55 * This is a convenience method to load a resource as a stream.
56 * <p/>
57 * The algorithm used to find the resource is given in getResource()
58 *
59 * @param resourceName The name of the resource to load
60 * @param callingClass The Class object of the calling object
61 */
62 public static InputStream getResourceAsStream(String resourceName, Class callingClass)
63 {
64 URL url = getResource(resourceName, callingClass);
65
66 try
67 {
68 return (url != null) ? url.openStream() : null;
69 }
70 catch(IOException e)
71 {
72 return null;
73 }
74 }
75
76 /***
77 * Load a class with a given name.
78 * <p/>
79 * It will try to load the class in the following order:
80 * <ul>
81 * <li>From Thread.currentThread().getContextClassLoader()
82 * <li>Using the basic Class.forName()
83 * <li>From ClassLoaderUtil.class.getClassLoader()
84 * <li>From the callingClass.getClassLoader()
85 * </ul>
86 *
87 * @param className The name of the class to load
88 * @param callingClass The Class object of the calling object
89 * @throws ClassNotFoundException If the class cannot be found anywhere.
90 */
91 public static Class loadClass(String className, Class callingClass) throws ClassNotFoundException
92 {
93 try
94 {
95 return Thread.currentThread().getContextClassLoader().loadClass(className);
96 }
97 catch(ClassNotFoundException e)
98 {
99 try
100 {
101 return Class.forName(className);
102 }
103 catch(ClassNotFoundException ex)
104 {
105 try
106 {
107 return ClassLoaderUtils.class.getClassLoader().loadClass(className);
108 }
109 catch(ClassNotFoundException exc)
110 {
111 return callingClass.getClassLoader().loadClass(className);
112 }
113 }
114 }
115 }
116 }