blob: 3a3b28f6269e1cba0e3b445b1f7d9eead6b6fcef [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.util;
import org.apache.axis2.java.security.AccessController;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.security.PrivilegedAction;
/**
* Loads resources (or images) from various sources.
*/
public class Loader {
private static final Log log = LogFactory.getLog(Loader.class);
/**
* Searches for <code>resource</code> in different
* places. The search order is as follows:
* <ol>
* <p><li>Search for <code>resource</code> using the thread context
* class loader under Java2. If that fails, search for
* <code>resource</code> using the class loader that loaded this
* class (<code>Loader</code>).
* <p><li>Try one last time with
* <code>ClassLoader.getSystemResource(resource)</code>, that is is
* using the system class loader in JDK 1.2 and virtual machine's
* built-in class loader in JDK 1.1.
* </ol>
* <p/>
*
* @param resource
* @return Returns URL
*/
static public URL getResource(String resource) {
ClassLoader classLoader = null;
URL url = null;
try {
// We could not find resource. Ler us now try with the
// classloader that loaded this class.
classLoader = getTCL();
if (classLoader != null) {
log.debug("Trying to find [" + resource + "] using " + classLoader +
" class loader.");
url = classLoader.getResource(resource);
if (url != null) {
return url;
}
}
} catch (Throwable t) {
log.warn("Caught Exception while in Loader.getResource. This may be innocuous.", t);
}
// Last ditch attempt: get the resource from the class path. It
// may be the case that clazz was loaded by the Extentsion class
// loader which the parent of the system class loader. Hence the
// code below.
log.debug("Trying to find [" + resource + "] using ClassLoader.getSystemResource().");
return ClassLoader.getSystemResource(resource);
}
/**
* Gets the resource with the specified class loader.
*
* @param loader
* @param resource
* @return Returns URL.
* @throws ClassNotFoundException
*/
static public URL getResource(ClassLoader loader, String resource)
throws ClassNotFoundException {
URL url = null;
try {
if (loader != null) {
log.debug("Trying to find [" + resource + "] using " + loader + " class loader.");
url = loader.getResource(resource);
if (url != null) {
return url;
}
}
} catch (Throwable t) {
log.warn("Caught Exception while in Loader.getResource. This may be innocuous.", t);
}
return getResource(resource);
}
/**
* Searches for <code>resource</code> in different
* places. The search order is as follows:
* <ol>
* <p><li>Search for <code>resource</code> using the thread context
* class loader under Java2. If that fails, search for
* <code>resource</code> using the class loader that loaded this
* class (<code>Loader</code>).
* <p><li>Try one last time with
* <code>ClassLoader.getSystemResourceAsStream(resource)</code>, that is is
* using the system class loader in JDK 1.2 and virtual machine's
* built-in class loader in JDK 1.1.
* </ol>
* <p/>
*
* @param resource
* @return Returns URL
*/
static public InputStream getResourceAsStream(String resource) {
ClassLoader classLoader = null;
try {
// Let's try the Thread Context Class Loader
classLoader = getTCL();
if (classLoader != null) {
log.debug("Trying to find [" + resource + "] using " + classLoader +
" class loader.");
InputStream is = classLoader.getResourceAsStream(resource);
if (is != null) {
return is;
}
}
} catch (Throwable t) {
log.warn("Caught Exception while in Loader.getResourceAsStream. This may be innocuous.", t);
}
try {
// We could not find resource. Ler us now try with the
// classloader that loaded this class.
classLoader = Loader.class.getClassLoader();
if (classLoader != null) {
log.debug("Trying to find [" + resource + "] using " + classLoader +
" class loader.");
InputStream is = classLoader.getResourceAsStream(resource);
if (is != null) {
return is;
}
}
} catch (Throwable t) {
log.warn("Caught Exception while in Loader.getResourceAsStream. This may be innocuous.", t);
}
// Last ditch attempt: get the resource from the class path. It
// may be the case that clazz was loaded by the Extentsion class
// loader which the parent of the system class loader. Hence the
// code below.
log.debug("Trying to find [" + resource + "] using ClassLoader.getSystemResourceAsStream().");
return ClassLoader.getSystemResourceAsStream(resource);
}
/**
* Gets the resource with the specified class loader.
*
* @param loader
* @param resource
* @return Returns URL.
* @throws ClassNotFoundException
*/
static public InputStream getResourceAsStream(ClassLoader loader, String resource)
throws ClassNotFoundException {
try {
if (loader != null) {
log.debug("Trying to find [" + resource + "] using " + loader + " class loader.");
InputStream is = loader.getResourceAsStream(resource);
if (is != null) {
return is;
}
}
} catch (Throwable t) {
log.warn("Caught Exception while in Loader.getResource. This may be innocuous.", t);
}
return getResourceAsStream(resource);
}
/**
* Gets the thread context class loader.
*
* @return Returns ClassLoader.
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
static private ClassLoader getTCL() throws IllegalAccessException, InvocationTargetException {
return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
public ClassLoader run() {
return Thread.currentThread().getContextClassLoader();
}
});
}
/**
* Loads the specified classloader and then falls back to the loadClass.
*
* @param loader
* @param clazz
* @return Returns Class.
* @throws ClassNotFoundException
*/
static public Class loadClass(ClassLoader loader, String clazz) throws ClassNotFoundException {
try {
if (loader != null) {
Class c = loader.loadClass(clazz);
if (c != null) {
return c;
}
}
} catch (UnsupportedClassVersionError e) {
log.debug(e);
throw e;
} catch (Throwable e) {
log.debug(e);
}
return loadClass(clazz);
}
/**
* If running under JDK 1.2, loads the specified class using the
* <code>Thread</code> <code>contextClassLoader</code> . If that
* fails, try Class.forname.
* <p/>
*
* @param clazz
* @return Returns Class.
* @throws ClassNotFoundException
*/
static public Class loadClass(String clazz) throws ClassNotFoundException {
try {
ClassLoader tcl = getTCL();
if (tcl != null) {
Class c = tcl.loadClass(clazz);
if (c != null) {
return c;
}
}
} catch (UnsupportedClassVersionError e) {
log.debug(e);
throw e;
} catch (Throwable e) {
log.debug(e);
}
// we reached here because tcl was null or because of a
// security exception, or because clazz could not be loaded...
// In any case we now try one more time
return Class.forName(clazz);
}
}