/* * 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.actions.iface.tools.tcpmon; import com.eviware.soapui.SoapUI; import com.eviware.soapui.impl.wsdl.WsdlInterface; 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.ToolHost; import com.eviware.soapui.impl.wsdl.support.HelpUrls; import com.eviware.soapui.settings.ToolsSettings; import com.eviware.soapui.support.Tools; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.types.StringToStringMap; import com.eviware.x.form.XForm; import com.eviware.x.form.XFormDialog; import com.eviware.x.form.XFormDialogBuilder; import com.eviware.x.form.XFormFactory; import javax.swing.Action; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Invokes Apache TCPmon tool * * @author Ole.Matzura */ public class TcpMonAction extends AbstractToolsAction<WsdlInterface> { private static final String ENDPOINT = "Endpoint"; private static final String PORT = "Local Port"; private static final String ADD_ENDPOINT = "Add local endpoint"; private XForm mainForm; public static final String SOAPUI_ACTION_ID = "TcpMonAction"; public TcpMonAction() { super("Launch TcpMon", "Launch Tcp Mon for monitoring SOAP traffic"); } protected XFormDialog buildDialog(WsdlInterface modelItem) { if (modelItem == null) { return null; } XFormDialogBuilder builder = XFormFactory.createDialogBuilder("Launch TcpMon"); mainForm = builder.createForm("Basic"); mainForm.addComboBox(ENDPOINT, new String[]{""}, "endpoint to forward to"); mainForm.addTextField(PORT, "Local port to listen on.", XForm.FieldType.TEXT); mainForm.addCheckBox(ADD_ENDPOINT, "adds an endpoint to the interface pointing to the started monitor"); return builder.buildDialog(buildDefaultActions(HelpUrls.TCPMON_HELP_URL, modelItem), "Specify arguments for launching TcpMon", UISupport.TOOL_ICON); } protected Action createRunOption(WsdlInterface modelItem) { Action action = super.createRunOption(modelItem); action.putValue(Action.NAME, "Launch"); return action; } protected StringToStringMap initValues(WsdlInterface modelItem, Object param) { if (modelItem != null) { List<String> endpoints = new ArrayList<String>(Arrays.asList(modelItem.getEndpoints())); endpoints.add(0, null); mainForm.setOptions(ENDPOINT, endpoints.toArray()); } else if (mainForm != null) { mainForm.setOptions(ENDPOINT, new String[]{null}); } StringToStringMap values = super.initValues(modelItem, param); if (!values.isEmpty()) { return values; } values.put(ENDPOINT, getDefinition(modelItem)); values.put(PORT, "8080"); return values; } protected void generate(StringToStringMap values, ToolHost toolHost, WsdlInterface modelItem) throws Exception { String tcpMonDir = SoapUI.getSettings().getString(ToolsSettings.TCPMON_LOCATION, null); if (Tools.isEmpty(tcpMonDir)) { UISupport.showErrorMessage("TcpMon directory must be set in global preferences"); return; } ProcessBuilder builder = new ProcessBuilder(); ArgumentBuilder args = buildArgs(modelItem); builder.command(args.getArgs()); builder.directory(new File(tcpMonDir + File.separatorChar + "build")); SoapUI.log("Launching tcpmon in directory [" + builder.directory() + "] with arguments [" + args.toString() + "]"); builder.start(); closeDialog(modelItem); } private ArgumentBuilder buildArgs(WsdlInterface modelItem) throws IOException { XFormDialog dialog = getDialog(); if (dialog == null) { ArgumentBuilder builder = new ArgumentBuilder(new StringToStringMap()); builder.startScript("tcpmon", ".bat", ".sh"); return builder; } StringToStringMap values = dialog.getValues(); ArgumentBuilder builder = new ArgumentBuilder(values); builder.startScript("tcpmon", ".bat", ".sh"); builder.addArgs(values.get(PORT)); String endpoint = values.get(ENDPOINT); if (endpoint != null && !endpoint.equals("- none available -")) { URL url = new URL(endpoint); builder.addArgs(url.getHost()); builder.addArgs((url.getPort() == -1) ? "80" : "" + url.getPort()); if (values.getBoolean(ADD_ENDPOINT)) { modelItem.addEndpoint("http://localhost:" + values.get(PORT) + url.getPath()); } } addToolArgs(values, builder); return builder; } }