001 package railo.runtime.functions.system; 002 003 import java.io.IOException; 004 import java.util.Iterator; 005 006 import railo.commons.io.IOUtil; 007 import railo.commons.io.res.Resource; 008 import railo.commons.io.res.util.ResourceUtil; 009 import railo.commons.lang.StringUtil; 010 import railo.runtime.PageContext; 011 import railo.runtime.exp.PageException; 012 import railo.runtime.op.Caster; 013 import railo.runtime.type.Array; 014 import railo.runtime.type.Struct; 015 import railo.runtime.type.util.KeyConstants; 016 017 public class CallStackDump { 018 019 public static String call(PageContext pc) throws PageException { 020 return call(pc,null); 021 } 022 023 public static String call(PageContext pc, String output) throws PageException { 024 Array arr = CallStackGet.call(pc); 025 Struct sct=null; 026 String func; 027 028 // create stack 029 StringBuilder sb=new StringBuilder(); 030 Iterator<Object> it = arr.valueIterator(); 031 while(it.hasNext()){ 032 sct=(Struct) it.next(); 033 func=(String) sct.get(KeyConstants._function); 034 sb.append(sct.get(KeyConstants._template)); 035 if(func.length()>0) { 036 sb.append(':'); 037 sb.append(func); 038 } 039 sb.append(':'); 040 sb.append(Caster.toString(sct.get(CallStackGet.LINE_NUMBER))); 041 sb.append('\n'); 042 } 043 044 // output 045 try{ 046 if(StringUtil.isEmpty(output,true) || output.trim().equalsIgnoreCase("browser")) { 047 pc.forceWrite("<pre>"); 048 pc.forceWrite(sb.toString()); 049 pc.forceWrite("</pre>"); 050 } 051 else if(output.trim().equalsIgnoreCase("console")) { 052 System.out.println(sb.toString()); 053 } 054 else { 055 Resource res = ResourceUtil.toResourceNotExisting(pc, output); 056 IOUtil.write( 057 res, 058 sb.toString()+"\n", 059 pc.getConfig().getResourceCharset(), true); 060 } 061 } 062 catch(IOException ioe){ 063 throw Caster.toPageException(ioe); 064 } 065 066 return null; 067 } 068 }