You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-cvs@jakarta.apache.org by cs...@apache.org on 2001/06/20 09:59:57 UTC

cvs commit: jakarta-log4j/src/java/org/apache/log4j/xml DOMConfigurator.java

cstaylor    01/06/20 00:59:57

  Modified:    src/java/org/apache/log4j BasicConfigurator.java
               src/java/org/apache/log4j/helpers OptionConverter.java
               src/java/org/apache/log4j/spi LocationInfo.java
                        LoggingEvent.java
               src/java/org/apache/log4j/xml DOMConfigurator.java
  Added:       src/java/org/apache/log4j/helpers VersionHelper.java
                        VersionHelper11.java VersionHelper20.java
  Log:
  Changes for supporting multiple Classloader environments like Tomcat.  Replaced
  all calls to Class.forName with version check and delegation to JVM specific
  routines.  See javadocs for org.apache.log4j.helpers.VersionHelper for more
  details.
  
  Revision  Changes    Path
  1.15      +2 -1      jakarta-log4j/src/java/org/apache/log4j/BasicConfigurator.java
  
  Index: BasicConfigurator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/BasicConfigurator.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- BasicConfigurator.java	2001/06/19 15:44:50	1.14
  +++ BasicConfigurator.java	2001/06/20 07:59:42	1.15
  @@ -12,6 +12,7 @@
   package org.apache.log4j;
   
   import org.apache.log4j.helpers.LogLog;
  +import org.apache.log4j.helpers.VersionHelper;
   import org.apache.log4j.helpers.OptionConverter;
   import org.apache.log4j.or.ObjectRenderer;
   import org.apache.log4j.or.RendererMap;
  @@ -109,7 +110,7 @@
         return;
       } else {
         try {
  -	Class renderedClass = Class.forName(renderedClassName);
  +	Class renderedClass = VersionHelper.getInstance().loadClass(renderedClassName);
   	hierarchy.rendererMap.put(renderedClass, renderer);
         } catch(ClassNotFoundException e) {
   	LogLog.error("Could not find class ["+renderedClassName+"].", e);
  
  
  
  1.17      +3 -2      jakarta-log4j/src/java/org/apache/log4j/helpers/OptionConverter.java
  
  Index: OptionConverter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/helpers/OptionConverter.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- OptionConverter.java	2001/04/17 22:32:32	1.16
  +++ OptionConverter.java	2001/06/20 07:59:46	1.17
  @@ -16,6 +16,7 @@
   import org.apache.log4j.spi.Configurator;
   import org.apache.log4j.xml.DOMConfigurator;
   import org.apache.log4j.PropertyConfigurator;
  +import org.apache.log4j.helpers.VersionHelper;
   
   // Contributors:   Avy Sharell (sharell@online.fr)
   //                 Anders Kristensen
  @@ -191,7 +192,7 @@
   		 + ":pri=[" + priorityName + "]");
   
       try {
  -      Class customPriority = Class.forName(clazz);
  +      Class customPriority = VersionHelper.getInstance().loadClass(clazz);
   
         // get a ref to the specified class' static method
         // toPriority(String, org.apache.log4j.Priority)
  @@ -298,7 +299,7 @@
   				Object defaultValue) {
       if(className != null) {
         try {
  -	Class classObj = Class.forName(className);
  +	Class classObj = VersionHelper.getInstance().loadClass(className);
   	if(!superClass.isAssignableFrom(classObj)) {
   	  LogLog.error("A \""+className+"\" object is not assignable to a \""+
   		       superClass.getName() + "\" variable.");
  
  
  
  1.1                  jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper.java
  
  Index: VersionHelper.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.APL file.
   */
  
  package org.apache.log4j.helpers;
  
  import java.util.StringTokenizer;
  
  /**
     VersionHelper fixes the classloading trouble when using Log4J in a multi-classloader
     environment like Jakarta Tomcat
  
     @since 1.2
     @author Christopher Taylor
  */
  abstract public class VersionHelper {
  	
  	public static final String VERSION_PROPERTY = "java.version";	
  	private static VersionHelper helper;
  
  	
  	/** VersionHelpers for specific JVM versions override this method,  For example, VersionHelper11 just calls
  	 *  into <code>Class.forName()</code>, while VersionHelper20 calls into 
  	 *  <code>Thread.currentThread().getContextClassLoader().loadClass()</code>
       *	@see java.lang.Thread#getContextClassLoader
  	 */
  	abstract public Class loadClass (String klass_name) throws ClassNotFoundException;
  	
  	/** All classes in Log4J that need to dynamically load other classes must use 
  	 * <code>org.apache.log4j.helpers.VersionHelper.getInstance().loadClass(<i>class name</i>)</code>
  	 * and <b>not</b> use <code>Class.forName</code>.  In a Java 2 environment, classes from a parent
  	 * classloader will ignore any classes available in child class loaders.  Consequently, any appenders,
  	 * layout managers, or other supporting Log4J classes that are not bundled with the main <code>log4j.jar</code>
  	 * file will be ignored in a multi-classloader environment like Tomcat unless a call is made to 
  	 * <code>Thread.currentThread().getContextClassLoader().loadClass</code>.  As this method is only in Java 2,
  	 * special version checking code must be inserted guaranteeing that it won't be executed on Java 1 platforms.
  	 * The VersionHelper superclass handles the version checking within this method by parsing the System property
  	 * <code>java.version</code>.
  	 * @see java.lang.Thread#getContextClassLoader
  	 */
  	public static VersionHelper getInstance () {
          if (helper == null) {
  			/* If the helper is null, we'll inspect the System property "java.version" and
  			   figure out which version of the VM we're running on.
  			   Version strings are: [major version].[minor version].[bug fix revision]
  			   So JDK 1.2: 1.2.0
  			   JDK 1.1: 1.1.0 
  				*/
  			String prop = System.getProperty(VERSION_PROPERTY);
  			StringTokenizer st = new StringTokenizer(prop,".");
              st.nextToken(); // Ignore the initial 1
  			String version = st.nextToken();
  			try {
  				/* Here we'll parse the number and decide which version helper to use */
  				switch (Integer.parseInt(version)) {
  					case 0:
  					case 1: helper = new VersionHelper11(); break;
  					default: helper = new VersionHelper20(); break;
  				}
  			}
  			catch (NumberFormatException oops) {
  				helper = new VersionHelper11();
  			}  
  		}
  		return helper;
  	}
  }
  
  
  
  1.1                  jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper11.java
  
  Index: VersionHelper11.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.APL file.
   */
   
  package org.apache.log4j.helpers;
  
  /** VersionHelper11 is the Java 1 compatible VersionHelper for classloading
       *  @since 1.2
  	 *  @see org.apache.log4j.helpers.VersionHelper
  	 *  @author Christopher Taylor
  	 */
  public class VersionHelper11 extends VersionHelper {
      public Class loadClass (String klass_name) throws ClassNotFoundException {
  		return Class.forName(klass_name);
  	}
  }
  
  
  
  1.1                  jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper20.java
  
  Index: VersionHelper20.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.APL file.
   */
  package org.apache.log4j.helpers;
  
   /** VersionHelper20 is the Java 2 compatible VersionHelper for classloading
       *  @since 1.2
  	 *  @see org.apache.log4j.helpers.VersionHelper
  	 *  @author Christopher Taylor
  	 */
  public class VersionHelper20 extends VersionHelper {
      public Class loadClass (String klass_name) throws ClassNotFoundException {
  		return Thread.currentThread().getContextClassLoader().loadClass(klass_name);
  	}
  }
  
  
  
  
  1.7       +2 -1      jakarta-log4j/src/java/org/apache/log4j/spi/LocationInfo.java
  
  Index: LocationInfo.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/spi/LocationInfo.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- LocationInfo.java	2001/06/13 00:20:36	1.6
  +++ LocationInfo.java	2001/06/20 07:59:49	1.7
  @@ -13,6 +13,7 @@
   import java.io.PrintWriter;
   import org.apache.log4j.helpers.LogLog;
   import org.apache.log4j.Layout;
  +import org.apache.log4j.helpers.VersionHelper;
   
   /**
      The internal representation of caller location information.
  @@ -59,7 +60,7 @@
     static boolean inVisualAge = false;
     static {
       try {
  -      Class dummy = Class.forName("com.ibm.uvm.tools.DebugSupport");
  +      Class dummy = VersionHelper.getInstance().loadClass("com.ibm.uvm.tools.DebugSupport");
         inVisualAge = true;
         LogLog.debug("Detected IBM VisualAge environment.");
       } catch(Throwable e) { 
  
  
  
  1.13      +2 -1      jakarta-log4j/src/java/org/apache/log4j/spi/LoggingEvent.java
  
  Index: LoggingEvent.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/spi/LoggingEvent.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- LoggingEvent.java	2001/06/06 16:07:23	1.12
  +++ LoggingEvent.java	2001/06/20 07:59:50	1.13
  @@ -12,6 +12,7 @@
   import org.apache.log4j.NDC;
   
   import org.apache.log4j.helpers.LogLog;
  +import org.apache.log4j.helpers.VersionHelper;
   
   import java.io.StringWriter;
   import java.io.PrintWriter;
  @@ -230,7 +231,7 @@
         } else {
   	Method m = (Method) methodCache.get(className);	
   	if(m == null) {
  -	  Class clazz = Class.forName(className);
  +	  Class clazz = VersionHelper.getInstance().loadClass(className);
   	  m = clazz.getDeclaredMethod(TO_PRIORITY, TO_PRIORITY_PARAMS);
   	  methodCache.put(className, m);
   	}      
  
  
  
  1.24      +5 -4      jakarta-log4j/src/java/org/apache/log4j/xml/DOMConfigurator.java
  
  Index: DOMConfigurator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/xml/DOMConfigurator.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- DOMConfigurator.java	2001/06/19 15:44:59	1.23
  +++ DOMConfigurator.java	2001/06/20 07:59:55	1.24
  @@ -28,6 +28,7 @@
   import org.apache.log4j.config.PropertySetter;
   import org.apache.log4j.helpers.OptionConverter;
   import org.apache.log4j.helpers.FileWatchdog;
  +import org.apache.log4j.helpers.VersionHelper;
   import org.xml.sax.InputSource;
   import java.io.FileInputStream;
   import java.io.InputStream;
  @@ -156,7 +157,7 @@
       String className = subst(appenderElement.getAttribute(CLASS_ATTR));
       LogLog.debug("Class name: [" + className+']');    
       try {
  -      Object instance 	= Class.forName(className).newInstance();
  +      Object instance 	= VersionHelper.getInstance().loadClass(className).newInstance();
         Appender appender	= (Appender)instance;
         PropertySetter propSetter = new PropertySetter(appender);
   
  @@ -293,7 +294,7 @@
       else {
         LogLog.debug("Desired category sub-class: ["+className+']');
          try {	 
  -	 Class clazz = Class.forName(className);
  +	 Class clazz = VersionHelper.getInstance().loadClass(className);
   	 Method getInstanceMethod = clazz.getMethod("getInstance", 
   						    ONE_STRING_PARAM);
   	 cat = (Category) getInstanceMethod.invoke(null, new Object[] {catName});
  @@ -386,7 +387,7 @@
       String className = subst(layout_element.getAttribute(CLASS_ATTR));
       LogLog.debug("Parsing layout of class: \""+className+"\"");		 
       try {
  -      Object instance 	= Class.forName(className).newInstance();
  +      Object instance 	= VersionHelper.getInstance().loadClass(className).newInstance();
         Layout layout   	= (Layout)instance;
         PropertySetter propSetter = new PropertySetter(layout);
         
  @@ -449,7 +450,7 @@
         } else {
   	LogLog.debug("Desired Priority sub-class: ["+className+']');
   	try {	 
  -	  Class clazz = Class.forName(className);
  +	  Class clazz = VersionHelper.getInstance().loadClass(className);
   	  Method toPriorityMethod = clazz.getMethod("toPriority", 
   						    ONE_STRING_PARAM);
   	  Priority pri = (Priority) toPriorityMethod.invoke(null, 
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-cvs-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-cvs-help@jakarta.apache.org