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    }