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 try { 111 IOUtil.write(file, header+sb.toString()+content.toString(), null, false); 112 } catch (IOException ioe) { 113 err(pc,ioe); 114 } 115 } 116 117 private void createHeader(StringBuffer sb,String name, String value) { 118 sb.append(name); 119 sb.append(":"); 120 sb.append(StringUtil.emptyIfNull(value)); 121 sb.append("\n"); 122 } 123 124 125 126 @Override 127 protected void _log(int startPos, int endPos, long startTime, long endTime) { 128 long diff=endTime-startTime; 129 if(unit==UNIT_MICRO)diff/=1000; 130 else if(unit==UNIT_MILLI)diff/=1000000; 131 132 content.append(path(pc.getCurrentPageSource().getDisplayPath())); 133 content.append("\t"); 134 content.append(startPos); 135 content.append("\t"); 136 content.append(endPos); 137 content.append("\t"); 138 content.append(diff); 139 content.append("\n"); 140 } 141 142 143 private int path(String path) { 144 int index= pathes.indexOf(path); 145 if(index==-1){ 146 pathes.add(path); 147 return pathes.size()-1; 148 } 149 return index; 150 } 151 152 private void err(PageContext pc, String msg) { 153 SystemOut.print(pc.getConfig().getErrWriter(), msg); 154 } 155 156 private void err(PageContext pc, Throwable t) { 157 String msg =ExceptionUtil.getStacktrace(t,true); 158 SystemOut.print(pc.getConfig().getErrWriter(), msg); 159 } 160 }