package com.jwmsolutions.jwmscript; import java.net.URL; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.io.InputStreamReader; import java.io.BufferedReader; import javax.script.Invocable; import netscape.javascript.JSObject; import java.lang.reflect.Array; public class Util implements JSHolder { private JSHandle handle; public Util(JSHandle handle) { this.handle = handle; } public JSHandle getJSHandle() { return handle; } public void setJSHandle(JSHandle handle) { this.handle = handle; } public String getBacktrace(Object o) { if (o instanceof Throwable) { Throwable e = (Throwable) o; StringWriter writer = new StringWriter(); PrintWriter print = new PrintWriter(writer, true); e.printStackTrace(print); return writer.toString(); } else { return String.valueOf(o); } } public ClassWrapper wrapClass(String name, ClassLoader loader) throws Exception { if (loader == null) { loader = JSHandle.class.getClassLoader(); } Class cls = loader.loadClass(name); return new ClassWrapper(cls); } public String getResourceString(String resource, ClassLoader classLoader) throws Exception { URL url = classLoader.getResource(resource); return readURLString(url); } public String readURLString(URL url) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream())); StringBuffer buff = new StringBuffer(); String inputLine; while ((inputLine = in.readLine()) != null) { buff.append(inputLine).append("\n"); } in.close(); return buff.toString(); } public JSHandle jsFunction(JSHandle handle, Invocable ivk, Object object, String name) { return (JSHandle) handle.call("createCallback", new Object[] { ivk, object, name }); } public URL[] toURLAry(JSHandle jsAry) throws java.net.MalformedURLException { int length = ((Number) jsAry.getMember("length")).intValue(); URL[] ary = new URL[length]; for (int i = 0; i < length; i++) { Object obj = jsAry.getSlot(i); if (obj == null) { continue; } String spec = obj.toString(); if (!spec.matches("^\\w+:.+")) { String location = (String) handle.eval("document.location.toString()"); spec = location.replaceFirst("/[^/]*$", "/"+spec); } ary[i] = new URL(spec); } return ary; } public Object[] toObjectAry(JSHandle jsAry) { return toJavaAry(jsAry, Object.class); } public JSHandle[] toHandleAry(JSHandle jsAry) { return (JSHandle[]) toJavaAry(jsAry, JSHandle.class); } public Object[] toJavaAry(JSHandle jsAry, Class javaClass) { int length = ((Number) jsAry.getMember("length")).intValue(); if (javaClass == null) { javaClass = Object.class; } Object ary = Array.newInstance(javaClass, length); for (int i = 0; i < length; i ++) { Object obj = jsAry.getSlot(i); if (JSObject.class.isAssignableFrom(javaClass) && obj instanceof JSHandle) { obj = ((JSHandle) obj).getJSObject(); } Array.set(ary, i, obj); } return (Object[]) ary; } public JSHandle newHandle(JSObject jsObject) { return new JSHandle(jsObject, getJSHandle().getAppletContext()); } }