| /* |
| * Copyright 2003-2004 The Apache Software Foundation. |
| * |
| * Licensed 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.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.net.URL; |
| |
| /** |
| * 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); |
| } |
| |
| /** |
| * Gets the thread context class loader. |
| * |
| * @return Returns ClassLoader. |
| * @throws IllegalAccessException |
| * @throws InvocationTargetException |
| */ |
| static public ClassLoader getTCL() throws IllegalAccessException, InvocationTargetException { |
| 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 (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 (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); |
| } |
| } |