| /* |
| * Copyright 2001-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.commons.logging; |
| |
| |
| import java.lang.reflect.Constructor; |
| import java.util.Hashtable; |
| |
| import org.apache.commons.logging.impl.NoOpLog; |
| |
| |
| /** |
| * <p>Factory for creating {@link Log} instances. Applications should call |
| * the <code>makeNewLogInstance()</code> method to instantiate new instances |
| * of the configured {@link Log} implementation class.</p> |
| * |
| * <p>By default, calling <code>getInstance()</code> will use the following |
| * algorithm:</p> |
| * <ul> |
| * <li>If Log4J is available, return an instance of |
| * <code>org.apache.commons.logging.impl.Log4JLogger</code>.</li> |
| * <li>If JDK 1.4 or later is available, return an instance of |
| * <code>org.apache.commons.logging.impl.Jdk14Logger</code>.</li> |
| * <li>Otherwise, return an instance of |
| * <code>org.apache.commons.logging.impl.NoOpLog</code>.</li> |
| * </ul> |
| * |
| * <p>You can change the default behavior in one of two ways:</p> |
| * <ul> |
| * <li>On the startup command line, set the system property |
| * <code>org.apache.commons.logging.log</code> to the name of the |
| * <code>org.apache.commons.logging.Log</code> implementation class |
| * you want to use.</li> |
| * <li>At runtime, call <code>LogSource.setLogImplementation()</code>.</li> |
| * </ul> |
| * |
| * @deprecated Use {@link LogFactory} instead - The default factory |
| * implementation performs exactly the same algorithm as this class did |
| * |
| * @author Rod Waldhoff |
| * @version $Id: LogSource.java 155426 2005-02-26 13:10:49Z dirkv $ |
| */ |
| public class LogSource { |
| |
| // ------------------------------------------------------- Class Attributes |
| |
| static protected Hashtable logs = new Hashtable(); |
| |
| /** Is log4j available (in the current classpath) */ |
| static protected boolean log4jIsAvailable = false; |
| |
| /** Is JDK 1.4 logging available */ |
| static protected boolean jdk14IsAvailable = false; |
| |
| /** Constructor for current log class */ |
| static protected Constructor logImplctor = null; |
| |
| |
| // ----------------------------------------------------- Class Initializers |
| |
| static { |
| |
| // Is Log4J Available? |
| try { |
| if (null != Class.forName("org.apache.log4j.Logger")) { |
| log4jIsAvailable = true; |
| } else { |
| log4jIsAvailable = false; |
| } |
| } catch (Throwable t) { |
| log4jIsAvailable = false; |
| } |
| |
| // Is JDK 1.4 Logging Available? |
| try { |
| if ((null != Class.forName("java.util.logging.Logger")) && |
| (null != Class.forName("org.apache.commons.logging.impl.Jdk14Logger"))) { |
| jdk14IsAvailable = true; |
| } else { |
| jdk14IsAvailable = false; |
| } |
| } catch (Throwable t) { |
| jdk14IsAvailable = false; |
| } |
| |
| // Set the default Log implementation |
| String name = null; |
| try { |
| name = System.getProperty("org.apache.commons.logging.log"); |
| if (name == null) { |
| name = System.getProperty("org.apache.commons.logging.Log"); |
| } |
| } catch (Throwable t) { |
| } |
| if (name != null) { |
| try { |
| setLogImplementation(name); |
| } catch (Throwable t) { |
| try { |
| setLogImplementation |
| ("org.apache.commons.logging.impl.NoOpLog"); |
| } catch (Throwable u) { |
| ; |
| } |
| } |
| } else { |
| try { |
| if (log4jIsAvailable) { |
| setLogImplementation |
| ("org.apache.commons.logging.impl.Log4JLogger"); |
| } else if (jdk14IsAvailable) { |
| setLogImplementation |
| ("org.apache.commons.logging.impl.Jdk14Logger"); |
| } else { |
| setLogImplementation |
| ("org.apache.commons.logging.impl.NoOpLog"); |
| } |
| } catch (Throwable t) { |
| try { |
| setLogImplementation |
| ("org.apache.commons.logging.impl.NoOpLog"); |
| } catch (Throwable u) { |
| ; |
| } |
| } |
| } |
| |
| } |
| |
| |
| // ------------------------------------------------------------ Constructor |
| |
| |
| /** Don't allow others to create instances */ |
| private LogSource() { |
| } |
| |
| |
| // ---------------------------------------------------------- Class Methods |
| |
| |
| /** |
| * Set the log implementation/log implementation factory |
| * by the name of the class. The given class |
| * must implement {@link Log}, and provide a constructor that |
| * takes a single {@link String} argument (containing the name |
| * of the log). |
| */ |
| static public void setLogImplementation(String classname) throws |
| LinkageError, ExceptionInInitializerError, |
| NoSuchMethodException, SecurityException, |
| ClassNotFoundException { |
| try { |
| Class logclass = Class.forName(classname); |
| Class[] argtypes = new Class[1]; |
| argtypes[0] = "".getClass(); |
| logImplctor = logclass.getConstructor(argtypes); |
| } catch (Throwable t) { |
| logImplctor = null; |
| } |
| } |
| |
| |
| /** |
| * Set the log implementation/log implementation factory |
| * by class. The given class must implement {@link Log}, |
| * and provide a constructor that takes a single {@link String} |
| * argument (containing the name of the log). |
| */ |
| static public void setLogImplementation(Class logclass) throws |
| LinkageError, ExceptionInInitializerError, |
| NoSuchMethodException, SecurityException { |
| Class[] argtypes = new Class[1]; |
| argtypes[0] = "".getClass(); |
| logImplctor = logclass.getConstructor(argtypes); |
| } |
| |
| |
| /** Get a <code>Log</code> instance by class name */ |
| static public Log getInstance(String name) { |
| Log log = (Log) (logs.get(name)); |
| if (null == log) { |
| log = makeNewLogInstance(name); |
| logs.put(name, log); |
| } |
| return log; |
| } |
| |
| |
| /** Get a <code>Log</code> instance by class */ |
| static public Log getInstance(Class clazz) { |
| return getInstance(clazz.getName()); |
| } |
| |
| |
| /** |
| * Create a new {@link Log} implementation, based |
| * on the given <i>name</i>. |
| * <p> |
| * The specific {@link Log} implementation returned |
| * is determined by the value of the |
| * <tt>org.apache.commons.logging.log</tt> property. |
| * The value of <tt>org.apache.commons.logging.log</tt> may be set to |
| * the fully specified name of a class that implements |
| * the {@link Log} interface. This class must also |
| * have a public constructor that takes a single |
| * {@link String} argument (containing the <i>name</i> |
| * of the {@link Log} to be constructed. |
| * <p> |
| * When <tt>org.apache.commons.logging.log</tt> is not set, |
| * or when no corresponding class can be found, |
| * this method will return a Log4JLogger |
| * if the log4j Logger class is |
| * available in the {@link LogSource}'s classpath, or a |
| * Jdk14Logger if we are on a JDK 1.4 or later system, or |
| * NoOpLog if neither of the above conditions is true. |
| * |
| * @param name the log name (or category) |
| */ |
| static public Log makeNewLogInstance(String name) { |
| |
| Log log = null; |
| try { |
| Object[] args = new Object[1]; |
| args[0] = name; |
| log = (Log) (logImplctor.newInstance(args)); |
| } catch (Throwable t) { |
| log = null; |
| } |
| if (null == log) { |
| log = new NoOpLog(name); |
| } |
| return log; |
| |
| } |
| |
| |
| /** |
| * Returns a {@link String} array containing the names of |
| * all logs known to me. |
| */ |
| static public String[] getLogNames() { |
| return (String[]) (logs.keySet().toArray(new String[logs.size()])); |
| } |
| |
| |
| } |