blob: 3acb8859892375925f9e1a7fe384de77927911e0 [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.bsf;
import java.lang.reflect.*;
/**
* This class is used in BSF for logging (a delegator for <em>org.apache.commons.logging</em>, which is needed for compilation) using the
* <code>org.apache.commons.logging.Log</code> methods.
*
* Therefore this class implements all the <code>org.apache.commons.logging.Log</code> methods. If <code>org.apache.commons.logging.LogFactory</code> is
* available, then this class is used to get an <code>org.apache.commons.logging.Log</code> instance to which to forward the message.
*
* Therefore, if Apache's common logging is available, then it is employed. If Apache's commons logging is <em>not</em> available then a <em>no-op</em> behavior
* is employed, modelled after <code>org.apache.commons.logging.impl.NoOpLog</code>.
*
*/
/*
* ---rgf, 2007-01-29, loading and invoking all methods via reflection ---rgf, 2007-09-17, adjusted for using default class loader, if system class loader fails
* ---rgf, 2011-01-08, cf. [https://issues.apache.org/jira/browse/BSF-37] - context class loader may not be set, account for it (2009-09-10) - fix logic error
* if context class loader is not set (e.g. observed on MacOSX, 2011-01-08)
*/
//@Immutable
public class BSF_Log // implements org.apache.commons.logging.Log
{
final private static int iDebug = 0; // don't show any debug-info
final static private Class oac_LogFactory;
// NOTUSED final static private Method oac_LogFactoryGetLog_Clazz;
final static private Method oac_LogFactoryGetLog_String;
final static private Method[] meths = new Method[18]; // store the Log methods
// define the slots in the array
final private static int debug1 = 0;
final private static int debug2 = 1;
final private static int isDebugEnabled = 2;
final private static int error1 = 3;
final private static int error2 = 4;
final private static int isErrorEnabled = 5;
final private static int fatal1 = 6;
final private static int fatal2 = 7;
final private static int isFatalEnabled = 8;
final private static int info1 = 9;
final private static int info2 = 10;
final private static int isInfoEnabled = 11;
final private static int trace1 = 12;
final private static int trace2 = 13;
final private static int isTraceEnabled = 14;
final private static int warn1 = 15;
final private static int warn2 = 16;
final private static int isWarnEnabled = 17;
static { // try to demand load the apache commons logging LogFactory
Class oac_LogFactory_ = null;
// NOTUSED Method oac_LogFactoryGetLog_Clazz_ = null;
Method oac_LogFactoryGetLog_String_ = null;
try // rgf, 20070917: o.k., if not found, try definedClassLoader instead
{
ClassLoader cl = Thread.currentThread().getContextClassLoader();
final String str4Log = "org.apache.commons.logging.Log";
Class logClass = null;
if (cl != null) // use current Thread's context class loader, if set
{
try {
logClass = cl.loadClass(str4Log);
} catch (final ClassNotFoundException e1) // not found by contextClassLoader
{
}
}
if (logClass == null) // not found, try defined class loader instead
{
final ClassLoader defCL = BSFManager.getDefinedClassLoader();
logClass = defCL.loadClass(str4Log);
cl = defCL; // class found, hence we use the definedClassLoader here
}
oac_LogFactory_ = cl.loadClass("org.apache.commons.logging.LogFactory");
// get method with Class object argument
// NOTUSED oac_LogFactoryGetLog_Clazz_ = oac_LogFactory_.getMethod("getLog", new Class[] {Class.class});
// get method with String object argument
oac_LogFactoryGetLog_String_ = oac_LogFactory_.getMethod("getLog", new Class[] { String.class });
// get the Log methods
final String str[][] = { { "debug", "isDebugEnabled" }, { "error", "isErrorEnabled" }, { "fatal", "isFatalEnabled" }, { "info", "isInfoEnabled" },
{ "trace", "isTraceEnabled" }, { "warn", "isWarnEnabled" } };
int i = 0;
for (; i < 6; i++) {
final int j = i * 3;
meths[j] = logClass.getMethod(str[i][0], new Class[] { Object.class });
meths[j + 1] = logClass.getMethod(str[i][0], new Class[] { Object.class, Throwable.class });
meths[j + 2] = logClass.getMethod(str[i][1], new Class[] {});
}
}
catch (final ClassNotFoundException e)// o.k., so we do not use org.apache.commons.logging in this run
{
if (iDebug > 1) {
e.printStackTrace();
}
oac_LogFactory_ = null; // make sure it does not get used
oac_LogFactoryGetLog_String_ = null; // make sure it does not get used
} catch (final NoSuchMethodException e)// o.k., so we do not use org.apache.commons.logging in this run
{
if (iDebug > 1) {
e.printStackTrace();
}
oac_LogFactory_ = null; // make sure it does not get used
oac_LogFactoryGetLog_String_ = null; // make sure it does not get used
}
// Set up final fields
oac_LogFactory = oac_LogFactory_;
// NOTUSED oac_LogFactoryGetLog_Clazz = oac_LogFactoryGetLog_Clazz_;
oac_LogFactoryGetLog_String = oac_LogFactoryGetLog_String_;
}
/** Name of the BSF_Log instance. */
final String name;
/** Proxy object for <em>org.apache.commons.logging.Log</em>, if available. */
private final Object oac_logger;
public BSF_Log() {
this("<?>");
}
public BSF_Log(final String name) {
Object oac_logger_ = null;
this.name = name;
if (oac_LogFactory != null) {
try // try to get an org.apache.commons.logging.Log object from the LogFactory
{
oac_logger_ = oac_LogFactoryGetLog_String.invoke(oac_LogFactory, new Object[] { name });
} catch (final Exception e) {
e.printStackTrace();
}
}
oac_logger = oac_logger_;
}
public BSF_Log(final Class clazz) {
this(clazz.getName());
}
public void debug(final Object msg) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).debug(msg);
meths[debug1].invoke(oac_logger, new Object[] { msg });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void debug(final Object msg, final Throwable t) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).debug(msg, t);
meths[debug2].invoke(oac_logger, new Object[] { msg, t });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void error(final Object msg) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).error(msg);
meths[error1].invoke(oac_logger, new Object[] { msg });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void error(final Object msg, final Throwable t) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).error(msg, t);
meths[error2].invoke(oac_logger, new Object[] { msg, t });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void fatal(final Object msg) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).fatal(msg);
meths[fatal1].invoke(oac_logger, new Object[] { msg });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void fatal(final Object msg, final Throwable t) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).fatal(msg, t);
meths[fatal2].invoke(oac_logger, new Object[] { msg, t });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void info(final Object msg) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).info(msg);
meths[info1].invoke(oac_logger, new Object[] { msg });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void info(final Object msg, final Throwable t) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).info(msg, t);
meths[info2].invoke(oac_logger, new Object[] { msg, t });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void trace(final Object msg) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).trace(msg);
meths[trace1].invoke(oac_logger, new Object[] { msg });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void trace(final Object msg, final Throwable t) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).trace(msg, t);
meths[trace2].invoke(oac_logger, new Object[] { msg, t });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void warn(final Object msg) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).warn(msg);
meths[warn1].invoke(oac_logger, new Object[] { msg });
} catch (final Exception e) {
e.printStackTrace();
}
}
public void warn(final Object msg, final Throwable t) {
if (oac_logger == null) {
return; // no org.apache.commons.logging.Log object ?
}
try {
// ((org.apache.commons.logging.Log) oac_logger).warn(msg, t);
meths[warn2].invoke(oac_logger, new Object[] { msg, t });
} catch (final Exception e) {
e.printStackTrace();
}
}
public boolean isDebugEnabled() {
if (oac_logger == null) {
return false;
} // no org.apache.commons.logging.Log object ?
try {
// return ((org.apache.commons.logging.Log) oac_logger).isDebugEnabled();
return ((Boolean) meths[isDebugEnabled].invoke(oac_logger, new Object[] {})).booleanValue();
} catch (final Exception e) {
} finally {
return false;
}
}
public boolean isErrorEnabled() {
if (oac_logger == null) {
return false; // no org.apache.commons.logging.Log object ?
}
try {
// return ((org.apache.commons.logging.Log) oac_logger).isErrorEnabled();
return ((Boolean) meths[isErrorEnabled].invoke(oac_logger, new Object[] {})).booleanValue();
} catch (final Exception e) {
} finally {
return false;
}
}
public boolean isFatalEnabled() {
if (oac_logger == null) {
return false; // no org.apache.commons.logging.Log object ?
}
try {
// return ((org.apache.commons.logging.Log) oac_logger).isFatalEnabled();
return ((Boolean) meths[isFatalEnabled].invoke(oac_logger, new Object[] {})).booleanValue();
} catch (final Exception e) {
} finally {
return false;
}
}
public boolean isInfoEnabled() {
if (oac_logger == null) {
return false; // no org.apache.commons.logging.Log object ?
}
try {
// return ((org.apache.commons.logging.Log) oac_logger).isInfoEnabled();
return ((Boolean) meths[isInfoEnabled].invoke(oac_logger, new Object[] {})).booleanValue();
} catch (final Exception e) {
} finally {
return false;
}
}
public boolean isTraceEnabled() {
if (oac_logger == null) {
return false; // no org.apache.commons.logging.Log object ?
}
try {
// return ((org.apache.commons.logging.Log) oac_logger).isTraceEnabled();
return ((Boolean) meths[isTraceEnabled].invoke(oac_logger, new Object[] {})).booleanValue();
} catch (final Exception e) {
} finally {
return false;
}
}
public boolean isWarnEnabled() {
if (oac_logger == null) {
return false; // no org.apache.commons.logging.Log object ?
}
try {
// return ((org.apache.commons.logging.Log) oac_logger).isWarnEnabled();
return ((Boolean) meths[isWarnEnabled].invoke(oac_logger, new Object[] {})).booleanValue();
} catch (final Exception e) {
} finally {
return false;
}
}
// for development purposes only (to debug this class on its own)
public static void main(final String args[]) {
System.out.println("in BSF_Log ...");
System.out.println("--------------------------------------------------------");
System.out.println("--------------------------------------------------------");
BSF_Log bl = new BSF_Log();
dump(bl);
bl = new BSF_Log(Class.class);
dump(bl);
bl = new BSF_Log("Rony was here...");
dump(bl);
}
static void dump(final BSF_Log bl) {
System.out.println("\n\tbl=[" + bl + "] --->>> --->>> --->>>");
System.err.print("/debug **/");
bl.debug("debug message. ");
System.err.println("\\** debug.\\");
System.err.print("/error **/");
bl.error("error message. ");
System.err.println("\\** error.\\");
System.err.print("/fatal **/");
bl.fatal("fatal message. ");
System.err.println("\\** fatal.\\");
System.err.print("/info **/");
bl.info("info message. ");
System.err.println("\\** info .\\");
System.err.print("/trace **/");
bl.trace("trace message. ");
System.err.println("\\** trace.\\");
System.err.print("/warn **/");
bl.warn("warn message. ");
System.err.println("\\** warn .\\");
System.err.println();
final Throwable t = new Throwable("Test from Rony for: " + bl);
System.err.print("/debug **/");
bl.debug("debug message. ", t);
System.err.println("\\** debug.\\");
System.err.print("/error **/");
bl.error("error message. ", t);
System.err.println("\\** error.\\");
System.err.print("/fatal **/");
bl.fatal("fatal message. ", t);
System.err.println("\\** fatal.\\");
System.err.print("/info **/");
bl.info("info message. ", t);
System.err.println("\\** info .\\");
System.err.print("/trace **/");
bl.trace("trace message. ", t);
System.err.println("\\** trace.\\");
System.err.print("/warn **/");
bl.warn("warn message. ", t);
System.err.println("\\** warn .\\");
System.err.println();
System.out.println("\tisDebugEnabled: " + bl.isDebugEnabled());
System.out.println("\tisErrorEnabled: " + bl.isErrorEnabled());
System.out.println("\tisFatalEnabled: " + bl.isFatalEnabled());
System.out.println("\tisInfo Enabled: " + bl.isInfoEnabled());
System.out.println("\tisTraceEnabled: " + bl.isTraceEnabled());
System.out.println("\tisWarn Enabled: " + bl.isWarnEnabled());
System.out.println("\tbl=[" + bl + "] <<<--- <<<--- <<<---");
System.out.println("--------------------------------------------------------");
}
}