001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.logging.impl;
019    
020    import org.apache.avalon.framework.logger.Logger;
021    import org.apache.commons.logging.Log;
022    
023    /**
024     * Implementation of commons-logging Log interface that delegates all
025     * logging calls to the Avalon logging abstraction: the Logger interface.
026     * <p>
027     * There are two ways in which this class can be used:
028     * <ul>
029     * <li>the instance can be constructed with an Avalon logger
030     * (by calling {@link #AvalonLogger(Logger)}). In this case, it acts
031     * as a simple thin wrapping implementation over the logger. This is
032     * particularly useful when using a property setter.
033     * </li>
034     * <li>the {@link #setDefaultLogger} class property can be called which
035     * sets the ancestral Avalon logger for this class. Any <code>AvalonLogger</code>
036     * instances created through the <code>LogFactory</code> mechanisms will output
037     * to child loggers of this <code>Logger</code>.
038     * </li>
039     * </ul>
040     * <p>
041     * <strong>Note:</strong> <code>AvalonLogger</code> does not implement Serializable
042     * because the constructors available for it make this impossible to achieve in all
043     * circumstances; there is no way to "reconnect" to an underlying Logger object on
044     * deserialization if one was just passed in to the constructor of the original
045     * object. This class <i>was</i> marked Serializable in the 1.0.4 release of
046     * commons-logging, but this never actually worked (a NullPointerException would
047     * be thrown as soon as the deserialized object was used), so removing this marker
048     * is not considered to be an incompatible change.
049     *
050     * @version $Id: AvalonLogger.html 862526 2013-05-20 17:07:42Z tn $
051     */
052    public class AvalonLogger implements Log {
053    
054        /** Ancestral Avalon logger. */
055        private static volatile Logger defaultLogger = null;
056        /** Avalon logger used to perform log. */
057        private final transient Logger logger;
058    
059        /**
060         * Constructs an <code>AvalonLogger</code> that outputs to the given
061         * <code>Logger</code> instance.
062         *
063         * @param logger the Avalon logger implementation to delegate to
064         */
065        public AvalonLogger(Logger logger) {
066            this.logger = logger;
067        }
068    
069        /**
070         * Constructs an <code>AvalonLogger</code> that will log to a child
071         * of the <code>Logger</code> set by calling {@link #setDefaultLogger}.
072         *
073         * @param name the name of the avalon logger implementation to delegate to
074         */
075        public AvalonLogger(String name) {
076            if (defaultLogger == null) {
077                throw new NullPointerException("default logger has to be specified if this constructor is used!");
078            }
079            this.logger = defaultLogger.getChildLogger(name);
080        }
081    
082        /**
083         * Gets the Avalon logger implementation used to perform logging.
084         *
085         * @return avalon logger implementation
086         */
087        public Logger getLogger() {
088            return logger;
089        }
090    
091        /**
092         * Sets the ancestral Avalon logger from which the delegating loggers will descend.
093         *
094         * @param logger the default avalon logger,
095         * in case there is no logger instance supplied in constructor
096         */
097        public static void setDefaultLogger(Logger logger) {
098            defaultLogger = logger;
099        }
100    
101        /**
102        * Logs a message with <code>org.apache.avalon.framework.logger.Logger.debug</code>.
103        *
104        * @param message to log
105        * @param t log this cause
106        * @see org.apache.commons.logging.Log#debug(Object, Throwable)
107         */
108        public void debug(Object message, Throwable t) {
109            if (getLogger().isDebugEnabled()) {
110                getLogger().debug(String.valueOf(message), t);
111            }
112        }
113    
114        /**
115         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.debug</code>.
116         *
117         * @param message to log.
118         * @see org.apache.commons.logging.Log#debug(Object)
119         */
120        public void debug(Object message) {
121            if (getLogger().isDebugEnabled()) {
122                getLogger().debug(String.valueOf(message));
123            }
124        }
125    
126        /**
127         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.error</code>.
128         *
129         * @param message to log
130         * @param t log this cause
131         * @see org.apache.commons.logging.Log#error(Object, Throwable)
132         */
133        public void error(Object message, Throwable t) {
134            if (getLogger().isErrorEnabled()) {
135                getLogger().error(String.valueOf(message), t);
136            }
137        }
138    
139        /**
140         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.error</code>.
141         *
142         * @param message to log
143         * @see org.apache.commons.logging.Log#error(Object)
144         */
145        public void error(Object message) {
146            if (getLogger().isErrorEnabled()) {
147                getLogger().error(String.valueOf(message));
148            }
149        }
150    
151        /**
152         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.fatalError</code>.
153         *
154         * @param message to log.
155         * @param t log this cause.
156         * @see org.apache.commons.logging.Log#fatal(Object, Throwable)
157         */
158        public void fatal(Object message, Throwable t) {
159            if (getLogger().isFatalErrorEnabled()) {
160                getLogger().fatalError(String.valueOf(message), t);
161            }
162        }
163    
164        /**
165         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.fatalError</code>.
166         *
167         * @param message to log
168         * @see org.apache.commons.logging.Log#fatal(Object)
169         */
170        public void fatal(Object message) {
171            if (getLogger().isFatalErrorEnabled()) {
172                getLogger().fatalError(String.valueOf(message));
173            }
174        }
175    
176        /**
177         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.info</code>.
178         *
179         * @param message to log
180         * @param t log this cause
181         * @see org.apache.commons.logging.Log#info(Object, Throwable)
182         */
183        public void info(Object message, Throwable t) {
184            if (getLogger().isInfoEnabled()) {
185                getLogger().info(String.valueOf(message), t);
186            }
187        }
188    
189        /**
190         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.info</code>.
191         *
192         * @param message to log
193         * @see org.apache.commons.logging.Log#info(Object)
194         */
195        public void info(Object message) {
196            if (getLogger().isInfoEnabled()) {
197                getLogger().info(String.valueOf(message));
198            }
199        }
200    
201        /**
202         * Is logging to <code>org.apache.avalon.framework.logger.Logger.debug</code> enabled?
203         * @see org.apache.commons.logging.Log#isDebugEnabled()
204         */
205        public boolean isDebugEnabled() {
206            return getLogger().isDebugEnabled();
207        }
208    
209        /**
210         * Is logging to <code>org.apache.avalon.framework.logger.Logger.error</code> enabled?
211         * @see org.apache.commons.logging.Log#isErrorEnabled()
212         */
213        public boolean isErrorEnabled() {
214            return getLogger().isErrorEnabled();
215        }
216    
217        /**
218         * Is logging to <code>org.apache.avalon.framework.logger.Logger.fatalError</code> enabled?
219         * @see org.apache.commons.logging.Log#isFatalEnabled()
220         */
221        public boolean isFatalEnabled() {
222            return getLogger().isFatalErrorEnabled();
223        }
224    
225        /**
226         * Is logging to <code>org.apache.avalon.framework.logger.Logger.info</code> enabled?
227         * @see org.apache.commons.logging.Log#isInfoEnabled()
228         */
229        public boolean isInfoEnabled() {
230            return getLogger().isInfoEnabled();
231        }
232    
233        /**
234         * Is logging to <code>org.apache.avalon.framework.logger.Logger.debug</code> enabled?
235         * @see org.apache.commons.logging.Log#isTraceEnabled()
236         */
237        public boolean isTraceEnabled() {
238            return getLogger().isDebugEnabled();
239        }
240    
241        /**
242         * Is logging to <code>org.apache.avalon.framework.logger.Logger.warn</code> enabled?
243         * @see org.apache.commons.logging.Log#isWarnEnabled()
244         */
245        public boolean isWarnEnabled() {
246            return getLogger().isWarnEnabled();
247        }
248    
249        /**
250         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.debug</code>.
251         *
252         * @param message to log.
253         * @param t log this cause.
254         * @see org.apache.commons.logging.Log#trace(Object, Throwable)
255         */
256        public void trace(Object message, Throwable t) {
257            if (getLogger().isDebugEnabled()) {
258                getLogger().debug(String.valueOf(message), t);
259            }
260        }
261    
262        /**
263         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.debug</code>.
264         *
265         * @param message to log
266         * @see org.apache.commons.logging.Log#trace(Object)
267         */
268        public void trace(Object message) {
269            if (getLogger().isDebugEnabled()) {
270                getLogger().debug(String.valueOf(message));
271            }
272        }
273    
274        /**
275         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.warn</code>.
276         *
277         * @param message to log
278         * @param t log this cause
279         * @see org.apache.commons.logging.Log#warn(Object, Throwable)
280         */
281        public void warn(Object message, Throwable t) {
282            if (getLogger().isWarnEnabled()) {
283                getLogger().warn(String.valueOf(message), t);
284            }
285        }
286    
287        /**
288         * Logs a message with <code>org.apache.avalon.framework.logger.Logger.warn</code>.
289         *
290         * @param message to log
291         * @see org.apache.commons.logging.Log#warn(Object)
292         */
293        public void warn(Object message) {
294            if (getLogger().isWarnEnabled()) {
295                getLogger().warn(String.valueOf(message));
296            }
297        }
298    }