Skip to content

Commit

Permalink
Merge f8dabb8 into a2d79d2
Browse files Browse the repository at this point in the history
  • Loading branch information
Tirla-Alin committed Aug 1, 2019
2 parents a2d79d2 + f8dabb8 commit f190fd0
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ public interface SlangTextualKeys {
String SEQ_STEP_HIGHLIGHT_ID_KEY = "highlight_id";
String SEQ_STEP_SNAPSHOT_KEY = "snapshot";
String SEQ_OUTPUT_ROBOT_KEY = "robot";
String SEQ_EXTERNAL_KEY = "external";

//inputs
String VALUE_KEY = "value";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@
import static com.google.common.collect.Sets.newHashSet;
import static io.cloudslang.lang.compiler.CompilerConstants.DEFAULT_SENSITIVITY_LEVEL;
import static io.cloudslang.lang.compiler.SlangTextualKeys.SEQ_ACTION_KEY;
import static io.cloudslang.lang.compiler.SlangTextualKeys.SEQ_EXTERNAL_KEY;
import static io.cloudslang.lang.compiler.modeller.transformers.Transformer.Scope.ACTION;
import static java.util.Collections.emptySet;
import static java.lang.Boolean.FALSE;
import static java.util.Collections.singletonList;

public class SeqActionTransformer extends AbstractTransformer
Expand All @@ -44,9 +45,9 @@ public SeqActionTransformer(DependencyFormatValidator dependencyFormatValidator,
this.seqStepsTransformer = seqStepsTransformer;
}

private static final Set<String> MANDATORY_KEY_SET = newHashSet(SlangTextualKeys.SEQ_ACTION_GAV_KEY,
SlangTextualKeys.SEQ_STEPS_KEY);
private static final Set<String> OPTIONAL_KEY_SET = emptySet();
private static final Set<String> MANDATORY_KEY_SET = newHashSet(SlangTextualKeys.SEQ_ACTION_GAV_KEY);
private static final Set<String> OPTIONAL_KEY_SET = newHashSet(SlangTextualKeys.SEQ_STEPS_KEY,
SlangTextualKeys.SEQ_EXTERNAL_KEY);

@Override
public TransformModellingResult<Map<String, Serializable>> transform(Map<String, Serializable> rawData) {
Expand Down Expand Up @@ -82,18 +83,36 @@ private void transformGav(Map<String, Serializable> rawData) {
private void transformSteps(Map<String, Serializable> rawData,
List<RuntimeException> errors,
SensitivityLevel sensitivityLevel) {
Serializable externalValue = rawData.remove(SlangTextualKeys.SEQ_EXTERNAL_KEY);
Boolean external = parseExternalValue(errors, externalValue);
rawData.put(ScoreLangConstants.SEQ_EXTERNAL_KEY, external);

List<Map<String, Map<String, String>>> steps = preCompileValidator
.validateSeqActionSteps(rawData.remove(SlangTextualKeys.SEQ_STEPS_KEY), errors);
.validateSeqActionSteps(rawData.remove(SlangTextualKeys.SEQ_STEPS_KEY), errors, external);
TransformModellingResult<ArrayList<SeqStep>> transformedSteps = seqStepsTransformer
.transform(steps, sensitivityLevel);
errors.addAll(transformedSteps.getErrors());
ArrayList<SeqStep> transformedData = transformedSteps.getTransformedData();
if (transformedData.isEmpty()) {
errors.add(new RuntimeException("Missing sequential operation steps."));
}

rawData.put(ScoreLangConstants.SEQ_STEPS_KEY, transformedData);
}

private Boolean parseExternalValue(List<RuntimeException> errors, Serializable externalValue) {
Boolean external;
if (externalValue instanceof Boolean) {
external = (Boolean) externalValue;
} else if (externalValue instanceof String) {
external = Boolean.valueOf((String) externalValue);
} else {
external = FALSE;
if (externalValue != null) {
errors.add(new RuntimeException("Unsupported value found for '" + SEQ_EXTERNAL_KEY + "' key. " +
"Supported values are: [true, false]."));
}
}
return external;
}

@Override
public List<Scope> getScopes() {
return singletonList(ACTION);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ List<Map<String, Map<String, Object>>> validateWorkflowRawData(ParsedSlang parse
List<RuntimeException> errors);

List<Map<String, Map<String, String>>> validateSeqActionSteps(Object oSeqActionStepsRawData,
List<RuntimeException> errors);
List<RuntimeException> errors,
boolean external);

ExecutableModellingResult validateResult(ParsedSlang parsedSlang,
String executableName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public class PreCompileValidatorImpl extends AbstractValidator implements PreCom
"'on_failure' should be last step in the workflow";
public static final String FLOW_RESULTS_WITH_EXPRESSIONS_MESSAGE =
"Explicit values are not allowed for flow results. Correct format is:";
public static final String FLOW_RESULTS_NOT_ALLOWED_EXPRESSIONS_MESSAGE =
private static final String FLOW_RESULTS_NOT_ALLOWED_EXPRESSIONS_MESSAGE =
"Valid results are:";

@Override
Expand Down Expand Up @@ -115,11 +115,10 @@ public List<Map<String, Map<String, Object>>> validateWorkflowRawData(ParsedSlan

@Override
public List<Map<String, Map<String, String>>> validateSeqActionSteps(Object oSeqActionStepsRawData,
List<RuntimeException> errors) {
List<RuntimeException> errors,
boolean external) {
if (oSeqActionStepsRawData == null) {
oSeqActionStepsRawData = new ArrayList<>();
errors.add(new RuntimeException("Error compiling sequential operation: missing '" +
SEQ_STEPS_KEY + "' property."));
}
List<Map<String, Map<String, String>>> stepsRawData;
try {
Expand All @@ -130,9 +129,12 @@ public List<Map<String, Map<String, String>>> validateSeqActionSteps(Object oSeq
errors.add(new RuntimeException("Error compiling sequential operation: syntax is illegal.\n" +
"Below '" + SEQ_STEPS_KEY + "' property there should be a list of steps and not a map."));
}
if (CollectionUtils.isEmpty(stepsRawData)) {
if (CollectionUtils.isEmpty(stepsRawData) && !external) {
errors.add(new RuntimeException("Error compiling sequential operation: missing '" +
SEQ_STEPS_KEY + "' data."));
} else if (!CollectionUtils.isEmpty(stepsRawData) && external) {
errors.add(new RuntimeException("Error compiling sequential operation: property '" +
SEQ_STEPS_KEY + "' is not supported for external operations."));
}
for (Map<String, Map<String, String>> step : stepsRawData) {
if (step.size() > 1) {
Expand Down Expand Up @@ -271,8 +273,7 @@ public void validateDecisionResultsSection(
public List<RuntimeException> validateNoDuplicateInOutParams(List<? extends InOutParam> inputs,
InOutParam element) {
List<RuntimeException> errors = new ArrayList<>();
Collection<InOutParam> inOutParams = new ArrayList<>();
inOutParams.addAll(inputs);
Collection<InOutParam> inOutParams = new ArrayList<>(inputs);

String message = "Duplicate " + getMessagePart(element.getClass()) + " found: " + element.getName();
validateNotDuplicateInOutParam(inOutParams, element, message, errors);
Expand All @@ -285,7 +286,7 @@ public void validateStringValue(String name, Serializable value, InOutTransforme
validateStringValue(prefix, value);
}

public static void validateStringValue(String errorMessagePrefix, Serializable value) {
private static void validateStringValue(String errorMessagePrefix, Serializable value) {
if (value != null && !(value instanceof String)) {
throw new RuntimeException(errorMessagePrefix + "' should have a String value, but got value '" + value +
"' of type " + value.getClass().getSimpleName() + ".");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@

import static com.google.common.collect.Lists.newArrayList;
import static io.cloudslang.lang.entities.ScoreLangConstants.SEQ_ACTION_GAV_KEY;
import static io.cloudslang.lang.entities.ScoreLangConstants.SEQ_EXTERNAL_KEY;
import static io.cloudslang.lang.entities.ScoreLangConstants.SEQ_STEPS_KEY;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.collection.IsEmptyCollection.empty;
Expand Down Expand Up @@ -86,6 +89,7 @@ public void testTransformSimple() {
Map<String, Serializable> expectedSeqActionSimple = new LinkedHashMap<>();
expectedSeqActionSimple.put(SEQ_ACTION_GAV_KEY, "seq:seqf.simple_valid_seq_op:1.0.0");
expectedSeqActionSimple.put(SEQ_STEPS_KEY, newArrayList(new SeqStep()));
expectedSeqActionSimple.put(SEQ_EXTERNAL_KEY, FALSE);

TransformModellingResult<Map<String, Serializable>> transformedAction = seqActionTransformer
.transform(new HashMap<>(initialSeqActionSimple));
Expand Down Expand Up @@ -140,7 +144,7 @@ public void testTransformWithMissingKeys() {
assertNull(transformedAction.getTransformedData());
assertThat(transformedAction.getErrors(), is(not(empty())));
assertEquals(transformedAction.getErrors().get(0).getMessage(),
"Following tags are missing: [gav, steps]");
"Following tags are missing: [gav]");
}

@Test
Expand All @@ -153,6 +157,7 @@ public void testTransformWithNoSteps() {
Map<String, Serializable> expectedSeqActionSimple = new LinkedHashMap<>();
expectedSeqActionSimple.put(SEQ_ACTION_GAV_KEY, "seq:seqf.simple_valid_seq_op:1.0.0");
expectedSeqActionSimple.put(SEQ_STEPS_KEY, newArrayList());
expectedSeqActionSimple.put(SEQ_EXTERNAL_KEY, FALSE);

TransformModellingResult<Map<String, Serializable>> transformedAction = seqActionTransformer
.transform(rawData);
Expand All @@ -162,6 +167,69 @@ public void testTransformWithNoSteps() {
"Error compiling sequential operation: missing 'steps' data.");
}

@Test
public void testTransformExternalWithSteps() {
doReturn(new BasicTransformModellingResult<>(newArrayList(), new ArrayList<>()))
.when(seqStepsTransformer).transform(any(), any());

HashMap<String, Serializable> rawData = new HashMap<>(initialSeqActionSimple);
rawData.put(SEQ_EXTERNAL_KEY, TRUE);
rawData.put(SEQ_ACTION_GAV_KEY, "seq:seqf.simple_valid_external_seq_op:1.0.0");
Map<String, Serializable> expectedSeqActionSimple = new LinkedHashMap<>();
expectedSeqActionSimple.put(SEQ_ACTION_GAV_KEY, "seq:seqf.simple_valid_external_seq_op:1.0.0");
expectedSeqActionSimple.put(SEQ_STEPS_KEY, newArrayList());
expectedSeqActionSimple.put(SEQ_EXTERNAL_KEY, TRUE);

TransformModellingResult<Map<String, Serializable>> transformedAction = seqActionTransformer.transform(rawData);

assertEquals(expectedSeqActionSimple, transformedAction.getTransformedData());
assertThat(transformedAction.getErrors(), is(not(empty())));
assertEquals(transformedAction.getErrors().get(0).getMessage(),
"Error compiling sequential operation: property 'steps' is not supported for external operations.");
}

@Test
public void testTransformExternalWithNoSteps() {
doReturn(new BasicTransformModellingResult<>(newArrayList(), new ArrayList<>()))
.when(seqStepsTransformer).transform(any(), any());

HashMap<String, Serializable> rawData = new HashMap<>(initialSeqActionSimple);
rawData.put(SEQ_EXTERNAL_KEY, TRUE);
rawData.put(SEQ_ACTION_GAV_KEY, "seq:seqf.simple_valid_external_seq_op:1.0.0");
rawData.remove(SEQ_STEPS_KEY);
Map<String, Serializable> expectedSeqActionSimple = new LinkedHashMap<>();
expectedSeqActionSimple.put(SEQ_ACTION_GAV_KEY, "seq:seqf.simple_valid_external_seq_op:1.0.0");
expectedSeqActionSimple.put(SEQ_STEPS_KEY, newArrayList());
expectedSeqActionSimple.put(SEQ_EXTERNAL_KEY, TRUE);

TransformModellingResult<Map<String, Serializable>> transformedAction = seqActionTransformer.transform(rawData);

assertEquals(expectedSeqActionSimple, transformedAction.getTransformedData());
assertThat(transformedAction.getErrors(), is(empty()));
}

@Test
public void testTransformWithInvalidExternalValue() {
doReturn(new BasicTransformModellingResult<>(newArrayList(), new ArrayList<>()))
.when(seqStepsTransformer).transform(any(), any());

HashMap<String, Serializable> rawData = new HashMap<>(initialSeqActionSimple);
rawData.put(SEQ_EXTERNAL_KEY, 567);
rawData.put(SEQ_ACTION_GAV_KEY, "seq:seqf.simple_valid_external_seq_op:1.0.0");
rawData.remove(SEQ_STEPS_KEY);
Map<String, Serializable> expectedSeqActionSimple = new LinkedHashMap<>();
expectedSeqActionSimple.put(SEQ_ACTION_GAV_KEY, "seq:seqf.simple_valid_external_seq_op:1.0.0");
expectedSeqActionSimple.put(SEQ_STEPS_KEY, newArrayList());
expectedSeqActionSimple.put(SEQ_EXTERNAL_KEY, FALSE);

TransformModellingResult<Map<String, Serializable>> transformedAction = seqActionTransformer.transform(rawData);

assertEquals(expectedSeqActionSimple, transformedAction.getTransformedData());
assertThat(transformedAction.getErrors(), is(not(empty())));
assertEquals(transformedAction.getErrors().get(0).getMessage(),
"Unsupported value found for 'external' key. Supported values are: [true, false].");
}

@Test
public void testTransformWithNullMap() {
doReturn(new BasicTransformModellingResult<>(newArrayList(new SeqStep()), new ArrayList<>()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public interface ScoreLangConstants {

String SEQ_ACTION_GAV_KEY = "gav";
String SEQ_STEPS_KEY = "steps";
String SEQ_EXTERNAL_KEY = "external";

//navigation
String NEXT_STEP_ID_KEY = "nextStepId";
Expand Down

0 comments on commit f190fd0

Please sign in to comment.