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    }