/**
* Sahi - Web Automation and Test Tool
*
* Copyright 2006 V Narayan Raman
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.sahi.util;
//
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import java.io.*;
import java.net.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* User: nraman Date: Jun 26, 2005 Time: 4:52:58 PM
*/
public class Utils {
final static public SimpleDateFormat COMMON_DATE_FORMAT = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a");
private static Logger logger = Logger.getLogger(Utils.class);
public static String escapeDoubleQuotesAndBackSlashes(final String line) {
if (line == null) {
return null;
}
return line.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\\\\"");
}
public static byte[] getBytes(InputStream in) throws IOException {
return getBytes(in, -1);
}
public static byte[] getBytes(final InputStream in, final int contentLength) throws IOException {
BufferedInputStream bin = new BufferedInputStream(in, BUFFER_SIZE);
if (contentLength != -1) {
int totalBytesRead = 0;
byte[] buffer = new byte[contentLength];
while (totalBytesRead < contentLength) {
int bytesRead = -1;
try {
bytesRead = bin.read(buffer, totalBytesRead, contentLength - totalBytesRead);
} catch (EOFException e) {
}
if (bytesRead == -1) {
break;
}
totalBytesRead += bytesRead;
}
return buffer;
} else {
ByteArrayOutputStream byteArOut = new ByteArrayOutputStream();
BufferedOutputStream bout = new BufferedOutputStream(byteArOut);
try {
int totalBytesRead = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while (true) {
int bytesRead = -1;
try {
bytesRead = bin.read(buffer);
} catch (EOFException e) {
}
if (bytesRead == -1) {
break;
}
bout.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
}
} catch (SocketTimeoutException ste) {
ste.printStackTrace();
}
bout.flush();
bout.close();
return byteArOut.toByteArray();
}
}
public static byte[] readURL(final String url) {
return readURL(url, true);
}
public static byte[] readURLThrowException(final String url) throws MalformedURLException, IOException {
byte[] data = null;
InputStream inputStream = null;
try {
inputStream = new URL(url).openStream();
data = getBytes(inputStream, -1);
inputStream.close();
} finally {
inputStream.close();
}
return data;
}
public static byte[] readURL(final String url, boolean printExceptions) {
byte[] data = null;
InputStream inputStream = null;
try {
inputStream = new URL(url).openStream();
data = getBytes(inputStream, -1);
inputStream.close();
} catch (Exception e) {
if (printExceptions)
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (Exception e) {
if (printExceptions)
e.printStackTrace();
}
}
return data;
}
static Map<String, Object> fileCache = new HashMap<String, Object>();
public static int BUFFER_SIZE = 8192;
public static byte[] readCachedFile(final File file) {
return readCachedFile(file.getAbsolutePath());
}
public static byte[] readCachedFileIfExists(final String fileName) {
File file = new File(fileName);
if (file.exists()) return readCachedFile(fileName);
return new byte[0];
}
public static byte[] readCachedFile(final String fileName) {
if (!fileCache.containsKey(fileName)) {
fileCache.put(fileName, readFile(fileName));
}
return (byte[]) fileCache.get(fileName);
}
public static byte[] readFile(final String fileName) {
File file = new File(fileName);
return readFile(file);
}
public static String getString(byte[] bytes) {
try {
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
return new String(bytes);
}
}
public static byte[] readFile(final File file) {
if (file != null && file.isDirectory()) {
throw new FileIsDirectoryException();
}
byte[] data = null;
InputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
data = getBytes(inputStream, -1);
} catch (IOException e) {
throw new FileNotFoundRuntimeException(e);
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return data;
}
public static void writeFile(String str, String filePath, boolean overWrite) {
try {
File file = new File(filePath);
if (!file.exists()) {
createNewFile(file);
}
FileOutputStream out;
out = new FileOutputStream(file, !overWrite);
out.write((str).getBytes());
out.close();
} catch (IOException e) {
e.printStackTrace();
logger.error("Exception on writing file", e);
}
}
public static void createNewFile(String file) throws IOException {
createNewFile(new File(file));
}
public static void createNewFile(File file) throws IOException {
if (file.exists()) return;
file.getParentFile().mkdirs();
file.createNewFile();
}
public static boolean deleteFile(String filePath) {
File file = new File(filePath);
if (file.exists()) {
return file.delete();
}
return false;
}
public static String readFileAsString(final File file) {
return getString(readFile(file));
}
public static String readFileAsString(final String fileName) {
return getString(readFile(fileName));
}
public static synchronized String createLogFileName(final String scriptFileName) {
String TMPscriptFileName = new File(scriptFileName).getName();
String date = getFormattedDateForFile(new Date());
return TMPscriptFileName.replaceAll("[.].*$", "") + "__" + date;
}
static String getFormattedDateForFile(Date date) {
return new SimpleDateFormat("ddMMMyyyy__HH_mm_ss").format(date);
}
public static Date getDateFromFileName(String fileName) {
int start = fileName.lastIndexOf("__");
int length = fileName.length();
if (start != -1)
start = fileName.lastIndexOf("__", start - 1);
int end = fileName.lastIndexOf(".");
start = (start == -1) ? 0 : start + 2;
if (end == -1)
end = length;
String dateString = fileName.substring(start, end);
try {
return new SimpleDateFormat("ddMMMyyyy__HH_mm_ss").parse(dateString);
} catch (ParseException e) {
return null;
}
}
public static File getRelativeFile(File parent, final String s2) {
File sf2 = new File(s2);
if (sf2.isAbsolute()) {
return sf2;
}
if (!parent.isDirectory()) {
parent = parent.getParentFile();
}
File file = new File(parent, s2);
return file;
}
public static String concatPaths(final String s1, final String s2, final String s3) {
return concatPaths(concatPaths(s1, s2), s3);
}
public static String concatPaths(final String s1, final String s2) {
return concatPaths(s1, s2, false);
}
public static String concatPaths(final String s1, final String s2, boolean returnRelative) {
File sf2 = new File(s2);
if (sf2.isAbsolute()) {
return s2;
}
File parent = new File(s1);
if (!parent.isDirectory()) {
parent = parent.getParentFile();
}
File file = new File(parent, s2);
return returnRelative ? file.getPath() : getAbsolutePath(file);
}
public static ArrayList<String> getTokens(final String s) {
ArrayList<String> tokens = new ArrayList<String>();
int ix1 = 0;
int ix2 = -1;
int len = s.length();
while (ix1 < len && (ix2 = s.indexOf('\n', ix1)) != -1) {
String token = s.substring(ix1, ix2 + 1);
tokens.add(token);
ix1 = ix2 + 1;
}
if (ix2 == -1) {
String token = s.substring(ix1);
tokens.add(token);
}
return tokens;
}
public static boolean isBlankOrNull(final String s) {
return (s == null || "".equals(s));
}
@SuppressWarnings("unchecked")
public static String substitute(final String content, final Map substitutions) {
StringBuffer patternBuf = new StringBuffer();
int i = 0;
Iterator<?> keys = substitutions.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
patternBuf.append(i++ == 0 ? "" : "|").append("\\$").append(key);
}
Pattern pattern = Pattern.compile(patternBuf.toString());
patternBuf = null;
Matcher matcher = pattern.matcher(content);
StringBuffer buf = new StringBuffer();
while (matcher.find()) {
String key = matcher.group(0).substring(1);
String replaceStr = ((String) substitutions.get(key)).replace("\\", "\\\\").replaceAll("\\$", "SDLR");
matcher.appendReplacement(buf, replaceStr);
}
matcher.appendTail(buf);
return buf.toString().replaceAll("SDLR", "\\$");
}
public static String makeString(String s) {
if (s == null) {
return null;
}
return escapeDoubleQuotesAndBackSlashes(s).replaceAll("\n", "\\\\n").replaceAll("\r", "");
}
public static String escapeQuotesForXML(final String input) {
return input.replaceAll("\"", """);
}
public static String escapeQuotes(final String input) {
return input.replaceAll("\"", "\\\\\"");
}
public static String addChildSessionId(String sessionId) {
// return sessionId + "sahix" + "SAHI_CHILD_ID" + "x";
return sessionId + "sahix" + Utils.getUUID() + "x";
}
public static String stripChildSessionId(final String sessionId) {
return sessionId.replaceFirst("sahix[^x]+x", "");
}
public static void deleteDir(final File dir) {
try {
FileUtils.deleteDirectory(dir);
} catch (Exception e) {
}
}
public static String makePathOSIndependent(final String path) {
String separator = System.getProperty("file.separator");
return path.replace(separator.charAt(0), '/');
}
public static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().startsWith("windows");
}
public static boolean isWindowsNT() {
return System.getProperty("os.name").equals("Windows NT");
}
public static boolean isWindows95() {
return System.getProperty("os.name").equals("Windows 95");
}
public static String[] getCommandTokens(String commandString) {
boolean escaped = false;
ArrayList<String> tokens = new ArrayList<String>();
int length = commandString.length();
int startIx = 0;
int endIx = length;
final char NONE = 'x';
char startChar = NONE;
for (int i = 0; i < length; i++) {
char c = commandString.charAt(i);
if (c == '\\') {
escaped = !escaped;
}
if (!escaped) {
if (c == ' ' && startChar == NONE) {
endIx = i;
if (startIx != endIx) // Happens just after quote
tokens.add(commandString.substring(startIx, endIx + 1).trim());
startChar = NONE; // reset
startIx = i + 1;
}
if (c == '"' || c == '\'') {
if (startChar == NONE) {
startChar = c;
startIx = i;
} else {
if (c == startChar) {
endIx = i;
tokens.add(commandString.substring(startIx + 1, endIx).trim());
startChar = NONE; // reset
startIx = i + 1;
}
}
}
}
if (c != '\\') {
escaped = false;
}
}
if (startIx < length) {
tokens.add(commandString.substring(startIx, length).trim());
}
return (String[]) tokens.toArray(new String[0]);
}
public static String getStackTraceString(Exception e) {
return getStackTraceString(e, false);
}
public static String getStackTraceString(Exception e, boolean forHTML) {
ByteArrayOutputStream b = new ByteArrayOutputStream();
PrintStream s = new PrintStream(b);
e.printStackTrace(s);
String str = b.toString();
if (forHTML)
str = str.replaceAll("<", "<").replaceAll(">", ">").replaceAll("\\\r", "").replaceAll("\\\n", "<br/>");
return str;
}
public static String getAbsolutePath(String fileStr) {
return getAbsolutePath(new File(fileStr));
}
public static String getAbsolutePath(File file) {
String path = "";
try {
path = file.getCanonicalPath();
} catch (IOException e) {
path = file.getAbsolutePath();
}
return path;
}
public static String getUUID() {
return UUID.randomUUID().toString().replace('-', '0');
}
public static String generateId() {
// return "SAHI_HARDCODED_ID";
return "sahi_" + getUUID();
}
public static String toJSON(String[] list) {
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < list.length; i++) {
sb.append("\"");
sb.append(Utils.makeString(list[i]));
sb.append("\"");
if (i != list.length - 1)
sb.append(",");
}
sb.append("]");
return sb.toString();
}
public static String executeCommand(final String command, boolean isSync, long timeout) throws Exception {
final RunnableWithResult runnable = new RunnableWithResult(command);
final Thread thread = new Thread(runnable);
thread.start();
if (isSync) thread.join(timeout);
return runnable.getResult();
}
public static String executeCommand(String[] command) throws Exception {
StringBuffer sb = new StringBuffer();
Process p = Runtime.getRuntime().exec(command);
InputStream stdInput = p.getInputStream();
InputStream stdError = p.getErrorStream();
StringBuffer inBuffer = new StringBuffer();
StringBuffer errBuffer = new StringBuffer();
Thread inThread = new Thread(new StreamReader(stdInput, inBuffer));
inThread.start();
Thread errThread = new Thread(new StreamReader(stdError, errBuffer));
errThread.start();
p.waitFor();
inThread.join();
errThread.join();
sb.append(inBuffer);
sb.append(errBuffer);
return sb.toString();
}
public static Process executeAndGetProcess(String[] command) throws Exception {
// use inheritIO to see the output of the browser and other tools on console
Process p = new ProcessBuilder().inheritIO().command(command).start();
return p;
}
public static String encode(String s) {
try {
return URLEncoder.encode(s, "UTF8");
} catch (Exception e) {
e.printStackTrace();
return s;
}
}
public static void sleep(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static String escapeForXML(String message) {
if (message == null) return null;
return message.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">")
.replaceAll("\"", """).replaceAll("'", "'");
}
public static byte[] getBytes(String dataStr) {
try {
return dataStr.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
return dataStr.getBytes();
}
}
public static boolean isSahiTestFile(String testName) {
return testName.endsWith(".sah") || testName.endsWith(".sahi");
}
public static HashMap<String, String> parseCLInput(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
for (int i = 0; i < args.length; i++) {
if (args[i].indexOf("-") == 0) {
if (i + 1 < args.length) {
final String key = args[i].substring(1);
final String value = args[i + 1];
map.put(key, value);
i++;
}
}
}
return map;
}
public static String expandSystemProperties(String cmd) {
return substitute(cmd, System.getenv());
}
public static String getOSFamily() {
final String osName = "" + System.getProperty("os.name").toLowerCase();
if (osName.contains("windows"))
return System.getenv("PROGRAMFILES(X86)") != null ? "win64" : "win32";
if (osName.contains("mac")) return "mac";
return "linux";
}
public static String replaceLocalhostWithMachineName(String url) {
String computername;
try {
computername = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
return url;
}
return url.replace("localhost", computername);
}
}
class StreamReader implements Runnable {
private final InputStream in;
private final StringBuffer data;
StreamReader(InputStream in, StringBuffer data) {
this.in = in;
this.data = data;
}
public void run() {
try {
data.append(new String(Utils.getBytes(in)));
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class RunnableWithResult implements Runnable {
private final String command;
String result = "RUNNING";
RunnableWithResult(String command) {
this.command = command;
}
@Override
public void run() {
try {
result = Utils.executeCommand(Utils.getCommandTokens(command));
} catch (Exception e) {
e.printStackTrace();
}
}
public String getResult() {
return result;
}
}