/*******************************************************************************
* (C) Copyright 2010 IBM Corp. 2010
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Thavidu Ranatunga (IBM) - Initial implementation.
*******************************************************************************/
package org.eclipse.linuxtools.internal.perf.model;
import java.util.ArrayList;
import java.util.List;
public class TreeParent {
private String name;
private TreeParent parent;
private List<TreeParent> children;
private float percent = -1;
private double samples = -1;
public TreeParent(String name, float percent) {
this.name = name;
this.percent = percent;
children = new ArrayList<>();
}
public TreeParent(String name, float percent, double samples) {
this(name, percent);
this.samples = samples;
}
public String getName() {
return name;
}
public void setParent(TreeParent parent) {
this.parent = parent;
}
public TreeParent getParent() {
return parent;
}
@Override
public String toString() {
return getName() + " (" + getFormattedSamples() + " samples)"; //$NON-NLS-1$//$NON-NLS-2$
}
public Boolean equals(String s) {
return getName().equals(s);
}
public float getPercent() {
return percent;
}
public void setPercent(float percent) {
this.percent = percent;
}
/**
* Get the number of samples collected for this element.
*
* If this element is a child of PMSymbol (eg. PMLineRef) we should
* calculate its samples using its given percentage and the number of
* samples from its parent. If this element is a parent of PMSymbol we
* should calculate its samples by accumulating all samples from its
* children.
*
* @return the number of samples
*/
private double getSamples () {
// Child of PMSymbol, distribute samples by percentage
if (this instanceof PMLineRef) {
if (samples == -1) {
samples = (int) (getParent().getSamples() * (getPercent() / 100));
}
} else {
// Parent of PMSymbol, accumulate from children elements
if (samples == -1) {
int sampleSum = 0;
for (TreeParent child : getChildren()) {
sampleSum += child.getSamples();
}
samples = sampleSum;
}
}
return samples;
}
public String getFormattedSamples () {
double samples = getSamples();
return (samples <= Integer.MAX_VALUE)
? String.format("%.0f", samples) //$NON-NLS-1$
: String.format("%.4G", samples); //$NON-NLS-1$
}
public TreeParent(String name) {
this.name = name;
children = new ArrayList<>();
}
public void addChild(TreeParent child) {
children.add(child);
child.setParent(this);
recalculatePercentage();
}
public TreeParent getChild(String name) {
//check if it exists
for(TreeParent t : children) {
if (t.equals(name))
return t;
}
return null;
}
public void removeChild(TreeParent child) {
children.remove(child);
child.setParent(null);
recalculatePercentage();
}
public TreeParent [] getChildren() {
return children.toArray(new TreeParent[children.size()]);
}
public boolean hasChildren() {
return children.size() > 0;
}
public void clear() {
children.clear();
}
private void recalculatePercentage() {
if (getPercent() != -1 && (this instanceof PMDso || this instanceof PMFile)){
percent = 0;
// Re-sum its children percentages
for (TreeParent c : getChildren()) {
percent += c.getPercent();
}
// Tell its parent to re-sum too.
if (getParent().getPercent() != -1) {
getParent().recalculatePercentage();
}
}
}
}