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 }