package jdepend.util.analyzer.element; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import jdepend.framework.domain.notPersistent; import jdepend.model.JavaClassUnit; import jdepend.model.MetricsMgr; import jdepend.model.result.AnalysisResult; import jdepend.model.util.JDependUnitByMetricsComparator; import jdepend.util.analyzer.framework.AbstractAnalyzer; import jdepend.util.analyzer.framework.AnalyzerException; import jdepend.util.analyzer.framework.GraphItemData; public final class ClassLineCountAnalyzer extends AbstractAnalyzer { private static final long serialVersionUID = -4533305440655861869L; private transient Map<Object, Object> data; private transient Collection<JavaClassUnit> javaClasses; public ClassLineCountAnalyzer() { super("类规模分析", Attention, "类规模分析"); } @Override protected void doExecute(AnalysisResult result) throws AnalyzerException { javaClasses = result.getClasses(); this.calData(result); List<GraphItemData> items = new ArrayList<GraphItemData>(); GraphItemData item = new GraphItemData(); item.setTitle("按类行数分类比例"); item.setType(GraphItemData.PIE); item.setDatas(data); items.add(item); this.printGraphData(items); this.printList(); } private void calData(AnalysisResult result) { Map<String, Integer> data1 = new HashMap<String, Integer>(); data1.put("10000~100000", 0); data1.put("5000~10000", 0); data1.put("1000~5000", 0); data1.put("500~1000", 0); data1.put("200~500", 0); data1.put("0~200", 0); int classCount = 0; for (JavaClassUnit javaClass : javaClasses) { if (javaClass.getLineCount() != 0) { if (javaClass.getLineCount() > 10000) { data1.put("10000~100000", (Integer) data1.get("10000~100000") + 1); } else if (javaClass.getLineCount() > 5000) { data1.put("5000~10000", (Integer) data1.get("5000~10000") + 1); } else if (javaClass.getLineCount() > 1000) { data1.put("1000~5000", (Integer) data1.get("1000~5000") + 1); } else if (javaClass.getLineCount() > 500) { data1.put("500~1000", (Integer) data1.get("500~1000") + 1); } else if (javaClass.getLineCount() > 200) { data1.put("200~500", (Integer) data1.get("200~500") + 1); } else { data1.put("0~200", (Integer) data1.get("0~200") + 1); } classCount++; } } data = new HashMap<Object, Object>(); if (data1.get("10000~100000") != 0) { data.put("10000~100000", (Integer) data1.get("10000~100000") * 1F / classCount); } if (data1.get("5000~10000") != 0) { data.put("5000~10000", (Integer) data1.get("5000~10000") * 1F / classCount); } if (data1.get("1000~5000") != 0) { data.put("1000~5000", (Integer) data1.get("1000~5000") * 1F / classCount); } if (data1.get("500~1000") != 0) { data.put("500~1000", (Integer) data1.get("500~1000") * 1F / classCount); } if (data1.get("200~500") != 0) { data.put("200~500", (Integer) data1.get("200~500") * 1F / classCount); } if (data1.get("0~200") != 0) { data.put("0~200", (Integer) data1.get("0~200") * 1F / classCount); } } private void printList() { List<JavaClassUnit> jces = new ArrayList<JavaClassUnit>(this.javaClasses); Collections.sort(jces, new JDependUnitByMetricsComparator(MetricsMgr.LC, false)); for (JavaClassUnit javaClass : jces) { this.printTable("类名", javaClass.getName()); this.printTable("类行数", javaClass.getLineCount()); this.printTable("所属组件", javaClass.getComponent().getName()); } } @notPersistent public Map<Object, Object> getData() { return data; } @Override public String getExplain() { StringBuilder explain = new StringBuilder(); explain.append("从Class的代码行数可以对代码的可理解性、逻辑划分的粒度等内容有一个初步判断。<br>"); explain.append("<strong>类规模分析</strong>展现了类代码行数的区间比例。<br>"); return explain.toString(); } }