1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.support;
14
15 import java.io.BufferedInputStream;
16 import java.io.BufferedOutputStream;
17 import java.io.ByteArrayOutputStream;
18 import java.io.File;
19 import java.io.FileInputStream;
20 import java.io.FileOutputStream;
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24 import java.lang.reflect.Method;
25 import java.util.ArrayList;
26 import java.util.Arrays;
27 import java.util.List;
28
29 import com.eviware.soapui.support.types.StringToStringMap;
30
31 public class Tools
32 {
33 public static final int COPY_BUFFER_SIZE = 1000;
34
35 public static String[] tokenizeArgs(String args)
36 {
37 if( args == null || args.trim().length() == 0 )
38 return null;
39
40 List<String> l = Arrays.asList( args.split( " " ));
41 List<String> result = new ArrayList<String>();
42
43 for( int c = 0; c < l.size(); c++ )
44 {
45 String s = l.get( c );
46 if( s.startsWith( "\"" ))
47 {
48 c++;
49 s += " " + l.get( c );
50 while( !(s.endsWith( "\"") && !s.endsWith( "//\"" )) && c < l.size() )
51 {
52 c++;
53 }
54
55
56 s = c == l.size() ? s.substring( 1 ) : s.substring( 1, s.length()-1 );
57
58
59 s = s.replace( "//\"", "\"" );
60 }
61
62 result.add( s );
63 }
64
65 return result.toArray( new String[result.size()]);
66 }
67
68 public static String convertToHtml( String str )
69 {
70 StringBuffer result = new StringBuffer( "<html><body>");
71
72 for( int c = 0; c < str.length(); c++ )
73 {
74 char ch = str.charAt( c );
75 if( ch == '\n' )
76 result.append( "<br>" );
77 else
78 result.append( ch );
79 }
80
81 result.append( "</body></html>");
82 return result.toString();
83 }
84
85 public static String getFilename(String filePath)
86 {
87 if (filePath == null || filePath.length() == 0)
88 return filePath;
89
90 int ix = filePath.lastIndexOf( File.separatorChar );
91 if (ix <= 0)
92 return filePath;
93
94 return filePath.substring(ix+1, filePath.length());
95 }
96
97 public static String getDir(String filePath)
98 {
99 if (filePath == null || filePath.length() == 0)
100 return filePath;
101
102 int ix = filePath.lastIndexOf( File.separatorChar );
103 if (ix <= 0)
104 return filePath;
105
106 return ensureDir(filePath.substring(0, ix), "");
107 }
108
109 public static String ensureDir(String dir, String basedir )
110 {
111 if( dir == null || dir.length() == 0 )
112 return "";
113
114 File dirFile = new File( dir );
115 if( !dirFile.isAbsolute() )
116 {
117 if( basedir.length() == 0 )
118 basedir = new File("").getAbsolutePath();
119
120 dirFile = new File( basedir, dir );
121 }
122
123 dirFile.mkdirs();
124 return dirFile.getAbsolutePath();
125 }
126
127 public static String ensureFileDir(String file, String basedir )
128 {
129 if( file == null || file.length() == 0 )
130 return "";
131
132 File dirFile = new File( basedir, file );
133 if( !dirFile.isAbsolute() )
134 {
135 if( basedir.length() == 0 )
136 basedir = new File("").getAbsolutePath();
137
138 dirFile = new File( basedir, file );
139 }
140
141 String absolutePath = dirFile.getAbsolutePath();
142 if( !dirFile.exists() )
143 {
144 int ix = absolutePath.lastIndexOf( File.separatorChar );
145 File fileDir = new File( absolutePath.substring( 0, ix ));
146 fileDir.mkdirs();
147 }
148
149 return absolutePath;
150 }
151
152 public static String ensureDir(String outputDir)
153 {
154 if( outputDir == null )
155 outputDir = "";
156
157 File output = new File(outputDir);
158 output.mkdirs();
159 return outputDir;
160 }
161
162
163 private static final byte[] copyBuffer = new byte[8192];
164 public static final long READ_ALL = 0;
165
166 public static void openURL(String url)
167 {
168 String osName = System.getProperty("os.name");
169
170 try
171 {
172 if (osName.startsWith("Mac OS")) {
173 Class fileMgr = Class.forName("com.apple.eio.FileManager");
174 Method openURL = fileMgr.getDeclaredMethod("openURL",
175 new Class[] {String.class});
176 openURL.invoke(null, new Object[] {url});
177 }
178 else if (osName.startsWith("Windows"))
179 {
180 Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
181 }
182 else {
183 String[] browsers = {
184 "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape" };
185 String browser = null;
186 for (int count = 0; count < browsers.length && browser == null; count++)
187 if (Runtime.getRuntime().exec(
188 new String[] {"which", browsers[count]}).waitFor() == 0)
189 browser = browsers[count];
190 if (browser == null)
191 throw new Exception("Could not find web browser");
192 else
193 Runtime.getRuntime().exec(new String[] {browser, url});
194 }
195 }
196 catch (Exception e)
197 {
198 UISupport.showErrorMessage(e);
199 }
200 }
201
202 public static ByteArrayOutputStream readAll(InputStream instream, long maxSize) throws IOException
203 {
204 ByteArrayOutputStream outstream = new ByteArrayOutputStream( 4096 );
205
206 byte[] buffer = new byte[4096];
207 int len;
208 int read = 0;
209 int toRead = 4096;
210
211 if( maxSize > 0 )
212 {
213 if( read + toRead > maxSize )
214 toRead = (int) (maxSize - read);
215 }
216
217 while ((len = instream.read(buffer, 0, toRead )) > 0)
218 {
219 outstream.write(buffer, 0, len);
220 read += toRead;
221
222 if( maxSize > 0 )
223 {
224 if( read + toRead > maxSize )
225 toRead = (int) (maxSize - read);
226 }
227 }
228
229 outstream.close();
230 return outstream;
231 }
232
233 public static int copyFile( File source, File target, boolean overwrite ) throws IOException
234 {
235 int bytes = 0;
236
237 if( target.exists() )
238 {
239 if( overwrite )
240 target.delete();
241 else
242 return -1;
243 }
244 else
245 {
246 String path = target.getAbsolutePath();
247 int ix = path.lastIndexOf( File.separatorChar );
248 if( ix != -1 )
249 {
250 path = path.substring( 0, ix );
251 File pathFile = new File( path );
252 if( !pathFile.exists() )
253 pathFile.mkdirs();
254 }
255 }
256
257 BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));
258 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(target));
259
260 int read = in.read( copyBuffer );
261 while( read != -1 )
262 {
263 if( read > 0 )
264 {
265 out.write( copyBuffer, 0, read );
266 bytes += read;
267 }
268 read = in.read( copyBuffer );
269 }
270
271 in.close();
272 out.close();
273
274 return bytes;
275 }
276
277 /***
278 * Joins a relative url to a base url.. needs improvements..
279 */
280
281 public static String joinRelativeUrl( String baseUrl, String url )
282 {
283 boolean isWindowsUrl = baseUrl.indexOf( '//' ) >= 0;
284 boolean isUsedInUnix = File.separatorChar == '/';
285
286 if( isUsedInUnix && isWindowsUrl )
287 {
288 baseUrl = baseUrl.replace( '//', '/' );
289 url = url.replace( '//', '/' );
290 }
291
292 boolean isFile = baseUrl.startsWith("file:");
293
294 int ix = baseUrl.lastIndexOf( '//' );
295 if( ix == -1 ) ix = baseUrl.lastIndexOf( '/' );
296
297
298 while( url.startsWith( ".//" ) || url.startsWith( "./" ))
299 url = url.substring( 2 );
300
301
302 while( url.startsWith( "../" ) || url.startsWith( "..//" ))
303 {
304 int ix2 = baseUrl.lastIndexOf( '//', ix-1 );
305 if( ix2 == -1 )
306 ix2 = baseUrl.lastIndexOf( '/', ix-1 );
307 if( ix2 == -1 )
308 break;
309
310 baseUrl = baseUrl.substring( 0, ix2+1 );
311 ix = ix2;
312
313 url = url.substring( 3 );
314 }
315
316
317 while( url.indexOf( "/./" ) != -1 || url.indexOf( "//.//") != -1 )
318 {
319 int ix2 = url.indexOf( "/./");
320 if( ix2 == -1 )
321 ix2 = url.indexOf( "//.//" );
322
323 url = url.substring( 0, ix2 ) + url.substring( ix2+2 );
324 }
325
326
327 while( url.indexOf( "/../" ) != -1 || url.indexOf( "//..//") != -1 )
328 {
329 int ix2 = -1;
330
331 int ix3 = url.indexOf( "/../");
332 if( ix3 == -1 )
333 {
334 ix3 = url.indexOf( "//..//" );
335 ix2 = url.lastIndexOf( '//', ix3-1 );
336 }
337 else
338 {
339 ix2 = url.lastIndexOf( '/', ix3-1 );
340 }
341
342 if( ix2 == -1 )
343 break;
344
345 url = url.substring( 0, ix2 ) + url.substring( ix3+3 );
346 }
347
348 String result = baseUrl.substring( 0, ix+1 ) + url;
349 if( isFile )
350 result = result.replace( '/', File.separatorChar );
351
352 return result;
353 }
354
355 public static boolean isEmpty(String str)
356 {
357 return str == null || str.trim().length() == 0;
358 }
359
360 public static long writeAll( OutputStream out, InputStream in ) throws IOException
361 {
362 byte [] buffer = new byte[COPY_BUFFER_SIZE];
363 long total = 0;
364
365 int sz = in.read( buffer );
366 while( sz != -1 )
367 {
368 out.write( buffer, 0, sz );
369 total += sz;
370 sz = in.read( buffer );
371 }
372
373 return total;
374 }
375
376 public static String expandProperties(StringToStringMap values, String content, boolean leaveMissing)
377 {
378 int ix = content.indexOf( "${" );
379 if( ix == -1 )
380 return content;
381
382 StringBuffer buf = new StringBuffer();
383 int lastIx = 0;
384 while( ix != -1 )
385 {
386 buf.append( content.substring( lastIx, ix ));
387
388 int ix2 = content.indexOf( '}', ix+2 );
389 if( ix2 == -1 )
390 break;
391
392 int ix3 = content.lastIndexOf( "${", ix2 );
393 if( ix3 != ix )
394 {
395 buf.append( content.substring( ix, ix3 ));
396 ix = ix3;
397 }
398
399 String propertyName = content.substring( ix+2, ix2 );
400 Object property = values.get( propertyName );
401 if( property != null )
402 {
403 buf.append( property.toString() );
404 }
405 else if( leaveMissing )
406 {
407 buf.append( "${" ).append( propertyName ).append( '}' );
408 }
409
410 lastIx = ix2+1;
411 ix = content.indexOf( "${", lastIx );
412 }
413
414 if( lastIx < content.length() )
415 buf.append( content.substring( lastIx ));
416
417 return buf.toString();
418 }
419
420 /***
421 * Replaces the host part of the specified endpoint with the specified host
422 *
423 * @param endpoint the endpoint to modify
424 * @param host the host to set
425 * @return the modified endpoint
426 */
427
428 public static String replaceHost(String endpoint, String host)
429 {
430 int ix1 = endpoint.indexOf( "://" );
431 if( ix1 < 0 )
432 return endpoint;
433
434 int ix2 = endpoint.indexOf( ":", ix1+3 );
435 if( ix2 == -1 || host.indexOf( ":") > 0 )
436 {
437 ix2 = endpoint.indexOf( "/", ix1+3 );
438 if( ix2 == ix1+3 )
439 ix2 = -1;
440 }
441
442 return endpoint.substring( 0, ix1 )+ "://" + host + (ix2 == -1 ? "" : endpoint.substring(ix2));
443 }
444 }