package com.intuit.tank.script.processor;
/*
* #%L
* Script Processor
* %%
* 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 java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.dao.ScriptDao;
import com.intuit.tank.project.Script;
import com.intuit.tank.project.ScriptFilter;
import com.intuit.tank.project.ScriptStep;
import com.intuit.tank.script.util.OwaspReader;
import com.intuit.tank.script.util.RecordedScriptReader;
import com.intuit.tank.script.util.ScriptFilterUtil;
import com.intuit.tank.vm.common.PercentCompleteMonitor;
import com.intuit.tank.vm.common.util.MethodTimer;
import com.intuit.tank.vm.exception.WatsParseException;
/**
*
* ScriptProcessor
*
* @author dangleton
*
*/
@Named
public class ScriptProcessor implements Runnable, Serializable {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LogManager.getLogger(ScriptProcessor.class);
@Inject
private PercentCompleteMonitor monitor;
private Script script = null;
private List<ScriptStep> steps;
public ScriptProcessor() {
}
/**
*
* @param xml
* @param filters
* @throws WatsParseException
*/
public List<ScriptStep> parseScript(String xml, List<ScriptFilter> filters) throws WatsParseException {
return parseScript(new StringReader(xml), filters);
}
/**
* @return the monitor
*/
public PercentCompleteMonitor getMonitor() {
return monitor;
}
/**
* @param monitor
* the monitor to set
*/
public void setMonitor(PercentCompleteMonitor monitor) {
this.monitor = monitor;
}
/**
*
* @param reader
* @param filters
* @throws WatsParseException
*/
public List<ScriptStep> parseScript(Reader reader, List<ScriptFilter> filters) throws WatsParseException {
MethodTimer timer = new MethodTimer(LOG, getClass(), "parseScript");
timer.start();
// parse xml
steps = getScriptSteps(reader, filters);
if (script != null) {
monitor.setSavingStarted(script.getId());
}
timer.markAndLog("Parse Script with " + steps.size() + " steps");
return steps;
}
/**
* @param script
* the script to set
*/
public void setScript(Script script) {
this.script = script;
}
@Override
public void run() {
ScriptDao scriptDao = new ScriptDao();
if (script != null) {
MethodTimer timer = new MethodTimer(LOG, getClass(), "run");
timer.start();
// save script to db
try {
setScriptSteps(script, steps);
scriptDao.saveOrUpdate(script);
timer.markAndLog("Save Script of with " + steps.size() + " steps");
if (script != null) {
monitor.setProcessingComplete(script.getId());
}
} catch (Exception e) {
if (script != null) {
monitor.setError(script.getId(), 204);
}
timer.markAndLog("Save Script failed");
LOG.error(e);
}
}
}
public List<ScriptStep> getScriptSteps(Reader reader, Collection<ScriptFilter> filters) throws WatsParseException {
List<ScriptStep> entries = null;
RecordedScriptReader scriptReader = new OwaspReader();
if (script != null) {
setScriptSteps(script, scriptReader.read(reader));
ScriptFilterUtil.applyFiltersToScript(filters, script);
entries = script.getScriptSteps();
} else {
entries = ScriptFilterUtil.applyFilters(filters, scriptReader.read(reader));
}
return entries;
}
public void setScriptSteps(Script script, List<ScriptStep> steps) {
LOG.debug("script " + script.getName() + " has " + steps.size() + " steps");
List<ScriptStep> newSteps = new ArrayList<ScriptStep>();
for (ScriptStep step : steps) {
newSteps.add(step);
}
script.getScriptSteps().clear();
script.getScriptSteps().addAll(newSteps);
}
}