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 buf.append( value );
199 }
200
201 return buf.toString();
202 }
203
204 public ArgumentBuilder startScript( String script )
205 {
206 return startScript( script, ".bat", ".sh" );
207 }
208
209 public boolean addString( String name, String arg, String separator )
210 {
211 if( !values.containsKey( name ) )
212 return false;
213
214 String value = values.get( name ).toString();
215 if( value == null || value.length() == 0 )
216 return false;
217
218 args.add( arg + separator + value );
219
220 return true;
221 }
222
223 /***
224 * Just remember how argument starts, assumes that value can change.
225 */
226 public boolean addStringShadow( String name, String arg, String separator )
227 {
228
229 if( !values.containsKey( name ) )
230 return false;
231
232 String value = values.get( name ).toString();
233 if( value == null || value.length() == 0 )
234 return false;
235
236 args.add( arg + separator + value );
237 argsToShadow.add( arg + separator );
238
239 return true;
240 }
241
242 public boolean addBoolean( String name, String arg, String trueValue, String falseValue )
243 {
244 if( !values.containsKey( name ) )
245 return false;
246
247 args.add( arg );
248
249 if( Boolean.valueOf( values.get( name ).toString() ) )
250 {
251 args.add( trueValue );
252 return true;
253 }
254 else
255 {
256 args.add( falseValue );
257 return false;
258 }
259 }
260
261 public ArgumentBuilder startScript( String script, String windowsExt, String unixExt )
262 {
263 if( UISupport.isWindows() && windowsExt != null )
264 {
265 addArgs( "cmd.exe", "/C", script + windowsExt );
266 }
267 else
268 {
269 isUnix = true;
270
271 if( !script.startsWith( "." ) && !script.startsWith( File.separator ) )
272 script = "./" + script;
273
274 addArgs( "sh", "-c", script + unixExt );
275 }
276
277 return this;
278 }
279
280 public String[] getStringArgs()
281 {
282 return args.toArray( new String[args.size()] );
283 }
284
285 }