View Javadoc

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