/** * * Copyright (c) 2014, the Railo Company Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * **/ package lucee.runtime.exp; import lucee.runtime.PageContext; import lucee.runtime.config.Constants; import lucee.runtime.dump.DumpData; import lucee.runtime.dump.DumpProperties; import lucee.runtime.dump.DumpTable; import lucee.runtime.op.Caster; import lucee.runtime.reflection.Reflector; import lucee.runtime.type.Collection; import lucee.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 */ protected NativeException(Throwable t) { super(t,t.getClass().getName()); this.t=t; // set stacktrace /*StackTraceElement[] st = getRootCause(t).getStackTrace(); if(hasLuceeRuntime(st))setStackTrace(st); else { StackTraceElement[] cst = Thread.currentThread().getStackTrace(); if(hasLuceeRuntime(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); }*/ } public static NativeException newInstance(Throwable t) { return newInstance(t, true); } public static NativeException newInstance(Throwable t, boolean rethrowIfNecessary) { if(rethrowIfNecessary && t instanceof ThreadDeath) // never ever catch this throw (ThreadDeath)t; return new NativeException(t); } private static Throwable getRootCause(Throwable t) { Throwable c; do{ c=t.getCause(); if(c==null || c==t) return t; t=c; }while(true); } private boolean hasLuceeRuntime(StackTraceElement[] st) { if(st!=null)for(int i=0;i<st.length;i++){ if(st[i].getClassName().indexOf("lucee.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(Constants.NAME+" ["+pageContext.getConfig().getFactory().getEngine().getInfo().getVersion()+"] - 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); } public Throwable getException() { return t; } }