getOptimizationResult.jsp 11.3 KB
<%@ page language="java" contentType="text/html; charset=GBK" %>
<%@ include file="/systeminfo/init_wev8.jsp" %>
<%@ taglib uri="/WEB-INF/weaver.tld" prefix="wea"%>
<%@ page import="java.lang.management.ManagementFactory" %>
<%@ page import="java.lang.management.ThreadInfo" %>
<%@ page import="java.lang.management.ThreadMXBean" %>
<%@ page import="weaver.general.TimeUtil" %>
<%@ page import="java.util.Properties" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="weaver.general.GCONST" %>
<%@ page import="java.text.DecimalFormat" %>
<%@ page import="java.util.Random" %>
<script src="../profiler/js/jquery-1.4.2.min_wev8.js"></script>
<script type="text/javascript">
var idlist = new Array();
var index = 0;
var displayMap = {};
function closeThisDiv(id){
	closeDiv(id,displayMap[id]);
	if(displayMap[id]){
		displayMap[id]= false;
	}else{
		displayMap[id] = true;
	}
}
function closeDiv(id,none){
	var find = false;
	for (var thisid in idlist){
		
		if(idlist[thisid].indexOf(id+",")!=-1){
			find = true;
		}
	}
	if(!find) return;
	for (var thisid in idlist){
		if(idlist[thisid].indexOf(id+",")!=-1){
			var dd = document.getElementById(idlist[thisid].split(",")[1]);
			if(none){
				dd.style.display='none';
				closeDiv(idlist[thisid].split(",")[1],none);
			}else{
				dd.style.display='';
			}
		}
	}
}
window.onload = function(){
	var $divlist = $("div[id]");
	var divindex = 0;
	var rootDiv = new Array();
	$divlist.each(function(){
		var rootid = $(this).attr('parentid');
		if(rootid.indexOf("ROOT")!=-1){
			rootDiv[divindex++] = $(this).attr('id');
			var dd = document.getElementById($(this).attr('id'));
			dd.style.display='';
			displayMap[$(this).attr('id')]=true;
		}
	});
	$divlist.each(function(){
		var parentid = $(this).attr('parentid')+"";
		var thisid = $(this).attr('id')+"";
		idlist[index++] = parentid+","+thisid;
		var find = false;
		for(var i=0;i<rootDiv.length;++i){
			if(parentid==rootDiv[i]){
				find = true;
				break;
			}
		}
		if(find){
			var dd = document.getElementById(thisid);
			dd.style.display='';
		}else{
		}
	});
}
</script>
<%
String key = request.getParameter("key");
String result = "";
boolean hasValue = false;
try{
	if(key!=null&&!key.equals("")){
		key = key.toLowerCase();
		File file = new File(GCONST.getRootPath()+"/profiler/threadlog");
		String[] tempList = file.list();
		File temp = null;
		List<String> findThreads = new ArrayList<String>();
		if(tempList.length>0){
			String fileName = GCONST.getRootPath()+"/profiler/threadlog";
			temp = new File(fileName);
			findThreads = getContainKeyThreadId(temp,key);
		}
		if(findThreads.size()==0){
			result = "没有找到包含关键字的线程,请确认关键字是否正确";
		}else{
			hasValue = true;
			result = getResult(findThreads,key);
		}
	}else{
		result = "没有找到包含关键字的线程,请确认关键字是否正确";
	}
}catch (Exception ew){
  System.out.println("关闭文件流出错!");
  System.out.println(ew);
}
%>
<%!
private boolean lineInFindDetails(List<String> findThreads,String line){
	for(String threadId:findThreads){
		String threadIdStr = threadId.split("\\|\\|")[0];
		String threadDetail = threadId;
		if(line.indexOf(threadIdStr)!=-1&&threadDetail.indexOf(line.split("\\|\\|")[2])!=-1
			&&!(line.trim().indexOf("weaver")==-1&&line.trim().indexOf("__jsp")==-1||(line.trim().indexOf("weaver.conn")!=-1))
			){
			return true;
		}
	}
	return false;
}
%>
<%!
private boolean lineInFindThreads(List<String> findThreads,String line){
	for(String threadId:findThreads){
		String threadIdStr = threadId.split("\\|\\|")[0];
		String threadDetail = threadId;
		if(line.indexOf(threadIdStr)!=-1
			&&!(line.trim().indexOf("weaver")==-1&&line.trim().indexOf("__jsp")==-1||(line.trim().indexOf("weaver.conn")!=-1))
			){
			return true;
		}
	}
	return false;
}
%>

