changeset 1990:1ee23f6c4b50

Streamline Treemap Building PR3059 Reviewed-by: jkang Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2016-June/019844.html Original-thread: http://icedtea.classpath.org/pipermail/thermostat/2015-December/017089.html
author James Aziz <jaziz@redhat.com>
date Wed, 29 Jun 2016 12:23:12 -0400
parents 10e0b0fe84ef
children ec503206ccf5
files client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/NodeDataExtractor.java client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/TreeMap.java client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapTest.java vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/ObjectHistogramNodeDataExtractor.java
diffstat 4 files changed, 29 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/NodeDataExtractor.java	Wed Jun 29 12:23:11 2016 -0400
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/NodeDataExtractor.java	Wed Jun 29 12:23:12 2016 -0400
@@ -48,10 +48,23 @@
  */
 public interface NodeDataExtractor<S, T> {
 
-    String getNodeSeparator();
+    /**
+     * This method extracts and returns the nodes from the key of the {@link T} element parameter.
+     *
+     * @param element a unit, holding some weight and labelled by some key (e.g. a pathname) that
+     *           expresses a delimited set of (hierarchical) nodes
+     * @return a String array, with an individual node at each index
+     */
+    String[] getNodes(T element);
 
-    String getKey(T element);
+    /**
+     * This method returns the weight of the {@link T} element parameter.
+     */
     double getWeight(T element);
 
+    /**
+     * This method extracts and returns the set of {@link T} elements which are aggregated in the
+     * {@link S} data parameter.
+     */
     Collection<T> getAsCollection(S data);
 }
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/TreeMap.java	Wed Jun 29 12:23:11 2016 -0400
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/experimental/TreeMap.java	Wed Jun 29 12:23:12 2016 -0400
@@ -37,7 +37,6 @@
 package com.redhat.thermostat.client.swing.components.experimental;
 
 import java.util.List;
-import java.util.regex.Pattern;
 
 /**
  * This class represents a treemap and facilitates its construction from information available in
@@ -64,32 +63,22 @@
         return root;
     }
 
-    private static <S, T> void buildTree(S data, TreeMapNode root, NodeDataExtractor<S, T> extractor) {
+    private static <S, T> void buildTree(S data, TreeMapNode root,
+                                         NodeDataExtractor<S, T> extractor) {
 
-        for(T element: extractor.getAsCollection(data)) {
-            String key = extractor.getKey(element);
-            String splitToken = extractor.getNodeSeparator();
-            double weight = extractor.getWeight(element);
-
+        for (T element: extractor.getAsCollection(data)) {
             TreeMapNode lastProcessed = root;
-            while (!key.equals("")) {
-
-                String nodeId = key.split(Pattern.quote(splitToken))[0];
+            for (String node : extractor.getNodes(element)) {
+                TreeMapNode child = searchNode(lastProcessed, node);
 
-                TreeMapNode child = searchNode(lastProcessed, nodeId);
                 if (child == null) {
-                    child = new TreeMapNode(nodeId, 0);
+                    child = new TreeMapNode(node, 0);
                     lastProcessed.addChild(child);
                 }
 
                 lastProcessed = child;
-
-                key = key.substring(nodeId.length());
-                if (key.startsWith(splitToken)) {
-                    key = key.substring(1);
-                }
             }
-            lastProcessed.setRealWeight(weight);
+            lastProcessed.setRealWeight(extractor.getWeight(element));
         }
     }
     
--- a/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapTest.java	Wed Jun 29 12:23:11 2016 -0400
+++ b/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/experimental/TreeMapTest.java	Wed Jun 29 12:23:12 2016 -0400
@@ -42,6 +42,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.regex.Pattern;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -54,6 +55,7 @@
     final private double SOME_ROOT_WEIGHT = 25.0;
     final private double DELTA = 0.01;
     final private double SOME_WEIGHT = 3.14;
+    final private String NODE_SEPARATOR = ".";
 
     private ArrayList<Pair<String, Double>> data;
     private TreeMapNode root;
@@ -108,13 +110,8 @@
                 new NodeDataExtractor<ArrayList<Pair<String, Double>>, Pair<String, Double>>() {
 
                     @Override
-                    public String getNodeSeparator() {
-                        return ".";
-                    }
-
-                    @Override
-                    public String getKey(Pair<String, Double> element) {
-                        return element.getFirst();
+                    public String[] getNodes(Pair<String, Double> element) {
+                        return element.getFirst().split(Pattern.quote(NODE_SEPARATOR));
                     }
 
                     @Override
--- a/vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/ObjectHistogramNodeDataExtractor.java	Wed Jun 29 12:23:11 2016 -0400
+++ b/vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/ObjectHistogramNodeDataExtractor.java	Wed Jun 29 12:23:12 2016 -0400
@@ -37,6 +37,7 @@
 package com.redhat.thermostat.vm.heap.analysis.client.swing.internal;
 
 import java.util.Collection;
+import java.util.regex.Pattern;
 
 import com.redhat.thermostat.client.swing.components.experimental.NodeDataExtractor;
 import com.redhat.thermostat.common.utils.DescriptorConverter;
@@ -46,15 +47,10 @@
 public class ObjectHistogramNodeDataExtractor implements NodeDataExtractor<ObjectHistogram, HistogramRecord> {
 
     @Override
-    public String getNodeSeparator() {
-        return ".";
-    }
-
-    @Override
-    public String getKey(HistogramRecord record) {
+    public String[] getNodes(HistogramRecord record) {
         String className = record.getClassname();
         // if className is a primitive type it is converted with its full name
-        return DescriptorConverter.toJavaType(className);
+        return DescriptorConverter.toJavaType(className).split(Pattern.quote("."));
     }
 
     @Override