/*******************************************************************************
* (c) Copyright 2016 Hewlett-Packard Development Company, L.P.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License v2.0 which accompany this distribution.
*
* The Apache License is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package io.cloudslang.lang.systemtests;
import ch.lambdaj.group.Group;
import io.cloudslang.lang.entities.ScoreLangConstants;
import io.cloudslang.lang.runtime.events.LanguageEventData;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections4.CollectionUtils;
import static ch.lambdaj.Lambda.by;
import static ch.lambdaj.Lambda.group;
import static ch.lambdaj.Lambda.having;
import static ch.lambdaj.Lambda.on;
import static ch.lambdaj.Lambda.selectFirst;
import static org.hamcrest.Matchers.equalTo;
/*
* Created by orius123 on 24/12/14.
*/
public class RunDataAggregatorListener extends AbstractAggregatorListener {
public Map<String, StepData> aggregate() {
Map<String, StepData> stepsData = new HashMap<>();
Group<LanguageEventData> groups = group(getEvents(), by(on(LanguageEventData.class).getPath()));
for (Group<LanguageEventData> subGroup : groups.subgroups()) {
StepData stepData = buildStepData(subGroup.findAll());
stepsData.put(stepData.getPath(), stepData);
}
return stepsData;
}
private StepData buildStepData(List<LanguageEventData> data) {
List<LanguageEventData> stepEvents = selectByStepType(data, LanguageEventData.StepType.STEP);
List<LanguageEventData> executableEvents =
selectByStepType(data, LanguageEventData.StepType.getExecutableTypes());
LanguageEventData inputsEvent;
LanguageEventData outputsEvent;
boolean isStep = CollectionUtils.isNotEmpty(stepEvents);
if (isStep) {
inputsEvent = selectByEventType(stepEvents, ScoreLangConstants.EVENT_ARGUMENT_END);
outputsEvent = selectByEventType(stepEvents, ScoreLangConstants.EVENT_OUTPUT_END);
} else {
inputsEvent = selectByEventType(executableEvents, ScoreLangConstants.EVENT_INPUT_END);
outputsEvent = selectByEventType(executableEvents, ScoreLangConstants.EVENT_OUTPUT_END);
}
String path = inputsEvent.getPath();
String stepName = inputsEvent.getStepName();
Map<String, Serializable> inputs;
if (isStep) {
inputs = inputsEvent.getArguments();
} else {
inputs = inputsEvent.getInputs();
}
Map<String, Serializable> outputs = outputsEvent == null ? null : outputsEvent.getOutputs();
String result = outputsEvent == null ? null : (String) outputsEvent.get(LanguageEventData.RESULT);
String executableName = executableEvents.get(0).getStepName();
return new StepData(path, stepName, inputs, outputs, executableName, result);
}
private List<LanguageEventData> selectByStepType(List<LanguageEventData> data,
LanguageEventData.StepType... stepTypes) {
List<LanguageEventData> result = new ArrayList<>();
for (LanguageEventData element : data) {
boolean match = false;
for (LanguageEventData.StepType typeToCheck : stepTypes) {
if (element.getStepType().equals(typeToCheck)) {
match = true;
}
}
if (match) {
result.add(element);
}
}
return result;
}
private LanguageEventData selectByEventType(List<LanguageEventData> data, String eventType) {
return selectFirst(data, having(on(LanguageEventData.class).getEventType(), equalTo(eventType)));
}
}