1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.actions.iface.tools.support;
14
15 import java.io.File;
16 import java.util.ArrayList;
17 import java.util.List;
18
19 import com.eviware.soapui.support.UISupport;
20 import com.eviware.soapui.support.types.StringToStringMap;
21
22 /***
23 * Utility for build commandline arguments from dialog input
24 *
25 * @author ole.matzura
26 */
27
28 public class ArgumentBuilder
29 {
30 private static final String SHADOW = "XXXXXX";
31 private final StringToStringMap values;
32 private List<String> args = new ArrayList<String>();
33 /***
34 * List of arguments that needs to be shadowed.
35 */
36 private List<String> argsToShadow = new ArrayList<String>();
37 private boolean isUnix;
38
39 public ArgumentBuilder( StringToStringMap values )
40 {
41 this.values = values;
42 }
43
44 public List<String> getArgs()
45 {
46 if( isUnix )
47 {
48
49 StringBuffer buf = new StringBuffer();
50 for( int c = 2; c < args.size(); c++ )
51 {
52 if( c > 2 )
53 buf.append( ' ' );
54 buf.append( escapeUnixArg( args.get( c )));
55 }
56
57 ArrayList<String> result = new ArrayList<String>();
58 result.add( args.get( 0 ));
59 result.add( args.get( 1 ));
60 result.add( buf.toString() );
61
62 return result;
63 }
64 else
65 {
66 return new ArrayList<String>( args );
67 }
68 }
69
70 private String escapeUnixArg( String str )
71 {
72 StringBuffer buf = new StringBuffer();
73
74 for( int c = 0; c < str.length(); c++ )
75 {
76 char ch = str.charAt( c );
77 switch( ch )
78 {
79 case ' ' : buf.append( "%20" ); break;
80 default : buf.append( ch );
81 }
82 }
83
84 return buf.toString();
85 }
86
87 public boolean addString(String name, String arg)
88 {
89 if( !values.containsKey( name ))
90 return false;
91
92 String value = values.get( name ).toString();
93 if( value == null || value.length() == 0 )
94 return false;
95
96 if( arg != null )
97 args.add( arg );
98
99 args.add( value);
100
101 return true;
102 }
103
104 public boolean addStringShadow(String name, String arg)
105 {
106 if( !values.containsKey( name ))
107 return false;
108
109 String value = values.get( name ).toString();
110 if( value == null || value.length() == 0 ) {
111 return false;
112 }
113
114 if( arg != null ) {
115 args.add( arg );
116 }
117
118 args.add( value );
119 argsToShadow.add( value );
120
121 return true;
122 }
123
124 public ArgumentBuilder addArgs( String... args )
125 {
126 for( int c = 0; c < args.length; c++ )
127 this.args.add( args[c] );
128
129 return this;
130 }
131
132 public boolean addBoolean( String name, String arg )
133 {
134 if( values.containsKey( name ) && Boolean.valueOf( values.get( name ).toString() ))
135 {
136 args.add( arg );
137 return true;
138 }
139
140 return false;
141 }
142
143 /***
144 * Arguments that are added
145 */
146 public String toString()
147 {
148 StringBuffer buf = new StringBuffer();
149 for( int cnt = 0; cnt < args.size(); cnt++ )
150 {
151 if( cnt > 0 ) {
152 buf.append( ' ' );
153 }
154
155 String value = args.get(cnt);
156 for(String argToShadow : argsToShadow ) {
157 if( value.equals(argToShadow) ) {
158 value = SHADOW;
159 break;
160 }
161 if (value.startsWith(argToShadow)) {
162 value = argToShadow + SHADOW;
163 break;
164 }
165 }
166 buf.append( value );
167 }
168
169 return buf.toString();
170 }
171
172 public ArgumentBuilder startScript(String script)
173 {
174 return startScript( script, ".bat", ".sh" );
175 }
176
177 public boolean addString(String name, String arg, String separator)
178 {
179 if( !values.containsKey( name ))
180 return false;
181
182 String value = values.get( name ).toString();
183 if( value == null || value.length() == 0 )
184 return false;
185
186 args.add( arg + separator + value );
187
188 return true;
189 }
190
191 /***
192 * Just remember how argument starts, assumes that value can change.
193 */
194 public boolean addStringShadow(String name, String arg, String separator)
195 {
196
197 if( !values.containsKey( name ))
198 return false;
199
200 String value = values.get( name ).toString();
201 if( value == null || value.length() == 0 )
202 return false;
203
204 args.add( arg + separator + value );
205 argsToShadow.add( arg + separator);
206
207 return true;
208 }
209
210 public boolean addBoolean(String name, String arg, String trueValue, String falseValue )
211 {
212 if( !values.containsKey( name ))
213 return false;
214
215 args.add( arg );
216
217 if( Boolean.valueOf( values.get( name ).toString() ))
218 {
219 args.add( trueValue );
220 return true;
221 }
222 else
223 {
224 args.add( falseValue );
225 return false;
226 }
227 }
228
229 public ArgumentBuilder startScript(String script, String windowsExt, String unixExt )
230 {
231 if( UISupport.isWindows() && windowsExt != null )
232 {
233 addArgs( "cmd.exe", "/C", script + windowsExt );
234 }
235 else
236 {
237 isUnix = true;
238
239 if( !script.startsWith( "." ) && !script.startsWith( File.separator ))
240 script = "./" + script;
241
242 addArgs( "sh", "-c", script + unixExt );
243 }
244
245 return this;
246 }
247
248 public String[] getStringArgs()
249 {
250 return args.toArray( new String[args.size()] );
251 }
252
253 }