001    /**
002     * Implements the Cold Fusion Function dump
003     */
004    package railo.runtime.functions.other;
005    
006    import java.io.IOException;
007    import java.util.Set;
008    
009    import railo.commons.io.IOUtil;
010    import railo.commons.io.res.Resource;
011    import railo.commons.io.res.util.ResourceUtil;
012    import railo.commons.lang.StringUtil;
013    import railo.runtime.PageContext;
014    import railo.runtime.dump.DumpData;
015    import railo.runtime.dump.DumpProperties;
016    import railo.runtime.dump.DumpTable;
017    import railo.runtime.dump.DumpUtil;
018    import railo.runtime.dump.DumpWriter;
019    import railo.runtime.dump.HTMLDumpWriter;
020    import railo.runtime.dump.SimpleDumpData;
021    import railo.runtime.exp.NativeException;
022    import railo.runtime.exp.PageException;
023    import railo.runtime.ext.function.Function;
024    import railo.runtime.type.List;
025    
026    public final class Dump implements Function {
027            
028            private static final int OUTPUT_TYPE_NONE = 0;
029            private static final int OUTPUT_TYPE_BROWSER = 1;
030            private static final int OUTPUT_TYPE_CONSOLE = 2;
031            private static final int OUTPUT_TYPE_RESOURCE = 3;
032             
033            private static final int FORMAT_TYPE_HTML = 0;
034            private static final int FORMAT_TYPE_TEXT = 1;
035    
036            public static String call(PageContext pc , Object object) throws PageException {
037                    return call(pc, object,null,true,9999,null,null,null,null,9999,true,true);
038            }
039            public static String call(PageContext pc , Object object, String label) throws PageException {
040                    return call(pc, object,label,true,9999,null,null,null,null,9999,true,true);
041            }
042            public static String call(PageContext pc , Object object, String label,boolean expand) throws PageException {
043                    return call(pc, object,label,expand,9999,null,null,null,null,9999,true,true);
044            }
045    
046            public static String call(PageContext pc , Object object, String label,boolean expand,double maxLevel) throws PageException {
047                    return call(pc, object,label,expand,maxLevel,null,null,null,null,9999,true,true);
048            }
049    
050            public static String call(PageContext pc , Object object, String label,boolean expand,double maxLevel, String show) throws PageException {
051                    return call(pc, object,label,expand,maxLevel,show,null,null,null,9999,true,true);
052            }
053            
054            public static String call(PageContext pc , Object object, String label,boolean expand,double maxLevel, String show, String hide) throws PageException {
055                    return call(pc, object,label,expand,maxLevel,show,hide,null,null,9999,true,true);
056            }
057            
058            public static String call(PageContext pc , Object object, String label,boolean expand,double maxLevel, String show, String hide,String output) throws PageException {
059                    return call(pc , object, label,expand,maxLevel, show, hide,output,null,9999,true,true);
060            }
061            
062            public static String call(PageContext pc , Object object, String label,boolean expand,double maxLevel, String show, String hide,String output,String format) throws PageException {
063                    return call(pc , object, label,expand,maxLevel, show, hide,output,format,9999,true,true);
064            }
065    
066            public static String call(PageContext pc , Object object, String label,boolean expand,double maxLevel, String show, String hide,String output,String format,double keys) throws PageException {
067                    return call(pc , object, label,expand,maxLevel, show, hide,output,format,keys,true,true);
068            }
069            public static String call(PageContext pc , Object object, String label,boolean expand,double maxLevel, String show, String hide,String output,String format,double keys,boolean metainfo) throws PageException {
070                    return call(pc , object, label,expand,maxLevel, show, hide,output,format,keys,metainfo,true);   
071            }
072                    
073            public static String call(PageContext pc , Object object, String label,boolean expand,double maxLevel, String show, String hide,String output,String format,double keys,boolean metainfo, boolean showUDFs) throws PageException {
074                    if(show!=null && "all".equalsIgnoreCase(show.trim()))show=null;
075                    if(hide!=null && "all".equalsIgnoreCase(hide.trim()))hide=null;
076                    
077                    
078                    String context = getContext();
079                    //PageContext pcc = pc; 
080                    try { 
081                            
082                            // output
083                            int defType=HTMLDumpWriter.DEFAULT_RICH;
084                            int outputType=OUTPUT_TYPE_NONE;
085                            Resource outputRes=null;
086                            if(!StringUtil.isEmpty(output,true)){
087                                    output=output.trim();
088                                    if("browser".equalsIgnoreCase(output)){
089                                            outputType=OUTPUT_TYPE_BROWSER;
090                                            defType=HTMLDumpWriter.DEFAULT_RICH;
091                                    }
092                                    else if("console".equalsIgnoreCase(output)){
093                                            outputType=OUTPUT_TYPE_CONSOLE;
094                                            defType=HTMLDumpWriter.DEFAULT_PLAIN;
095                                    }
096                                    else {
097                                            outputType=OUTPUT_TYPE_RESOURCE;
098                                            defType=HTMLDumpWriter.DEFAULT_RICH;
099                                            outputRes=ResourceUtil.toResourceNotExisting(pc, output);
100                                    }
101                            }
102                            
103                            // format
104                            DumpWriter writer=pc.getConfig().getDumpWriter(format,defType);
105                            
106                            Set setShow=(show!=null)?List.listToSet(show.toLowerCase(),",",true):null;
107                            Set setHide=(hide!=null)?List.listToSet(hide.toLowerCase(),",",true):null;
108                            
109                            DumpProperties properties=new DumpProperties((int)maxLevel,setShow,setHide,(int)keys,metainfo,showUDFs);
110                            DumpData dd = DumpUtil.toDumpData(object, pc,(int)maxLevel,properties);
111                            
112                            if(!StringUtil.isEmpty(label)) {
113                                    DumpTable table=new DumpTable("#ffffff","#cccccc","#000000");
114                                    table.appendRow(1,new SimpleDumpData(label));
115                                    //table.appendRow(1,new SimpleDumpData(getContext()));
116                                    table.appendRow(0,dd);
117                                    dd=table;
118                            }
119                            
120                            boolean isText="text".equalsIgnoreCase(format);//formatType==FORMAT_TYPE_TEXT
121                            if(OUTPUT_TYPE_BROWSER==outputType || outputType==OUTPUT_TYPE_NONE) {
122                                    if(isText) pc.forceWrite("<pre>");
123                                    pc.forceWrite(writer.toString(pc,dd,expand));
124                                    if(isText) pc.forceWrite("</pre>");
125                            }
126                            else if(OUTPUT_TYPE_CONSOLE==outputType)
127                                    System.out.println(writer.toString(pc,dd,expand));
128                            else if(OUTPUT_TYPE_RESOURCE==outputType)
129                                    IOUtil.write(
130                                                    outputRes, 
131                                                    writer.toString(pc,dd,expand)+
132                                                    "\n************************************************************************************\n", 
133                                                    pc.getConfig().getResourceCharset(), true);
134                            
135                    } 
136                    catch (IOException e) {
137                            throw new NativeException(e);
138                    }
139                    
140                    return "";
141            }
142            public static String getContext() {
143                    //Throwable cause = t.getCause();
144                    StackTraceElement[] traces = new Exception("Stack trace").getStackTrace();
145                    
146                    int line=0;
147                    String template;
148                    StackTraceElement trace=null;
149                    for(int i=0;i<traces.length;i++) {
150                            trace=traces[i];
151                            template=trace.getFileName();
152                            if((line=trace.getLineNumber())<=0 || template==null || ResourceUtil.getExtension(template,"").equals("java")) continue;
153                            return template+":"+line;
154                    }
155                    return null;
156            }
157    }