Uploaded image for project: 'Commons Logging'
  1. Commons Logging
  2. LOGGING-45

Default LogFactory Implementation fails for Log4J : ClassCastException

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.0
    • 1.0.3
    • None
    • Operating System: other
      Platform: Other

    • 9845

    Description

      I've got Log4J 1.1.3 JAR in my classpath. Upon startup of my application
      (actually a JUnit test case), I immediately get:

      java.lang.ExceptionInInitializerError:
      org.apache.commons.logging.LogConfigurationException:
      java.lang.ClassCastException

      So I downloaded the Commons Logging 1.0 source and debugged. The problem is in
      org.apache.commons.logging.impl.LogFactoryImpl.guessConfig().

      Class proxyClass=findClassLoader().
      loadClass( "org.apache.commons.logging.Log4jFactory" );

      The above loadClass call should be changed to:

      Class proxyClass=findClassLoader().
      loadClass( "org.apache.commons.logging.impl.Log4jFactory" );

      However, after I make the above change I still get a ClassCastException, now
      from org.apache.commons.logging.LogFactory.newFactory(). This exception
      baffles me. It happens at:

      return (LogFactory) clazz.newInstance();

      So I modify newFactory() to do the newInstance() and the return in two steps
      instead of one.

      Object result = clazz.newInstance();
      return (LogFactory)result;

      The exception occurs during the cast of result. If I print result's class name
      I get org.apache.commons.logging.impl.LogFactoryImpl. But checking if result
      is an instanceof org.apache.commons.logging.impl.LogFactoryImpl returns false.

      Object result = clazz.newInstance();
      System.out.println("Got Factory: " + result.getClass().getName());

      if (result instanceof LogFactory) {
      System.out.println("result is a LogFactory");
      }

      if (result instanceof org.apache.commons.logging.impl.LogFactoryImpl) {
      System.out.println("result is a LogFactoryImpl");
      }

      return (LogFactory) result;

      The code above just prints:
      Got Factory: org.apache.commons.logging.impl.LogFactoryImpl

      And then throws the ClassCastException. I'm confused.

      Attachments

        Activity

          People

            Unassigned Unassigned
            jerome.jacobsen@gentootech.com Jerome Jacobsen
            Votes:
            1 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: