/**
*
*/
package com.thoughtworks.calabash.android;
import org.jruby.RubyArray;
import org.jruby.RubyHash;
import org.jruby.RubyObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;
final class Utils {
public static String getStringFromHash(RubyHash target, String key) {
try {
Object value = target.get(key);
if (value != null)
return value.toString();
return null;
} catch (Exception e) {
return null;
}
}
public static Integer getIntFromHash(RubyHash target, String key) {
String value = getStringFromHash(target, key);
if (value != null) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
return null;
}
}
return null;
}
public static Object[] toJavaArray(RubyArray array) {
ArrayList<Object> result = new ArrayList<Object>();
for (int i = 0; i < array.size(); i++) {
Object rubyObject = array.get(i);
Object javaObject = toJavaObject(rubyObject);
result.add(javaObject);
}
return result.toArray();
}
public static Object toJavaObject(Object rubyObject) {
if (rubyObject == null)
return null;
if (rubyObject instanceof RubyArray)
return toJavaArray((RubyArray) rubyObject);
if (rubyObject instanceof RubyHash)
return toJavaHash((RubyHash) rubyObject);
if (rubyObject instanceof RubyObject)
return ((RubyObject) rubyObject).toJava(Object.class);
return rubyObject.toString();
}
public static Map<?, ?> toJavaHash(RubyHash rubyHash) {
HashMap<Object, Object> map = new HashMap<Object, Object>();
Set<?> keySet = rubyHash.keySet();
for (Object rubyKey : keySet) {
Object rubyValue = rubyHash.get(rubyKey);
Object javaKey = toJavaObject(rubyKey);
Object javaValue = toJavaObject(rubyValue);
map.put(javaKey, javaValue);
}
return map;
}
public static void inspectElement(TreeNode node, int nestingLevel, InspectCallback callback) {
callback.onEachElement(node.getData(), nestingLevel);
for (TreeNode childNode : node.getChildren()) {
inspectElement(childNode, nestingLevel + 1, callback);
}
}
public static String runCommand(String[] command, String onExceptionMessage) throws CalabashException {
int exitCode;
try {
Process process = executeCommand(command);
exitCode = process.waitFor();
String error = toString(process.getErrorStream());
String output = toString(process.getInputStream());
CalabashLogger.info(output);
if (exitCode == 0) {
return output;
} else {
CalabashLogger.error("Executing command failed");
CalabashLogger.info(output);
CalabashLogger.error(error);
throw new CalabashException(onExceptionMessage);
}
} catch (Exception e) {
throw new CalabashException(onExceptionMessage);
}
}
public static String runCommand(String[] command) throws CalabashException {
Process process;
try {
process = executeCommand(command);
process.waitFor();
String error = toString(process.getErrorStream());
String output = toString(process.getInputStream());
CalabashLogger.info(output);
CalabashLogger.error(error);
return output;
} catch (Exception e) {
throw new CalabashException(String.format("Failed to execute command %s, %s", getStringFromArray(command), e.getMessage()), e);
}
}
public static Process runCommandInBackGround(String[] command, String onExceptionMessage) throws CalabashException {
try {
return executeCommand(command);
} catch (Exception e) {
throw new CalabashException(onExceptionMessage);
}
}
private static Process executeCommand(String[] command) throws Exception {
String cmd = getStringFromArray(command);
CalabashLogger.info("Executing command");
CalabashLogger.info(cmd);
return Runtime.getRuntime().exec(command);
}
public static String getStringFromArray(String[] command) {
return Arrays.toString(command).replaceAll("\\[|,|]", "");
}
public static String toString(InputStream in) throws CalabashException {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String read;
try {
while ((read = br.readLine()) != null) {
sb.append(read);
}
} catch (IOException e) {
throw new CalabashException("Error reading from stream.", e);
}
return sb.toString();
}
public static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().contains("win");
}
public static int getFirstIntValue(RubyArray rubyArray) {
Object[] javaArray = Utils.toJavaArray(rubyArray);
return Integer.parseInt(javaArray[0].toString());
}
public static String toString(Object object) {
return object != null ? object.toString() : "";
}
}