All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.refcodes.logger.alt.slf4j.impls.Slf4jRuntimeLoggerImpl Maven / Gradle / Ivy

// /////////////////////////////////////////////////////////////////////////////
// REFCODES.ORG
// /////////////////////////////////////////////////////////////////////////////
// This code is copyright (c) by Siegfried Steiner, Munich, Germany and licensed
// under the following (see "http://en.wikipedia.org/wiki/Multi-licensing")
// licenses:
// -----------------------------------------------------------------------------
// GNU General Public License, v3.0 ("http://www.gnu.org/licenses/gpl-3.0.html")
// -----------------------------------------------------------------------------
// Apache License, v2.0 ("http://www.apache.org/licenses/LICENSE-2.0")
// -----------------------------------------------------------------------------
// Please contact the copyright holding author(s) of the software artifacts in
// question for licensing issues not being covered by the above listed licenses,
// also regarding commercial licensing models or regarding the compatibility
// with other open source licenses.
// /////////////////////////////////////////////////////////////////////////////
package org.refcodes.logger.alt.slf4j.impls;

import java.text.MessageFormat;

import org.refcodes.logger.LogPriority;
import org.refcodes.logger.RuntimeLogger;
import org.refcodes.logger.RuntimeLoggerAccessor;
import org.refcodes.runtime.RuntimeUtility;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author steiner
 *
 */
public class Slf4jRuntimeLoggerImpl implements RuntimeLogger {

	// /////////////////////////////////////////////////////////////////////////
	// VARIABLES:
	// /////////////////////////////////////////////////////////////////////////

	private transient Logger _logger = null;
	private transient RuntimeLogger _runtimeLogger = null;

	// /////////////////////////////////////////////////////////////////////////
	// CONSTRUCTORS:
	// /////////////////////////////////////////////////////////////////////////

	/**
	 * In case the {@link Slf4jRuntimeLoggerImpl} (as created by the
	 * {@link Slf4jRuntimeLoggerFactorySingleton}) detects that SLF4J has bound
	 * a {@link Slf4jRuntimeLoggerAdapterImpl} (i.e. the REFCODES.ORG SLF4J
	 * binding), it directly delegates its method calls to the wrapped
	 * {@link RuntimeLogger} instead of marshaling a log request through the
	 * {@link Slf4jRuntimeLoggerAdapterImpl}; as marshaling would mean
	 * consolidating of various detailed {@link LogPriority} levels to a single
	 * SLF4J log level.
	 */
	public Slf4jRuntimeLoggerImpl() {
		StackTraceElement theStackTraceElement = RuntimeUtility.getCallerStackTraceElement( Slf4jRuntimeLoggerFactoryImpl.class );
		if ( theStackTraceElement == null ) {
			theStackTraceElement = RuntimeUtility.getCallerStackTraceElement( Slf4jRuntimeLoggerImpl.class );
		}
		String className = theStackTraceElement.getClassName();
		Logger aLogger = LoggerFactory.getLogger( className );
		toRuntimeLogger( aLogger );
	}

	/**
	 * In case the {@link Slf4jRuntimeLoggerImpl} (as created by the
	 * {@link Slf4jRuntimeLoggerFactorySingleton}) detects that SLF4J has bound
	 * a {@link Slf4jRuntimeLoggerAdapterImpl} (i.e. the REFCODES.ORG SLF4J
	 * binding), it directly delegates its method calls to the wrapped
	 * {@link RuntimeLogger} instead of marshaling a log request through the
	 * {@link Slf4jRuntimeLoggerAdapterImpl}; as marshaling would mean
	 * consolidating of various detailed {@link LogPriority} levels to a single
	 * SLF4J log level.
	 * 
	 * @param A SLF4J logger which might be of type
	 *        {@link Slf4jRuntimeLoggerAdapterImpl} in which case the therein
	 *        wrapped {@link RuntimeLogger} would be addressed directly using
	 *        the {@link Slf4jRuntimeLoggerAdapterImpl#getRuntimeLogger()}
	 *        method.
	 */
	public Slf4jRuntimeLoggerImpl( Logger aLogger ) {
		toRuntimeLogger( aLogger );
	}

