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]

Reply via email to