package railo.runtime.exp;
import railo.runtime.Info;
import railo.runtime.PageContext;
import railo.runtime.dump.DumpData;
import railo.runtime.dump.DumpProperties;
import railo.runtime.dump.DumpTable;
import railo.runtime.op.Caster;
import railo.runtime.reflection.Reflector;
import railo.runtime.type.Collection;
import railo.runtime.type.util.KeyConstants;
/**
* Box a Native Exception, Native = !PageException
*/
public class NativeException extends PageExceptionImpl {
private static final long serialVersionUID = 6221156691846424801L;
private Throwable t;
/**
* Standart constructor for native Exception class
* @param t Throwable
*/
public NativeException(Throwable t) {
super(t,t.getClass().getName());
this.t=t;
StackTraceElement[] st = t.getStackTrace();
if(hasRailoRuntime(st))setStackTrace(st);
else {
StackTraceElement[] cst = new Exception("Stack trace").getStackTrace();
if(hasRailoRuntime(cst)){
StackTraceElement[] mst=new StackTraceElement[st.length+cst.length-1];
System.arraycopy(st, 0, mst, 0, st.length);
System.arraycopy(cst, 1, mst, st.length, cst.length-1);
setStackTrace(mst);
}
else setStackTrace(st);
}
setAdditional(KeyConstants._Cause, t.getClass().getName());
}
private boolean hasRailoRuntime(StackTraceElement[] st) {
if(st!=null)for(int i=0;i<st.length;i++){
if(st[i].getClassName().indexOf("railo.runtime")!=-1) return true;
}
return false;
}
@Override
public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) {
DumpData data = super.toDumpData(pageContext, maxlevel,dp);
if(data instanceof DumpTable)
((DumpTable)data).setTitle("Railo ["+Info.getVersionAsString()+"] - Error ("+Caster.toClassName(t)+")");
return data;
}
@Override
public boolean typeEqual(String type) {
if(super.typeEqual(type))return true;
return Reflector.isInstaneOfIgnoreCase(t.getClass(),type);
}
@Override
public void setAdditional(Collection.Key key, Object value) {
super.setAdditional(key, value);
}
}