001 package railo.runtime.engine; 002 003 import java.io.IOException; 004 import java.util.ArrayList; 005 import java.util.Iterator; 006 import java.util.Map; 007 008 import javax.servlet.http.HttpServletRequest; 009 010 import railo.commons.io.IOUtil; 011 import railo.commons.io.res.Resource; 012 import railo.commons.io.res.util.ResourceUtil; 013 import railo.commons.lang.ExceptionUtil; 014 import railo.commons.lang.StringUtil; 015 import railo.commons.lang.SystemOut; 016 import railo.runtime.PageContext; 017 import railo.runtime.functions.other.CreateUUID; 018 import railo.runtime.op.Caster; 019 020 public class ResourceExecutionLog extends ExecutionLogSupport { 021 022 private static int count=1; 023 private Resource file; 024 private StringBuffer content; 025 private PageContext pc; 026 private StringBuffer header; 027 private ArrayList<String> pathes=new ArrayList<String>(); 028 private long start; 029 private Resource dir; 030 031 032 protected void _init(PageContext pc, Map<String, String> arguments) { 033 this.pc=pc; 034 035 //header 036 HttpServletRequest req = pc.getHttpServletRequest(); 037 038 header=new StringBuffer(); 039 createHeader(header,"context-path",req.getContextPath()); 040 createHeader(header,"remote-user",req.getRemoteUser()); 041 createHeader(header,"remote-addr",req.getRemoteAddr()); 042 createHeader(header,"remote-host",req.getRemoteHost()); 043 createHeader(header,"script-name",StringUtil.emptyIfNull(req.getContextPath())+StringUtil.emptyIfNull(req.getServletPath())); 044 createHeader(header,"server-name",req.getServerName()); 045 createHeader(header,"protocol",req.getProtocol()); 046 createHeader(header,"server-port",Caster.toString(req.getServerPort())); 047 createHeader(header,"path-info",StringUtil.replace( 048 StringUtil.emptyIfNull(req.getRequestURI()), 049 StringUtil.emptyIfNull(req.getServletPath()),"", true)); 050 //createHeader(header,"path-translated",pc.getBasePageSource().getDisplayPath()); 051 createHeader(header,"query-string",req.getQueryString()); 052 createHeader(header,"unit",unitShortToString(unit)); 053 createHeader(header,"min-time-nano",min+""); 054 055 content=new StringBuffer(); 056 057 058 // directory 059 String strDirectory=arguments.get("directory"); 060 if(dir==null) { 061 if(StringUtil.isEmpty(strDirectory)) { 062 dir=getTemp(pc); 063 } 064 else { 065 try { 066 dir = ResourceUtil.toResourceNotExisting(pc, strDirectory,false); 067 if(!dir.exists()){ 068 dir.createDirectory(true); 069 } 070 else if(dir.isFile()){ 071 err(pc,"can not create directory ["+dir+"], there is already a file with same name."); 072 } 073 } 074 catch (Throwable t) { 075 err(pc,t); 076 dir=getTemp(pc); 077 } 078 } 079 } 080 file=dir.getRealResource((pc.getId())+"-"+CreateUUID.call(pc)+".exl"); 081 file.createNewFile(); 082 start=System.currentTimeMillis(); 083 } 084 085 private static Resource getTemp(PageContext pc) { 086 Resource tmp = pc.getConfig().getConfigDir(); 087 Resource dir = tmp.getRealResource("execution-log"); 088 if(!dir.exists())dir.mkdirs(); 089 return dir; 090 } 091 092 protected void _release() { 093 094 // execution time 095 createHeader(header, "execution-time", Caster.toString(System.currentTimeMillis()-start)); 096 header.append("\n"); 097 098 099 //path 100 StringBuffer sb=new StringBuffer(); 101 Iterator<String> it = pathes.iterator(); 102 int count=0; 103 while(it.hasNext()){ 104 sb.append(count++); 105 sb.append(":"); 106 sb.append(it.next()); 107 sb.append("\n"); 108 } 109 sb.append("\n"); 110 111 try { 112 IOUtil.write(file, header+sb.toString()+content.toString(), null, false); 113 } catch (IOException ioe) { 114 err(pc,ioe); 115 } 116 } 117 118 private void createHeader(StringBuffer sb,String name, String value) { 119 sb.append(name); 120 sb.append(":"); 121 sb.append(StringUtil.emptyIfNull(value)); 122 sb.append("\n"); 123 } 124 125 126 127 @Override 128 protected void _log(int startLine, int endLine, long startTime, long endTime) { 129 long diff=endTime-startTime; 130 if(unit==UNIT_MICRO)diff/=1000; 131 else if(unit==UNIT_MILLI)diff/=1000000; 132 133 content.append(path(pc.getCurrentPageSource().getDisplayPath())); 134 content.append("\t"); 135 content.append(startLine); 136 content.append("\t"); 137 content.append(endLine); 138 content.append("\t"); 139 content.append(diff); 140 content.append("\n"); 141 } 142 143 144 private int path(String path) { 145 int index= pathes.indexOf(path); 146 if(index==-1){ 147 pathes.add(path); 148 return pathes.size()-1; 149 } 150 return index; 151 } 152 153 private void err(PageContext pc, String msg) { 154 SystemOut.print(pc.getConfig().getErrWriter(), msg); 155 } 156 157 private void err(PageContext pc, Throwable t) { 158 String msg =ExceptionUtil.getStacktrace(t,true); 159 SystemOut.print(pc.getConfig().getErrWriter(), msg); 160 } 161 }