blob: 56007ef7765d032a0fa1a8ebe8cd8119628f3df8 [file] [log] [blame]
/*
* Copyright (c) 2020 Kentyou.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kentyou - initial API and implementation
*/
package org.slf4j.osgi.logservice.impl;
import org.eclipse.sensinact.gateway.util.ReflectUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.Version;
import org.osgi.service.log.LogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <code>LogServiceImpl</code> is a simple OSGi LogService implementation that delegates to a slf4j
* Logger.
*/
public class LogServiceImpl implements LogService {
private static final String UNKNOWN = "[Unknown]";
private final Logger delegate;
/**
* Creates a new instance of LogServiceImpl.
*
* @param bundle The bundle to create a new LogService for.
*/
public LogServiceImpl(Bundle bundle) {
String name = bundle.getSymbolicName();
Version version = bundle.getVersion();
if (version == null) {
version = Version.emptyVersion;
}
delegate = LoggerFactory.getLogger(name + '.' + version);
}
@SuppressWarnings("unchecked")
@Override
public <L extends org.osgi.service.log.Logger> L getLogger(String name, Class<L> loggerType) {
if(loggerType == org.osgi.service.log.Logger.class) {
return (L) new org.osgi.service.log.Logger(){
private Logger delegate = LoggerFactory.getLogger(name);
@Override
public boolean isDebugEnabled() {
return delegate.isDebugEnabled();
}
@Override
public void debug(String message) {
delegate.debug(message);
}
@Override
public void debug(String format, Object arg) {
delegate.debug(format, arg);
}
@Override
public boolean isInfoEnabled() {
return delegate.isInfoEnabled();
}
@Override
public void info(String message) {
delegate.info(message);
}
@Override
public void info(String format, Object arg) {
delegate.info(format, arg);
}
@Override
public boolean isWarnEnabled() {
return delegate.isWarnEnabled();
}
@Override
public void warn(String message) {
delegate.warn(message);
}
@Override
public void warn(String format, Object arg) {
delegate.warn(format,arg);
}
@Override
public boolean isErrorEnabled() {
return delegate.isErrorEnabled();
}
@Override
public void error(String message) {
delegate.error(message);
}
@Override
public void error(String format, Object arg) {
delegate.error(format, arg);
}
};
}
if(loggerType.isInterface())
return null;
return ReflectUtils.getTheBestInstance(loggerType, new Object[] {name});
}
@Override
public void log(int level, String message) {
switch (level) {
case LOG_DEBUG:
delegate.debug(message);
break;
case LOG_ERROR:
delegate.error(message);
break;
case LOG_INFO:
delegate.info(message);
break;
case LOG_WARNING:
delegate.warn(message);
break;
default:
break;
}
}
@Override
public void log(int level, String message, Throwable exception) {
switch (level) {
case LOG_DEBUG:
delegate.debug(message, exception);
break;
case LOG_ERROR:
delegate.error(message, exception);
break;
case LOG_INFO:
delegate.info(message, exception);
break;
case LOG_WARNING:
delegate.warn(message, exception);
break;
default:
break;
}
}
@Override
public void log(ServiceReference sr, int level, String message) {
switch (level) {
case LOG_DEBUG:
if (delegate.isDebugEnabled()) {
delegate.debug(createMessage(sr, message));
}
break;
case LOG_ERROR:
if (delegate.isErrorEnabled()) {
delegate.error(createMessage(sr, message));
}
break;
case LOG_INFO:
if (delegate.isInfoEnabled()) {
delegate.info(createMessage(sr, message));
}
break;
case LOG_WARNING:
if (delegate.isWarnEnabled()) {
delegate.warn(createMessage(sr, message));
}
break;
default:
break;
}
}
/**
* Formats the log message to indicate the service sending it, if known.
*
* @param sr the ServiceReference sending the message.
* @param message The message to log.
* @return The formatted log message.
*/
private String createMessage(ServiceReference sr, String message) {
StringBuilder output = new StringBuilder();
if (sr != null) {
output.append('[').append(sr.toString()).append(']');
} else {
output.append(UNKNOWN);
}
output.append(message);
return output.toString();
}
@Override
public void log(ServiceReference sr, int level, String message, Throwable exception) {
switch (level) {
case LOG_DEBUG:
if (delegate.isDebugEnabled()) {
delegate.debug(createMessage(sr, message), exception);
}
break;
case LOG_ERROR:
if (delegate.isErrorEnabled()) {
delegate.error(createMessage(sr, message), exception);
}
break;
case LOG_INFO:
if (delegate.isInfoEnabled()) {
delegate.info(createMessage(sr, message), exception);
}
break;
case LOG_WARNING:
if (delegate.isWarnEnabled()) {
delegate.warn(createMessage(sr, message), exception);
}
break;
default:
break;
}
}
}