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 }