package org.cloudgraph.web;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.ServletException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public abstract class BaseExceptionHandler
{
private static Log log =LogFactory.getLog(
BaseExceptionHandler.class);
private static String instanceName = "Server Instance";
static {
try {
//InitialContext ctx = new InitialContext();
//MBeanServer server = (MBeanServer)ctx.lookup("java:comp/env/jmx/runtime");
//ObjectName serverRT = (ObjectName)server.getAttribute(new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean"), "ServerRuntime");
//instanceName = (String)server.getAttribute(serverRT, "Name");
}
catch (Exception e) {
log.error("Could not get server instance name", e);
}
}
protected static String getInstanceName() {
return instanceName;
}
protected String errorId;
protected abstract Throwable getException();
protected abstract Log getLogInstance();
public BaseExceptionHandler()
{
this.errorId = createUniqueID();
}
protected void logStackTrace()
{
getLogInstance().error(getStrackTrace());
}
public String getStrackTrace()
{
Throwable ex = getException();
StringWriter writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
pw.println("\n================ " + errorId + " ================ ");
populateTrace(ex, pw);
pw.println("================ " + errorId + " ================ ");
return writer.toString();
}
protected void populateTrace(Throwable ex, PrintWriter pw)
{
fillStackTrace(ex, pw);
}
private void fillStackTrace(Throwable ex, PrintWriter pw)
{
if (null == ex) { return; }
ex.printStackTrace(pw);
if (ex instanceof ServletException)
{
Throwable cause = ((ServletException) ex).getRootCause();
if (null != cause)
{
pw.println("Root Cause:");
fillStackTrace(cause, pw);
}
}
else
{
Throwable cause = ex.getCause();
if (null != cause)
{
pw.println("Cause:");
fillStackTrace(cause, pw);
}
}
}
public static String createUniqueID ()
{
return getInstanceName() + "." + System.currentTimeMillis();
}
public String getErrorId() {
return errorId;
}
}