package railo.runtime.listener;
import java.io.PrintStream;
import java.io.PrintWriter;
import railo.runtime.PageContext;
import railo.runtime.PageSource;
import railo.runtime.config.Config;
import railo.runtime.config.Constants;
import railo.runtime.dump.DumpData;
import railo.runtime.dump.DumpProperties;
import railo.runtime.engine.ThreadLocalPageContext;
import railo.runtime.err.ErrorPage;
import railo.runtime.exp.CatchBlock;
import railo.runtime.exp.PageException;
import railo.runtime.exp.PageExceptionImpl;
import railo.runtime.op.Duplicator;
import railo.runtime.type.Collection;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.util.KeyConstants;
public final class ModernAppListenerException extends PageException {
private static final Collection.Key ROOT_CAUSE = KeyImpl.intern("rootCause");
private static final Collection.Key CAUSE = KeyImpl.intern("cause");
private PageException rootCause;
private String eventName;
/**
* Constructor of the class
* @param pe
* @param eventName
*/
public ModernAppListenerException(PageException pe, String eventName) {
super(pe.getMessage());
setStackTrace(pe.getStackTrace());
this.rootCause=pe;
this.eventName=eventName;
}
@Override
public void addContext(PageSource pageSource, int line, int column, StackTraceElement ste) {
rootCause.addContext(pageSource, line, column,ste);
}
@Override
public Struct getAdditional() {
return rootCause.getAddional();
}
@Override
public Struct getAddional() {
return rootCause.getAddional();
}
public Struct getCatchBlock() {
return getCatchBlock(ThreadLocalPageContext.getConfig());
}
@Override
public Struct getCatchBlock(PageContext pc) {
return getCatchBlock(pc.getConfig());
}
@Override
public CatchBlock getCatchBlock(Config config) {
CatchBlock cb=rootCause.getCatchBlock(config);
Collection cause = (Collection) Duplicator.duplicate(cb,false);
//rtn.setEL("message", getMessage());
if(!cb.containsKey(KeyConstants._detail))cb.setEL(KeyConstants._detail, "Exception throwed while invoking function ["+eventName+"] from "+Constants.APP_CFC);
cb.setEL(ROOT_CAUSE, cause);
cb.setEL(CAUSE, cause);
//cb.setEL("stacktrace", getStackTraceAsString());
//rtn.setEL("tagcontext", new ArrayImpl());
//rtn.setEL("type", getTypeAsString());
cb.setEL(KeyConstants._name, eventName);
return cb;
}
@Override
public String getCustomTypeAsString() {
return rootCause.getCustomTypeAsString();
}
@Override
public String getDetail() {
return rootCause.getDetail();
}
@Override
public Struct getErrorBlock(PageContext pc, ErrorPage ep) {
return rootCause.getErrorBlock(pc, ep);
}
@Override
public String getErrorCode() {
return rootCause.getErrorCode();
}
@Override
public String getExtendedInfo() {
return rootCause.getExtendedInfo();
}
@Override
public String getStackTraceAsString() {
return rootCause.getStackTraceAsString();
}
@Override
public int getTracePointer() {
return rootCause.getTracePointer();
}
@Override
public String getTypeAsString() {
return rootCause.getTypeAsString();
}
@Override
public void setDetail(String detail) {
rootCause.setDetail(detail);
}
@Override
public void setErrorCode(String errorCode) {
rootCause.setErrorCode(errorCode);
}
@Override
public void setExtendedInfo(String extendedInfo) {
rootCause.setExtendedInfo(extendedInfo);
}
@Override
public void setTracePointer(int tracePointer) {
rootCause.setTracePointer(tracePointer);
}
@Override
public boolean typeEqual(String type) {
return rootCause.equals(type);
}
@Override
public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) {
return rootCause.toDumpData(pageContext,maxlevel,dp);
}
/**
* @return the eventName
*/
public String getEventName() {
return eventName;
}
public String getLine(Config config) {
return ((PageExceptionImpl)rootCause).getLine(config);
}
@Override
public Throwable getRootCause() {
return rootCause.getRootCause();
}
@Override
public StackTraceElement[] getStackTrace() {
return rootCause.getStackTrace();
}
@Override
public void printStackTrace() {
rootCause.printStackTrace();
}
@Override
public void printStackTrace(PrintStream s) {
rootCause.printStackTrace(s);
}
@Override
public void printStackTrace(PrintWriter s) {
rootCause.printStackTrace(s);
}
public PageException getPageException() {
return rootCause;
}
}