package org.jblooming.tracer;
import org.apache.log4j.Logger;
import org.hibernate.stat.Statistics;
import org.jblooming.persistence.hibernate.HibernateFactory;
import org.jblooming.utilities.HashTable;
import org.jblooming.PlatformRuntimeException;
import org.jblooming.utilities.StringUtilities;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
public class Tracer {
protected static Tracer singleton = new Tracer();
private static final MemoryCounter mc = new MemoryCounter();
public static TracerConstants DEFAULT_LOG_MODALITY = TracerConstants.HTTP;
public static boolean oqlDebug = false;
private Map<String, StringBuffer> trace = new HashTable();
private StringBuffer oqlTrace = new StringBuffer();
public static Logger platformLogger = Logger.getLogger("platformLogger");
public static Logger i18nLogger = Logger.getLogger("i18nLogger");
public static Logger hibernateLogger = Logger.getLogger("org.hibernate");
public static Logger jobLogger = Logger.getLogger("jobLogger");
public static Logger emailLogger = Logger.getLogger("emailLogger");
public Tracer() {
trace = new Hashtable();
trace.put("127.0.0.1", new StringBuffer(512));
}
public static Tracer getInstance() {
return singleton;
}
public static synchronized void addTrace(String s) {
if (DEFAULT_LOG_MODALITY.equals(TracerConstants.HTTP))
s = s + "<br>";
Tracer.getInstance().trace.get("127.0.0.1").append(s);
}
public static synchronized void addTrace(String s, HttpServletRequest request) {
addTrace(new StringBuffer(s), request);
}
public static synchronized void addTrace(StringBuffer s, HttpServletRequest request) {
StringBuffer currentTrace = Tracer.getInstance().trace.get(request.getRemoteAddr());
if (currentTrace == null)
Tracer.getInstance().trace.put(request.getRemoteAddr(), new StringBuffer(512));
Tracer.getInstance().trace.get(request.getRemoteAddr()).append(s);
}
public static StringBuffer getTrace(HttpServletRequest request) {
return Tracer.getInstance().trace.get(request.getRemoteAddr());
}
public static synchronized void resetTrace(HttpServletRequest request) {
Tracer.getInstance().trace.put(request.getRemoteAddr(), new StringBuffer(512));
Tracer.getInstance().oqlTrace = new StringBuffer();
}
public static void printTrace(String s) {
printTrace(TracerConstants.SYSTEM, s);
}
public static void printTrace(TracerConstants modality, String s) {
if (modality.equals(TracerConstants.SYSTEM))
System.out.print(s + '\n');
}
public static void printTrace(Throwable throwable) {
printTrace(TracerConstants.SYSTEM, throwable);
}
public static void printTrace(TracerConstants modality, Throwable e) {
if (modality.equals(TracerConstants.SYSTEM))
e.printStackTrace();
}
/**
* to allow object breakpoints on jsp pages
*
* @param o
*/
public static void objectDebug(Object o) {
if (o != null)
o.toString();
int breakPoint = 0;
}
public static void objectDebug(Object... os) {
if (os != null)
os.toString();
int breakPoint = 0;
}
public String getOqlTrace(boolean reset) {
String result = oqlTrace.toString();
if (reset)
oqlTrace = new StringBuffer();
return result;
}
public void addOqlTrace(String oqlTrace) {
this.oqlTrace.append(oqlTrace);
}
public static final String where() {
StackTraceElement[] elems = new Exception().getStackTrace();
return (elems.length < 2) ?
"" :
elems[1].getFileName() + "@" + elems[1].getLineNumber() + ":" + elems[1].getClassName() + "." + elems[1].getMethodName() + "()";
}
public static String traceRequest(HttpServletRequest request) {
StringBuffer rd = new StringBuffer();
//authentication
if (request.getUserPrincipal() != null)
rd.append("request.getUserPrincipal().getName() " + request.getUserPrincipal().getName() + "<br>");
rd.append("request.getAuthType()" + request.getAuthType() + "<br>");
rd.append("request.getRemoteUser() " + request.getRemoteUser() + "<br>");
rd.append("request.isUserInRole(\"user\") " + request.isUserInRole("user") + "<br>");
rd.append("request.isSecure() " + request.isSecure() + "<br><br>");
rd.append("request.getRequestedSessionId() " + request.getRequestedSessionId() + "<br>");
rd.append("request.getCharacterEncoding() " + request.getCharacterEncoding() + "<br>");
rd.append("request.getMethod() " + request.getMethod() + "<br><br>");
//params
Enumeration parameters = request.getParameterNames();
rd.append(System.currentTimeMillis() + "<br>");
rd.append("header:<br><br>");
Enumeration en = request.getHeaderNames();
while (en.hasMoreElements()) {
String s = (String) en.nextElement();
rd.append(s + ": " + request.getHeader(s) + "<br>");
}
rd.append("<hr>");
rd.append("attributes:<br><br>");
Enumeration attr = request.getAttributeNames();
while (attr.hasMoreElements()) {
String requestString = (String) attr.nextElement();
rd.append(requestString + " - " + request.getAttribute(requestString) + "<br>");
}
rd.append("<hr>");
rd.append("parameters:<br><br>");
while (parameters.hasMoreElements()) {
String requestString = (String) parameters.nextElement();
rd.append(requestString + " - " + request.getParameter(requestString) + "<br>");
}
rd.append("<hr>");
rd.append("request.getContextPath():" + request.getContextPath() + "<br>");
rd.append("request.getContentType():" + request.getContentType() + "<br>");
rd.append("request.getRemoteAddr():" + request.getRemoteAddr() + "<br>");
rd.append("request.getRemoteHost():" + request.getRemoteHost() + "<br>");
rd.append("request.getRequestURI():" + request.getRequestURI() + "<br>");
rd.append("request.getRequestURL():" + request.getRequestURL() + "<br>");
return rd.toString();
}
public static String measureSize(Object o) {
return measureSize(o,false);
}
public static String measureSize(Object o, boolean includeStatic) {
long mem = mc.estimate(o,includeStatic);
String s = o.getClass().getSimpleName() + " memory usage size: " + objectSize(mem);
return s;
}
public static String objectSize(long size) {
int divisor = 1;
String unit = "bytes";
if (size >= 1024 * 1024) {
divisor = 1024 * 1024;
unit = "MB";
} else if (size >= 1024) {
divisor = 1024;
unit = "KB";
}
if (divisor == 1) return size / divisor + " " + unit;
String aftercomma = "" + 100 * (size % divisor) / divisor;
if (aftercomma.length() == 1) aftercomma = '0' + aftercomma;
return size / divisor + "." + aftercomma + ' ' + unit;
}
public static String getCallTrace(boolean showFullStack) {
StringBuffer sb = new StringBuffer();
Throwable stea = new Throwable();
StackTraceElement[] trace = stea.getStackTrace();
//jump the first element
for (int i = 1; i < trace.length; i++) {
StackTraceElement element = trace[i];
try {
String className = element.getClassName();
if (showFullStack || (className.indexOf("com.caucho") == -1 && className.indexOf("org.apache") == -1 ))
sb.append("\n at " + element);
} catch (Exception e) {
throw new PlatformRuntimeException(e);
}
}
/*final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
stea.printStackTrace(printWriter);
return result.toString();*/
return sb.toString();
}
public static void logExceptionOnPlatformOrOther(Throwable throwable) {
if (platformLogger!=null && platformLogger.getAllAppenders().hasMoreElements()) {
platformLogger.error(throwable.getMessage(),throwable);
} else
desperatelyLog(throwable.getMessage(),false,throwable);
}
public static void desperatelyLog(String message, boolean throwPlatformRuntimeException, Throwable e) {
if (platformLogger != null && platformLogger.getAllAppenders().hasMoreElements()) {
platformLogger.fatal(e.getMessage(),e);
return;
}
try {
if (Logger.getRootLogger() != null)
Logger.getRootLogger().fatal(message);
} catch (Exception ex) {
}
System.out.println(message);
if (throwPlatformRuntimeException) {
if (e!=null)
throw new PlatformRuntimeException(message,e);
else
throw new PlatformRuntimeException(message);
}
}
public static void traceHibernateStart() {
HibernateFactory.getSessionFactory().getStatistics().clear();
}
public static String traceHibernateEnd() {
String qq = "";
Statistics statistics = HibernateFactory.getSessionFactory().getStatistics();
for (String q : statistics.getQueries()) {
qq = qq + q+"\n";
}
qq = qq + "\n"+"Total HQL queries: "+ statistics.getQueries().length+"\n";
qq = qq + "----------------------------\n"+"Total queries executed to database: "+ statistics.getQueryExecutionCount()+"\n";
qq = qq + "----------------------------\n"+"Slowest query: "+ statistics.getQueryExecutionMaxTimeQueryString()+" TOOK "+statistics.getQueryExecutionMaxTime()+"\n";
qq = qq + "----------------------------\n"+ StringUtilities.replaceAllNoRegex(statistics+"",",","\n");
return qq;
}
}