/*******************************************************************************
* (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.runtime.steps;
import io.cloudslang.lang.entities.ScoreLangConstants;
import io.cloudslang.lang.entities.bindings.Argument;
import io.cloudslang.lang.entities.bindings.Input;
import io.cloudslang.lang.entities.bindings.values.Value;
import io.cloudslang.lang.runtime.env.Context;
import io.cloudslang.lang.runtime.env.ContextStack;
import io.cloudslang.lang.runtime.env.ParentFlowData;
import io.cloudslang.lang.runtime.env.ParentFlowStack;
import io.cloudslang.lang.runtime.env.RunEnvironment;
import io.cloudslang.lang.runtime.events.LanguageEventData;
import io.cloudslang.score.lang.ExecutionRuntimeServices;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang3.tuple.Pair;
public abstract class AbstractExecutionData {
public void sendStartBindingInputsEvent(List<Input> inputs,
RunEnvironment runEnv,
ExecutionRuntimeServices executionRuntimeServices,
String desc,
LanguageEventData.StepType stepType,
String stepName) {
ArrayList<String> inputNames = new ArrayList<>();
for (Input input : inputs) {
inputNames.add(input.getName());
}
fireEvent(executionRuntimeServices, runEnv, ScoreLangConstants.EVENT_INPUT_START, desc, stepType, stepName,
Pair.of(LanguageEventData.INPUTS, inputNames));
}
public void sendEndBindingInputsEvent(List<Input> inputs,
final Map<String, Value> context,
RunEnvironment runEnv,
ExecutionRuntimeServices executionRuntimeServices,
String desc,
LanguageEventData.StepType stepType,
String stepName) {
Map<String, Value> inputsForEvent = new LinkedHashMap<>();
for (Input input : inputs) {
String inputName = input.getName();
Value inputValue = context.get(inputName);
inputsForEvent.put(inputName, inputValue);
}
fireEvent(executionRuntimeServices, runEnv, ScoreLangConstants.EVENT_INPUT_END, desc, stepType, stepName,
Pair.of(LanguageEventData.BOUND_INPUTS, (Serializable) inputsForEvent));
}
public void sendStartBindingArgumentsEvent(
List<Argument> arguments,
RunEnvironment runEnv,
ExecutionRuntimeServices executionRuntimeServices,
String description,
String stepName) {
ArrayList<String> argumentNames = new ArrayList<>();
for (Argument argument : arguments) {
argumentNames.add(argument.getName());
}
fireEvent(
executionRuntimeServices,
runEnv,
ScoreLangConstants.EVENT_ARGUMENT_START,
description,
LanguageEventData.StepType.STEP,
stepName,
Pair.of(LanguageEventData.ARGUMENTS, argumentNames)
);
}
public void sendEndBindingArgumentsEvent(
List<Argument> arguments,
final Map<String, Value> context,
RunEnvironment runEnv,
ExecutionRuntimeServices executionRuntimeServices,
String description,
String stepName) {
Map<String, Value> argumentsForEvent = new LinkedHashMap<>();
for (Argument argument : arguments) {
String argumentName = argument.getName();
Value argumentValue = context.get(argumentName);
argumentsForEvent.put(argumentName, argumentValue);
}
fireEvent(
executionRuntimeServices,
runEnv, ScoreLangConstants.EVENT_ARGUMENT_END,
description,
LanguageEventData.StepType.STEP,
stepName,
Pair.of(LanguageEventData.BOUND_ARGUMENTS, (Serializable) argumentsForEvent)
);
}
@SafeVarargs
public static void fireEvent(ExecutionRuntimeServices runtimeServices,
RunEnvironment runEnvironment,
String type,
String description,
LanguageEventData.StepType stepType,
String stepName,
Map.Entry<String, ? extends Serializable>... fields) {
fireEvent(runtimeServices, type, description,
runEnvironment.getExecutionPath().getCurrentPath(), stepType, stepName, fields);
}
@SafeVarargs
public static void fireEvent(ExecutionRuntimeServices runtimeServices,
String type,
String description,
String path,
LanguageEventData.StepType stepType,
String stepName,
Map.Entry<String, ? extends Serializable>... fields) {
LanguageEventData eventData = new LanguageEventData();
eventData.setStepType(stepType);
eventData.setStepName(stepName);
eventData.setEventType(type);
eventData.setDescription(description);
eventData.setTimeStamp(new Date());
eventData.setExecutionId(runtimeServices.getExecutionId());
eventData.setPath(path);
for (Entry<String, ? extends Serializable> field : fields) {
//noinspection unchecked
eventData.put(field.getKey(), LanguageEventData.maskSensitiveValues(field.getValue()));
}
runtimeServices.addEvent(type, eventData);
}
protected void updateCallArgumentsAndPushContextToStack(RunEnvironment runEnvironment, Context currentContext,
Map<String, Value> callArguments) {
ContextStack contextStack = runEnvironment.getStack();
contextStack.pushContext(currentContext);
runEnvironment.putCallArguments(callArguments);
}
protected void pushParentFlowDataOnStack(RunEnvironment runEnv, Long runningExecutionPlanId, Long nextStepId) {
// create ParentFlowData object containing the current running execution plan id and
// the next step id to navigate to in the current execution plan,
// and push it to the ParentFlowStack for future use (once we finish running the ref operation/flow)
ParentFlowStack stack = runEnv.getParentFlowStack();
stack.pushParentFlowData(new ParentFlowData(runningExecutionPlanId, nextStepId));
}
}