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 addStringShadow( String name, String arg )
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 {
118 return false;
119 }
120
121 if( arg != null )
122 {
123 args.add( arg );
124 }
125
126 args.add( value );
127 argsToShadow.add( value );
128
129 return true;
130 }
131
132 public ArgumentBuilder addArgs( String... args )
133 {
134 for( int c = 0; c < args.length; c++ )
135 this.args.add( args[c] );
136
137 return this;
138 }
139
140 public boolean addBoolean( String name, String arg )
141 {
142 if( values.containsKey( name ) && Boolean.valueOf( values.get( name ).toString() ) )
143 {
144 args.add( arg );
145 return true;
146 }
147
148 return false;
149 }
150
151 /***
152 * Arguments that are added
153 */
154 public String toString()
155 {
156 StringBuffer buf = new StringBuffer();
157 for( int cnt = 0; cnt < args.size(); cnt++ )
158 {
159 if( cnt > 0 )
160 {
161 buf.append( ' ' );
162 }
163
164 String value = args.get( cnt );
165 for( String argToShadow : argsToShadow )
166 {
167 if( value.equals( argToShadow ) )
168 {
169 value = SHADOW;
170 break;
171 }
172 if( value.startsWith( argToShadow ) )
173 {
174 value = argToShadow + SHADOW;
175 break;
176 }
177 }
178 buf.append( value );
179 }
180
181 return buf.toString();
182 }
183
184 public ArgumentBuilder startScript( String script )
185 {
186 return startScript( script, ".bat", ".sh" );
187 }
188
189 public boolean addString( String name, String arg, String separator )
190 {
191 if( !values.containsKey( name ) )
192 return false;
193
194 String value = values.get( name ).toString();
195 if( value == null || value.length() == 0 )
196 return false;
197
198 args.add( arg + separator + value );
199
200 return true;
201 }
202
203 /***
204 * Just remember how argument starts, assumes that value can change.
205 */
206 public boolean addStringShadow( String name, String arg, String separator )
207 {
208
209 if( !values.containsKey( name ) )
210 return false;
211
212 String value = values.get( name ).toString();
213 if( value == null || value.length() == 0 )
214 return false;
215
216 args.add( arg + separator + value );
217 argsToShadow.add( arg + separator );
218
219 return true;
220 }
221
222 public boolean addBoolean( String name, String arg, String trueValue, String falseValue )
223 {
224 if( !values.containsKey( name ) )
225 return false;
226
227 args.add( arg );
228
229 if( Boolean.valueOf( values.get( name ).toString() ) )
230 {
231 args.add( trueValue );
232 return true;
233 }
234 else
235 {
236 args.add( falseValue );
237 return false;
238 }
239 }
240
241 public ArgumentBuilder startScript( String script, String windowsExt, String unixExt )
242 {
243 if( UISupport.isWindows() && windowsExt != null )
244 {
245 addArgs( "cmd.exe", "/C", script + windowsExt );
246 }
247 else
248 {
249 isUnix = true;
250
251 if( !script.startsWith( "." ) && !script.startsWith( File.separator ) )
252 script = "./" + script;
253
254 addArgs( "sh", "-c", script + unixExt );
255 }
256
257 return this;
258 }
259
260 public String[] getStringArgs()
261 {
262 return args.toArray( new String[args.size()] );
263 }
264
265 }