blob: b46012845a75445ff5751888070132d76a883bb3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.util.impl;
import java.io.OutputStream;
import java.io.PrintStream;
import java.text.MessageFormat;
import org.apache.uima.internal.util.I18nUtil;
import org.apache.uima.resource.ResourceManager;
import org.apache.uima.util.Level;
import org.apache.uima.util.Logger;
/**
* UIMA Logging interface implementation for Log4j
*/
public class Log4jLogger_impl implements Logger {
private static final String EXCEPTION_MESSAGE = "Exception occurred";
/**
* logger object from the underlying Log4j logging framework
*/
private org.apache.log4j.Logger logger = null;
/**
* ResourceManager whose extension ClassLoader will be used to locate the
* message digests. Null will cause the ClassLoader to default to
* this.class.getClassLoader().
*/
private ResourceManager mResourceManager = null;
/**
* create a new LogWrapper class for the specified source class
*
* @param component
* specified source class
*/
private Log4jLogger_impl(Class<?> component) {
super();
if (component != null) {
logger = org.apache.log4j.Logger.getLogger(component);
} else {
logger = org.apache.log4j.Logger.getLogger("org.apache.uima");
}
}
/**
* create a new LogWrapper object with the default logger from the Log4j
* logging framework
*/
private Log4jLogger_impl() {
this(null);
}
/**
* Creates a new Log4jLogger instance for the specified source class
*
* @param component
* current source class
* @return Logger returns the JSR47Logger object for the specified class
*/
public static synchronized Logger getInstance(Class<?> component) {
return new Log4jLogger_impl(component);
}
/**
* Creates a new Log4jLogger instance with the default Log4j framework logger
*
* @return Logger returns the JSR47Logger object with the default Log4j
* framework logger
*/
public static synchronized Logger getInstance() {
return new Log4jLogger_impl();
}
/**
* Logs a message with level INFO.
*
* @deprecated use new function with log level
* @param aMessage
* the message to be logged
*/
@Deprecated
public void log(String aMessage) {
if (isLoggable(Level.INFO)) {
if (aMessage == null || aMessage.equals(""))
return;
String[] sourceInfo = getStackTraceInfo(new Throwable());
org.apache.log4j.Logger.getLogger(sourceInfo[0]).info(aMessage);
}
}
/**
* Logs a message with a message key and the level INFO
*
* @deprecated use new function with log level
* @see org.apache.uima.util.Logger#log(java.lang.String, java.lang.String,
* java.lang.Object[])
*/
@Deprecated
public void log(String aResourceBundleName, String aMessageKey,
Object[] aArguments) {
if (isLoggable(Level.INFO)) {
if (aMessageKey == null || aMessageKey.equals(""))
return;
String[] sourceInfo = getStackTraceInfo(new Throwable());
org.apache.log4j.Logger.getLogger(sourceInfo[0]).info(
I18nUtil.localizeMessage(aResourceBundleName, aMessageKey,
aArguments, getExtensionClassLoader()));
}
}
/**
* Logs an exception with level INFO
*
* @deprecated use new function with log level
* @param aException
* the exception to be logged
*/
@Deprecated
public void logException(Exception aException) {
if (isLoggable(Level.INFO)) {
if (aException == null)
return;
String[] sourceInfo = getStackTraceInfo(new Throwable());
// log exception
org.apache.log4j.Logger.getLogger(sourceInfo[0]).info(
EXCEPTION_MESSAGE, aException);
}
}
/**
* @see org.apache.uima.util.Logger#setOutputStream(java.io.OutputStream)
* @deprecated use external configuration possibility
*/
@Deprecated
public void setOutputStream(OutputStream out) {
throw new UnsupportedOperationException(
"Method setOutputStream(OutputStream out) not supported");
}
/**
* @see org.apache.uima.util.Logger#setOutputStream(java.io.PrintStream)
* @deprecated use external configuration possibility
*/
@Deprecated
public void setOutputStream(PrintStream out) {
throw new UnsupportedOperationException(
"Method setOutputStream(PrintStream out) not supported");
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#isLoggable(org.apache.uima.util.Level)
*/
public boolean isLoggable(Level level) {
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
return logger.isEnabledFor(log4jLevel);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#setLevel(org.apache.uima.util.Level)
*/
public void setLevel(Level level) {
// get corresponding Log4j level
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
logger.setLevel(log4jLevel);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#log(org.apache.uima.util.Level,
* java.lang.String)
*/
public void log(Level level, String aMessage) {
if (isLoggable(level)) {
if (aMessage == null || aMessage.equals(""))
return;
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
logger.log(log4jLevel, aMessage);
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#log(org.apache.uima.util.Level,
* java.lang.String, java.lang.Object)
*/
public void log(Level level, String aMessage, Object param1) {
if (isLoggable(level)) {
if (aMessage == null || aMessage.equals(""))
return;
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
logger.log(log4jLevel, MessageFormat.format(aMessage,
new Object[] { param1 }));
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#log(org.apache.uima.util.Level,
* java.lang.String, java.lang.Object[])
*/
public void log(Level level, String aMessage, Object[] params) {
if (isLoggable(level)) {
if (aMessage == null || aMessage.equals(""))
return;
// get corresponding Log4j level
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
logger.log(log4jLevel, MessageFormat.format(aMessage, params));
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#log(org.apache.uima.util.Level,
* java.lang.String, java.lang.Throwable)
*/
public void log(Level level, String aMessage, Throwable thrown) {
if (isLoggable(level)) {
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
if (aMessage != null && !aMessage.equals("")) {
// get corresponding Log4j level
logger.log(log4jLevel, aMessage, thrown);
}
if (thrown != null && (aMessage == null || aMessage.equals(""))) {
// get corresponding Log4j level
// log exception
logger.log(log4jLevel, EXCEPTION_MESSAGE, thrown);
}
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#logrb(org.apache.uima.util.Level,
* java.lang.String, java.lang.String, java.lang.String,
* java.lang.String, java.lang.Object)
*/
public void logrb(Level level, String sourceClass, String sourceMethod,
String bundleName, String msgKey, Object param1) {
if (isLoggable(level)) {
if (msgKey == null || msgKey.equals(""))
return;
if (sourceClass == null) {
sourceClass = "";
}
// get corresponding Log4j level
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
logger.log(log4jLevel, I18nUtil.localizeMessage(bundleName, msgKey,
new Object[] { param1 }, getExtensionClassLoader()));
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#logrb(org.apache.uima.util.Level,
* java.lang.String, java.lang.String, java.lang.String,
* java.lang.String, java.lang.Object[])
*/
public void logrb(Level level, String sourceClass, String sourceMethod,
String bundleName, String msgKey, Object[] params) {
if (isLoggable(level)) {
if (msgKey == null || msgKey.equals(""))
return;
if (sourceClass == null) {
sourceClass = "";
}
// get corresponding Log4j level
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
logger.log(log4jLevel, I18nUtil.localizeMessage(bundleName, msgKey,
params, getExtensionClassLoader()));
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#logrb(org.apache.uima.util.Level,
* java.lang.String, java.lang.String, java.lang.String,
* java.lang.String, java.lang.Throwable)
*/
public void logrb(Level level, String sourceClass, String sourceMethod,
String bundleName, String msgKey, Throwable thrown) {
if (isLoggable(level)) {
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
if (sourceClass == null) {
sourceClass = "";
}
if (msgKey != null && !msgKey.equals("")) {
// get corresponding Log4j level
org.apache.log4j.Logger.getLogger(sourceClass).log(
log4jLevel,
I18nUtil.localizeMessage(bundleName, msgKey, null,
getExtensionClassLoader()), thrown);
}
if (thrown != null && (msgKey == null || msgKey.equals(""))) {
// log exception
org.apache.log4j.Logger.getLogger(sourceClass).log(log4jLevel,
EXCEPTION_MESSAGE, thrown);
}
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#logrb(org.apache.uima.util.Level,
* java.lang.String, java.lang.String, java.lang.String,
* java.lang.String)
*/
public void logrb(Level level, String sourceClass, String sourceMethod,
String bundleName, String msgKey) {
if (isLoggable(level)) {
if (msgKey == null || msgKey.equals(""))
return;
if (sourceClass == null) {
sourceClass = "";
}
// get corresponding Log4j level
org.apache.log4j.Level log4jLevel = getLog4jLevel(level);
org.apache.log4j.Logger.getLogger(sourceClass).log(
log4jLevel,
I18nUtil.localizeMessage(bundleName, msgKey, null,
getExtensionClassLoader()));
// logger.log(log4jLevel, sourceClass + sourceMethod +
// I18nUtil.localizeMessage(bundleName, msgKey, null,
// getExtensionClassLoader()));
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#setResourceManager(org.apache.uima.resource.ResourceManager)
*/
public void setResourceManager(ResourceManager resourceManager) {
mResourceManager = resourceManager;
}
/**
* Gets the extension ClassLoader to used to locate the message digests. If
* this returns null, then message digests will be searched for using
* this.class.getClassLoader().
*/
private ClassLoader getExtensionClassLoader() {
if (mResourceManager == null)
return null;
else
return mResourceManager.getExtensionClassLoader();
}
/**
* log4j level mapping to UIMA level mapping. SEVERE (highest value) ->
* SEVERE WARNING -> WARNING INFO -> INFO CONFIG -> CONFIG FINE -> FINE FINER ->
* FINER FINEST (lowest value) -> FINEST OFF -> OFF ALL -> ALL
*
* @param level
* uima level
* @return Level - corresponding JSR47 level
*/
private org.apache.log4j.Level getLog4jLevel(Level level) {
switch (level.toInteger()) {
case org.apache.uima.util.Level.OFF_INT:
return org.apache.log4j.Level.OFF;
case org.apache.uima.util.Level.SEVERE_INT:
return org.apache.log4j.Level.ERROR;
case org.apache.uima.util.Level.WARNING_INT:
return org.apache.log4j.Level.WARN;
case org.apache.uima.util.Level.INFO_INT:
return org.apache.log4j.Level.INFO;
case org.apache.uima.util.Level.CONFIG_INT:
return org.apache.log4j.Level.INFO;
case org.apache.uima.util.Level.FINE_INT:
return org.apache.log4j.Level.DEBUG;
case org.apache.uima.util.Level.FINER_INT:
return org.apache.log4j.Level.ALL;
case org.apache.uima.util.Level.FINEST_INT:
return org.apache.log4j.Level.ALL;
default: // for all other cases return Level.ALL
return org.apache.log4j.Level.ALL;
}
}
/**
* returns the method name and the line number if available
*
* @param thrown
* the thrown
* @return String[] - fist element is the souce class, second element is the
* method name with linenumber if available
*/
private String[] getStackTraceInfo(Throwable thrown) {
StackTraceElement[] stackTraceElement = thrown.getStackTrace();
String sourceMethod = "";
String sourceClass = "";
int lineNumber = 0;
try {
lineNumber = stackTraceElement[1].getLineNumber();
sourceMethod = stackTraceElement[1].getMethodName();
sourceClass = stackTraceElement[1].getClassName();
} catch (Exception ex) {
// do nothing, use the initialized string members
}
if (lineNumber > 0) {
StringBuffer buffer = new StringBuffer(25);
buffer.append(sourceMethod);
buffer.append("(");
buffer.append(lineNumber);
buffer.append(")");
sourceMethod = buffer.toString();
}
return new String[] { sourceClass, sourceMethod };
}
}