io.cloudslang.lang.compiler.modeller.transformers.NavigateTransformer.java Source code

Java tutorial

Introduction

Here is the source code for io.cloudslang.lang.compiler.modeller.transformers.NavigateTransformer.java

Source

/*******************************************************************************
 * (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.compiler.modeller.transformers;

/*
 * Created by orius123 on 05/11/14.
 */

import io.cloudslang.lang.compiler.CompilerConstants;
import io.cloudslang.lang.compiler.modeller.result.BasicTransformModellingResult;
import io.cloudslang.lang.compiler.modeller.result.TransformModellingResult;
import io.cloudslang.lang.compiler.validator.ExecutableValidator;
import io.cloudslang.lang.entities.SensitivityLevel;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public class NavigateTransformer implements Transformer<List<Object>, List<Map<String, String>>> {

    private ExecutableValidator executableValidator;
    private Type type = Type.INTERNAL;

    @Override
    public TransformModellingResult<List<Map<String, String>>> transform(List<Object> rawData) {
        return transform(rawData, CompilerConstants.DEFAULT_SENSITIVITY_LEVEL);
    }

    @Override
    public TransformModellingResult<List<Map<String, String>>> transform(List<Object> rawData,
            SensitivityLevel sensitivityLevel) {
        List<Map<String, String>> transformedData = new ArrayList<>();
        List<RuntimeException> errors = new ArrayList<>();

        if (CollectionUtils.isEmpty(rawData)) {
            return new BasicTransformModellingResult<>(transformedData, errors);
        }

        for (Object elementAsObject : rawData) {
            try {
                if (elementAsObject instanceof Map) {
                    Map elementAsMap = (Map) elementAsObject;
                    if (elementAsMap.size() != 1) {
                        throw new RuntimeException("Each list item in the navigate "
                                + "section should contain exactly one key:value pair.");
                    }
                    // - SUCCESS: some_step
                    Map.Entry navigationEntry = (Map.Entry) elementAsMap.entrySet().iterator().next();
                    Object navigationKey = navigationEntry.getKey();
                    Object navigationValue = navigationEntry.getValue();
                    if (!(navigationKey instanceof String)) {
                        throw new RuntimeException("Each key in the navigate section should be a string.");
                    }
                    if (!(navigationValue instanceof String)) {
                        throw new RuntimeException("Each value in the navigate section should be a string.");
                    }
                    @SuppressWarnings("unchecked")
                    Map<String, String> elementAsStringMap = elementAsMap;
                    transformedData.add(elementAsStringMap);
                } else {
                    throw new RuntimeException("Navigation rule should be a Map. Actual type is "
                            + elementAsObject.getClass().getName() + ": " + elementAsObject);
                }
            } catch (RuntimeException rex) {
                errors.add(rex);
            }
        }

        try {
            List<Map<String, String>> navigationStrings = (List<Map<String, String>>) (List) rawData;
            if (!navigationStrings.isEmpty() && errors.isEmpty()) {
                executableValidator.validateNavigationStrings(navigationStrings);
            }
        } catch (RuntimeException e) {
            errors.add(e);
        }
        return new BasicTransformModellingResult<>(transformedData, errors);
    }

    @Override
    public List<Scope> getScopes() {
        return Collections.singletonList(Scope.AFTER_STEP);
    }

    @Override
    public String keyToTransform() {
        return null;
    }

    @Override
    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }

    public ExecutableValidator getExecutableValidator() {
        return executableValidator;
    }

    public void setExecutableValidator(ExecutableValidator executableValidator) {
        this.executableValidator = executableValidator;
    }
}