/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.tools;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.analytics.Analytics;
import com.eviware.soapui.analytics.SoapUIActions;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.WsdlProjectFactory;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.RunnerContext;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolHost;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolRunner;
import com.eviware.soapui.model.iface.Interface;
import com.eviware.soapui.model.project.ProjectFactoryRegistry;
import com.eviware.soapui.support.UISupport;
import org.apache.commons.cli.CommandLine;
import java.io.File;
/**
* Standalone tool-runner used from maven-plugin, can also be used from
* command-line (see xdocs) or directly from other classes.
* <p>
* For standalone usage, set the project file (with setProjectFile) and other
* desired properties before calling run
* </p>
*
* @author Ole.Matzura
* @author <a href="mailto:nenadn@eviware.com">Nenad V. Nikolic</a>
*/
public class SoapUIToolRunner extends AbstractSoapUIRunner implements ToolHost, RunnerContext {
private String iface;
private String tool;
private RunnerStatus status;
private String projectPassword;
public static String TITLE = "SoapUI " + SoapUI.SOAPUI_VERSION + " Tool Runner";
/**
* Runs the specified tool in the specified soapUI project file, see SoapUI
* xdocs for details.
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
System.exit(new SoapUIToolRunner().runFromCommandLine(args));
}
/**
* Sets the tool(s) to run, can be a comma-seperated list
*
* @param tool the tools to run
*/
public void setTool(String tool) {
this.tool = tool;
}
public void setInterface(String iface) {
this.iface = iface;
}
public SoapUIToolRunner() {
super(TITLE);
}
public SoapUIToolRunner(String title) {
super(title);
}
public boolean runRunner() throws Exception {
UISupport.setToolHost(this);
String projectFile = getProjectFile();
if (!new File(projectFile).exists()) {
throw new Exception("SoapUI project file [" + projectFile + "] not found");
}
// WsdlProject project = new WsdlProject( projectFile,
// getProjectPassword() );
WsdlProject project = (WsdlProject) ProjectFactoryRegistry.getProjectFactory(WsdlProjectFactory.WSDL_TYPE)
.createNew(projectFile, getProjectPassword());
log.info("Running tools [" + tool + "] for interface [" + iface + "] in project [" + project.getName() + "]");
long startTime = System.nanoTime();
for (int c = 0; c < project.getInterfaceCount(); c++) {
Interface i = project.getInterfaceAt(c);
if (iface == null || i.getName().equals(iface)) {
runTool(i);
}
}
long timeTaken = (System.nanoTime() - startTime) / 1000000;
log.info("time taken: " + timeTaken + "ms");
return true;
}
/**
* Runs the configured tool(s) for the specified interface.
*
* @param iface an interface that exposes an invokable operation
*/
public void runTool(Interface iface) {
AbstractToolsAction<Interface> action = null;
String[] tools = tool.split(",");
for (String toolName : tools) {
if (toolName == null || toolName.trim().length() == 0) {
continue;
}
action = ToolActionFactory.createToolAction(toolName);
try {
if (action != null) {
log.info("Running tool [" + toolName + "] for Interface [" + iface.getName() + "]");
action.performHeadless(iface, null);
} else {
log.error("Specified tool [" + toolName + "] is unknown or unsupported.");
}
} catch (Exception e) {
SoapUI.logError(e);
}
}
}
public void run(ToolRunner runner) throws Exception {
status = RunnerStatus.RUNNING;
runner.setContext(this);
Analytics.trackAction(SoapUIActions.RUN_TOOL_FROM_COMMAND_LINE.getActionName(), "Tool", runner.getName());
runner.run();
}
public RunnerStatus getStatus() {
return status;
}
public String getTitle() {
return getClass().getSimpleName();
}
public String getProjectPassword() {
return projectPassword;
}
public void log(String msg) {
System.out.print(msg);
}
public void logError(String msg) {
System.err.println(msg);
}
public void setStatus(RunnerStatus status) {
this.status = status;
}
public void disposeContext() {
}
@Override
protected SoapUIOptions initCommandLineOptions() {
SoapUIOptions options = new SoapUIOptions("toolrunner");
options.addOption("i", true, "Sets the interface");
options.addOption("t", true, "Sets the tool to run");
options.addOption("s", true, "Sets the soapui-settings.xml file to use");
options.addOption("x", true, "Sets project password for decryption if project is encrypted");
options.addOption("v", true, "Sets password for soapui-settings.xml file");
options.addOption("f", true, "Sets report output folder");
options.addOption("D", true, "Sets system property with name=value");
options.addOption("G", true, "Sets global property with name=value");
return options;
}
@Override
protected boolean processCommandLine(CommandLine cmd) {
setTool(cmd.getOptionValue("t"));
if (cmd.hasOption("i")) {
setInterface(cmd.getOptionValue("i"));
}
if (cmd.hasOption("s")) {
setSettingsFile(getCommandLineOptionSubstSpace(cmd, "s"));
}
if (cmd.hasOption("x")) {
setProjectPassword(cmd.getOptionValue("x"));
}
if (cmd.hasOption("v")) {
setSoapUISettingsPassword(cmd.getOptionValue("v"));
}
if (cmd.hasOption("D")) {
setSystemProperties(cmd.getOptionValues("D"));
}
if (cmd.hasOption("G")) {
setGlobalProperties(cmd.getOptionValues("G"));
}
if (cmd.hasOption("f")) {
setOutputFolder(cmd.getOptionValue("f"));
}
return true;
}
public void setProjectPassword(String projectPassword) {
this.projectPassword = projectPassword;
}
}