/* * 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 }; } }