Author: mrdon Date: Fri Feb 25 23:18:15 2005 New Revision: 155388 URL: http://svn.apache.org/viewcvs?view=rev&rev=155388 Log: * Adding support for Javascript syntax with DynaBeans * Improved testing framework to add file name to output
Added: struts/flow/trunk/src/java/org/apache/struts/flow/sugar/ScriptableDynaBean.java (with props) Modified: struts/flow/trunk/src/java/org/apache/struts/flow/sugar/JavaObjectWrapper.java struts/flow/trunk/src/java/org/apache/struts/flow/sugar/SugarWrapFactory.java struts/flow/trunk/src/test/assert.js struts/flow/trunk/src/test/org/apache/struts/flow/sugar/JavascriptSugarTest.java struts/flow/trunk/src/test/wrappersTest.js Modified: struts/flow/trunk/src/java/org/apache/struts/flow/sugar/JavaObjectWrapper.java URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/sugar/JavaObjectWrapper.java?view=diff&r1=155387&r2=155388 ============================================================================== --- struts/flow/trunk/src/java/org/apache/struts/flow/sugar/JavaObjectWrapper.java (original) +++ struts/flow/trunk/src/java/org/apache/struts/flow/sugar/JavaObjectWrapper.java Fri Feb 25 23:18:15 2005 @@ -61,4 +61,14 @@ return super.get(name, start); } } + + protected Object wrap(Object o, Scriptable start) { + Class type = Object.class; + if (o != null) { + type = o.getClass(); + } + start = ScriptableObject.getTopLevelScope(start); + Context cx = Context.getCurrentContext(); + return cx.getWrapFactory().wrap(cx, start, o, type); + } } Added: struts/flow/trunk/src/java/org/apache/struts/flow/sugar/ScriptableDynaBean.java URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/sugar/ScriptableDynaBean.java?view=auto&rev=155388 ============================================================================== --- struts/flow/trunk/src/java/org/apache/struts/flow/sugar/ScriptableDynaBean.java (added) +++ struts/flow/trunk/src/java/org/apache/struts/flow/sugar/ScriptableDynaBean.java Fri Feb 25 23:18:15 2005 @@ -0,0 +1,167 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * 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 org.apache.struts.flow.sugar; + +import org.mozilla.javascript.NativeJavaObject; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.Wrapper; +import org.apache.commons.beanutils.DynaBean; +import org.apache.commons.beanutils.DynaProperty; + +import java.io.Serializable; + +import java.util.Map; + +/** + * Wrap a DynaBean for JavaScript. Currently only supports named, + * and not mapped or indexed properties for Javascript shortcuts. + * Mapped and indexed properties are still available through their + * get() methods. + */ +public class ScriptableDynaBean extends JavaObjectWrapper implements Scriptable, Wrapper, Serializable { + + private DynaBean bean; + private String functionPrefix = null; + + public ScriptableDynaBean() { + super(); + } + + public ScriptableDynaBean(DynaBean bean) { + this.bean = bean; + } + + public ScriptableDynaBean(Scriptable scope, Object javaObject, Class staticType, String functionPrefix, Map functions) { + super(scope, javaObject, staticType, functions); + this.functionPrefix = functionPrefix; + if (javaObject instanceof DynaBean) { + this.bean = (DynaBean)javaObject; + } else { + throw new IllegalArgumentException("Passed object "+javaObject+" is not an instance of DynaBean"); + } + } + + public String getClassName() { + return "DynaBean"; + } + + public boolean has(String name, Scriptable start) { + return (has(name) || super.has(name, start)); + } + + /** + * no numeric properties + */ + public boolean has(int index, Scriptable start) { + return false; + } + + public Object get(String name, Scriptable start) { + if (functionPrefix != null && name.startsWith(functionPrefix)) { + return super.get(name.substring(functionPrefix.length()), start); + } else { + + if (has(name)) { + return wrap(this.bean.get(name), start); + } else { + return super.get(name, start); + } + } + } + + private boolean has(String name) { + try { + Object val = this.bean.get(name); + return (val != null); + } catch (IllegalArgumentException ex) { + // Do nothing as we don't care if it complains + } + return false; + } + + public Object get(int index, Scriptable start) { + return NOT_FOUND; + } + + public void put(String name, Scriptable start, Object value) { + if (value instanceof NativeJavaObject) { + value = ((NativeJavaObject)value).unwrap(); + } + bean.set(name, value); + } + + public void put(int index, Scriptable start, Object value) { + } + + public void delete(String id) { + bean.set(id, null); + } + + public void delete(int index) { + } + + public Scriptable getPrototype() { + return prototype; + } + + public void setPrototype(Scriptable prototype) { + this.prototype = prototype; + } + + public Scriptable getParentScope() { + return parent; + } + + public void setParentScope(Scriptable parent) { + this.parent = parent; + } + + /** + * The id array that is returned is of class DynaProperties, + * rather than the perhaps expected String. + */ + public Object[] getIds() { + DynaProperty[] props = this.bean.getDynaClass().getDynaProperties(); + String[] ids = new String[props.length]; + for (int x=0; x < props.length; x++) { + ids[x] = props[x].getName(); + } + return ids; + } + + public Object getDefaultValue(Class typeHint) { + return this.bean.toString(); + } + + public boolean hasInstance(Scriptable value) { + Scriptable proto = value.getPrototype(); + while (proto != null) { + if (proto.equals(this)) + return true; + proto = proto.getPrototype(); + } + + return false; + } + + /** + * Return the DynaBean that is wrapped by this class. + */ + public Object unwrap() { + return this.bean; + } + +} Propchange: struts/flow/trunk/src/java/org/apache/struts/flow/sugar/ScriptableDynaBean.java ------------------------------------------------------------------------------ svn:executable = * Modified: struts/flow/trunk/src/java/org/apache/struts/flow/sugar/SugarWrapFactory.java URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/sugar/SugarWrapFactory.java?view=diff&r1=155387&r2=155388 ============================================================================== --- struts/flow/trunk/src/java/org/apache/struts/flow/sugar/SugarWrapFactory.java (original) +++ struts/flow/trunk/src/java/org/apache/struts/flow/sugar/SugarWrapFactory.java Fri Feb 25 23:18:15 2005 @@ -19,6 +19,7 @@ import java.io.*; import java.util.*; import java.lang.reflect.*; +import org.apache.commons.beanutils.DynaBean; /** * Wraps Java objects by adding support for function extensions, which are @@ -91,6 +92,8 @@ Scriptable wrap = null; if (javaObject instanceof Map) { wrap = new ScriptableMap(scope, javaObject, staticType, mapFuncPrefix, map); + } else if (javaObject instanceof DynaBean) { + wrap = new ScriptableDynaBean(scope, javaObject, staticType, mapFuncPrefix, map); } else if (javaObject instanceof List) { wrap = new ScriptableList(scope, javaObject, staticType, map); } else { Modified: struts/flow/trunk/src/test/assert.js URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/test/assert.js?view=diff&r1=155387&r2=155388 ============================================================================== --- struts/flow/trunk/src/test/assert.js (original) +++ struts/flow/trunk/src/test/assert.js Fri Feb 25 23:18:15 2005 @@ -14,7 +14,7 @@ } } -function runTests() { +function runTests(name) { for (id in this) { if (id.length > 4 && id.substr(0, 4) == 'test') { @@ -34,12 +34,12 @@ } } - printResults() + printResults(name) } -function printResults() { - print("Test Results"); - print("===============\n"); +function printResults(name) { + print("\n"+name + " Test Results"); + print("==============="); print("Successes - "+successes.length); for (x in successes) { print("\t"+successes[x]); @@ -58,6 +58,5 @@ java.lang.System.out.println((val == null ? "null" : val)); } -runTests(); Modified: struts/flow/trunk/src/test/org/apache/struts/flow/sugar/JavascriptSugarTest.java URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/test/org/apache/struts/flow/sugar/JavascriptSugarTest.java?view=diff&r1=155387&r2=155388 ============================================================================== --- struts/flow/trunk/src/test/org/apache/struts/flow/sugar/JavascriptSugarTest.java (original) +++ struts/flow/trunk/src/test/org/apache/struts/flow/sugar/JavascriptSugarTest.java Fri Feb 25 23:18:15 2005 @@ -51,7 +51,7 @@ // Now evaluate the string we've colected. String code = readAll(kids[x]); - StringReader reader = new StringReader(code + "\n" + assertCode); + StringReader reader = new StringReader(code + "\n" + assertCode + "\nrunTests('"+kids[x].getName()+"');"); Object result = cx.evaluateReader(scope, reader, kids[x].getName(), 1, null); // Convert the result to a string and print it. Modified: struts/flow/trunk/src/test/wrappersTest.js URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/test/wrappersTest.js?view=diff&r1=155387&r2=155388 ============================================================================== --- struts/flow/trunk/src/test/wrappersTest.js (original) +++ struts/flow/trunk/src/test/wrappersTest.js Fri Feb 25 23:18:15 2005 @@ -6,6 +6,24 @@ assertTrue("normal map get() didn't work", map.get("foo") == "bar"); } +function testBeanIndex() { + bean = new Packages.org.apache.commons.beanutils.LazyDynaBean(); + bean.set("foo", "bar"); + bean["jim"] = "bar"; + bean.sara = "friend"; + + assertTrue("set didn't work", bean["foo"] == "bar"); + assertTrue("dot notation didn't work", bean.jim == "bar"); + assertTrue("normal map get() didn't work", bean.get("sara") == "friend"); + + jimFound = false; + for (x in bean) { + if (x == "jim") jimFound = true; + } + assertTrue("jim not found in for..in", jimFound); +} + + function testListIndex() { list = new java.util.ArrayList(); list.add("foo"); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]