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
018package org.apache.commons.logging.impl;
019
020import java.io.Serializable;
021import java.util.logging.Level;
022import java.util.logging.Logger;
023
024import org.apache.commons.logging.Log;
025
026/**
027 * Implementation of the {@code org.apache.commons.logging.Log}
028 * interface that wraps the standard JDK logging mechanisms that were
029 * introduced in the Merlin release (JDK 1.4).
030 */
031public class Jdk14Logger implements Log, Serializable {
032
033    /** Serializable version identifier. */
034    private static final long serialVersionUID = 4784713551416303804L;
035
036    /**
037     * This member variable simply ensures that any attempt to initialize
038     * this class in a pre-1.4 JVM will result in an ExceptionInInitializerError.
039     * It must not be private, as an optimizing compiler could detect that it
040     * is not used and optimize it away.
041     */
042    protected static final Level dummyLevel = Level.FINE;
043
044    /**
045     * The underlying Logger implementation we are using.
046     */
047    protected transient Logger logger;
048
049    /**
050     * The name of the logger we are wrapping.
051     */
052    protected String name;
053
054    /**
055     * Constructs a named instance of this Logger.
056     *
057     * @param name Name of the logger to be constructed
058     */
059    public Jdk14Logger(final String name) {
060        this.name = name;
061        logger = getLogger();
062    }
063
064    /**
065     * Logs a message with {@link java.util.logging.Level#FINE}.
066     *
067     * @param message to log
068     * @see org.apache.commons.logging.Log#debug(Object)
069     */
070    @Override
071    public void debug(final Object message) {
072        log(Level.FINE, String.valueOf(message), null);
073    }
074
075    /**
076     * Logs a message with {@link java.util.logging.Level#FINE}.
077     *
078     * @param message to log
079     * @param exception log this cause
080     * @see org.apache.commons.logging.Log#debug(Object, Throwable)
081     */
082    @Override
083    public void debug(final Object message, final Throwable exception) {
084        log(Level.FINE, String.valueOf(message), exception);
085    }
086
087    /**
088     * Logs a message with {@link java.util.logging.Level#SEVERE}.
089     *
090     * @param message to log
091     * @see org.apache.commons.logging.Log#error(Object)
092     */
093    @Override
094    public void error(final Object message) {
095        log(Level.SEVERE, String.valueOf(message), null);
096    }
097
098    /**
099     * Logs a message with {@link java.util.logging.Level#SEVERE}.
100     *
101     * @param message to log
102     * @param exception log this cause
103     * @see org.apache.commons.logging.Log#error(Object, Throwable)
104     */
105    @Override
106    public void error(final Object message, final Throwable exception) {
107        log(Level.SEVERE, String.valueOf(message), exception);
108    }
109
110    /**
111     * Logs a message with {@link java.util.logging.Level#SEVERE}.
112     *
113     * @param message to log
114     * @see org.apache.commons.logging.Log#fatal(Object)
115     */
116    @Override
117    public void fatal(final Object message) {
118        log(Level.SEVERE, String.valueOf(message), null);
119    }
120
121    /**
122     * Logs a message with {@link java.util.logging.Level#SEVERE}.
123     *
124     * @param message to log
125     * @param exception log this cause
126     * @see org.apache.commons.logging.Log#fatal(Object, Throwable)
127     */
128    @Override
129    public void fatal(final Object message, final Throwable exception) {
130        log(Level.SEVERE, String.valueOf(message), exception);
131    }
132
133    /**
134     * Gets the native Logger instance we are using.
135     *
136     * @return  the native Logger instance we are using.
137     */
138    public Logger getLogger() {
139        if (logger == null) {
140            logger = Logger.getLogger(name);
141        }
142        return logger;
143    }
144
145    /**
146     * Logs a message with {@link java.util.logging.Level#INFO}.
147     *
148     * @param message to log
149     * @see org.apache.commons.logging.Log#info(Object)
150     */
151    @Override
152    public void info(final Object message) {
153        log(Level.INFO, String.valueOf(message), null);
154    }
155
156    /**
157     * Logs a message with {@link java.util.logging.Level#INFO}.
158     *
159     * @param message to log
160     * @param exception log this cause
161     * @see org.apache.commons.logging.Log#info(Object, Throwable)
162     */
163    @Override
164    public void info(final Object message, final Throwable exception) {
165        log(Level.INFO, String.valueOf(message), exception);
166    }
167
168    /**
169     * Is debug logging currently enabled?
170     */
171    @Override
172    public boolean isDebugEnabled() {
173        return getLogger().isLoggable(Level.FINE);
174    }
175
176    /**
177     * Is error logging currently enabled?
178     */
179    @Override
180    public boolean isErrorEnabled() {
181        return getLogger().isLoggable(Level.SEVERE);
182    }
183
184    /**
185     * Is fatal logging currently enabled?
186     */
187    @Override
188    public boolean isFatalEnabled() {
189        return getLogger().isLoggable(Level.SEVERE);
190    }
191
192    /**
193     * Is info logging currently enabled?
194     */
195    @Override
196    public boolean isInfoEnabled() {
197        return getLogger().isLoggable(Level.INFO);
198    }
199
200    /**
201     * Is trace logging currently enabled?
202     */
203    @Override
204    public boolean isTraceEnabled() {
205        return getLogger().isLoggable(Level.FINEST);
206    }
207
208    /**
209     * Is warn logging currently enabled?
210     */
211    @Override
212    public boolean isWarnEnabled() {
213        return getLogger().isLoggable(Level.WARNING);
214    }
215
216    /**
217     * Logs a message at the given level.
218     * @param level The level.
219     * @param msg The message.
220     * @param ex The exception.
221     */
222    protected void log(final Level level, final String msg, final Throwable ex) {
223        final Logger logger = getLogger();
224        if (logger.isLoggable(level)) {
225            // Hack (?) to get the stack trace.
226            final Throwable dummyException = new Throwable();
227            final StackTraceElement[] locations = dummyException.getStackTrace();
228            // LOGGING-132: use the provided logger name instead of the class name
229            final String cname = name;
230            String method = "unknown";
231            // Caller will be the third element
232            if (locations != null && locations.length > 2) {
233                final StackTraceElement caller = locations[2];
234                method = caller.getMethodName();
235            }
236            if (ex == null) {
237                logger.logp(level, cname, method, msg);
238            } else {
239                logger.logp(level, cname, method, msg, ex);
240            }
241        }
242    }
243
244    /**
245     * Logs a message with {@link java.util.logging.Level#FINEST}.
246     *
247     * @param message to log
248     * @see org.apache.commons.logging.Log#trace(Object)
249     */
250    @Override
251    public void trace(final Object message) {
252        log(Level.FINEST, String.valueOf(message), null);
253    }
254
255    /**
256     * Logs a message with {@link java.util.logging.Level#FINEST}.
257     *
258     * @param message to log
259     * @param exception log this cause
260     * @see org.apache.commons.logging.Log#trace(Object, Throwable)
261     */
262    @Override
263    public void trace(final Object message, final Throwable exception) {
264        log(Level.FINEST, String.valueOf(message), exception);
265    }
266
267    /**
268     * Logs a message with {@link java.util.logging.Level#WARNING}.
269     *
270     * @param message to log
271     * @see org.apache.commons.logging.Log#warn(Object)
272     */
273    @Override
274    public void warn(final Object message) {
275        log(Level.WARNING, String.valueOf(message), null);
276    }
277
278    /**
279     * Logs a message with {@link java.util.logging.Level#WARNING}.
280     *
281     * @param message to log
282     * @param exception log this cause
283     * @see org.apache.commons.logging.Log#warn(Object, Throwable)
284     */
285    @Override
286    public void warn(final Object message, final Throwable exception) {
287        log(Level.WARNING, String.valueOf(message), exception);
288    }
289}