1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.qedeq.base.io;
17
18 import java.io.File;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.lang.reflect.InvocationTargetException;
22 import java.lang.reflect.Method;
23 import java.net.URL;
24
25 import org.qedeq.base.trace.Trace;
26
27
28
29
30
31
32
33
34 public final class ResourceLoaderUtility {
35
36
37 private static final Class CLASS = ResourceLoaderUtility.class;
38
39
40
41
42 private ResourceLoaderUtility() {
43
44 }
45
46
47
48
49
50
51
52
53
54
55 public static Class loadClass(final String name) throws ClassNotFoundException {
56 return loadClass(name, null);
57 }
58
59
60
61
62
63
64
65
66
67 public static URL getResourceUrl(final String name) {
68 return getResourceUrl(name, ResourceLoaderUtility.class.getClassLoader());
69 }
70
71
72
73
74
75
76
77
78
79 public static InputStream getResourceAsStream(final String name) {
80 return getResourceAsStream(name, null);
81 }
82
83
84
85
86
87
88
89
90
91
92
93
94 public static Class loadClass(final String name, final ClassLoader callerClassLoader)
95 throws ClassNotFoundException {
96 Class clazz = null;
97
98 try {
99 final ClassLoader loader = getContextClassLoader();
100
101 if (loader != null) {
102 clazz = loader.loadClass(name);
103 }
104 } catch (ClassNotFoundException e) {
105
106 }
107
108 if (clazz == null) {
109 if (callerClassLoader != null) {
110 clazz = callerClassLoader.loadClass(name);
111 } else {
112 clazz = Class.forName(name);
113 }
114 }
115
116 return clazz;
117 }
118
119
120
121
122
123
124
125
126
127
128
129 public static URL getResourceUrl(final String name, final ClassLoader callerClassLoader) {
130 checkResourceName(name);
131
132 URL url = null;
133
134 final ClassLoader loader = getContextClassLoader();
135
136 if (loader != null) {
137 url = loader.getResource(name);
138 }
139
140 if (url == null) {
141
142 if (callerClassLoader != null) {
143 url = callerClassLoader.getResource(name);
144 } else {
145
146 url = ClassLoader.getSystemResource(name);
147 }
148 }
149 return url;
150 }
151
152
153
154
155
156
157
158
159
160
161
162 public static InputStream getResourceAsStream(final String name,
163 final ClassLoader callerClassLoader) {
164 checkResourceName(name);
165
166 InputStream stream = null;
167
168 final ClassLoader loader = getContextClassLoader();
169
170 if (loader != null) {
171 stream = loader.getResourceAsStream(name);
172 }
173 if (stream == null) {
174 if (callerClassLoader != null) {
175 stream = callerClassLoader.getResourceAsStream(name);
176 } else {
177 stream = ClassLoader.getSystemResourceAsStream(name);
178 }
179 }
180
181 return stream;
182 }
183
184
185
186
187
188
189
190
191 public static ClassLoader getContextClassLoader() {
192 try {
193 final Method method = Thread.class.getMethod("getContextClassLoader", null);
194 return (ClassLoader) method.invoke(Thread.currentThread(), null);
195 } catch (RuntimeException e) {
196 return null;
197 } catch (IllegalAccessException e) {
198 return null;
199 } catch (InvocationTargetException e) {
200 return null;
201 } catch (NoSuchMethodException e) {
202 return null;
203 }
204 }
205
206 private static void checkResourceName(final String name) {
207 if ((name != null) && name.startsWith("/")) {
208 Trace.info(CLASS, "ClassLoaderUtility", "checkResourceName",
209 "resource name not portable: " + name);
210
211 }
212 }
213
214
215
216
217
218
219
220
221
222
223
224 public static File getResourceFile(final File startDirectory,
225 final String resourceDirectoryName, final String resourceName) {
226 final File resourceDir = new File(startDirectory, resourceDirectoryName);
227 final File resource = new File(resourceDir, resourceName);
228 if (!resource.exists()) {
229 final URL url = getResourceUrl(resourceDirectoryName + "/" + resourceName);
230 if (url == null) {
231 Trace.info(ResourceLoaderUtility.class, "getResourceUrlAndMakeLocalCopy",
232 "URL not found for: " + resourceDirectoryName + "/" + resourceName);
233 return null;
234 }
235 try {
236 if (!resourceDir.exists()) {
237 if (!resourceDir.mkdirs()) {
238 Trace.info(ResourceLoaderUtility.class, "getResourceUrlAndMakeLocalCopy",
239 "creation failed: " + resourceDir);
240 }
241 }
242 IoUtility.saveFile(url, resource);
243 } catch (IOException e) {
244 Trace.fatal(ResourceLoaderUtility.class, "getResourceUrlAndMakeLocalCopy",
245 "resource can not be saved", e);
246 }
247 }
248 return resource;
249 }
250
251 }