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 com.intuit.tank.util.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;
}
}