/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.toolbox; import java.awt.Desktop; import java.awt.Frame; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import java.util.Map.Entry; import java.util.StringTokenizer; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JOptionPane; import javax.swing.UIManager; import org.jdom2.Document; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; /** * @author bmangez <B>Class Description</B> */ public class ToolBox { private static String PLATFORM; public static final String WINDOWS = "WINDOWS"; public static final String LINUX = "LINUX"; public static final String MACOS = "MACOS"; public static final String OTHER = "OTHER"; static { String osName = System.getProperty("os.name"); if (osName.indexOf("Mac OS") > -1) { PLATFORM = MACOS; } else if (osName.indexOf("Windows") > -1) { PLATFORM = WINDOWS; } else if (osName.indexOf("Linux") > -1) { PLATFORM = LINUX; } else { PLATFORM = OTHER; } } public static boolean isMacOS() { return PLATFORM == MACOS; } public static boolean isWindows() { return PLATFORM == WINDOWS; } public static boolean isLinux() { return PLATFORM == LINUX; } public static boolean isOther() { return PLATFORM == OTHER; } /** * */ public ToolBox() { super(); } public static boolean isEmpty(String s) { return s == null || s.trim().equals(""); } public static String replaceStringByStringInString(String replacedString, String aNewString, String message) { if (message == null || message.equals("")) { return ""; } if (replacedString == null || replacedString.equals("")) { return message; } if (aNewString == null || aNewString.equals("")) { aNewString = ""; } // String newString = ""; // int replacedStringLength = replacedString.length(); // int indexOfTag = message.indexOf(replacedString); // while (indexOfTag != -1) { // newString = newString + message.substring(0, indexOfTag) + aNewString; // message = message.substring(indexOfTag + replacedStringLength); // indexOfTag = message.indexOf(replacedString); // } // return newString + message; StringBuffer newString = new StringBuffer(""); int replacedStringLength = replacedString.length(); int indexOfTag = message.indexOf(replacedString); while (indexOfTag != -1) { newString.append(message.substring(0, indexOfTag)).append(aNewString); message = message.substring(indexOfTag + replacedStringLength); indexOfTag = message.indexOf(replacedString); } return newString.append(message).toString(); } public static String replaceStringByStringInStringOld(String replacedString, String aNewString, String message) { if (message == null || message.equals("")) { return ""; } if (replacedString == null || replacedString.equals("")) { return message; } if (aNewString == null || aNewString.equals("")) { aNewString = ""; } String newString = ""; int replacedStringLength = replacedString.length(); int indexOfTag = message.indexOf(replacedString); while (indexOfTag != -1) { newString = newString + message.substring(0, indexOfTag) + aNewString; message = message.substring(indexOfTag + replacedStringLength); indexOfTag = message.indexOf(replacedString); } return newString + message; } public static String capitalize(String s, boolean removeStartingUnderscore) { if (s == null) { return null; } if (s.length() == 0) { return s; } if (s.startsWith("_") && removeStartingUnderscore) { s = s.substring(1); } if (s.length() == 0) { return s; } if (s.length() == 1) { return s.toUpperCase(); } return s.substring(0, 1).toUpperCase() + s.substring(1); } public static String capitalize(String s) { return capitalize(s, false); } public static String uncapitalize(String s) { if (s == null) { return null; } if (s.length() > 0 && Character.isUpperCase(s.charAt(0))) { s = Character.toLowerCase(s.charAt(0)) + s.substring(1); } return s; } /** * @deprecated use methods from JavaUtils * @param s * @return */ @Deprecated public static String cleanStringForJava(String s) { StringBuilder sb = new StringBuilder(); s = StringUtils.convertAccents(s); Matcher m = JavaUtils.JAVA_VARIABLE_ACCEPTABLE_PATTERN.matcher(s); while (m.find()) { if (sb.length() == 0) { sb.append(m.group()); } else { sb.append(capitalize(m.group())); } } String ret = sb.toString(); if (!ret.matches(JavaUtils.JAVA_BEGIN_VARIABLE_NAME_REGEXP)) { return "_" + ret; } return ret; } public static String cleanStringForProcessDictionaryKey(String s) { String cleanedString = getJavaName(s, false, true); if ("_".equals(cleanedString)) { return null; } return cleanedString; } /** * Replace ",',\n,\r by blank * * @param comment * @return a String to use in a javascript */ public static String getJavascriptComment(String comment) { if (comment == null) { return null; } return ToolBox.replaceStringByStringInString( "\r", " ", ToolBox.replaceStringByStringInString("\n", " ", ToolBox.replaceStringByStringInString("\"", " ", ToolBox.replaceStringByStringInString("'", " ", comment)))); } /** * @deprecated use methods from JavaUtils * @param s * @return */ @Deprecated public static String getJavaName(String name, boolean keepCase) { return getJavaName(name, keepCase, true); } /** * @deprecated use methods from JavaUtils * @param name * @return a java name ( starts with a minuscule, and no blanks, dot,..., convert accentuated characters) */ @Deprecated public static String getJavaName(String name, boolean keepCase, boolean lowerFirstChar) { if (name == null) { return null; } if (name.equals("")) { return name; } name = StringUtils.convertAccents(name); StringBuffer sb = new StringBuffer(); Matcher m = JavaUtils.JAVA_VARIABLE_ACCEPTABLE_PATTERN.matcher(name); while (m.find()) { String group = m.group(); if (sb.length() == 0 && !group.matches(JavaUtils.JAVA_BEGIN_VARIABLE_NAME_REGEXP)) { sb.append('_'); } if (keepCase) { sb.append(group); } else { if (sb.length() > 0 || !lowerFirstChar) { sb.append(capitalize(group)); } else { sb.append(group.substring(0, 1).toLowerCase()).append(group.substring(1, group.length())); } } } name = sb.toString(); if (name.equals("")) { return "_"; } if (ReservedKeyword.contains(name)) { return "_" + name; } return name; } /** * @deprecated use methods from JavaUtils * @param s * @return */ @Deprecated public static String getJavaClassName(String name) { return getJavaName(name, false, false); } /** * * @param name * @return a java name ( starts with a minuscule, and no blanks, dot,..., convert accentuated characters) */ public static String getWarName(String name) { if (name == null) { return null; } if (name.equals("")) { return name; } name = StringUtils.convertAccents(name); StringBuffer sb = new StringBuffer(); Matcher m = WAR_NAME_ACCEPTABLE_PATTERN.matcher(name); while (m.find()) { String group = m.group(); if (sb.length() == 0 && !group.matches(JavaUtils.JAVA_BEGIN_VARIABLE_NAME_REGEXP)) { sb.append('_'); } sb.append(group); } name = sb.toString(); if (name.equals("")) { return "_"; } return name; } /** * @deprecated use methods from JavaUtils * @param s * @return */ @Deprecated public static String getJavaName(StringBuffer name) { return getJavaName(name.toString(), false); } /** * @deprecated use methods from JavaUtils * @param s * @return */ @Deprecated public static String getJavaName(String name) { return getJavaName(name, false); } /** * @deprecated use methods from JavaUtils * @param s * @return */ @Deprecated public static String convertStringToJavaString(String stringToConvert) { if (stringToConvert == null) { return null; } StringBuffer sb = new StringBuffer(); Matcher m = JavaUtils.JAVA_CHAR_TO_ESCAPE_IN_STRINGS_PATTERN.matcher(stringToConvert); while (m.find()) { m.appendReplacement(sb, "\\\\$0"); } m.appendTail(sb); int index; while ((index = sb.indexOf("\r")) > -1) { sb.deleteCharAt(index); } return sb.toString().replaceAll("[\n]", "\\\\n"); } public static String convertStringToJavascriptString(String stringToConvert) { StringBuffer sb = new StringBuffer(); Matcher m = JAVASCRIPT_CHAR_TO_ESCAPE_IN_STRINGS_PATTERN.matcher(stringToConvert); while (m.find()) { m.appendReplacement(sb, "\\\\$0"); } m.appendTail(sb); return sb.toString().replaceAll("[\n\r]", "\\\\n"); } public static String convertJavaStringToDBName(String javaString) { int index = 0; boolean lastCharIsUpperCase = true; StringBuilder sb = new StringBuilder(); for (int i = 0; i < javaString.length(); i++) { char c = javaString.charAt(i); if (Character.isUpperCase(c)) { if (i != 0) { if (!lastCharIsUpperCase) { sb.append(javaString.substring(index, i).toUpperCase()); sb.append("_"); index = i; } else { if (i + 1 < javaString.length()) { if (!Character.isUpperCase(javaString.charAt(i + 1))) { sb.append(javaString.substring(index, i).toUpperCase()); sb.append("_"); index = i; } } else { sb.append(javaString.substring(index, i + 1).toUpperCase()); index = i; } } } lastCharIsUpperCase = true; } else { if (i + 1 == javaString.length()) { sb.append(javaString.substring(index, i + 1).toUpperCase()); } lastCharIsUpperCase = false; } } return sb.toString(); } public static final String JAVASCRIPT_CHAR_TO_ESCAPE_IN_STRINGS_REG_EXP = "['\\\\]"; public static final Pattern JAVASCRIPT_CHAR_TO_ESCAPE_IN_STRINGS_PATTERN = Pattern .compile(JAVASCRIPT_CHAR_TO_ESCAPE_IN_STRINGS_REG_EXP); public static final String WAR_NAME_ACCEPTABLE_CHARS = "[_A-Za-z0-9.]+"; public static final Pattern WAR_NAME_ACCEPTABLE_PATTERN = Pattern.compile(WAR_NAME_ACCEPTABLE_CHARS); /** * Getter method for the attribute pLATFORM * * @return Returns the pLATFORM. */ public static String getPLATFORM() { return PLATFORM; } public static class RequestResponse { public int status; public String response; } public static RequestResponse getRequest(Hashtable param, String url) throws IOException { StringBuffer paramsAsString = new StringBuffer(""); if (param != null && param.size() > 0) { // paramsAsString.append("?"); Enumeration en = param.keys(); String key = null; String value = null; while (en.hasMoreElements()) { key = (String) en.nextElement(); value = (String) param.get(key); try { paramsAsString.append(URLEncoder.encode(key, "UTF-8")).append("=").append(URLEncoder.encode(value, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (en.hasMoreElements()) { paramsAsString.append("&"); } } } // Create a URL for the desired page URL local_url = new URL(url); URLConnection conn = local_url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(paramsAsString.toString()); wr.flush(); // Read all the text returned by the server int httpStatus = 200; if (conn instanceof HttpURLConnection) { httpStatus = ((HttpURLConnection) conn).getResponseCode(); } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String str; StringBuffer reply = new StringBuffer(); while ((str = in.readLine()) != null) { reply.append(str).append("\n"); } wr.close(); in.close(); RequestResponse response = new RequestResponse(); response.response = reply.toString(); response.status = httpStatus; return response; } public static RequestResponse postRequest(Hashtable parameters, String url) { try { // Construct data StringBuffer data = new StringBuffer(); if (parameters != null && parameters.size() > 0) { Enumeration en = parameters.keys(); String key = null; String value = null; while (en.hasMoreElements()) { key = (String) en.nextElement(); value = (String) parameters.get(key); data.append(URLEncoder.encode(key, "UTF-8")).append("=").append(URLEncoder.encode(value, "UTF-8")); if (en.hasMoreElements()) { data.append("&"); } } } // Send data URL local_url = new URL(url); URLConnection conn = local_url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data.toString()); wr.flush(); // Get the response int httpStatus = 200; if (conn instanceof HttpURLConnection) { httpStatus = ((HttpURLConnection) conn).getResponseCode(); } StringBuffer reply = new StringBuffer(); BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = rd.readLine()) != null) { reply.append(line).append("\n"); } wr.close(); rd.close(); RequestResponse response = new RequestResponse(); response.response = reply.toString(); response.status = httpStatus; return response; } catch (Exception e) { e.printStackTrace(); RequestResponse response = new RequestResponse(); response.response = e.getMessage(); response.status = -1; return response; } } public static <E> Enumeration<E> getEnumeration(E[] o) { return new ArrayEnumeration<E>(o); } private static class ArrayEnumeration<E> implements Enumeration<E> { private E[] array; private int index = 0; protected ArrayEnumeration(E[] array) { this.array = array; } /** * Overrides hasMoreElements * * @see java.util.Enumeration#hasMoreElements() */ @Override public boolean hasMoreElements() { return array != null && array.length > index; } /** * Overrides nextElement * * @see java.util.Enumeration#nextElement() */ @Override public E nextElement() { return array[index++]; } } public static String serializeHashtable(Hashtable<String, String> params) { StringBuffer buf = new StringBuffer(); String key = null; Enumeration<String> en = params.keys(); while (en.hasMoreElements()) { key = en.nextElement(); buf.append(key).append("=").append(params.get(key)); if (en.hasMoreElements()) { buf.append("&"); } } return buf.toString(); } /** * @deprecated use methods from JavaUtils * @param s * @return */ @Deprecated public static String getJavaDocString(String s) { return getJavaDocString(s, " "); } /** * @deprecated use methods from JavaUtils * @param s * @return */ @Deprecated public static String getJavaDocString(String s, String prefix) { if (s == null) { return ""; } s = ToolBox.replaceStringByStringInString("*/", "* /", s); StringTokenizer st = new StringTokenizer(s, StringUtils.LINE_SEPARATOR, false); StringBuilder sb = new StringBuilder(); while (st.hasMoreTokens()) { String str = st.nextToken(); if (str.length() > 0) { sb.append(str.trim()); sb.append(StringUtils.LINE_SEPARATOR); if (st.hasMoreTokens()) { sb.append(prefix + "* "); } } } return sb.toString(); } public static String getWodKeyPath(String s) { if (s == null) { return null; } s = ToolBox.replaceStringByStringInString("()", "", s); return s; } public static String stackTraceAsAString(Throwable e) { StringBuilder sb = new StringBuilder("Exception " + e.getClass().getName() + ":\n" + (e.getMessage() != null ? e.getMessage() : "")); stackTraceAsAString(e, sb); return sb.toString(); } private static void stackTraceAsAString(Throwable e, StringBuilder sb) { StackTraceElement[] stackTrace = e.getStackTrace(); if (stackTrace != null) { for (int i = 0; i < stackTrace.length; i++) { sb.append("\tat " + stackTrace[i] + "\n"); } if (e.getCause() != null) { sb.append("Caused by ").append(e.getCause().getClass().getName()).append('\n'); stackTraceAsAString(e.getCause(), sb); } } else { sb.append("StackTrace not available\n"); } } public static void openURL(String url) { try { Desktop.getDesktop().browse(new URI(url)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void showFileInExplorer(File fileToOpen) throws IOException { String[] command; if (ToolBox.getPLATFORM() == ToolBox.WINDOWS) { command = new String[3]; command[0] = "explorer"; command[1] = "/select,"; command[2] = fileToOpen.getAbsolutePath(); } else { command = new String[2]; command[0] = "open"; command[1] = fileToOpen.isDirectory() ? fileToOpen.getCanonicalPath() : fileToOpen.getParentFile().getCanonicalPath(); } Runtime.getRuntime().exec(command); } public static boolean openFile(File fileToOpen) { try { Desktop.getDesktop().open(fileToOpen); return true; } catch (IOException e2) { e2.printStackTrace(); return false; } } /** * @param newNalme */ public static String getDBTableNameFromPropertyName(String name) { StringBuffer sb = new StringBuffer(); boolean previousCharIsUpperCase = false; for (int i = 0; i < name.length(); i++) { if (Character.isUpperCase(name.charAt(i))) { if (i == 0) { sb.append(name.charAt(i)); } else if (i + 1 == name.length()) { sb.append(name.charAt(i)); } else if (previousCharIsUpperCase) { if (Character.isUpperCase(name.charAt(i + 1))) { sb.append(name.charAt(i)); } else { sb.append('_').append(name.charAt(i)); } } else { sb.append('_').append(name.charAt(i)); } previousCharIsUpperCase = true; } else { sb.append(Character.toUpperCase(name.charAt(i))); previousCharIsUpperCase = false; } } return sb.toString(); } public static Document parseXMLData(StringReader xmlStream) throws IOException, JDOMException { SAXBuilder parser = new SAXBuilder(); return parser.build(xmlStream); } private static Boolean fileChooserRequiresFix; public static boolean fileChooserRequiresFix() { if (fileChooserRequiresFix == null) { if (getPLATFORM() == WINDOWS) { String javaVersion = System.getProperty("java.version"); String version; String release = null; if (javaVersion.indexOf('_') > 0) { version = javaVersion.substring(0, javaVersion.indexOf('_')); release = javaVersion.substring(javaVersion.indexOf('_') + 1); } else { version = javaVersion; } try { fileChooserRequiresFix = version.startsWith("1.6.0") && (release == null || Integer.valueOf(release) < 10); } catch (NumberFormatException e) { e.printStackTrace(); fileChooserRequiresFix = true; } } else { fileChooserRequiresFix = false; } } return fileChooserRequiresFix; } public static void fixFileChooser() { String[] cmd = new String[] { "regsvr32", "/u", "/s", System.getenv("windir") + "\\system32\\zipfldr.dll" }; try { Runtime.getRuntime().exec(cmd); } catch (IOException e) { e.printStackTrace(); } } public static void undoFixFileChooser() { String[] cmd = new String[] { "regsvr32", "/s", System.getenv("windir") + "\\system32\\zipfldr.dll" }; try { Runtime.getRuntime().exec(cmd); } catch (IOException e) { e.printStackTrace(); } } /** * @param s * @return a string to be inserted between single quote in js. */ public static String escapeStringForJS(String s) { if (s == null) { return null; } return s.replaceAll("\\\\", "\\\\\\\\").replaceAll("'", "\\\\'").replaceAll("\n", "\\\\n").replaceAll("\r", ""); } public static String escapeStringForProperties(String s) { if (s == null) { return null; } return s.replaceAll("#", "\\\\#").replaceAll("!", "\\\\!").replaceAll("=", "\\\\=").replaceAll(":", "\\\\:"); } public static String escapeStringForCsv(String s) { if (s == null) { return null; } return s.replaceAll("\"", "\"\""); } public static String getCsvLine(List<String> list) { List<List<String>> tmp = new ArrayList<List<String>>(); tmp.add(list); return getCsv(tmp); } public static String getCsv(List<List<String>> list) { StringBuilder sb = new StringBuilder(); boolean isFirstLine = true; for (List<String> line : list) { if (!isFirstLine) { sb.append("\n"); } boolean isFirstValue = true; for (String value : line) { if (!isFirstValue) { sb.append(";"); } if (!StringUtils.isEmpty(value)) { sb.append("\"" + escapeStringForCsv(value) + "\""); } isFirstValue = false; } isFirstLine = false; } return sb.toString(); } public static List<String> parseCsvLine(String csvLine) { List<List<String>> result = parseCsv(csvLine); if (result.size() > 0) { return result.get(0); } return new ArrayList<String>(); } public static List<List<String>> parseCsv(String csvString) { csvString = csvString != null ? csvString.trim() : null; List<List<String>> result = new ArrayList<List<String>>(); if (StringUtils.isEmpty(csvString)) { return result; } char separator; if (csvString.indexOf(';') == -1 && csvString.indexOf(',') > -1) { separator = ','; } else { separator = ';'; } List<String> line = new ArrayList<String>(); StringBuilder currentValue = new StringBuilder(); boolean isInsideQuote = false; boolean wasInsideQuote = false; for (int i = 0; i < csvString.length(); i++) { if (!wasInsideQuote && csvString.charAt(i) == '"' && (isInsideQuote || currentValue.toString().trim().length() == 0)) { if (i + 1 < csvString.length() && csvString.charAt(i + 1) == '"') { // Double quote, escape i++; } else { if (isInsideQuote) { wasInsideQuote = true; } else { currentValue = new StringBuilder(); } isInsideQuote = !isInsideQuote; continue; } } else if ((csvString.charAt(i) == separator || csvString.charAt(i) == '\n') && !isInsideQuote) { line.add(currentValue.toString()); currentValue = new StringBuilder(); wasInsideQuote = false; if (csvString.charAt(i) == '\n') { result.add(line); line = new ArrayList<String>(); } continue; } if (!wasInsideQuote) { currentValue.append(csvString.charAt(i)); } } if (result.size() > 0 || currentValue.length() > 0 || line.size() > 0) { line.add(currentValue.toString()); result.add(line); } return result; } /** * Returns the owner frame if not null, or the hidden frame otherwise. * * @param owner * @return */ public static Frame getFrame(Frame owner) { return owner == null ? Frame.getFrames().length > 0 ? Frame.getFrames()[0] : JOptionPane.getRootFrame() : owner; } public static String getMd5Hash(String toHash) throws NoSuchAlgorithmException { if (toHash == null) { return null; } java.security.MessageDigest md5 = java.security.MessageDigest.getInstance("MD5"); byte dataBytes[] = toHash.getBytes(); md5.update(dataBytes); byte digest[] = md5.digest(); StringBuffer hashString = new StringBuffer(); for (int i = 0; i < digest.length; ++i) { String hex = Integer.toHexString(digest[i]); if (hex.length() == 1) { hashString.append('0'); hashString.append(hex.charAt(hex.length() - 1)); } else { hashString.append(hex.substring(hex.length() - 2)); } } return hashString.toString(); } public static String[] getHostPortFromString(String hostPort, int defaultPort) { int hostPortSepIndex = hostPort.indexOf(":"); if (hostPortSepIndex > -1) { return new String[] { hostPort.substring(0, hostPortSepIndex), hostPort.substring(hostPortSepIndex + 1) }; } else { return new String[] { hostPort, String.valueOf(defaultPort) }; } } public static String getContentAtURL(URL url) throws UnsupportedEncodingException, IOException { if (url.getProtocol().toLowerCase().startsWith("http")) { return getContentAtHTTPURL(url); } else if (url.getProtocol().toLowerCase().startsWith("file")) { return getContentAtFileURL(url); } else { System.err.println("Can't handle prototcol: " + url.getProtocol()); return null; } } public static String getContentAtHTTPURL(URL url) throws IOException { HttpURLConnection conn = (HttpURLConnection) url.openConnection(); int httpStatus = conn.getResponseCode(); if (httpStatus > 199 && httpStatus < 300) { InputStream is = conn.getInputStream(); return getContentFromInputStream(is); } else if (httpStatus > 299 && httpStatus < 400) { return getContentAtHTTPURL(new URL(conn.getHeaderField("Location"))); } return null; } public static String getContentAtFileURL(URL url) throws UnsupportedEncodingException, IOException { return getContentFromInputStream(url.openStream()); } public static String getContentFromInputStream(InputStream is) throws IOException, UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); byte[] b = new byte[1024]; while (is.available() > 0) { int read = is.read(b); sb.append(new String(b, 0, read, "UTF-8")); } return sb.toString(); } public static String getSystemProperties() { return getSystemProperties(false); } public static String getSystemProperties(boolean replaceBackslashInClasspath) { StringBuilder sb = new StringBuilder(); for (Entry<Object, Object> e : new TreeMap<Object, Object>(System.getProperties()).entrySet()) { String key = (String) e.getKey(); if ("line.separator".equals(key)) { String nl = (String) e.getValue(); nl = nl.replace("\r", "\\r"); nl = nl.replace("\n", "\\n"); sb.append(key).append(" = ").append(nl).append('\n'); } else if ("java.class.path".equals(key)) { String nl = (String) e.getValue(); nl = nl.replace('\\', '/'); sb.append(key).append(" = ").append(nl).append('\n'); } else { sb.append(key).append(" = ").append(e.getValue()).append('\n'); } } return sb.toString(); } public static String getStackTraceAsString(Throwable t) { if (t == null) { return null; } StringBuilder returned = new StringBuilder(); if (t.getStackTrace() != null) { for (StackTraceElement ste : t.getStackTrace()) { returned.append("\tat ").append(ste).append("\n"); } } return returned.toString(); } public static List<?> getListFromIterable(Object iterable) { if (iterable instanceof List) { return (List<?>) iterable; } if (iterable instanceof Collection) { return new ArrayList<Object>((Collection<?>) iterable); } if (iterable instanceof Iterable) { List<Object> list = new ArrayList<Object>(); for (Object o : (Iterable<?>) iterable) { list.add(o); } return list; } if (iterable instanceof Enumeration) { List<Object> list = new ArrayList<Object>(); for (Enumeration<?> en = (Enumeration<?>) iterable; en.hasMoreElements();) { list.add(en.nextElement()); } return list; } return null; } public static boolean isMacOSLaf() { return UIManager.getLookAndFeel().getName().equals("Mac OS X"); } public static boolean isWindowsLaf() { return UIManager.getLookAndFeel().getName().startsWith("Windows"); } public static boolean isNimbusLaf() { return UIManager.getLookAndFeel().getName().equals("Nimbus"); } }