01: package com.ibatis.common.logging;
02:
03: import java.lang.reflect.Constructor;
04:
05: import com.ibatis.common.resources.Resources;
06:
07: public class LogFactory {
08:
09: private static Constructor logConstructor;
10:
11: static {
12: tryImplementation("org.apache.commons.logging.LogFactory",
13: "com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl");
14: tryImplementation("org.apache.log4j.Logger",
15: "com.ibatis.common.logging.log4j.Log4jImpl");
16: tryImplementation("java.util.logging.Logger",
17: "com.ibatis.common.logging.jdk14.Jdk14LoggingImpl");
18: tryImplementation("java.lang.Object",
19: "com.ibatis.common.logging.nologging.NoLoggingImpl");
20: }
21:
22: private static void tryImplementation(String testClassName,
23: String implClassName) {
24: if (logConstructor == null) {
25: try {
26: Resources.classForName(testClassName);
27: Class implClass = Resources.classForName(implClassName);
28: logConstructor = implClass
29: .getConstructor(new Class[] { Class.class });
30: } catch (Throwable t) {
31: }
32: }
33: }
34:
35: public static Log getLog(Class aClass) {
36: try {
37: return (Log) logConstructor
38: .newInstance(new Object[] { aClass });
39: } catch (Throwable t) {
40: throw new RuntimeException(
41: "Error creating logger for class " + aClass
42: + ". Cause: " + t, t);
43: }
44: }
45:
46: /**
47: * This method will switch the logging implementation to Log4J if
48: * Log4J is available on the classpath. This is useful in situations
49: * where you want to use Log4J to log iBATIS activity but
50: * commons logging is on the classpath. Note that this method is only
51: * effective for log classes obtained after calling this method. If you
52: * intend to use this method you should call it before calling any other
53: * iBATIS method.
54: *
55: */
56: public static synchronized void selectLog4JLogging() {
57: try {
58: Resources.classForName("org.apache.log4j.Logger");
59: Class implClass = Resources
60: .classForName("com.ibatis.common.logging.log4j.Log4jImpl");
61: logConstructor = implClass
62: .getConstructor(new Class[] { Class.class });
63: } catch (Throwable t) {
64: }
65: }
66:
67: /**
68: * This method will switch the logging implementation to Java native logging if
69: * you are running in JRE 1.4 or above. This is useful in situations
70: * where you want to use Java native logging to log iBATIS activity but
71: * commons logging or Log4J is on the classpath. Note that this method is only
72: * effective for log classes obtained after calling this method. If you
73: * intend to use this method you should call it before calling any other
74: * iBATIS method.
75: */
76: public static synchronized void selectJavaLogging() {
77: try {
78: Resources.classForName("java.util.logging.Logger");
79: Class implClass = Resources
80: .classForName("com.ibatis.common.logging.jdk14.Jdk14LoggingImpl");
81: logConstructor = implClass
82: .getConstructor(new Class[] { Class.class });
83: } catch (Throwable t) {
84: }
85: }
86: }
|