1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.actions.iface.tools.tcpmon;
14
15 import java.io.File;
16 import java.io.IOException;
17 import java.net.URL;
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.List;
21
22 import javax.swing.Action;
23
24 import org.apache.log4j.Logger;
25
26 import com.eviware.soapui.SoapUI;
27 import com.eviware.soapui.impl.wsdl.WsdlInterface;
28 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction;
29 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ArgumentBuilder;
30 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolHost;
31 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
32 import com.eviware.soapui.model.iface.Interface;
33 import com.eviware.soapui.settings.ToolsSettings;
34 import com.eviware.soapui.support.Tools;
35 import com.eviware.soapui.support.UISupport;
36 import com.eviware.soapui.support.types.StringToStringMap;
37 import com.eviware.x.form.XForm;
38 import com.eviware.x.form.XFormDialog;
39 import com.eviware.x.form.XFormDialogBuilder;
40 import com.eviware.x.form.XFormFactory;
41
42 /***
43 * Invokes Apache TCPmon tool
44 *
45 * @author Ole.Matzura
46 */
47
48 public class TcpMonAction extends AbstractToolsAction<WsdlInterface>
49 {
50 private static final String ENDPOINT = "Endpoint";
51 private static final String PORT = "Local Port";
52 private static final String ADD_ENDPOINT = "Add local endpoint";
53 private XForm mainForm;
54 private final static Logger log = Logger.getLogger(TcpMonAction.class);
55 public static final String SOAPUI_ACTION_ID = "TcpMonAction";
56
57 public TcpMonAction()
58 {
59 super( "Launch TcpMon", "Launch Tcp Mon for monitoring SOAP traffic");
60 }
61
62 protected XFormDialog buildDialog( WsdlInterface modelItem)
63 {
64 if( modelItem == null )
65 return null;
66
67 XFormDialogBuilder builder = XFormFactory.createDialogBuilder("Launch TcpMon");
68
69 mainForm = builder.createForm( "Basic" );
70 mainForm.addComboBox( ENDPOINT, new String[] {""}, "endpoint to forward to" );
71 mainForm.addTextField( PORT, "Local port to listen on.", XForm.FieldType.TEXT );
72 mainForm.addCheckBox( ADD_ENDPOINT, "adds an endpoint to the interface pointing to the started monitor" );
73
74 return builder.buildDialog( buildDefaultActions(HelpUrls.TCPMON_HELP_URL, modelItem),
75 "Specify arguments for launching TcpMon", UISupport.TOOL_ICON );
76 }
77
78 protected Action createRunOption( WsdlInterface modelItem)
79 {
80 Action action = super.createRunOption( modelItem );
81 action.putValue( Action.NAME, "Launch" );
82 return action;
83 }
84
85 protected StringToStringMap initValues(WsdlInterface modelItem, Object param)
86 {
87 if( modelItem != null )
88 {
89 List<String> endpoints = new ArrayList<String>( Arrays.asList( modelItem.getEndpoints() ));
90 endpoints.add( 0, null );
91 mainForm.setOptions( ENDPOINT, endpoints.toArray() );
92 }
93 else if( mainForm != null )
94 {
95 mainForm.setOptions( ENDPOINT, new String[] { null } );
96 }
97
98
99 StringToStringMap values = super.initValues( modelItem, param );
100 if( !values.isEmpty() )
101 return values;
102
103 values.put( ENDPOINT, getDefinition( modelItem ) );
104 values.put( PORT, "8080" );
105
106 return values;
107 }
108
109 protected void generate(StringToStringMap values, ToolHost toolHost, WsdlInterface modelItem ) throws Exception
110 {
111 String tcpMonDir = SoapUI.getSettings().getString( ToolsSettings.TCPMON_LOCATION, null );
112 if( Tools.isEmpty( tcpMonDir ))
113 {
114 UISupport.showErrorMessage( "TcpMon directory must be set in global preferences" );
115 return;
116 }
117
118 ProcessBuilder builder = new ProcessBuilder();
119 ArgumentBuilder args = buildArgs(modelItem);
120 builder.command(args.getArgs());
121 builder.directory(new File(tcpMonDir + File.separatorChar + "build" ));
122
123 if( log.isDebugEnabled() )
124 log.debug( "Launching tcpmon in directory [" + builder.directory() + "] with arguments [" +
125 args.toString() + "]" );
126
127 builder.start();
128 closeDialog(modelItem);
129 }
130
131 private ArgumentBuilder buildArgs(Interface modelItem) throws IOException
132 {
133 if( dialog == null )
134 {
135 ArgumentBuilder builder = new ArgumentBuilder( new StringToStringMap() );
136 builder.startScript( "tcpmon", ".bat", ".sh" );
137 return builder;
138 }
139
140 StringToStringMap values = dialog.getValues();
141
142 ArgumentBuilder builder = new ArgumentBuilder( values );
143 builder.startScript( "tcpmon", ".bat", ".sh" );
144
145 builder.addArgs( values.get( PORT ));
146 String endpoint = values.get( ENDPOINT );
147 if( endpoint != null && !endpoint.equals( "- none available -"))
148 {
149 URL url = new URL( endpoint);
150 builder.addArgs( url.getHost() );
151 builder.addArgs( (url.getPort() == -1) ? "80" : ""+url.getPort() );
152
153 if( values.getBoolean( ADD_ENDPOINT ))
154 {
155 modelItem.addEndpoint( "http://localhost:" + values.get( PORT ) + url.getPath() );
156 }
157 }
158
159 addToolArgs( values, builder );
160 return builder;
161 }
162 }