package com.griddynamics.jagger.engine.e1.reporting; import static com.griddynamics.jagger.util.StandardMetricsNamesUtil.extractDisplayNameFromGenerated; import static com.griddynamics.jagger.util.StandardMetricsNamesUtil.extractIdsFromGeneratedIdForScenarioComponents; import com.griddynamics.jagger.util.StandardMetricsNamesUtil; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * Created by Andrey Badaev * Date: 16/02/17 */ public class ScenarioSummaryExtractor { private final static String STEP_PREFIX = " Step: "; private final static Comparator<SummaryDto> STEP_METRICS_COMPARATOR = (o1, o2) -> { if (o2.getKey().startsWith(STEP_PREFIX)) { return 1; } return o1.getKey().compareTo(o2.getKey()); }; private final static String SCENARIO_PREFIX = "Scenario: "; private final static Comparator<SummaryDto> SCENARIO_METRICS_COMPARATOR = (o1, o2) -> { if (o2.getKey().startsWith(SCENARIO_PREFIX)) { return 1; } return o1.getKey().compareTo(o2.getKey()); }; private static class StepData { String displayName; final List<SummaryDto> metrics = new ArrayList<>(); } private final static class ScenarioData extends StepData { final Map<String, StepData> stepMetrics = new HashMap<>(); } public static List<SummaryDto> extractScenarioSummary(Map<String, SummaryDto> summaries) { final List<SummaryDto> result = new ArrayList<>(); final Map<String, ScenarioData> scenarioDataMap = new HashMap<>(); for (Map.Entry<String, SummaryDto> entry: summaries.entrySet()) { final SummaryDto metric = entry.getValue(); if (!StandardMetricsNamesUtil.isBelongingToScenario(entry.getKey())) { result.add(metric); continue; } StandardMetricsNamesUtil.IdContainer ids = extractIdsFromGeneratedIdForScenarioComponents(entry.getKey()); if (ids == null) { result.add(metric); continue; } ScenarioData scenarioData = scenarioDataMap.computeIfAbsent(ids.getScenarioId(), k -> new ScenarioData()); if (!ids.getScenarioId().equals(ids.getStepId())) { // if it is a step metric StepData stepData = scenarioData.stepMetrics.computeIfAbsent(ids.getStepId(), s -> new StepData()); addDisplayNameEntry(metric, stepData, STEP_PREFIX); metric.setKey(" " + metric.getKey()); stepData.metrics.add(metric); } else { // then it is a scenario metric addDisplayNameEntry(metric, scenarioData, SCENARIO_PREFIX); metric.setKey(" " + metric.getKey()); scenarioData.metrics.add(metric); } } result.sort(Comparator.comparing(SummaryDto::getKey)); result.addAll(scenarioDataMap.entrySet() .stream() .sorted(Comparator.comparing(se -> se.getValue().displayName)) .flatMap(e -> { List<SummaryDto> allScenarioMetrics = e.getValue().metrics.stream() .sorted(SCENARIO_METRICS_COMPARATOR) .collect(Collectors.toList()); List<SummaryDto> allStepsMetrics = e.getValue().stepMetrics.entrySet() .stream() .sorted(Comparator.comparing( ste -> ste.getValue().displayName)) .flatMap(e2 -> e2.getValue().metrics .stream() .sorted(STEP_METRICS_COMPARATOR)) .collect(Collectors.toList()); allScenarioMetrics.addAll(allStepsMetrics); return allScenarioMetrics.stream(); }) .collect(Collectors.toList())); return result; } private static void addDisplayNameEntry(SummaryDto metric, StepData stepData, String prefix) { if (stepData.displayName == null) { // add an entry with step display name String displayName = extractDisplayNameFromGenerated(metric.getKey()); stepData.displayName = displayName; SummaryDto summaryDto = new SummaryDto(); summaryDto.setKey(prefix + displayName); summaryDto.setValue(""); stepData.metrics.add(summaryDto); } } }