<%!
private String getResult(List<String> findThreads,String find) throws IOException{

	StringBuffer result = new StringBuffer();

	int len = 200;
    String[] buffer = new String[len];
    int index = 0;

	HashMap<String, Integer> countMap = new LinkedHashMap<String, Integer>();
	countMap.put("0",0);
	HashMap<String,String> childrenToParent = new HashMap<String,String>();
	HashMap<String,String> parentToChildren = new HashMap<String,String>();
	ArrayList<String> lineList = new ArrayList<String>();
	int lineIndex = 0;
	lineList.add(lineIndex,"ROOT");

	File root = new File(GCONST.getRootPath()+"/profiler/threadlog");

	File[] files = root.listFiles();
	int count = 0;
	int countFile = 0;
	for (int i = 0; i < files.length; i++)
    {
		File f = files[i];
		BufferedReader bfr = new BufferedReader(new FileReader(f));
	    String line = null;
		while ((line = bfr.readLine()) != null)
		{
			buffer[index] = line.toLowerCase();
			line = line.toLowerCase();
			if (line.indexOf(find) != -1&&(lineInFindDetails(findThreads,line)))
			{
			  String threadId = line.split("\\|\\|")[0];
			  String parent = null;
			  String key = "";
			  boolean recordFist = true;
		      for (int j = index; j >=0; j--){
					String current = buffer[j];
					if(current.indexOf(threadId)==-1)break;
					boolean linein = lineInFindThreads(findThreads,current);
					if(linein || recordFist){
						current = current.split("\\|\\|")[2];
						//22:12此处必须有父子结构关系 否则输出的时候 无法进行判断 此处
						if(j==index){
							count++;
						}
						Integer thisLineIndex = lineList.indexOf(current);
						if(thisLineIndex==-1){
							thisLineIndex = ++lineIndex;
							lineList.add(thisLineIndex,current);
						}
						if(parent==null){
							key = thisLineIndex+"<0";
							if(countMap.get(key)==null){
								countMap.put(key,1);
							}else{
								countMap.put(key,countMap.get(key)+1);
							}
							countMap.put("0",countMap.get("0")+1);
						}else{
							key = thisLineIndex+"<"+key;
							if(countMap.get(key)==null){
								countMap.put(key,1);
							}else{
								countMap.put(key,countMap.get(key)+1);
							}
						}
						parent = current;
						if(!linein)recordFist = false;
						if(linein)recordFist = true;
					}
			  }
			  index = 0;
			}
			else
			{
			  index++;
			  if (index == len) {
				for(int j=0;j<100;j++){
					buffer[j]=buffer[j+100];
				}
				index = 100;
			  }
			}
		}
		bfr.close();
	}
	if(countMap.size()==0||lineList.size()==1)
		return "没有找到包含关键字的线程,请确认关键字是否正确";
	StringBuffer returnBuffer = new StringBuffer();

	HashMap<String,String> perMap = new HashMap<String,String>();

	for (Map.Entry<String,Integer> entry:countMap.entrySet()) {
		if(entry.getKey().equals("0")){
			continue;
		}
		List<String> parentChildrens = new ArrayList<String>();
		String parentKey = entry.getKey().replace(entry.getKey().split("<")[0],"");
		int parentCount = 0;
		for (Map.Entry<String,Integer> children:countMap.entrySet()) {
			String currentKey = children.getKey();
			if(currentKey.equals(currentKey.split("<")[0]+parentKey)){
				parentChildrens.add(children.getKey());
				parentCount+=children.getValue();
			}
		}
		double currentChildrenPer = 1 * 100.0D / parentChildrens.size();
		double currentPer = entry.getValue()*100.0D / parentCount;
		double currentRootPer = entry.getValue()*100.0D / countMap.get("0");

		perMap.put(entry.getKey(),currentChildrenPer+"||"+currentPer+"||"+currentRootPer);
	}
	String currentKey = null;
	for (Map.Entry<String,Integer> entry:countMap.entrySet()) {
		if(currentKey==null)
			currentKey = entry.getKey();
	}

	final HashMap<String,String> cperMap = perMap;
	Comparator c = new Comparator<String>() {  
            @Override  
            public int compare(String o1, String o2) { 
				Double per1 = Double.valueOf(cperMap.get(o1).split("\\|\\|")[1]);
				Double per2 = Double.valueOf(cperMap.get(o2).split("\\|\\|")[1]);;
                if(per1<per2)  
                    return 1;
                else return -1;  
            }  
        }; 
	return getTreeInfo(currentKey,perMap,countMap,lineList,0,"ROOT",c);
}
%>
<%!
//不匹配节点占比 直接返回true 后面可调整
private boolean canFix(String key,HashMap<String,String> perMap){
	String str = perMap.get(key);
	if(str==null) return false;
	else{
		String currentChildrenPer = str.split("\\|\\|")[0];
		String currentPer = str.split("\\|\\|")[1];
		if(Double.valueOf(currentChildrenPer)<=Double.valueOf(currentPer))
			return true;
		else
			return false;
	}
}
%>
<%!
private String getTreeInfo(String key,HashMap<String,String> perMap,HashMap<String, Integer> countMap,ArrayList<String> lineList,int tab,String parentId,Comparator c){
	List<String> childrens = new ArrayList<String>();
	String returnKey = null;
	Random rd = new Random();
    String id = parentId.equals("ROOT")?"ROOT":(rd.nextInt()+"");
	if(!key.equals("0")){
		returnKey = lineList.get(Integer.valueOf(key.split("<")[0]));
	}
	for (Map.Entry<String,Integer> children:countMap.entrySet()) {
		if(children.getKey().equals(children.getKey().split("<")[0]+"<"+key)
			&&canFix(children.getKey(),perMap)){
			childrens.add(children.getKey());
		}
	}
	if(childrens.size()==0){
		return returnKey+"||"+perMap.get(key)+"||"+tab+"||"+parentId+","+"id_"+id;
	}else{
		String str = "";
		if(childrens.size()==1){
			if(!key.equals("0")){
				return returnKey+"||"+perMap.get(key)+"||"+tab+"||"+parentId+","+"id_"+id+"!"+getTreeInfo(childrens.get(0),perMap,countMap,lineList,tab+1,"id_"+id,c);
			}else{
				return getTreeInfo(childrens.get(0),perMap,countMap,lineList,1,"id_"+id,c);
			}
		}else{
			Collections.sort(childrens,c); 
			for(int i=0;i<childrens.size();++i){
				str = str+getTreeInfo(childrens.get(i),perMap,countMap,lineList,tab+1,"id_"+id,c)+"!";
			}
			if(!key.equals("0")){
				return returnKey+"||"+perMap.get(key)+"||"+tab+"||"+parentId+","+"id_"+id+"!"+str;
			}else{
				return str;
			}
		}
	}
}
%>
<%!
private ArrayList<String> getContainKeyThreadId(File firstFile,String find) throws IOException{

	ArrayList<String> list = new ArrayList<String>();

	HashMap<String,String> map = new HashMap<String,String>();

	File[] files = firstFile.listFiles();

	int count = 0;
	for (int i = 0; i < files.length; i++)
    {
		File f = files[i];
		BufferedReader bfr = new BufferedReader(new FileReader(f));
	    String line = null;
		while ((line = bfr.readLine()) != null)
		{
		   line = line.toLowerCase();
			
		   if (line.indexOf(find) != -1) {
			 map.put(line.split("\\|\\|")[0],line);
           }
		}
		bfr.close();
		for(Map.Entry<String,String> entry:map.entrySet()){
			if(!list.contains(entry.getValue())){
				list.add(entry.getValue());
			}
		}
		map = new HashMap<String,String>();
	}
	return list;
}
%>
<%
	DecimalFormat df = new DecimalFormat("#0.00");
	if(result.indexOf("!")!=-1){
		String[] strs = result.split("\\!");
		for(String str:strs){
			String[] strP = str.split("\\|\\|");
			if(strP.length<6)continue;
			int tabCount = 0;
			if(!strP[4].equals("")){
				tabCount = Integer.valueOf(strP[4])-1;
			}else{
				continue;
			}
			%>
			<div style='display:none' parentid="<%=strP[5].split(",")[0]%>"  id="<%=strP[5].split(",")[1]%>" onclick="closeThisDiv('<%=strP[5].split(",")[1]%>')">
				<a style='white-space:nowrap;padding-left:<%=tabCount*25%>px'></a>
			<%	
			 %>
			<a><a style='white-space:nowrap;padding-left:10px'><%="[占比 :"+df.format(Double.valueOf(strP[3]))+"%]"%></a><%=strP[0]%></a>
			<br/>
			</div>
			<%
		}
	}else{
		if(hasValue){
		%>
		<a style='white-space:nowrap;padding-left:10px'><%="[占比 :100%]"%></a><a><%=result.split("\\|\\|")[0]%></a>
		<br/>
		<%
		}else{
		%>
		<a><%=result%></a>
		<br/>
		<%
		}
	}
%>