001 package org.shiftone.jrat.provider.tree.ui.hierarchy; 002 003 import org.shiftone.jrat.core.MethodKey; 004 import org.shiftone.jrat.provider.tree.ui.hierarchy.nodes.ClassHierarchyNode; 005 import org.shiftone.jrat.provider.tree.ui.hierarchy.nodes.MethodHierarchyNode; 006 import org.shiftone.jrat.provider.tree.ui.hierarchy.nodes.MethodSummaryHierarchyNode; 007 import org.shiftone.jrat.provider.tree.ui.hierarchy.nodes.PackageHierarchyNode; 008 import org.shiftone.jrat.provider.tree.ui.summary.MethodSummary; 009 import org.shiftone.jrat.provider.tree.ui.summary.MethodSummaryModel; 010 011 import java.util.HashMap; 012 import java.util.Iterator; 013 import java.util.Map; 014 import java.util.Set; 015 016 public class HierarchyModelBuilder { 017 018 private final Map methodKeyNodes = new HashMap(); // method node cache <MethodKey, MethodSummaryHierarchyNode> 019 private final Map packageNodes = new HashMap(); // package node cache <String, PackageHierarchyNode> 020 021 private final PackageHierarchyNode root; 022 private final MethodSummaryModel methodSummaryModel; 023 024 public HierarchyModelBuilder(MethodSummaryModel methodSummaryModel, Set allMethodKeys) { 025 026 027 this.root = new PackageHierarchyNode("", methodSummaryModel); 028 this.methodSummaryModel = methodSummaryModel; 029 030 // getPreferences stack "performance" data into hierarchy 031 for (Iterator i = methodSummaryModel.getMethodSummaryList().iterator(); i.hasNext();) { 032 addMethodSummary((MethodSummary) i.next()); 033 } 034 035 // loop over the "all methods" set to initially populate the hierarchy 036 for (Iterator i = allMethodKeys.iterator(); i.hasNext();) { 037 addMethod((MethodKey) i.next()); 038 } 039 040 // update coverage counts 041 root.finalizeStatistics(); 042 043 } 044 045 public HierarchyTreeTableModel getModel() { 046 return new HierarchyTreeTableModel(getRoot()); 047 } 048 049 public PackageHierarchyNode getRoot() { 050 return root; 051 } 052 053 private void addMethod(MethodKey methodKey) { 054 if (!methodKeyNodes.containsKey(methodKey)) { 055 // if the method does not exist in the map yet, then we are looking at an 056 // non-covered method, and we need to add the MethodHierarchyNode. 057 getClassNode(methodKey).addMethod(new MethodHierarchyNode(methodKey, methodSummaryModel)); 058 } 059 } 060 061 062 /** 063 * Gets a method hirarchy node based on a methodKey, and creates one. 064 */ 065 private void addMethodSummary(MethodSummary methodSummary) { 066 MethodKey methodKey = methodSummary.getMethodKey(); 067 ClassHierarchyNode classNode = getClassNode(methodKey); 068 MethodHierarchyNode node = new MethodSummaryHierarchyNode(methodSummary, methodSummaryModel); 069 classNode.addMethod(node); 070 methodKeyNodes.put(methodKey, node); 071 072 } 073 074 075 private ClassHierarchyNode getClassNode(MethodKey methodKey) { 076 // todo - think about caching at this level also 077 return getPackageNode(methodKey).getChildClass(methodKey.getClassName()); 078 } 079 080 081 private PackageHierarchyNode getPackageNode(MethodKey methodKey) { 082 PackageHierarchyNode node = (PackageHierarchyNode) packageNodes.get(methodKey.getPackageName()); 083 if (node == null) { 084 node = root.getChildPackage(methodKey.getPackageNameParts()); 085 packageNodes.put(methodKey.getPackageName(), node); 086 } 087 return node; 088 } 089 090 }