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 if( str == null )
73 return "";
74
75 StringBuffer buf = new StringBuffer();
76
77 for( int c = 0; c < str.length(); c++ )
78 {
79 char ch = str.charAt( c );
80 switch( ch )
81 {
82 case ' ' :
83 buf.append( "%20" );
84 break;
85 default :
86 buf.append( ch );
87 }
88 }
89
90 return buf.toString();
91 }
92
93 public boolean addString( String name, String arg )
94 {
95 if( !values.containsKey( name ) )
96 return false;
97
98 String value = values.get( name ).toString();
99 if( value == null || value.length() == 0 )
100 return false;
101
102 if( arg != null )
103 args.add( arg );
104
105 args.add( value );
106
107 return true;
108 }
109
110 public boolean addStrings( String name, String arg, String sep )
111 {
112 if( !values.containsKey( name ) )
113 return false;
114
115 String value = values.get( name ).toString();
116 if( value == null || value.length() == 0 )
117 return false;
118
119 for( String v : value.split( sep ) )
120 {
121 if( arg != null )
122 args.add( arg );
123
124 args.add( v.trim() );
125 }
126
127 return true;
128 }
129
130 public boolean addStringShadow( String name, String arg )
131 {
132 if( !values.containsKey( name ) )
133 return false;
134
135 String value = values.get( name ).toString();
136 if( value == null || value.length() == 0 )
137 {
138 return false;
139 }
140
141 if( arg != null )
142 {
143 args.add( arg );
144 }
145
146 args.add( value );
147 argsToShadow.add( value );
148
149 return true;
150 }
151
152 public ArgumentBuilder addArgs( String... args )
153 {
154 for( int c = 0; c < args.length; c++ )
155 this.args.add( args[c] );
156
157 return this;
158 }
159
160 public boolean addBoolean( String name, String arg )
161 {
162 if( values.containsKey( name ) && Boolean.valueOf( values.get( name ).toString() ) )
163 {
164 args.add( arg );
165 return true;
166 }
167
168 return false;
169 }
170
171 /***
172 * Arguments that are added
173 */
174 public String toString()
175 {
176 StringBuffer buf = new StringBuffer();
177 for( int cnt = 0; cnt < args.size(); cnt++ )
178 {
179 if( cnt > 0 )
180 {
181 buf.append( ' ' );
182 }
183
184 String value = args.get( cnt );
185 for( String argToShadow : argsToShadow )
186 {
187 if( value.equals( argToShadow ) )
188 {
189 value = SHADOW;
190 break;
191 }
192 if( value.startsWith( argToShadow ) )
193 {
194 value = argToShadow + SHADOW;
195 break;
196 }
197 }
198
199 if( value.indexOf( '-' ) == 0 )
200 {
201 if( value.indexOf( ' ' ) > 1 )
202 buf.append( value.substring( 0, 2 ) ).append( '"' ).append( value.substring( 2 ) ).append( '"' );
203 else
204 buf.append( value );
205 }
206 else if( value.indexOf( ' ' ) >= 0 )
207 {
208 buf.append( '"' ).append( value ).append( '"' );
209 }
210 else
211 buf.append( value );
212 }
213
214 return buf.toString();
215 }
216
217 public ArgumentBuilder startScript( String script )
218 {
219 return startScript( script, ".bat", ".sh" );
220 }
221
222 public boolean addString( String name, String arg, String separator )
223 {
224 if( !values.containsKey( name ) )
225 return false;
226
227 String value = values.get( name ).toString();
228 if( value == null || value.length() == 0 )
229 return false;
230
231 args.add( arg + separator + value );
232
233 return true;
234 }
235
236 /***
237 * Just remember how argument starts, assumes that value can change.
238 */
239 public boolean addStringShadow( String name, String arg, String separator )
240 {
241
242 if( !values.containsKey( name ) )
243 return false;
244
245 String value = values.get( name ).toString();
246 if( value == null || value.length() == 0 )
247 return false;
248
249 args.add( arg + separator + value );
250 argsToShadow.add( arg + separator );
251
252 return true;
253 }
254
255 public boolean addBoolean( String name, String arg, String trueValue, String falseValue )
256 {
257 if( !values.containsKey( name ) )
258 return false;
259
260 args.add( arg );
261
262 if( Boolean.valueOf( values.get( name ).toString() ) )
263 {
264 args.add( trueValue );
265 return true;
266 }
267 else
268 {
269 args.add( falseValue );
270 return false;
271 }
272 }
273
274 public ArgumentBuilder startScript( String script, String windowsExt, String unixExt )
275 {
276 if( UISupport.isWindows() && windowsExt != null )
277 {
278 addArgs( "cmd.exe", "/C", script + windowsExt );
279 }
280 else
281 {
282 isUnix = true;
283
284 if( !script.startsWith( "." ) && !script.startsWith( File.separator ) )
285 script = "./" + script;
286
287 addArgs( "sh", "-c", script + unixExt );
288 }
289
290 return this;
291 }
292
293 public String[] getStringArgs()
294 {
295 return args.toArray( new String[args.size()] );
296 }
297
298 }