/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.support; import com.eviware.soapui.impl.wsdl.support.HelpUrls; import com.eviware.soapui.support.editor.inspectors.attachments.ContentTypeHandler; import com.eviware.soapui.support.types.StringToStringMap; import junit.framework.ComparisonFailure; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import java.awt.event.ActionEvent; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.UUID; import java.util.regex.Pattern; public class Tools { public static final int COPY_BUFFER_SIZE = 1000; private static final Logger log = Logger.getLogger(Tools.class); public static String[] tokenizeArgs(String args) { if (args == null || args.trim().length() == 0) { return null; } List<String> l = Arrays.asList(args.split(" ")); List<String> result = new ArrayList<String>(); for (int c = 0; c < l.size(); c++) { String s = l.get(c); if (s.startsWith("\"")) { c++; s += " " + l.get(c); while (!(s.endsWith("\"") && !s.endsWith("\\\"")) && c < l.size()) { c++; } // remove trailing/leading quotes s = c == l.size() ? s.substring(1) : s.substring(1, s.length() - 1); // replace backslashed quotes s = s.replace("\\\"", "\""); } result.add(s); } return result.toArray(new String[result.size()]); } public static String convertToHtml(String str) { StringBuilder result = new StringBuilder("<html><body>"); for (int c = 0; c < str.length(); c++) { char ch = str.charAt(c); if (ch == '\n') { result.append("<br>"); } else { result.append(ch); } } result.append("</body></html>"); return result.toString(); } public static String getFilename(String filePath) { if (filePath == null || filePath.length() == 0) { return filePath; } int ix = filePath.lastIndexOf(File.separatorChar); if (ix <= 0) { return filePath; } return filePath.substring(ix + 1, filePath.length()); } public static String getDir(String filePath) { if (filePath == null || filePath.length() == 0) { return filePath; } int ix = filePath.lastIndexOf(File.separatorChar); if (ix <= 0) { return filePath; } return ensureDir(filePath.substring(0, ix), ""); } public static String ensureDir(String dir, String basedir) { if (dir == null || dir.length() == 0) { return ""; } File dirFile = new File(dir); if (!dirFile.isAbsolute()) { if (basedir.length() == 0) { basedir = new File("").getAbsolutePath(); } dirFile = new File(basedir, dir); } dirFile.mkdirs(); return dirFile.getAbsolutePath(); } public static String ensureFileDir(String file, String basedir) { if (file == null || file.length() == 0) { return ""; } File dirFile = new File(basedir, file); if (!dirFile.isAbsolute()) { if (basedir.length() == 0) { basedir = new File("").getAbsolutePath(); } dirFile = new File(basedir, file); } String absolutePath = dirFile.getAbsolutePath(); if (!dirFile.exists()) { int ix = absolutePath.lastIndexOf(File.separatorChar); File fileDir = new File(absolutePath.substring(0, ix)); fileDir.mkdirs(); } return absolutePath; } public static String ensureDir(String outputDir) { if (outputDir == null) { outputDir = ""; } File output = new File(outputDir); output.mkdirs(); return outputDir; } // preallocate so it does not consume memory after out-of-memory errors private static final byte[] copyBuffer = new byte[8192]; public static final long READ_ALL = 0; public static String modifyUrl(final String url, Integer mods) { String helpUrl = url; // Integer, since switch strings won't work yet. int modifier = 0; // String modifier = "prod"; if (helpUrl == null) { modifier = 1; // "missing"; } else if (url.substring(0, 4).equals("http")) { modifier = 2; // "external"; } else if (((mods & ActionEvent.SHIFT_MASK) != 0) && ((mods & ActionEvent.CTRL_MASK) != 0)) { modifier = 3; // "dev"; }else if (((mods & ActionEvent.SHIFT_MASK) != 0) && ((mods & ActionEvent.ALT_MASK) != 0)) { modifier = 4; // "next"; } else { modifier = 0; // String modifier = "prod"; } switch (modifier) { case 1: // "missing": UISupport.showErrorMessage("Missing help URL"); helpUrl = HelpUrls.MISSING_URL + url; break; case 2: // "external": helpUrl = url; break; case 3: // "dev": helpUrl = HelpUrls.BASE_URL_DEV + url; break; case 4: // "next": helpUrl = HelpUrls.BASE_URL_NEXT + url; break; default: helpUrl = HelpUrls.BASE_URL_PROD + url; break; } return helpUrl; } public static void openURL(String url) { String osName = System.getProperty("os.name"); try { if (osName.startsWith("Mac OS")) { Class<?> fileMgr = Class.forName("com.apple.eio.FileManager"); Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[]{String.class}); openURL.invoke(null, url); } else if (osName.startsWith("Windows")) { if (url.startsWith("file:")) { url = URLDecoder.decode(url.substring(5), "utf-8"); while (url.startsWith("/")) { url = url.substring(1); } url = url.replace('/', '\\'); if (!new File(url).exists()) { UISupport.showErrorMessage("File [" + url + "] not found"); return; } } Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url); } else { // assume Unix or Linux String[] browsers = {"firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape"}; String browser = null; for (int count = 0; count < browsers.length && browser == null; count++) { if (Runtime.getRuntime().exec(new String[]{"which", browsers[count]}).waitFor() == 0) { browser = browsers[count]; } } if (browser == null) { throw new Exception("Could not find web browser"); } else { Runtime.getRuntime().exec(new String[]{browser, url}); } } } catch (Exception e) { UISupport.showErrorMessage(e); } } public static ByteArrayOutputStream readAll(InputStream instream, long maxSize) throws IOException { ByteArrayOutputStream outstream = new ByteArrayOutputStream(4096); readAndWrite(instream, maxSize, outstream); outstream.close(); return outstream; } public static void readAndWrite(InputStream instream, long maxSize, OutputStream outstream) throws IOException { byte[] buffer = new byte[4096]; int len; int read = 0; int toRead = 4096; if (maxSize > 0) { if (read + toRead > maxSize) { toRead = (int) (maxSize - read); } } while ((len = instream.read(buffer, 0, toRead)) > 0) { outstream.write(buffer, 0, len); read += toRead; if (maxSize > 0) { if (read + toRead > maxSize) { toRead = (int) (maxSize - read); } } } } public static int copyFile(File source, File target, boolean overwrite) throws IOException { int bytes = 0; if (target.exists()) { if (overwrite) { target.delete(); } else { return -1; } } else { String path = target.getAbsolutePath(); int ix = path.lastIndexOf(File.separatorChar); if (ix != -1) { path = path.substring(0, ix); File pathFile = new File(path); if (!pathFile.exists()) { pathFile.mkdirs(); } } } BufferedInputStream in = new BufferedInputStream(new FileInputStream(source)); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(target)); int read = in.read(copyBuffer); while (read != -1) { if (read > 0) { out.write(copyBuffer, 0, read); bytes += read; } read = in.read(copyBuffer); } in.close(); out.close(); return bytes; } /** * Joins a relative url to a base url.. needs improvements.. */ public static String joinRelativeUrl(String baseUrl, String url) { if (baseUrl.indexOf('?') > 0) { baseUrl = baseUrl.substring(0, baseUrl.indexOf('?')); } boolean isWindowsUrl = baseUrl.indexOf('\\') >= 0; boolean isUsedInUnix = File.separatorChar == '/'; if (isUsedInUnix && isWindowsUrl) { baseUrl = baseUrl.replace('\\', '/'); url = url.replace('\\', '/'); } boolean isFile = baseUrl.startsWith("file:"); int ix = baseUrl.lastIndexOf('\\'); if (ix == -1) { ix = baseUrl.lastIndexOf('/'); } // absolute? if (url.startsWith("/") && !isFile) { ix = baseUrl.indexOf("/", baseUrl.indexOf("//") + 2); return baseUrl.substring(0, ix) + url; } // remove leading "./" while (url.startsWith(".\\") || url.startsWith("./")) { url = url.substring(2); } // remove leading "../" while (url.startsWith("../") || url.startsWith("..\\")) { int ix2 = baseUrl.lastIndexOf('\\', ix - 1); if (ix2 == -1) { ix2 = baseUrl.lastIndexOf('/', ix - 1); } if (ix2 == -1) { break; } baseUrl = baseUrl.substring(0, ix2 + 1); ix = ix2; url = url.substring(3); } // remove "/./" while (url.contains("/./") || url.contains("\\.\\")) { int ix2 = url.indexOf("/./"); if (ix2 == -1) { ix2 = url.indexOf("\\.\\"); } url = url.substring(0, ix2) + url.substring(ix2 + 2); } // remove "/../" while (url.contains("/../") || url.contains("\\..\\")) { int ix2 = -1; int ix3 = url.indexOf("/../"); if (ix3 == -1) { ix3 = url.indexOf("\\..\\"); ix2 = url.lastIndexOf('\\', ix3 - 1); } else { ix2 = url.lastIndexOf('/', ix3 - 1); } if (ix2 == -1) { break; } url = url.substring(0, ix2) + url.substring(ix3 + 3); } String result = baseUrl.substring(0, ix + 1) + url; if (isFile) { result = result.replace('/', File.separatorChar); } return result; } public static boolean isEmpty(String str) { return str == null || str.trim().length() == 0; } public static long writeAll(OutputStream out, InputStream in) throws IOException { byte[] buffer = new byte[COPY_BUFFER_SIZE]; long total = 0; int sz = in.read(buffer); while (sz != -1) { out.write(buffer, 0, sz); total += sz; sz = in.read(buffer); } return total; } public static String expandProperties(StringToStringMap values, String content, boolean leaveMissing) { int ix = content.indexOf("${"); if (ix == -1) { return content; } StringBuilder buf = new StringBuilder(); int lastIx = 0; while (ix != -1) { buf.append(content.substring(lastIx, ix)); int ix2 = content.indexOf('}', ix + 2); if (ix2 == -1) { break; } int ix3 = content.lastIndexOf("${", ix2); if (ix3 != ix) { buf.append(content.substring(ix, ix3)); ix = ix3; } String propertyName = content.substring(ix + 2, ix2); Object property = values.get(propertyName); if (property != null) { buf.append(property.toString()); } else if (leaveMissing) { buf.append("${").append(propertyName).append('}'); } lastIx = ix2 + 1; ix = content.indexOf("${", lastIx); } if (lastIx < content.length()) { buf.append(content.substring(lastIx)); } return buf.toString(); } /** * Replaces the host part of the specified endpoint with the specified host * * @param endpoint the endpoint to modify * @param host the host to set * @return the modified endpoint */ public static String replaceHost(String endpoint, String host) { int ix1 = endpoint.indexOf("://"); if (ix1 < 0) { return endpoint; } int ix2 = endpoint.indexOf(":", ix1 + 3); if (ix2 == -1 || host.indexOf(":") > 0) { ix2 = endpoint.indexOf("/", ix1 + 3); if (ix2 == ix1 + 3) { ix2 = -1; } } return endpoint.substring(0, ix1) + "://" + host + (ix2 == -1 ? "" : endpoint.substring(ix2)); } public static String getEndpointFromUrl(URL baseUrl) { StringBuilder result = new StringBuilder(); result.append(baseUrl.getProtocol()).append("://"); result.append(baseUrl.getHost()); if (baseUrl.getPort() > 0) { result.append(':').append(baseUrl.getPort()); } return result.toString(); } public static String getContentTypeFromFilename(String fileName) { return ContentTypeHandler.getContentTypeFromFilename(fileName); } public static String getExtensionForContentType(String contentType) { return ContentTypeHandler.getExtensionForContentType(contentType); } public static String getFileContent(String path) { String content = ""; try { FileInputStream fstream = new FileInputStream(path); DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); content = br.readLine(); br.close(); in.close(); } catch (Exception e) {// Catch exception if any System.err.println("Error: " + e.getMessage()); } return content; } public static String getTitleProperty(String path) { String content = ""; try { FileInputStream fstream = new FileInputStream(path); Properties props = new Properties(); props.load(fstream); fstream.close(); content = props.getProperty("soapui.app.title"); } catch (Exception e) {// Catch exception if any System.err.println("Error: " + e.getMessage()); } return content; } public static String normalizeFileSeparators(String input) { if (input != null && input.startsWith("file:")) { input = input.replace('/', File.separatorChar); input = input.replace('\\', File.separatorChar); } return input; } /** * Compares two string for similarity, allows wildcard. * * @param expected * @param real * @param wildcard * @throws ComparisonFailure */ public static void assertSimilar(String expected, String real, char wildcard) throws ComparisonFailure { if (!isSimilar(expected, real, wildcard)) { throw new ComparisonFailure("Not matched", expected, real); } } public static boolean isSimilar(String expected, String real, char wildcard) throws ComparisonFailure { // expected == wildcard matches all if (!expected.equals(String.valueOf(wildcard))) { StringBuilder sb = new StringBuilder(); if (expected.startsWith(String.valueOf(wildcard))) { sb.append(".*"); } boolean first = true; for (String token : expected.split(Pattern.quote(String.valueOf(wildcard)))) { if (token.isEmpty()) { continue; } if (!first) { sb.append(".*"); } first = false; sb.append(Pattern.quote(token)); } if (expected.endsWith(String.valueOf(wildcard))) { sb.append(".*"); } if (!Pattern.compile(sb.toString(), Pattern.DOTALL).matcher(real).matches()) { return false; } } return true; } public static void main(String[] args) { System.out.println(System.getProperty("os.name")); } public static File createTemporaryDirectory() throws IOException { String libDirectoryName = UUID.randomUUID().toString(); final File libDirectory = new File(System.getProperty("java.io.tmpdir"), libDirectoryName); if (!libDirectory.mkdir()) { throw new IOException("Could not create directory for unpacked JAR libraries at " + libDirectory); } deleteDirectoryOnExit(libDirectory); return libDirectory; } public static void deleteDirectoryOnExit(final File directory) { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { try { FileUtils.deleteDirectory(directory); } catch (IOException e) { log.warn("Could not delete temporary directory " + directory); } } })); } }