	// /////////////////////////////////////////////////////////////////////////
	// METHODS:
	// /////////////////////////////////////////////////////////////////////////

	@Override
	public void log( LogPriority aPriority, String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.log( aPriority, aMessage );
		else {
			switch ( aPriority ) {
			case PANIC:
				_logger.error( aMessage );
				break;
			case ALERT:
				_logger.error( aMessage );
				break;
			case CRITICAL:
				_logger.error( aMessage );
				break;
			case ERROR:
				_logger.error( aMessage );
				break;
			case WARN:
				_logger.warn( aMessage );
				break;
			case NOTICE:
				_logger.info( aMessage );
				break;
			case INFO:
				_logger.info( aMessage );
				break;
			case DEBUG:
				_logger.debug( aMessage );
				break;
			case TRACE:
				_logger.trace( aMessage );
				break;
			case DISCARD:
				break;
			case NONE:
				_logger.info( aMessage );
				break;
			default:
				_logger.info( aMessage );
				break;
			}
		}
	}

	@Override
	public void log( LogPriority aPriority, String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.log( aPriority, aMessage, aArguments );
		else {
			switch ( aPriority ) {
			case PANIC:
				_logger.error( aMessage, aArguments );
				break;
			case ALERT:
				_logger.error( aMessage, aArguments );
				break;
			case CRITICAL:
				_logger.error( aMessage, aArguments );
				break;
			case ERROR:
				_logger.error( aMessage, aArguments );
				break;
			case WARN:
				_logger.warn( aMessage, aArguments );
				break;
			case NOTICE:
				_logger.info( aMessage, aArguments );
				break;
			case INFO:
				_logger.info( aMessage, aArguments );
				break;
			case DEBUG:
				_logger.debug( aMessage, aArguments );
				break;
			case TRACE:
				_logger.trace( aMessage, aArguments );
				break;
			case DISCARD:
				break;
			case NONE:
				_logger.info( aMessage, aArguments );
				break;
			default:
				_logger.info( aMessage, aArguments );
				break;
			}
		}
	}

	@Override
	public String getName() {
		if ( _runtimeLogger != null ) return _runtimeLogger.getName();
		else {
			return _logger.getName();
		}
	}

	@Override
	public LogPriority getLogPriority() {
		if ( _runtimeLogger != null ) return _runtimeLogger.getLogPriority();
		else {
			if ( _logger.isDebugEnabled() ) return LogPriority.DEBUG;
			if ( _logger.isErrorEnabled() ) return LogPriority.ERROR;
			if ( _logger.isInfoEnabled() ) return LogPriority.INFO;
			if ( _logger.isTraceEnabled() ) return LogPriority.TRACE;
			if ( _logger.isWarnEnabled() ) return LogPriority.WARN;
			return LogPriority.NONE;
		}
	}

	@Override
	public void log( LogPriority aPriority, String aMessage, Throwable aThrowable ) {
		if ( _runtimeLogger != null ) _runtimeLogger.log( aPriority, aMessage, aThrowable );
		else {
			switch ( aPriority ) {
			case PANIC:
				_logger.error( aMessage, aThrowable );
				break;
			case ALERT:
				_logger.error( aMessage, aThrowable );
				break;
			case CRITICAL:
				_logger.error( aMessage, aThrowable );
				break;
			case ERROR:
				_logger.error( aMessage, aThrowable );
				break;
			case WARN:
				_logger.warn( aMessage, aThrowable );
				break;
			case NOTICE:
				_logger.info( aMessage, aThrowable );
				break;
			case INFO:
				_logger.info( aMessage, aThrowable );
				break;
			case DEBUG:
				_logger.debug( aMessage, aThrowable );
				break;
			case TRACE:
				_logger.trace( aMessage, aThrowable );
				break;
			case DISCARD:
				break;
			case NONE:
				_logger.info( aMessage, aThrowable );
				break;
			default:
				_logger.info( aMessage, aThrowable );
				break;
			}
		}
	}

