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 public class ArgumentBuilder
23 {
24 private final StringToStringMap values;
25 private List<String> args = new ArrayList<String>();
26 private boolean isUnix;
27
28 public ArgumentBuilder( StringToStringMap values )
29 {
30 this.values = values;
31 }
32
33 public List<String> getArgs()
34 {
35 if( isUnix )
36 {
37
38 StringBuffer buf = new StringBuffer();
39 for( int c = 2; c < args.size(); c++ )
40 {
41 if( c > 2 )
42 buf.append( ' ' );
43 buf.append( escapeUnixArg( args.get( c )));
44 }
45
46 ArrayList<String> result = new ArrayList<String>();
47 result.add( args.get( 0 ));
48 result.add( args.get( 1 ));
49 result.add( buf.toString() );
50
51 return result;
52 }
53 else
54 {
55 return new ArrayList<String>( args );
56 }
57 }
58
59 private String escapeUnixArg( String str )
60 {
61 StringBuffer buf = new StringBuffer();
62 int spaceIndex = str.indexOf( ' ' );
63 if( spaceIndex >= 0 )
64 {
65 buf.append( "//'" );
66 }
67
68 for( int c = 0; c < str.length(); c++ )
69 {
70 char ch = str.charAt( c );
71 switch( ch )
72 {
73 case '\'' : buf.append( "//'" ); break;
74 case '//' : buf.append( "////" ); break;
75 default : buf.append( ch );
76 }
77 }
78
79 if( spaceIndex >= 0 )
80 {
81 buf.append( "//'" );
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 ArgumentBuilder addArgs( String... args )
105 {
106 for( int c = 0; c < args.length; c++ )
107 this.args.add( args[c] );
108
109 return this;
110 }
111
112 public boolean addBoolean( String name, String arg )
113 {
114 if( values.containsKey( name ) && Boolean.valueOf( values.get( name ).toString() ))
115 {
116 args.add( arg );
117 return true;
118 }
119
120 return false;
121 }
122
123 public String toString()
124 {
125 StringBuffer buf = new StringBuffer();
126 for( int c = 0; c < args.size(); c++ )
127 {
128 if( c > 0 )
129 buf.append( ' ' );
130
131 buf.append( args.get( c ));
132 }
133
134 return buf.toString();
135 }
136
137 public ArgumentBuilder startScript(String script)
138 {
139 return startScript( script, ".bat", ".sh" );
140 }
141
142 public boolean addString(String name, String arg, String separator)
143 {
144 if( !values.containsKey( name ))
145 return false;
146
147 String value = values.get( name ).toString();
148 if( value == null || value.length() == 0 )
149 return false;
150
151 args.add( arg + separator + value );
152
153 return true;
154 }
155
156 public boolean addBoolean(String name, String arg, String trueValue, String falseValue )
157 {
158 if( !values.containsKey( name ))
159 return false;
160
161 args.add( arg );
162
163 if( Boolean.valueOf( values.get( name ).toString() ))
164 {
165 args.add( trueValue );
166 return true;
167 }
168 else
169 {
170 args.add( falseValue );
171 return false;
172 }
173 }
174
175 public ArgumentBuilder startScript(String script, String windowsExt, String unixExt )
176 {
177 if( UISupport.isWindows() && windowsExt != null )
178 {
179 addArgs( "cmd.exe", "/C", script + windowsExt );
180 }
181 else
182 {
183 isUnix = true;
184
185 if( !script.startsWith( "." ) && !script.startsWith( File.separator ))
186 script = "./" + script;
187
188 addArgs( "sh", "-c", script + unixExt );
189 }
190
191 return this;
192 }
193
194 public String[] getStringArgs()
195 {
196 return args.toArray( new String[args.size()] );
197 }
198 }