package org.sef4j.callstack.stattree;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import org.sef4j.callstack.stats.BasicTimeStatsLogHistogram;
import org.sef4j.callstack.stats.PendingPerfCount;
import org.sef4j.callstack.stats.PerfStats;
import org.sef4j.callstack.stattree.printers.value.BasicTimeStatsLogHistogramFieldValuePrinter;
import org.sef4j.callstack.stattree.printers.value.PendingPerfCountFieldValuePrinter;
import org.sef4j.callstack.stattree.printers.value.PerfStatsFieldValuePrinter;
import org.sef4j.core.helpers.proptree.model.PropTreeNode;
import org.sef4j.core.helpers.proptree.printers.PropTreeValuePrinter;
import org.sef4j.core.helpers.proptree.printers.PropTreeValueWrapperPrinter;
public class CallTreeNodeTstBuilder {
public static PropTreeNode buildTree(List<String> paths, Map<String,Callable<?>> propFactories) {
PropTreeNode root = PropTreeNode.newRoot();
if (paths == null) {
paths = defaultPaths();
}
if (propFactories == null) {
propFactories = defaultPropFactories();
}
fillTree(root, paths, propFactories);
return root;
}
public static Map<String, Callable<?>> defaultPropFactories() {
Map<String, Callable<?>> propFactories;
propFactories = new HashMap<String,Callable<?>>();
propFactories.put("histo1", BasicTimeStatsLogHistogram.FACTORY);
propFactories.put("pending1", PendingPerfCount.FACTORY);
propFactories.put("perfStat1", PerfStats.FACTORY);
return propFactories;
}
public static Map<Class<?>, PropTreeValuePrinter<?>> defaultPerTypePrinters(boolean prefixPropName, String prefixSep, String postfixSep) {
Map<Class<?>, PropTreeValuePrinter<?>> res = new HashMap<Class<?>, PropTreeValuePrinter<?>>();
res.put(BasicTimeStatsLogHistogram.class, new PropTreeValueWrapperPrinter<BasicTimeStatsLogHistogram>(
BasicTimeStatsLogHistogramFieldValuePrinter.INSTANCE, prefixPropName, prefixSep, postfixSep));
res.put(PendingPerfCount.class, new PropTreeValueWrapperPrinter<PendingPerfCount>(
PendingPerfCountFieldValuePrinter.INSTANCE, prefixPropName, prefixSep, postfixSep));
res.put(PerfStats.class, new PropTreeValueWrapperPrinter<PerfStats>(
PerfStatsFieldValuePrinter.DEFAULT_INSTANCE, prefixPropName, prefixSep, postfixSep));
return res;
}
public static List<String> defaultPaths() {
List<String> paths;
paths = new ArrayList<String>();
paths.add("a1/b1/c1");
paths.add("a2/b1");
paths.add("a3");
return paths;
}
public static void fillTree(PropTreeNode root, List<String> paths, Map<String, Callable<?>> propFactories) {
for(String pathStr : paths) {
String[] path = pathStr.split("/");
PropTreeNode elt = root;
for(String pathElt : path) {
elt = elt.getOrCreateChild(pathElt);
for(Map.Entry<String,Callable<?>> propFactory : propFactories.entrySet()) {
elt.getOrCreateProp(propFactory.getKey(), propFactory.getValue());
}
}
}
}
}