package com.griddynamics.jagger.dbapi.model.rules; import com.griddynamics.jagger.dbapi.dto.MetricNameDto; import com.griddynamics.jagger.dbapi.model.MetricNode; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class TreeViewGroupMetricsToNodeRule extends Rule { public TreeViewGroupMetricsToNodeRule() {} public TreeViewGroupMetricsToNodeRule(String id, String displayName, String rule) { super(id, displayName, rule); } public TreeViewGroupMetricsToNodeRule(By filterBy, String id, String displayName, String rule) { super(filterBy, id, displayName, rule); } public <M extends MetricNode> List<M> filter(String parentId, List<M> metricNodeList) { List<M> result = new ArrayList<>(); M resultMetricNode = null; List<MetricNameDto> metricNameDtoList = new ArrayList<>(); Iterator<M> i = metricNodeList.iterator(); while (i.hasNext()) { M metricNode = i.next(); // match String metric; // node can contain more than single metric // current strategy: if at least one metric match => take it for (MetricNameDto metricNameDto : metricNode.getMetricNameDtoList()) { if (filterBy == By.DISPLAY_NAME) { metric = metricNameDto.getMetricDisplayName(); } else { metric = metricNameDto.getMetricName(); } if (metric.matches(rule)) { //create result single time if (resultMetricNode == null) { resultMetricNode = metricNode; } metricNameDtoList.addAll(metricNode.getMetricNameDtoList()); i.remove(); break; } } } // result - compose single node from filtered list if (resultMetricNode != null) { // N goes for node resultMetricNode.init(parentId + "N_" + id, displayName, metricNameDtoList); result.add(resultMetricNode); return result; } else { return null; } } public static class Composer extends TreeViewGroupMetricsToNodeRule { private List<TreeViewGroupMetricsToNodeRule> treeViewGroupMetricsToNodeRules; public Composer(List<TreeViewGroupMetricsToNodeRule> treeViewGroupMetricsToNodeRules) { // remove duplicates and sort List<TreeViewGroupMetricsToNodeRule> temp = removeDuplicates(By.ID, treeViewGroupMetricsToNodeRules); this.treeViewGroupMetricsToNodeRules = sort(By.DISPLAY_NAME, temp); } public static TreeViewGroupMetricsToNodeRule compose(List<TreeViewGroupMetricsToNodeRule> treeViewGroupMetricsToNodeRules) { return new Composer(treeViewGroupMetricsToNodeRules); } @Override public <M extends MetricNode> List<M> filter(String parentId, List<M> metricNodeList) { List<M> result = new ArrayList<>(); List<M> tempResult; for (TreeViewGroupMetricsToNodeRule rule : treeViewGroupMetricsToNodeRules) { tempResult = rule.filter(parentId, metricNodeList); if (tempResult != null) { result.addAll(tempResult); } } if (result.size() > 0) { return result; } else { return null; } } } }