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    }