View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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  			// sh -c requires all args in one string..
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 }