001    package railo.runtime.engine;
002    
003    import java.util.ArrayList;
004    import java.util.Collections;
005    import java.util.HashMap;
006    import java.util.Map;
007    
008    import railo.commons.io.res.Resource;
009    import railo.runtime.PageContext;
010    import railo.runtime.PageSource;
011    import railo.runtime.debug.DebugEntry;
012    import railo.runtime.debug.Debugger;
013    
014    public class DebugExecutionLog extends ExecutionLogSupport {
015            
016            private PageContext pc;
017            private ArrayList<Resource> pathes=new ArrayList<Resource>();
018            
019            private Map<String,Entry> entries=Collections.synchronizedMap(new HashMap<String,Entry>());
020            
021            
022            protected void _init(PageContext pc, Map<String, String> arguments) {
023                    this.pc=pc;
024            }
025            
026            @Override
027            protected void _log(int startPos, int endPos, long startTime, long endTime) {
028                    long diff=endTime-startTime;
029                    if(unit==UNIT_MICRO)diff/=1000;
030                    else if(unit==UNIT_MILLI)diff/=1000000;
031                    Resource res = pc.getCurrentPageSource().getResource();
032                    int index = path(res);
033                    String key=index+":"+startPos+":"+endPos;
034                    Entry entry=entries.get(key);
035                    if(entry==null) entries.put(key, new Entry(res,startPos,endPos,diff));
036                    else entry.add(diff);
037                    
038                    PageSource ps = pc.getCurrentPageSource();
039                    
040                    
041                    Debugger debugger = pc.getDebugger();
042                    DebugEntry e = debugger.getEntry(pc, ps, startPos,endPos);
043                    e.updateExeTime((int)diff);
044            }
045            
046    
047            private int path(Resource res) {
048                    int index= pathes.indexOf(res);
049                    if(index==-1){
050                            pathes.add(res);
051                            return pathes.size()-1;
052                    }
053                    return index;
054            }
055    
056            @Override
057            protected void _release() {
058                    
059            }
060    
061            
062            
063            
064            class Entry{
065    
066                    private final Resource res;
067                    private final int startPos;
068                    private final int endPos;
069                    private long time;
070                    private int count=1;
071    
072                    public Entry(Resource res, int startPos, int endPos, long time) { 
073                            this.res=res;
074                            this.startPos=startPos;
075                            this.endPos=endPos;
076                            this.time=time;
077                    }
078    
079                    public void add(long time) { 
080                            this.time+=time;
081                            this.count++;
082                    }
083                    
084                    public String toString(){
085                            return "res:"+res+";time:"+time+";count:"+count+";start-pos:"+startPos+";end-pos:"+endPos;
086                    }
087                    
088            }
089    }