You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2008/01/23 16:57:34 UTC

svn commit: r614575 - in /incubator/sling/trunk/scripting/javascript/src: main/java/org/apache/sling/scripting/javascript/ main/java/org/apache/sling/scripting/javascript/helper/ main/java/org/apache/sling/scripting/javascript/wrapper/ test/java/org/ap...

Author: bdelacretaz
Date: Wed Jan 23 07:57:32 2008
New Revision: 614575

URL: http://svn.apache.org/viewvc?rev=614575&view=rev
Log:
SLING-154 - access to a Property with node.properties.propertyname works

Modified:
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java
    incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/RepositoryScriptingTestBase.java
    incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java

Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java?rev=614575&r1=614574&r2=614575&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java Wed Jan 23 07:57:32 2008
@@ -91,14 +91,18 @@
 
                     // register the host object
                     ScriptableObject.defineClass(rootScope, clazz);
+                    final ScriptableObject host = (ScriptableObject)clazz.newInstance();
 
-                    // only register SlignWrappers with our wrapper factory
                     if (SlingWrapper.class.isAssignableFrom(clazz)) {
-                        final SlingWrapper hostObject = (SlingWrapper) clazz.newInstance();
-                        for (Class<?> c : hostObject.getWrappedClasses()) {
+                        // SlingWrappers can map to several classes if needed
+                        final SlingWrapper hostWrapper = (SlingWrapper) host;
+                        for (Class<?> c : hostWrapper.getWrappedClasses()) {
                             SlingWrapFactory.INSTANCE.registerWrapper(c,
-                                hostObject.getClassName());
+                                hostWrapper.getClassName());
                         }
+                    } else {
+                        // but other ScriptableObjects need to be registered as well
+                        SlingWrapFactory.INSTANCE.registerWrapper(host.getClass(),host.getClassName());
                     }
                 } catch (Throwable t) {
                     // TODO: log

Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java?rev=614575&r1=614574&r2=614575&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java Wed Jan 23 07:57:32 2008
@@ -48,6 +48,7 @@
     public Scriptable wrapAsJavaObject(Context cx, Scriptable scope,
             Object javaObject, Class staticType) {
 
+        Scriptable result = null;
         try {
             String hostObjectName = getHostObjectName(staticType);
 
@@ -56,14 +57,18 @@
             }
 
             if (hostObjectName != null) {
-                return cx.newObject(scope, hostObjectName,
+                result = cx.newObject(scope, hostObjectName,
                     new Object[] { javaObject });
             }
         } catch (Exception e) {
             log.warn("Cannot Wrap " + javaObject, e);
         }
 
-        return super.wrapAsJavaObject(cx, scope, javaObject, staticType);
+        if(result==null) {
+            result = super.wrapAsJavaObject(cx, scope, javaObject, staticType);
+        }
+        
+        return result;
     }
 
     private String getHostObjectName(Class<?> javaClass) {

Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java?rev=614575&r1=614574&r2=614575&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java Wed Jan 23 07:57:32 2008
@@ -23,6 +23,7 @@
 import java.util.Map;
 
 import javax.jcr.Item;
+import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
 import org.mozilla.javascript.ScriptRuntime;
@@ -89,11 +90,14 @@
     @Override
     public Object get(String name, Scriptable start) {
         Item item = items.get(name);
-        if (item != null) {
-            return ScriptRuntime.toObject(this, item);
+        Object result = Undefined.instance;
+        if (item instanceof Property) {
+            result = ScriptRuntime.toObject(this, (Property)item);
+        } else if (item != null) {
+            result = ScriptRuntime.toObject(this, item);
         }
 
-        return Undefined.instance;
+        return result;
     }
 
     @Override

Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java?rev=614575&r1=614574&r2=614575&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java Wed Jan 23 07:57:32 2008
@@ -22,12 +22,12 @@
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 
+import org.apache.sling.scripting.javascript.helper.SlingWrapper;
 import org.mozilla.javascript.ScriptRuntime;
 import org.mozilla.javascript.ScriptableObject;
 import org.mozilla.javascript.Undefined;
-import org.mozilla.javascript.Wrapper;
 
-public class ScriptableProperty extends ScriptableObject implements Wrapper {
+public class ScriptableProperty extends ScriptableObject implements SlingWrapper {
 
     public static final String CLASSNAME = "Property";
     public static final Class<?> [] WRAPPED_CLASSES = { Property.class };
@@ -207,9 +207,14 @@
     }
 
     @Override
+    public Object getDefaultValue(Class typeHint) {
+        return toString();
+    }
+
+    @Override
     public String toString() {
         try {
-            return property.getString();
+            return property.getValue().getString();
         } catch (RepositoryException e) {
             return property.toString();
         }

Modified: incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/RepositoryScriptingTestBase.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/RepositoryScriptingTestBase.java?rev=614575&r1=614574&r2=614575&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/RepositoryScriptingTestBase.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/RepositoryScriptingTestBase.java Wed Jan 23 07:57:32 2008
@@ -18,6 +18,10 @@
  */
 package org.apache.sling.scripting;
 
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.naming.NamingException;
+
 import org.apache.sling.commons.testing.jcr.RepositoryTestBase;
 
 
@@ -25,11 +29,16 @@
  *  and scripting functionality */
 public class RepositoryScriptingTestBase extends RepositoryTestBase {
     protected ScriptEngineHelper script;
+    private int counter;
     
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script = new ScriptEngineHelper();
+    }
+    
+    protected Node getNewNode() throws RepositoryException, NamingException {
+        return getTestRootNode().addNode("test-" + (++counter));
     }
 
 }

Modified: incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java?rev=614575&r1=614574&r2=614575&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java Wed Jan 23 07:57:32 2008
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.scripting.wrapper;
 
+import javax.jcr.Node;
+
 import org.apache.sling.scripting.RepositoryScriptingTestBase;
 import org.apache.sling.scripting.ScriptEngineHelper;
 
@@ -27,12 +29,57 @@
  */
 public class ScriptableNodeTest extends RepositoryScriptingTestBase {
 
+    private Node node;
+    private String testText;
+    private ScriptEngineHelper.Data data;
+    
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        
+        node = getNewNode();
+        testText = "Test-" + System.currentTimeMillis();
+        node.setProperty("text", testText);
+        
+        data = new ScriptEngineHelper.Data();
+        data.put("node", node);
+        data.put("property", node.getProperty("text"));
+    }
+
     public void testPrimaryNodeType() throws Exception {
         final ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
         data.put("node", getTestRootNode());
         assertEquals(
                 "nt:unstructured",
                 script.evalToString("out.print(node.primaryNodeType.name)", data)
+        );
+    }
+
+    public void testViaPropertyNoWrappers() throws Exception {
+        assertEquals(
+                testText,
+                script.evalToString("out.print(property.value.string)", data)
+        );
+    }
+    
+    public void testViaPropertyWithWrappers() throws Exception {
+        assertEquals(
+                testText,
+                script.evalToString("out.print(property)", data)
+        );
+    }
+    
+    public void testViaNodeNoWrappers() throws Exception {
+        assertEquals(
+                testText,
+                script.evalToString("out.print(node.properties.text.value.string)", data)
+        );
+    }
+    
+    public void DIS_testViaNodeWithWrappers() throws Exception {
+        assertEquals(
+                testText,
+                script.evalToString("out.print(node.properties.text)", data)
         );
     }
 }