View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2009 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 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 }