/*
* 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.impl.wsdl.panels.request.actions;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.wsdl.WsdlRequest;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ArgumentBuilder;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ProcessToolRunner;
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.wsi.WSIAnalyzeAction;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.wsi.WSIReportPanel;
import com.eviware.soapui.model.iface.Response;
import com.eviware.soapui.model.settings.Settings;
import com.eviware.soapui.settings.WSISettings;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.types.StringToStringMap;
import com.eviware.soapui.support.types.StringToStringsMap;
import com.eviware.soapui.ui.support.DefaultDesktopPanel;
import org.apache.log4j.Logger;
import org.wsI.testing.x2003.x03.analyzerConfig.AssertionResults;
import org.wsI.testing.x2003.x03.analyzerConfig.Configuration;
import org.wsI.testing.x2003.x03.analyzerConfig.ConfigurationDocument;
import org.wsI.testing.x2003.x03.analyzerConfig.LogFile;
import org.wsI.testing.x2003.x03.analyzerConfig.LogFile.CorrelationType;
import org.wsI.testing.x2003.x03.analyzerConfig.ReportFile;
import org.wsI.testing.x2003.x03.common.AddStyleSheet;
import org.wsI.testing.x2003.x03.log.Environment;
import org.wsI.testing.x2003.x03.log.HttpMessageEntry;
import org.wsI.testing.x2003.x03.log.Implementation;
import org.wsI.testing.x2003.x03.log.Log;
import org.wsI.testing.x2003.x03.log.LogDocument;
import org.wsI.testing.x2003.x03.log.MessageEntry;
import org.wsI.testing.x2003.x03.log.Monitor;
import org.wsI.testing.x2003.x03.log.NameVersionPair;
import org.wsI.testing.x2003.x03.log.TcpMessageType;
import javax.swing.SwingUtilities;
import java.awt.Dimension;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Calendar;
import java.util.List;
/**
* Validates the request XML of a WsdlRequest
*
* @author Ole.Matzura
*/
public class WSIValidateRequestAction extends AbstractToolsAction<WsdlRequest> {
public final static Logger log = Logger.getLogger(WSIValidateRequestAction.class);
private String configFile;
private File logFile;
private String wsiDir;
private String profile;
public WSIValidateRequestAction() {
super("Check WS-I Compliance", "Validates the current request/response against the WS-I Basic Profile");
}
protected void generate(StringToStringMap values, ToolHost toolHost, WsdlRequest modelItem) throws Exception {
if (modelItem.getResponse() == null) {
UISupport.showErrorMessage("Response required for WS-I validations");
return;
}
wsiDir = SoapUI.getSettings().getString(WSISettings.WSI_LOCATION,
System.getProperty(WSIAnalyzeAction.WSI_DIR_PROP_NAME, System.getenv(WSIAnalyzeAction.WSI_HOME_ENV_VAR_NAME)));
if (wsiDir == null) {
UISupport.showErrorMessage("WSI Test Tools directory must be set in global preferences");
return;
}
if (modelItem.getAttachmentCount() > 0 || modelItem.getResponse().getAttachments().length > 0) {
if (!UISupport.confirm("Message contains attachments which is not supported by "
+ "validation tools, validate anyway?", "Validation Warning")) {
return;
}
}
profile = SoapUI.getSettings().getString(WSISettings.PROFILE_TYPE, WSISettings.BASIC_PROFILE_10_TAD);
ProcessBuilder builder = new ProcessBuilder();
File reportFile = File.createTempFile(WSIAnalyzeAction.WSI_REPORT_NAME, WSIAnalyzeAction.XML_EXTENSION);
ArgumentBuilder args = buildArgs(reportFile, modelItem);
builder.command(args.getArgs());
builder.directory(new File(wsiDir));
toolHost.run(new WSIProcessToolRunner(builder, reportFile, modelItem));
}
private ArgumentBuilder buildArgs(File reportFile, WsdlRequest modelItem) throws Exception {
File logFile = buildLog(modelItem);
File file = buildConfig(reportFile, logFile, modelItem);
Settings settings = modelItem.getSettings();
ArgumentBuilder builder = new ArgumentBuilder(new StringToStringMap());
builder.startScript(wsiDir + File.separator +
(profile.equals(WSISettings.BASIC_PROFILE_10_TAD)?WSIAnalyzeAction.ANALYZER_V10_NAME:WSIAnalyzeAction.ANALYZER_V11_NAME),
WSIAnalyzeAction.WIN_BATCH_FILE_EXTENSION, WSIAnalyzeAction.UNIX_BATCH_FILE_EXTENSION);
builder.addArgs("-config", file.getAbsolutePath());
return builder;
}
private File buildLog(WsdlRequest modelItem) throws Exception {
LogDocument logDoc = LogDocument.Factory.newInstance();
Log log = logDoc.addNewLog();
log.setTimestamp(Calendar.getInstance());
addMonitorConfig(log);
addMessageConfig(log, modelItem);
logFile = File.createTempFile("wsi-analyzer-log", ".xml");
logDoc.save(logFile);
return logFile;
}
private File buildConfig(File reportFile, File logFile, WsdlRequest modelItem) throws IOException {
Settings settings = modelItem.getSettings();
ConfigurationDocument configDoc = ConfigurationDocument.Factory.newInstance();
Configuration config = configDoc.addNewConfiguration();
config.setVerbose(settings.getBoolean(WSISettings.VERBOSE));
AssertionResults results = config.addNewAssertionResults();
/*results.setType(AssertionResults.Type.Enum.forString(settings.getString(WSISettings.RESULTS_TYPE,
AssertionResults.Type.ONLY_FAILED.toString())));*/
results.setType(AssertionResults.Type.Enum.forString(WSIAnalyzeAction.ALL_RESULT_TYPE));
results.setMessageEntry(settings.getBoolean(WSISettings.MESSAGE_ENTRY));
results.setFailureMessage(settings.getBoolean(WSISettings.FAILURE_MESSAGE));
results.setAssertionDescription(settings.getBoolean(WSISettings.ASSERTION_DESCRIPTION));
ReportFile report = config.addNewReportFile();
report.setLocation(reportFile.getAbsolutePath());
report.setReplace(true);
AddStyleSheet stylesheet = report.addNewAddStyleSheet();
stylesheet.setHref(WSIAnalyzeAction.PROFILES_DIR_RELATED_PATH + profile);
stylesheet.setType("text/xsl");
stylesheet.setAlternate(false);
config.setTestAssertionsFile(WSIAnalyzeAction.PROFILES_DIR_RELATED_PATH + profile);
LogFile logFileConfig = config.addNewLogFile();
logFileConfig.setStringValue(logFile.getAbsolutePath());
logFileConfig.setCorrelationType(CorrelationType.ENDPOINT);
configFile = configDoc.toString();
File file = File.createTempFile(WSIAnalyzeAction.WSI_ANALYZER_CONFIG, WSIAnalyzeAction.XML_EXTENSION);
configDoc.save(file);
return file;
}
private void addMessageConfig(Log log, WsdlRequest modelItem) throws MalformedURLException {
HttpMessageEntry requestMessage = HttpMessageEntry.Factory.newInstance();
requestMessage.addNewMessageContent().setStringValue(modelItem.getRequestContent());
requestMessage.setConversationID("1");
requestMessage.setTimestamp(Calendar.getInstance());
requestMessage.setID("1");
URL endpoint = new URL(modelItem.getEndpoint());
requestMessage.setSenderHostAndPort("localhost");
if (endpoint.getPort() > 0) {
requestMessage.setReceiverHostAndPort(endpoint.getHost() + ":" + endpoint.getPort());
} else {
requestMessage.setReceiverHostAndPort(endpoint.getHost());
}
requestMessage.setType(TcpMessageType.REQUEST);
Response response = modelItem.getResponse();
HttpMessageEntry responseMessage = HttpMessageEntry.Factory.newInstance();
responseMessage.addNewMessageContent().setStringValue(response.getContentAsString());
responseMessage.setConversationID("1");
responseMessage.setType(TcpMessageType.RESPONSE);
responseMessage.setTimestamp(Calendar.getInstance());
responseMessage.setID("2");
responseMessage.setSenderHostAndPort(requestMessage.getReceiverHostAndPort());
responseMessage.setReceiverHostAndPort(requestMessage.getSenderHostAndPort());
String requestHeaders = buildHttpHeadersString(response.getRequestHeaders());
requestMessage.setHttpHeaders("POST " + endpoint.getPath() + " HTTP/1.1\r\n" + requestHeaders);
responseMessage.setHttpHeaders(buildHttpHeadersString(response.getResponseHeaders()));
log.setMessageEntryArray(new MessageEntry[]{requestMessage, responseMessage});
}
private void addMonitorConfig(Log log) throws Exception {
Monitor monitor = log.addNewMonitor();
monitor.setVersion("1.5");
monitor.setReleaseDate(Calendar.getInstance());
org.wsI.testing.x2003.x03.monitorConfig.Configuration conf = monitor.addNewConfiguration();
conf.setCleanupTimeoutSeconds(0);
conf.setLogDuration(0);
org.wsI.testing.x2003.x03.monitorConfig.LogFile logFileConf = conf.addNewLogFile();
logFileConf.setLocation("report.xml");
logFileConf.setReplace(true);
/*
* ArrayOfRedirectConfig mintConf = conf.addNewManInTheMiddle();
* RedirectConfig redirect = mintConf.addNewRedirect();
* redirect.setListenPort( 9999 ); redirect.setMaxConnections( 10 );
* redirect.setReadTimeoutSeconds( 10 );
*
* URL endpoint = new URL( modelItem.getEndpoint()); if(
* endpoint.getPort() > 0 ) redirect.setSchemeAndHostPort(
* endpoint.getHost() + ":" + endpoint.getPort()); else
* redirect.setSchemeAndHostPort( endpoint.getHost() );
*/
Environment env = monitor.addNewEnvironment();
NameVersionPair osConf = env.addNewOperatingSystem();
osConf.setName("Windows");
osConf.setVersion("2003");
NameVersionPair rtConf = env.addNewRuntime();
rtConf.setName("java");
rtConf.setVersion("1.5");
NameVersionPair xpConf = env.addNewXmlParser();
xpConf.setName("xmlbeans");
xpConf.setVersion("2.1.0");
Implementation implConf = monitor.addNewImplementer();
implConf.setName("soapui");
implConf.setLocation("here");
}
private String buildHttpHeadersString(StringToStringsMap headers) {
StringBuffer buffer = new StringBuffer();
if (headers.containsKey("#status#")) {
buffer.append(headers.get("#status#")).append("\r\n");
}
for (String header : headers.keySet()) {
if (!header.equals("#status#")) {
for (String value : headers.get(header)) {
buffer.append(header).append(": ").append(value).append("\r\n");
}
}
}
return buffer.toString();
}
private class WSIProcessToolRunner extends ProcessToolRunner {
private final File reportFile;
private final WsdlRequest modelItem;
public WSIProcessToolRunner(ProcessBuilder builder, File reportFile, WsdlRequest modelItem) {
super(builder, "WSI Message Validation", modelItem);
this.reportFile = reportFile;
this.modelItem = modelItem;
}
public String getDescription() {
return "Running WSI Analysis tools...";
}
protected void afterRun(int exitCode, RunnerContext context) {
if (exitCode == 0 && context.getStatus() == RunnerContext.RunnerStatus.FINISHED) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
WSIReportPanel panel = new WSIReportPanel(WSIAnalyzeAction.transformReport(reportFile),
configFile, logFile, true);
panel.setPreferredSize(new Dimension(600, 400));
UISupport.showDesktopPanel(new DefaultDesktopPanel("WS-I Report",
"WS-I Report for validation of messages in request [" + modelItem.getName() + "]", panel));
} catch (Exception e) {
UISupport.showErrorMessage(e);
}
}
});
} else {
ProcessBuilder processBuilder = getBuilders()[0];
List<String> programAndArgs = processBuilder.command();
log.error("WSI checking failed. Exit code " + new Integer(exitCode).toString() + ". Command line: " + getCommandDetails(programAndArgs));
}
}
private String getCommandDetails (List<String> command){
String str = "";
for (String entity: command){
str += entity + " ";
}
return str;
}
public boolean showLog() {
return modelItem.getSettings().getBoolean(WSISettings.SHOW_LOG);
}
@Override
protected void beforeProcess(ProcessBuilder processBuilder, RunnerContext context) {
processBuilder.environment().put(WSIAnalyzeAction.WSI_HOME_ENV_VAR_NAME, wsiDir);
}
}
}