package railo.intergral.fusiondebug.server; import java.util.ArrayList; import java.util.List; import railo.commons.io.res.Resource; import railo.commons.io.res.util.ResourceUtil; import railo.runtime.CFMLFactoryImpl; import railo.runtime.PageContext; import railo.runtime.PageContextImpl; import railo.runtime.PageSource; import railo.transformer.bytecode.util.ASMUtil; import com.intergral.fusiondebug.server.IFDController; import com.intergral.fusiondebug.server.IFDStackFrame; import com.intergral.fusiondebug.server.IFDThread; public class FDThreadImpl implements IFDThread { private PageContextImpl pc; private String name; private FDControllerImpl engine; //private CFMLFactoryImpl factory; public FDThreadImpl(FDControllerImpl engine,CFMLFactoryImpl factory, String name, PageContextImpl pc) { this.engine=engine; //this.factory=factory; this.name=name; this.pc=pc; } @Override public String getName() { return name+":"+pc.getCFID(); } @Override public int id() { return pc.getId(); } public static int id(PageContext pc) { return pc.getId(); } @Override public void stop() { pc.getThread().stop(); } @Override public Thread getThread() { return pc.getThread(); } @Override public String getOutputBuffer() { return pc.getRootOut().toString(); } public List getStackFrames() { return getStack(); } public List getStack() { List stack = pc.getPageSourceList(); StackTraceElement[] traces = pc.getThread().getStackTrace(); String template=""; StackTraceElement trace=null; ArrayList list=new ArrayList(); Resource res; PageSource ps; int index=stack.size(); for(int i=traces.length-1;i>=0;i--) { trace=traces[i]; ps=null; if(trace.getLineNumber()<=0) continue; template=trace.getFileName(); if(template==null || ResourceUtil.getExtension(template,"").equals("java")) continue; if(index>0)ps=(PageSource) stack.get(--index); // inside the if is the old way, that only work when the cfm is inside the mapping, but i'm not shure woth the new way if(ps==null || !(ps.getFullClassName().equals(trace.getClassName()) && ps.getDisplayPath().equals(template))){ res = ResourceUtil.toResourceNotExisting(pc, template); ps = pc.toPageSource(res, null); } FDStackFrameImpl frame = new FDStackFrameImpl(this,pc,trace,ps); if(ASMUtil.isOverfowMethod(trace.getMethodName())) list.set(0,frame); else list.add(0,frame); } return list; } public IFDStackFrame getTopStack(){ return getTopStackFrame(); } @Override public IFDStackFrame getTopStackFrame(){ PageSource ps = pc.getCurrentPageSource(); StackTraceElement[] traces = pc.getThread().getStackTrace(); String template=""; StackTraceElement trace=null; Resource res; for(int i=0;i<traces.length;i++) { trace=traces[i]; if(trace.getLineNumber()<=0) continue; template=trace.getFileName(); if(template==null || ResourceUtil.getExtension(template,"").equals("java")) continue; if(ps==null || !(ps.getFullClassName().equals(trace.getClassName()) && ps.getResource().getAbsolutePath().equals(template))){ res = ResourceUtil.toResourceNotExisting(pc, template); ps = pc.toPageSource(res, null); } break; } return new FDStackFrameImpl(this,pc,trace,ps); } /** * @return the engine */ public IFDController getController() { return engine; } }