/*
This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along
with this program; if not, see http://www.gnu.org/licenses or write to the Free
Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.j2db.util;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.EcmaError;
import org.mozilla.javascript.ScriptRuntime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import com.servoy.base.util.ILogger;
import com.servoy.j2db.IServiceProvider;
import com.servoy.j2db.J2DBGlobals;
import com.servoy.j2db.persistence.Solution;
public class Debug
{
public static final ILogger LOGGER = new ILogger()
{
public void log(String message)
{
Debug.log(message);
}
public void error(String message, Throwable t)
{
Debug.error(message, t);
}
};
private volatile static Logger log = null;
private volatile static boolean trace = false;
private volatile static boolean traceClient = false;
static
{
try
{
// touch the LogFactory class in the init. (to avoid the webstart bug)
Class< ? > cls = LoggerFactory.class;
if (cls != null) cls.getName();
}
catch (Throwable t)
{
}
}
@SuppressWarnings("nls")
public static void init()
{
try
{
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.dateTimeFormat", "yyyy-MM-dd HH:mm");
System.setProperty("org.apache.commons.logging.simplelog.defaultlog", "warn");
boolean st = false;
try
{
st = Boolean.getBoolean("STACKTRACE"); //$NON-NLS-1$
}
catch (Exception ex)
{
//ignore
}
boolean STACKTRACE = st;
if (STACKTRACE) System.setProperty("org.apache.commons.logging.simplelog.defaultlog", "info");
boolean t = false;
try
{
if (STACKTRACE)
{
t = true;
}
else
{
t = Boolean.getBoolean("TRACE"); //$NON-NLS-1$
}
}
catch (Exception ex)
{
//ignore
}
boolean TRACE = t;
if (TRACE) System.setProperty("org.apache.commons.logging.simplelog.defaultlog", "trace");
log = LoggerFactory.getLogger(Debug.class);
trace = log.isTraceEnabled();
}
catch (Throwable t)
{
System.err.println("Error initializing Debug log class");
t.printStackTrace();
}
}
public static void toggleTracing()
{
if (log == null)
{
init();
}
trace = !trace;
traceClient = trace;
if (traceClient)
{
log("tracing enabled"); //$NON-NLS-1$
}
else
{
log("tracing disabled"); //$NON-NLS-1$
}
}
private static Boolean HASMDC = null;
@SuppressWarnings("nls")
private static boolean insertClientInfo(boolean insert)
{
if (HASMDC == null)
{
try
{
Class.forName("org.slf4j.MDC");
HASMDC = Boolean.TRUE;
}
catch (Exception e)
{
HASMDC = Boolean.FALSE;
}
}
if (!HASMDC.booleanValue()) return false;
return insetClientInfoWithMDC(insert);
}
/**
* @param message
* @return
*/
@SuppressWarnings("nls")
private static boolean insetClientInfoWithMDC(boolean insert)
{
IServiceProvider serviceProvider = J2DBGlobals.getServiceProvider();
if (insert && serviceProvider != null)
{
Solution solution = serviceProvider.getSolution();
String clientID = serviceProvider.getClientID();
if (solution != null && clientID != null)
{
if (MDC.get("clientid") == null)
{
MDC.put("clientid", clientID);
MDC.put("solution", solution.getName());
return true;
}
}
else
{
MDC.remove("clientid");
MDC.remove("solution");
}
}
else
{
MDC.remove("clientid");
MDC.remove("solution");
}
return false;
}
public static void trace(String message, Throwable throwable)
{
if (log == null) return;
if (traceClient)
{
// if trace is enable on client (trace boolean is runtime toggle)
// then do log instead of trace, because the default
// jre logging.properties only does INFO.
log(message, throwable);
}
else
{
boolean wasInserted = insertClientInfo(true);
log.trace(message, throwable);
if (wasInserted) insertClientInfo(false);
}
}
public static void trace(Object s)
{
if (log == null) return;
if (traceClient)
{
// if trace is enable on client (trace boolean is runtime toggle)
// then do log instead of trace, because the default
// jre logging.properties only does INFO.
log(s);
}
else
{
if (s instanceof Throwable)
{
boolean wasInserted = insertClientInfo(true);
log.trace("Throwable", (Throwable)s);
if (wasInserted) insertClientInfo(false);
}
else
{
boolean wasInserted = insertClientInfo(true);
log.trace(String.valueOf(s));
if (wasInserted) insertClientInfo(false);
}
}
// if (TRACE)
// {
// System.out.println(s);
// if(STACKTRACE && (s instanceof Throwable ))
// {
// ((Throwable)s).printStackTrace();
// logStackTraceToWindow((Throwable) s);
// }
// else if(s != null && !"".equals(s))
// {
// logToWindow(s, TRACE_LEVEL);
// }
// System.out.flush();
//
// if (LOG && logFile != null && s != null && !"".equals(s))
// {
// logFile.print(sdf.format(new Date()));
// logFile.print(" : ");
// if(s instanceof Throwable )
// {
// ((Throwable)s).printStackTrace(logFile);
// }
// else
// {
// logFile.println(s);
// }
// logFile.flush();
// }
// }
}
public static void error(String message, Throwable s)
{
initIfFirstTime();
if (log == null) return;
boolean wasInserted = insertClientInfo(true);
log.error(message, s);
if (wasInserted) insertClientInfo(false);
if (Context.getCurrentContext() != null)
{
try
{
EcmaError jsError = ScriptRuntime.constructError(message, message);
String scriptStackTrace = jsError.getScriptStackTrace();
if (!scriptStackTrace.equals(""))
{
wasInserted = insertClientInfo(true);
log.error(message + ", script stacktrace:\n" + scriptStackTrace);
if (wasInserted) insertClientInfo(false);
}
}
catch (Exception e)
{
// just ignore
}
}
}
public static void error(Object s)
{
initIfFirstTime();
if (log == null) return;
if (s instanceof Throwable)
{
error("Throwable", (Throwable)s);
}
else
{
boolean wasInserted = insertClientInfo(true);
log.error(String.valueOf(s));
if (wasInserted) insertClientInfo(false);
}
}
public static void log(String message, Throwable throwable)
{
if (log == null) return;
if (throwable != null)
{
boolean wasInserted = insertClientInfo(true);
log.warn(message, throwable);
if (wasInserted) insertClientInfo(false);
}
else
{
boolean wasInserted = insertClientInfo(true);
log.info(message);
if (wasInserted) insertClientInfo(false);
}
}
public static void log(Object s)
{
if (log == null) return;
if (s instanceof Throwable)
{
boolean wasInserted = insertClientInfo(true);
log.warn("Throwable", (Throwable)s);
if (wasInserted) insertClientInfo(false);
}
else
{
boolean wasInserted = insertClientInfo(true);
log.info(String.valueOf(s));
if (wasInserted) insertClientInfo(false);
}
}
public static boolean tracing()
{
return trace;
}
public static void warn(Object s)
{
initIfFirstTime();
if (log == null) return;
boolean wasInserted = insertClientInfo(true);
log.warn(String.valueOf(s));
if (wasInserted) insertClientInfo(false);
}
public static void fatal(Object s)
{
initIfFirstTime();
if (log == null) return;
boolean wasInserted = insertClientInfo(true);
log.error(String.valueOf(s));
if (wasInserted) insertClientInfo(false);
}
public static void debug(Object s)
{
initIfFirstTime();
if (log == null) return;
boolean wasInserted = insertClientInfo(true);
log.debug(String.valueOf(s));
if (wasInserted) insertClientInfo(false);
}
private static void initIfFirstTime()
{
if (log == null)
{
init();
}
}
}