com.intuit.tank.script.LogicStepEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.intuit.tank.script.LogicStepEditor.java

Source

package com.intuit.tank.script;

/*
 * #%L
 * JSF Support Beans
 * %%
 * Copyright (C) 2011 - 2015 Intuit Inc.
 * %%
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * #L%
 */

import static com.intuit.tank.util.ButtonLabel.ADD_LABEL;
import static com.intuit.tank.util.ButtonLabel.EDIT_LABEL;

import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.script.ScriptEngineManager;

import org.apache.commons.lang3.StringUtils;
import org.jboss.seam.international.status.Messages;

import com.intuit.tank.common.ScriptUtil;
import com.intuit.tank.harness.test.data.Variables;
import com.intuit.tank.http.BaseRequest;
import com.intuit.tank.http.BaseResponse;
import com.intuit.tank.project.RequestData;
import com.intuit.tank.project.ScriptStep;
import com.intuit.tank.script.ScriptConstants;
import com.intuit.tank.tools.script.ScriptIOBean;
import com.intuit.tank.tools.script.ScriptRunner;
import com.intuit.tank.tools.script.StringOutputLogger;
import com.intuit.tank.vm.common.LogicScriptUtil;
import com.intuit.tank.vm.settings.TankConfig;

@Named
@ConversationScoped
public class LogicStepEditor implements Serializable {

    private static final String DASHES = "-------------";

    private static final long serialVersionUID = 1L;

    @Inject
    private ScriptEditor scriptEditor;

    @Inject
    private Messages messages;

    private String script;
    private String name;
    private String output;
    private String groupName;
    private LogicTestData logicTestData;
    private ScriptStep step;
    private String buttonLabel = ADD_LABEL;
    private ScriptStep previousRequest = null;

    private boolean editMode;

    public void editLogicStep(ScriptStep step) {
        this.step = step;
        this.editMode = true;
        this.name = step.getName();
        this.previousRequest = scriptEditor.getPreviousRequest(step);
        this.groupName = step.getScriptGroupName();
        logicTestData = new LogicTestData(step, scriptEditor.getScript());
        for (RequestData requestData : step.getData()) {// dd
            if (ScriptConstants.SCRIPT.equals(requestData.getKey())) {
                script = requestData.getValue();
                break;
            }
        }
        buttonLabel = EDIT_LABEL;
    }

    public void insertLogicStep() {
        this.previousRequest = scriptEditor.getPreviousRequest(null);
        this.editMode = false;
        script = "";
        name = "";
        output = "";
        groupName = "";
        logicTestData = new LogicTestData(previousRequest, scriptEditor.getScript());
        buttonLabel = ADD_LABEL;
    }

    public void addToScript() {
        if (validate()) {
            if (editMode) {
                done();
            } else {
                insert();
            }
        }
    }

    public void insert() {
        ScriptStep newStep = ScriptStepFactory.createLogic(name, script);
        newStep.setScriptGroupName(groupName);
        logicTestData.setInStep(newStep);
        scriptEditor.insert(newStep);
        groupName = null;
        script = null;
        name = null;
        output = null;
    }

    public void done() {
        RequestData rd = new RequestData();
        rd.setKey(ScriptConstants.SCRIPT);
        rd.setValue(script);
        rd.setType(ScriptConstants.SCRIPT);

        Set<RequestData> datas = new HashSet<RequestData>();
        datas.add(rd);

        step.setData(datas);
        logicTestData.setInStep(step);
        step.setName(name);
        step.setScriptGroupName(groupName);
        step.setComments("Logic Step: " + name);
        ScriptUtil.updateStepLabel(step);
        script = null;
        groupName = null;
        name = null;
        output = null;
        logicTestData = null;
    }

    public String getInsertBefore() {
        return new TankConfig().getLogicStepConfig().getInsertBefore();
    }

    public void setValuesFromPrevious() {
        if (previousRequest != null) {
            logicTestData = new LogicTestData(previousRequest, scriptEditor.getScript());
        }
    }

    private boolean validate() {
        boolean retVal = true;

        if (StringUtils.isBlank(name)) {
            retVal = false;
            messages.error("Name cannot be empty");
        }
        return retVal;
    }

    public void testScript() {
        StringOutputLogger outputLogger = new StringOutputLogger();
        Map<String, Object> inputs = new HashMap<String, Object>();
        Variables vars = new Variables();
        for (Entry<String, String> entry : logicTestData.getVariables()) {
            vars.addVariable(entry.getKey(), entry.getValue());
        }
        inputs.put("variables", vars);
        inputs.put("request", createRequest());
        inputs.put("response", createResponse());
        try {
            String scriptToRun = new LogicScriptUtil().buildScript(script);
            logMap("Variables", vars.getVaribleValues(), outputLogger);
            outputLogger.logLine(DASHES + " script " + DASHES);
            ScriptIOBean ioBean = new ScriptRunner().runScript(name, scriptToRun,
                    new ScriptEngineManager().getEngineByExtension("js"), inputs, outputLogger);
            logMap("Outputs", ioBean.getOutputs(), outputLogger);
            logMap("Variables", vars.getVaribleValues(), outputLogger);
        } catch (Exception e) {
            outputLogger.logLine("\nException thrown: " + e);
        }
        this.output = outputLogger.getOutput();
    }

    private BaseResponse createResponse() {
        BaseResponse ret = new BaseResponse() {

            @Override
            public String getValue(String key) {
                return null;
            }
        };
        ret.setResponseBody(logicTestData.getResponseBody());
        for (Entry<String, String> entry : logicTestData.getResponseHeaders()) {
            ret.getHeaders().put(entry.getKey(), entry.getValue());
        }
        return ret;
    }

    private BaseRequest createRequest() {
        BaseRequest ret = new BaseRequest(null, null) {

            @Override
            public void setNamespace(String name, String value) {
            }

            @Override
            public void setKey(String key, String value) {
            }

            @Override
            public String getKey(String key) {
                return null;
            }
        };

        ret.setBody(logicTestData.getRequestBody());
        ret.addHeader("Test", "LoadTest");
        for (Entry<String, String> entry : logicTestData.getRequestHeaders()) {
            ret.addHeader(entry.getKey(), entry.getValue());
        }
        return ret;
    }

    private void logMap(String label, Map<String, ? extends Object> map, StringOutputLogger outputLogger) {
        if (!map.isEmpty()) {
            outputLogger.logLine(DASHES + " " + label + " " + DASHES);
            for (Entry<String, ? extends Object> entry : map.entrySet()) {
                outputLogger.logLine(entry.getKey() + " = " + entry.getValue());
            }
        }
    }

    /**
     * @return the buttonLabel
     */
    public String getButtonLabel() {
        return buttonLabel;
    }

    /**
     * @param buttonLabel
     *            the buttonLabel to set
     */
    public void setButtonLabel(String buttonLabel) {
        this.buttonLabel = buttonLabel;
    }

    /**
     * @return the script
     */
    public String getScript() {
        return script;
    }

    /**
     * @param script
     *            the script to set
     */
    public void setScript(String script) {
        this.script = script;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @return the output
     */
    public String getOutput() {
        return output;
    }

    /**
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the groupName
     */
    public String getGroupName() {
        return groupName;
    }

    /**
     * @param groupName
     *            the groupName to set
     */
    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    /**
     * @return the logicTestData
     */
    public LogicTestData getLogicTestData() {
        return logicTestData;
    }

}