FileDocCategorySizeDatePackage
Loader.javaAPI DocApache log4j 1.2.155608Sat Aug 25 00:09:40 BST 2007org.apache.log4j.helpers

Loader

public class Loader extends Object
Load resources (or images) from various sources.
author
Ceki Gülcü

Fields Summary
static final String
TSTR
private static boolean
java1
private static boolean
ignoreTCL
Constructors Summary
Methods Summary
public static java.net.URLgetResource(java.lang.String resource, java.lang.Class clazz)
Get a resource by delegating to getResource(String).

param
resource resource name
param
clazz class, ignored.
return
URL to resource or null.
deprecated
as of 1.2.

  
   
    String prop = OptionConverter.getSystemProperty("java.version", null);
    
    if(prop != null) {
      int i = prop.indexOf('.");
      if(i != -1) {	
	if(prop.charAt(i+1) != '1")
	  java1 = false;
      } 
    }
    String ignoreTCLProp = OptionConverter.getSystemProperty("log4j.ignoreTCL", null);
    if(ignoreTCLProp != null) {
      ignoreTCL = OptionConverter.toBoolean(ignoreTCLProp, true);      
    }   
  
      return getResource(resource);
  
public static java.net.URLgetResource(java.lang.String resource)
This method will search for resource in different places. The search order is as follows:

  1. Search for resource using the thread context class loader under Java2. If that fails, search for resource using the class loader that loaded this class (Loader). Under JDK 1.1, only the the class loader that loaded this class (Loader) is used.

  2. Try one last time with ClassLoader.getSystemResource(resource), that is is using the system class loader in JDK 1.2 and virtual machine's built-in class loader in JDK 1.1.

    ClassLoader classLoader = null;
    URL url = null;
    
    try {
  	if(!java1) {
  	  classLoader = getTCL();
  	  if(classLoader != null) {
  	    LogLog.debug("Trying to find ["+resource+"] using context classloader "
  			 +classLoader+".");
  	    url = classLoader.getResource(resource);      
  	    if(url != null) {
  	      return url;
  	    }
  	  }
  	}
  	
  	// We could not find resource. Ler us now try with the
  	// classloader that loaded this class.
  	classLoader = Loader.class.getClassLoader(); 
  	if(classLoader != null) {
  	  LogLog.debug("Trying to find ["+resource+"] using "+classLoader
  		       +" class loader.");
  	  url = classLoader.getResource(resource);
  	  if(url != null) {
  	    return url;
  	  }
  	}
    } catch(Throwable t) {
  	LogLog.warn(TSTR, 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.
    LogLog.debug("Trying to find ["+resource+
  		   "] using ClassLoader.getSystemResource().");
    return ClassLoader.getSystemResource(resource);
  
private static java.lang.ClassLoadergetTCL()
Get the Thread Context Loader which is a JDK 1.2 feature. If we are running under JDK 1.1 or anything else goes wrong the method returns null.


    // Are we running on a JDK 1.2 or later system?
    Method method = null;
    try {
      method = Thread.class.getMethod("getContextClassLoader", null);
    } catch (NoSuchMethodException e) {
      // We are running on JDK 1.1
      return null;
    }
    
    return (ClassLoader) method.invoke(Thread.currentThread(), null);
  
public static booleanisJava1()
Are we running under JDK 1.x?

    return java1;
  
public static java.lang.ClassloadClass(java.lang.String clazz)
If running under JDK 1.2 load the specified class using the Thread contextClassLoader if that fails try Class.forname. Under JDK 1.1 only Class.forName is used.

    // Just call Class.forName(clazz) if we are running under JDK 1.1
    // or if we are instructed to ignore the TCL.
    if(java1 || ignoreTCL) {
      return Class.forName(clazz);
    } else {
      try {
	return getTCL().loadClass(clazz);
      } catch(Throwable 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);
      }
    }