	@Override
	public void log( LogPriority aPriority, String aMessage, Throwable aThrowable, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.log( aPriority, aMessage, aThrowable, aArguments );
		else {
			switch ( aPriority ) {
			case PANIC:
				if ( _logger.isErrorEnabled() ) _logger.error( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case ALERT:
				if ( _logger.isErrorEnabled() ) _logger.error( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case CRITICAL:
				if ( _logger.isErrorEnabled() ) _logger.error( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case ERROR:
				if ( _logger.isErrorEnabled() ) _logger.error( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case WARN:
				if ( _logger.isWarnEnabled() ) _logger.warn( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case NOTICE:
				if ( _logger.isInfoEnabled() ) _logger.info( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case INFO:
				if ( _logger.isInfoEnabled() ) _logger.info( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case DEBUG:
				if ( _logger.isDebugEnabled() ) _logger.debug( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case TRACE:
				if ( _logger.isTraceEnabled() ) _logger.trace( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			case DISCARD:
				break;
			case NONE:
				if ( _logger.isInfoEnabled() ) _logger.info( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			default:
				if ( _logger.isInfoEnabled() ) _logger.info( MessageFormat.format( aMessage, aArguments ), aThrowable );
				break;
			}
		}
	}

	@Override
	public boolean isLog( LogPriority aPriority ) {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLog( aPriority );
		else {
			return aPriority.getPriority() >= getLogPriority().getPriority() && aPriority.getPriority() >= 0;
		}
	}

	@Override
	public void trace( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.trace( aMessage );
		else {
			_logger.trace( aMessage );
		}
	}

	@Override
	public void trace( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.trace( aMessage, aArguments );
		else {
			_logger.trace( aMessage, aArguments );
		}
	}

	@Override
	public boolean isLogTrace() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogTrace();
		else {
			return isLog( LogPriority.TRACE );
		}
	}

	@Override
	public void debug( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.debug( aMessage );
		else {
			_logger.debug( aMessage );
		}
	}

	@Override
	public void debug( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.debug( aMessage, aArguments );
		else {
			_logger.debug( aMessage, aArguments );
		}
	}

	@Override
	public boolean isLogDebug() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogDebug();
		else {
			return isLog( LogPriority.DEBUG );
		}
	}

	@Override
	public void info( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.info( aMessage );
		else {
			_logger.info( aMessage );
		}
	}

	@Override
	public void info( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.info( aMessage, aArguments );
		else {
			_logger.info( aMessage, aArguments );
		}
	}

	@Override
	public boolean isLogInfo() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogInfo();
		else {
			return isLog( LogPriority.INFO );
		}
	}

	@Override
	public void notice( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.notice( aMessage );
		else {
			_logger.info( aMessage );
		}
	}

	@Override
	public void notice( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.notice( aMessage, aArguments );
		else {
			_logger.info( aMessage, aArguments );
		}
	}

	@Override
	public boolean isLogNotice() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogNotice();
		else {
			return isLog( LogPriority.NOTICE );
		}
	}

	@Override
	public void warn( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.warn( aMessage );
		else {
			_logger.warn( aMessage );
		}
	}

	@Override
	public void warn( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.warn( aMessage, aArguments );
		else {
			_logger.warn( aMessage, aArguments );
		}
	}

	@Override
	public void warn( String aMessage, Throwable aThrowable ) {
		if ( _runtimeLogger != null ) _runtimeLogger.warn( aMessage, aThrowable );
		else {
			_logger.warn( aMessage, aThrowable );
		}
	}

	@Override
	public void warn( String aMessage, Throwable aThrowable, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.warn( aMessage, aArguments );
		else {
			_logger.warn( MessageFormat.format( aMessage, aArguments ), aThrowable );
		}
	}

	@Override
	public boolean isLogWarn() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogWarn();
		else {
			return isLog( LogPriority.WARN );
		}
	}

	@Override
	public void error( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.error( aMessage );
		else {
			_logger.error( aMessage );
		}
	}

	@Override
	public void error( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.error( aMessage, aArguments );
		else {
			_logger.error( aMessage, aArguments );
		}
	}

	@Override
	public void error( String aMessage, Throwable aThrowable ) {
		if ( _runtimeLogger != null ) _runtimeLogger.error( aMessage, aThrowable );
		else {
			_logger.error( aMessage, aThrowable );
		}
	}

	@Override
	public void error( String aMessage, Throwable aThrowable, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.error( aMessage, aThrowable, aArguments );
		else {
			_logger.error( MessageFormat.format( aMessage, aArguments ), aThrowable );
		}
	}

	@Override
	public boolean isLogError() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogError();
		else {
			return isLog( LogPriority.ERROR );
		}
	}

	@Override
	public void critical( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.critical( aMessage );
		else {
			_logger.error( aMessage );
		}
	}

	@Override
	public void critical( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.critical( aMessage, aArguments );
		else {
			_logger.error( aMessage, aArguments );
		}
	}

	@Override
	public void critical( String aMessage, Throwable aThrowable ) {
		if ( _runtimeLogger != null ) _runtimeLogger.critical( aMessage, aThrowable );
		else {
			_logger.error( aMessage, aThrowable );
		}
	}

	@Override
	public void critical( String aMessage, Throwable aThrowable, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.critical( aMessage, aThrowable, aArguments );
		else {
			_logger.error( MessageFormat.format( aMessage, aArguments ), aThrowable );
		}
	}

	@Override
	public boolean isLogCritical() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogCritical();
		else {
			return isLog( LogPriority.CRITICAL );
		}
	}

	@Override
	public void alert( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.alert( aMessage );
		else {
			_logger.error( aMessage );
		}
	}

	@Override
	public void alert( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.alert( aMessage, aArguments );
		else {
			_logger.error( aMessage, aArguments );
		}
	}

	@Override
	public void alert( String aMessage, Throwable aThrowable ) {
		if ( _runtimeLogger != null ) _runtimeLogger.alert( aMessage, aThrowable );
		else {
			_logger.error( aMessage, aThrowable );
		}
	}

	@Override
	public void alert( String aMessage, Throwable aThrowable, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.alert( aMessage, aThrowable, aArguments );
		else {
			_logger.error( MessageFormat.format( aMessage, aArguments ), aThrowable );
		}
	}

	@Override
	public boolean isLogAlert() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogAlert();
		else {
			return isLog( LogPriority.ALERT );
		}
	}

	@Override
	public void panic( String aMessage ) {
		if ( _runtimeLogger != null ) _runtimeLogger.panic( aMessage );
		else {
			_logger.error( aMessage );
		}
	}

	@Override
	public void panic( String aMessage, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.panic( aMessage, aArguments );
		else {
			_logger.error( aMessage, aArguments );
		}
	}

	@Override
	public void panic( String aMessage, Throwable aThrowable ) {
		if ( _runtimeLogger != null ) _runtimeLogger.panic( aMessage, aThrowable );
		else {
			_logger.error( aMessage, aThrowable );
		}
	}

	@Override
	public void panic( String aMessage, Throwable aThrowable, Object... aArguments ) {
		if ( _runtimeLogger != null ) _runtimeLogger.panic( aMessage, aThrowable, aArguments );
		else {
			_logger.error( MessageFormat.format( aMessage, aArguments ), aThrowable );
		}
	}

	@Override
	public boolean isLogPanic() {
		if ( _runtimeLogger != null ) return _runtimeLogger.isLogPanic();
		else {
			return isLog( LogPriority.PANIC );
		}
	}

	// /////////////////////////////////////////////////////////////////////////
	// HELPER:
	// /////////////////////////////////////////////////////////////////////////

	/**
	 * Tries to extract an encapsulated {@link RuntimeLogger} instance.
	 */
	private void toRuntimeLogger( Logger aLogger ) {
		if ( (aLogger instanceof RuntimeLoggerAccessor) && ((RuntimeLoggerAccessor) aLogger).getRuntimeLogger() != null ) {
			// -----------------------------------------------------------------
			// To avoid loss of priority level detail, use underlying
			// RuntimeLogger where possible, the Slf4jRuntimeLoggerAdapterImpl
			// provides access to the wrapped RuntimeLogger:
			// -----------------------------------------------------------------
			_runtimeLogger = ((RuntimeLoggerAccessor) aLogger).getRuntimeLogger();
		}
		else {
			_logger = aLogger;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy