package com.griddynamics.jagger.dbapi.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MetricGroupNode<M extends MetricNode> extends AbstractIdentifyNode {
private List<M> metrics = null;
private List<MetricGroupNode<M>> metricGroupNodeList = null;
public MetricGroupNode(MetricGroupNode<M> that) {
super(that);
if (that.getMetricsWithoutChildren() != null) {
this.metrics = new ArrayList<M>(that.getMetricsWithoutChildren());
}
if (that.getMetricGroupNodeList() != null) {
this.metricGroupNodeList = new ArrayList<MetricGroupNode<M>>(that.getMetricGroupNodeList().size());
for (MetricGroupNode<M> group : that.getMetricGroupNodeList()) {
this.metricGroupNodeList.add(new MetricGroupNode<M>(group));
}
}
}
public MetricGroupNode(String displayName) {
this.displayName = displayName;
}
public MetricGroupNode() {}
public void setMetricGroupNodeList(List<MetricGroupNode<M>> metricGroupNodeList) {
this.metricGroupNodeList = metricGroupNodeList;
}
public void setMetrics(List<M> metrics) {
this.metrics = sortByDisplayName(metrics);
}
public List<M> getMetricsWithoutChildren() {
return metrics;
}
public List<MetricGroupNode<M>> getMetricGroupNodeList() {
return metricGroupNodeList;
}
// all metrics, including children groups
public List<M> getMetrics() {
List<M> allMetrics = new ArrayList<M>();
if (metrics != null) {
allMetrics.addAll(metrics);
}
if (metricGroupNodeList != null) {
for (MetricGroupNode<M> metricGroupNode : metricGroupNodeList) {
List<M> metricNodeList = metricGroupNode.getMetrics();
if (metricNodeList != null) {
allMetrics.addAll(metricNodeList);
}
}
}
return allMetrics;
}
@Override
public List<? extends AbstractIdentifyNode> getChildren() {
ArrayList<AbstractIdentifyNode> result = new ArrayList<AbstractIdentifyNode>();
if (metricGroupNodeList != null) {
result.addAll(metricGroupNodeList);
}
if (metrics != null) {
result.addAll(metrics);
}
return result;
}
private List<M> sortByDisplayName(List<M> metricNodeList) {
Collections.sort(metricNodeList, new Comparator<M>() {
@Override
public int compare(M o1, M o2) {
int res = String.CASE_INSENSITIVE_ORDER.compare(o1.getDisplayName(), o2.getDisplayName());
return (res != 0) ? res : o1.getDisplayName().compareTo(o2.getDisplayName());
}
});
return metricNodeList;
}
}