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 }