001/*
002 * Copyright (c) 2004-2005 QOS.ch
003 *
004 * All rights reserved.
005 *
006 * Permission is hereby granted, free of charge, to any person obtaining
007 * a copy of this software and associated documentation files (the
008 * "Software"), to  deal in  the Software without  restriction, including
009 * without limitation  the rights to  use, copy, modify,  merge, publish,
010 * distribute, and/or sell copies of  the Software, and to permit persons
011 * to whom  the Software is furnished  to do so, provided  that the above
012 * copyright notice(s) and this permission notice appear in all copies of
013 * the  Software and  that both  the above  copyright notice(s)  and this
014 * permission notice appear in supporting documentation.
015 *
016 * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
017 * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
018 * MERCHANTABILITY, FITNESS FOR  A PARTICULAR PURPOSE AND NONINFRINGEMENT
019 * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
020 * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
021 * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
022 * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
023 * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
024 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
025 *
026 * Except as  contained in  this notice, the  name of a  copyright holder
027 * shall not be used in advertising or otherwise to promote the sale, use
028 * or other dealings in this Software without prior written authorization
029 * of the copyright holder.
030 *
031 */
032
033package org.slf4j.osgi.logservice.impl;
034
035import org.osgi.framework.Bundle;
036import org.osgi.framework.ServiceReference;
037import org.osgi.framework.Version;
038import org.osgi.service.log.LogService;
039import org.slf4j.Logger;
040import org.slf4j.LoggerFactory;
041
042/**
043 * <code>LogServiceImpl</code> is a simple OSGi LogService implementation that delegates to a slf4j
044 * Logger.
045 *
046 * @author John Conlon
047 * @author Matt Bishop
048 */
049public class LogServiceImpl implements LogService {
050
051    private static final String UNKNOWN = "[Unknown]";
052
053    private final Logger delegate;
054
055    /**
056     * Creates a new instance of LogServiceImpl.
057     *
058     * @param bundle The bundle to create a new LogService for.
059     */
060    public LogServiceImpl(Bundle bundle) {
061
062        String name = bundle.getSymbolicName();
063        Version version = bundle.getVersion();
064        if (version == null) {
065            version = Version.emptyVersion;
066        }
067        delegate = LoggerFactory.getLogger(name + '.' + version);
068    }
069
070    /*
071     * (non-Javadoc)
072     * 
073     * @see org.osgi.service.log.LogService#log(int, java.lang.String)
074     */
075    public void log(int level, String message) {
076
077        switch (level) {
078        case LOG_DEBUG:
079            delegate.debug(message);
080            break;
081        case LOG_ERROR:
082            delegate.error(message);
083            break;
084        case LOG_INFO:
085            delegate.info(message);
086            break;
087        case LOG_WARNING:
088            delegate.warn(message);
089            break;
090        default:
091            break;
092        }
093    }
094
095    /*
096     * (non-Javadoc)
097     * 
098     * @see org.osgi.service.log.LogService#log(int, java.lang.String, java.lang.Throwable)
099     */
100    public void log(int level, String message, Throwable exception) {
101
102        switch (level) {
103        case LOG_DEBUG:
104            delegate.debug(message, exception);
105            break;
106        case LOG_ERROR:
107            delegate.error(message, exception);
108            break;
109        case LOG_INFO:
110            delegate.info(message, exception);
111            break;
112        case LOG_WARNING:
113            delegate.warn(message, exception);
114            break;
115        default:
116            break;
117        }
118    }
119
120    /*
121     * (non-Javadoc)
122     * 
123     * @see org.osgi.service.log.LogService#log(org.osgi.framework.ServiceReference, int, java.lang.String)
124     */
125    public void log(ServiceReference sr, int level, String message) {
126
127        switch (level) {
128        case LOG_DEBUG:
129            if (delegate.isDebugEnabled()) {
130                delegate.debug(createMessage(sr, message));
131            }
132            break;
133        case LOG_ERROR:
134            if (delegate.isErrorEnabled()) {
135                delegate.error(createMessage(sr, message));
136            }
137            break;
138        case LOG_INFO:
139            if (delegate.isInfoEnabled()) {
140                delegate.info(createMessage(sr, message));
141            }
142            break;
143        case LOG_WARNING:
144            if (delegate.isWarnEnabled()) {
145                delegate.warn(createMessage(sr, message));
146            }
147            break;
148        default:
149            break;
150        }
151    }
152
153    /**
154     * Formats the log message to indicate the service sending it, if known.
155     *
156     * @param sr the ServiceReference sending the message.
157     * @param message The message to log.
158     * @return The formatted log message.
159     */
160    private String createMessage(ServiceReference sr, String message) {
161
162        StringBuilder output = new StringBuilder();
163        if (sr != null) {
164            output.append('[').append(sr.toString()).append(']');
165        } else {
166            output.append(UNKNOWN);
167        }
168        output.append(message);
169
170        return output.toString();
171    }
172
173    /*
174     * (non-Javadoc)
175     * 
176     * @see org.osgi.service.log.LogService#log(org.osgi.framework.ServiceReference, int, java.lang.String,
177     * java.lang.Throwable)
178     */
179    public void log(ServiceReference sr, int level, String message, Throwable exception) {
180
181        switch (level) {
182        case LOG_DEBUG:
183            if (delegate.isDebugEnabled()) {
184                delegate.debug(createMessage(sr, message), exception);
185            }
186            break;
187        case LOG_ERROR:
188            if (delegate.isErrorEnabled()) {
189                delegate.error(createMessage(sr, message), exception);
190            }
191            break;
192        case LOG_INFO:
193            if (delegate.isInfoEnabled()) {
194                delegate.info(createMessage(sr, message), exception);
195            }
196            break;
197        case LOG_WARNING:
198            if (delegate.isWarnEnabled()) {
199                delegate.warn(createMessage(sr, message), exception);
200            }
201            break;
202        default:
203            break;
204        }
205    }
206}