/******************************************************************************* * (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.events; import io.cloudslang.lang.entities.ExecutableType; import io.cloudslang.lang.entities.bindings.values.SensitiveValue; import io.cloudslang.lang.entities.bindings.values.Value; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * @author moradi * @version $Id$ * @since 03/11/2014 */ @SuppressWarnings("unchecked") public class LanguageEventData extends HashMap<String, Serializable> { public static final String TYPE = "TYPE"; public static final String DESCRIPTION = "DESCRIPTION"; public static final String TIMESTAMP = "TIMESTAMP"; public static final String EXECUTION_ID = "EXECUTION_ID"; public static final String PATH = "PATH"; public static final String EXCEPTION = "EXCEPTION"; public static final String OUTPUTS = "OUTPUTS"; public static final String RESULT = "RESULT"; public static final String CALL_ARGUMENTS = "CALL_ARGUMENTS"; public static final String INPUTS = "INPUTS"; public static final String ARGUMENTS = "ARGUMENTS"; public static final String BOUND_INPUTS = "BOUND_INPUTS"; public static final String BOUND_ARGUMENTS = "BOUND_ARGUMENTS"; public static final String BOUND_PARALLEL_LOOP_EXPRESSION = "BOUND_PARALLEL_LOOP_EXPRESSION"; public static final String NEXT_STEP_POSITION = "nextPosition"; public static final String STEP_TYPE = "STEP_TYPE"; public static final String STEP_NAME = "STEP_NAME"; public enum StepType { FLOW("flow"), OPERATION("operation"), DECISION("decision"), STEP("step"), ACTION("action"), NAVIGATION("navigation"); private final String value; private static final StepType[] EXECUTABLE_TYPES; static { EXECUTABLE_TYPES = new StepType[3]; EXECUTABLE_TYPES[0] = FLOW; EXECUTABLE_TYPES[1] = OPERATION; EXECUTABLE_TYPES[2] = DECISION; } StepType(String value) { this.value = value; } public String getValue() { return value; } public static StepType[] getExecutableTypes() { return Arrays.copyOf(EXECUTABLE_TYPES, EXECUTABLE_TYPES.length); } } public static StepType convertExecutableType(ExecutableType executableType) { switch (executableType) { case FLOW: return StepType.FLOW; case OPERATION: return StepType.OPERATION; case DECISION: return StepType.DECISION; default: throw new RuntimeException("Not implemented for executable type: " + executableType); } } public String getStepName() { return (String) get(STEP_NAME); } public void setStepName(String stepName) { put(STEP_NAME, stepName); } public StepType getStepType() { return (StepType) get(STEP_TYPE); } public void setStepType(StepType stepType) { put(STEP_TYPE, stepType); } public String getEventType() { return (String) get(TYPE); } public void setEventType(String eventType) { put(TYPE, eventType); } public String getDescription() { return (String) get(DESCRIPTION); } public void setDescription(String description) { put(DESCRIPTION, description); } public Date getTimeStamp() { return (Date) get(TIMESTAMP); } public void setTimeStamp(Date timeStamp) { put(TIMESTAMP, timeStamp); } public Long getExecutionId() { return (Long) get(EXECUTION_ID); } public void setExecutionId(Long executionId) { put(EXECUTION_ID, executionId); } public String getPath() { return (String) get(PATH); } public void setPath(String path) { put(PATH, path); } public String getResult() { return (String) get(RESULT); } public void setResult(String result) { put(RESULT, result); } public String getException() { return (String) get(EXCEPTION); } public void setException(String exceptionMessage) { put(EXCEPTION, exceptionMessage); } public Map<String, Serializable> getInputs() { return (Map<String, Serializable>) get(BOUND_INPUTS); } public void setInputs(Map<String, Serializable> inputs) { put(BOUND_INPUTS, (Serializable) inputs); } public Map<String, Serializable> getArguments() { return (Map<String, Serializable>) get(BOUND_ARGUMENTS); } public void setArguments(Map<String, Serializable> arguments) { put(BOUND_ARGUMENTS, (Serializable) arguments); } public Map<String, Serializable> getOutputs() { return (Map<String, Serializable>) get(OUTPUTS); } public void setOutputs(Map<String, Serializable> outputs) { put(OUTPUTS, (Serializable) outputs); } public Map<String, Serializable> getCallArguments() { return (Map<String, Serializable>) get(CALL_ARGUMENTS); } public void setCallArguments(Map<String, Serializable> callArguments) { put(CALL_ARGUMENTS, (Serializable) callArguments); } public List<Serializable> getParallelLoopBoundExpression() { return (List<Serializable>) get(BOUND_PARALLEL_LOOP_EXPRESSION); } public void setParallelLoopBoundExpression(List<Serializable> parallelLoopBoundExpression) { put(BOUND_PARALLEL_LOOP_EXPRESSION, (Serializable) parallelLoopBoundExpression); } @SuppressWarnings("unchecked") public static Serializable maskSensitiveValues(Serializable serializable) { if (serializable instanceof Map) { return (Serializable) maskSensitiveValues((Map<String, Serializable>) serializable); } else if (serializable instanceof List) { return (Serializable) maskSensitiveValues((List<Serializable>) serializable); } else { return serializable; } } public static Map<String, Serializable> maskSensitiveValues(Map<String, ? extends Serializable> values) { Map<String, Serializable> result = new LinkedHashMap<>(); for (Map.Entry<String, ? extends Serializable> entry : values.entrySet()) { result.put(entry.getKey(), getMaskedValue(entry.getValue())); } return result; } public static List<Serializable> maskSensitiveValues(List<? extends Serializable> values) { List<Serializable> result = new ArrayList<>(); for (Serializable value : values) { result.add(getMaskedValue(value)); } return result; } private static Serializable getMaskedValue(Serializable value) { if (value != null && value instanceof Value) { return ((Value) value).isSensitive() ? SensitiveValue.SENSITIVE_VALUE_MASK : ((Value) value).get(); } return value; } }