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/04/30 13:09:08 UTC

svn commit: r652323 - 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 Apr 30 04:09:08 2008
New Revision: 652323

URL: http://svn.apache.org/viewvc?rev=652323&view=rev
Log:
SLING-383 - javascript wrappers for Version and VersionHistory

Added:
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersion.java   (with props)
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersionHistory.java   (with props)
    incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableVersionTest.java
      - copied, changed from r652270, incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/SlingWrapFactoryTest.java
Removed:
    incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/SlingWrapFactoryTest.java
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/ScriptableBase.java
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java
    incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java
    incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.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=652323&r1=652322&r2=652323&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 Apr 30 04:09:08 2008
@@ -29,6 +29,8 @@
 import org.apache.sling.scripting.javascript.wrapper.ScriptablePrintWriter;
 import org.apache.sling.scripting.javascript.wrapper.ScriptableProperty;
 import org.apache.sling.scripting.javascript.wrapper.ScriptableResource;
+import org.apache.sling.scripting.javascript.wrapper.ScriptableVersion;
+import org.apache.sling.scripting.javascript.wrapper.ScriptableVersionHistory;
 import org.mozilla.javascript.Context;
 import org.mozilla.javascript.Scriptable;
 import org.mozilla.javascript.ScriptableObject;
@@ -47,9 +49,14 @@
     public final static String ESP_SCRIPT_EXTENSION = "esp";
 
     private static final Class<?>[] HOSTOBJECT_CLASSES = {
-        ScriptableResource.class, ScriptableNode.class,
-        ScriptableProperty.class, ScriptableItemMap.class,
-        ScriptablePrintWriter.class };
+        ScriptableResource.class, 
+        ScriptableNode.class,
+        ScriptableProperty.class, 
+        ScriptableItemMap.class,
+        ScriptablePrintWriter.class,
+        ScriptableVersionHistory.class,
+        ScriptableVersion.class
+    };
 
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());

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=652323&r1=652322&r2=652323&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 Apr 30 04:09:08 2008
@@ -21,9 +21,6 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.jcr.version.Version;
-import javax.jcr.version.VersionHistory;
-
 import org.mozilla.javascript.Context;
 import org.mozilla.javascript.Scriptable;
 import org.mozilla.javascript.WrapFactory;
@@ -34,7 +31,8 @@
 
     public static final SlingWrapFactory INSTANCE = new SlingWrapFactory();
     
-    private static final Class<?>[] EXCLUDED_CLASSES = {VersionHistory.class, Version.class};
+    /** List of classes that must not be wrapped (added for SLING-382) */
+    private static final Class<?>[] EXCLUDED_CLASSES = {};
 
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -83,14 +81,16 @@
         }
         String hostObjectName = wrappers.get(javaClass);
         if (hostObjectName == null) {
-            hostObjectName = getHostObjectName(javaClass.getSuperclass());
+            // before SLING-383 the superclass was tested first,
+            // but for Version and VersionHistory this would get 
+            // a Node wrapper, that's not what we want
+            final Class<?>[] javaInterfaces = javaClass.getInterfaces();
+            for (int i = 0; i < javaInterfaces.length && hostObjectName == null; i++) {
+                hostObjectName = getHostObjectName(javaInterfaces[i]);
+            }
 
             if (hostObjectName == null) {
-                Class<?>[] javaInterfaces = javaClass.getInterfaces();
-                for (int i = 0; i < javaInterfaces.length
-                    && hostObjectName == null; i++) {
-                    hostObjectName = getHostObjectName(javaInterfaces[i]);
-                }
+                hostObjectName = getHostObjectName(javaClass.getSuperclass());
             }
         }
 

Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableBase.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableBase.java?rev=652323&r1=652322&r2=652323&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableBase.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableBase.java Wed Apr 30 04:09:08 2008
@@ -64,6 +64,12 @@
     /** @return the static type to use for NativeJavaObject wrapping */
     protected abstract Class<?> getStaticType();
     
+    /** Used in testing, to check that the right wrapper is used. 
+     *  For some reason, defining the method here didn't work, it had to be
+     *  defined in all descendant classes.      
+     */
+    public abstract Class<?> jsGet_javascriptWrapperClass();
+    
     /** @return the Set of method names that clazz defines, i.e. all public methods
      *  with names that start with jsFunction_ */
     private Set<String> getJsMethodNames() {

Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java?rev=652323&r1=652322&r2=652323&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java Wed Apr 30 04:09:08 2008
@@ -200,7 +200,7 @@
 
     public Object jsFunction_getVersionHistory() {
         try {
-            return node.getVersionHistory();
+            return ScriptRuntime.toObject(this, node.getVersionHistory());
         } catch (RepositoryException re) {
             return Undefined.instance;
         }
@@ -208,7 +208,7 @@
 
     public Object jsFunction_getBaseVersion() {
         try {
-            return node.getBaseVersion();
+            return ScriptRuntime.toObject(this, node.getBaseVersion());
         } catch (RepositoryException re) {
             return Undefined.instance;
         }
@@ -402,6 +402,10 @@
         }
     }
 
+    public Class<?> jsGet_javascriptWrapperClass() {
+        return getClass();
+    }
+    
     @Override
     public String toString() {
         try {

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=652323&r1=652322&r2=652323&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 Apr 30 04:09:08 2008
@@ -205,6 +205,10 @@
         return property.isModified();
     }
 
+    public Class<?> jsGet_javascriptWrapperClass() {
+        return getClass();
+    }
+    
     public Object jsFunction_valueOf(String hint) {
         if ("undefined".equals(hint)) {
             

Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java?rev=652323&r1=652322&r2=652323&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java Wed Apr 30 04:09:08 2008
@@ -133,6 +133,10 @@
         return Undefined.instance;
     }
 
+    public Class<?> jsGet_javascriptWrapperClass() {
+        return getClass();
+    }
+    
     @SuppressWarnings("unchecked")
     @Override
     public Object getDefaultValue(Class typeHint) {

Added: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersion.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersion.java?rev=652323&view=auto
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersion.java (added)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersion.java Wed Apr 30 04:09:08 2008
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.sling.scripting.javascript.wrapper;
+
+import javax.jcr.version.Version;
+
+/** Scriptable wrapper for the JCR Version class */
+@SuppressWarnings("serial")
+public class ScriptableVersion extends ScriptableNode {
+
+    public static final String CLASSNAME = "Version";
+    public static final Class<?> [] WRAPPED_CLASSES = { Version.class };
+    
+    private Version version;
+    
+    @Override
+    public void jsConstructor(Object res) {
+        super.jsConstructor(res);
+        version = (Version)res;
+    }
+
+    @Override
+    protected Class<?> getStaticType() {
+        return Version.class;
+    }
+
+    @Override
+    public String getClassName() {
+        return CLASSNAME;
+    }
+
+    @Override
+    public Class<?>[] getWrappedClasses() {
+        return WRAPPED_CLASSES;
+    }
+
+    @Override
+    protected Object getWrappedObject() {
+        return version;
+    }
+    
+    public Class<?> jsGet_javascriptWrapperClass() {
+        return getClass();
+    }
+}
\ No newline at end of file

Propchange: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersion.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersion.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersionHistory.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersionHistory.java?rev=652323&view=auto
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersionHistory.java (added)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersionHistory.java Wed Apr 30 04:09:08 2008
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.sling.scripting.javascript.wrapper;
+
+import javax.jcr.version.VersionHistory;
+
+/** Scriptable wrapper for the JCR VersionHistory class */
+@SuppressWarnings("serial")
+public class ScriptableVersionHistory extends ScriptableNode {
+
+    public static final String CLASSNAME = "VersionHistory";
+    public static final Class<?> [] WRAPPED_CLASSES = { VersionHistory.class };
+    
+    private VersionHistory versionHistory;
+    
+    @Override
+    public void jsConstructor(Object res) {
+        super.jsConstructor(res);
+        versionHistory = (VersionHistory)res;
+    }
+
+    @Override
+    protected Class<?> getStaticType() {
+        return VersionHistory.class;
+    }
+
+    @Override
+    public String getClassName() {
+        return CLASSNAME;
+    }
+
+    @Override
+    public Class<?>[] getWrappedClasses() {
+        return WRAPPED_CLASSES;
+    }
+
+    @Override
+    protected Object getWrappedObject() {
+        return versionHistory;
+    }
+    
+    public Class<?> jsGet_javascriptWrapperClass() {
+        return getClass();
+    }
+}
\ No newline at end of file

Propchange: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersionHistory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableVersionHistory.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

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=652323&r1=652322&r2=652323&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 Apr 30 04:09:08 2008
@@ -158,6 +158,13 @@
         );
     }
     
+    public void testPropertyWrapperClass() throws Exception {
+        assertEquals(
+                "org.apache.sling.scripting.javascript.wrapper.ScriptableProperty", 
+                script.eval("node.getProperty('num').javascriptWrapperClass.getName()", data)
+        );
+    }
+    
     public void testPropertyAncestor() throws Exception {
         // call getAncestor which is not explicitly defined in ScriptableProperty,
         // to verify that all Property methods are available and that we get a 
@@ -289,4 +296,11 @@
         ;
         assertEquals("true false", script.evalToString(code, data));
     }
+    
+    public void testNodeWrapperClass() throws Exception {
+        assertEquals(
+                "org.apache.sling.scripting.javascript.wrapper.ScriptableNode", 
+                script.eval("node.javascriptWrapperClass.getName()", data)
+        );
+    }
 }

Modified: incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java?rev=652323&r1=652322&r2=652323&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java Wed Apr 30 04:09:08 2008
@@ -77,6 +77,16 @@
         assertEquals(Undefined.instance, script.eval(
             "resource.adaptTo(Packages.java.util.Date)", data));
     }
+    
+    public void testResourceWrapperClass() throws Exception {
+        final ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
+        data.put("resource", new TestResource(node));
+        
+        assertEquals(
+                "org.apache.sling.scripting.javascript.wrapper.ScriptableResource", 
+                script.eval("resource.javascriptWrapperClass.getName()", data)
+        );
+    }
 
     private void assertEquals(Node expected, Object actual) {
         while (actual instanceof Wrapper) {

Copied: incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableVersionTest.java (from r652270, incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/SlingWrapFactoryTest.java)
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableVersionTest.java?p2=incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableVersionTest.java&p1=incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/SlingWrapFactoryTest.java&r1=652270&r2=652323&rev=652323&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/SlingWrapFactoryTest.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableVersionTest.java Wed Apr 30 04:09:08 2008
@@ -23,15 +23,18 @@
 import org.apache.sling.scripting.RepositoryScriptingTestBase;
 import org.apache.sling.scripting.ScriptEngineHelper;
 
-public class SlingWrapFactoryTest extends RepositoryScriptingTestBase {
+/** Test access to Version and VersionHistory objects */
+public class ScriptableVersionTest extends RepositoryScriptingTestBase {
 
     private Node node;
+    private ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
         node = getNewNode();
+        data.put("node", node);
         node.addMixin("mix:versionable");
         getSession().save();
 
@@ -39,18 +42,37 @@
         getSession().save();
     }
 
-    public void testGetVersionHistoryNotWrapped() throws Exception {
-        final ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
-        data.put("node", node);
+    public void testVersionHistoryAccess() throws Exception {
         Object result = script.eval("node.getVersionHistory().getAllVersions()", data);
         assertNotNull(result);
     }
 
-    public void testVersionNotWrapped() throws Exception {
-        final ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
-        data.put("node", node);
+    public void testVersionHistoryIsWrapped() throws Exception {
+        assertEquals("nt:versionHistory", script.eval("node.versionHistory['jcr:primaryType']", data));
+        assertEquals("nt:version", script.eval("node.versionHistory.rootVersion['jcr:primaryType']", data));
+    }
+
+    public void testVersionHistoryWrapperClass() throws Exception {
+        assertEquals(
+                "org.apache.sling.scripting.javascript.wrapper.ScriptableVersionHistory", 
+                script.eval("node.versionHistory.javascriptWrapperClass.getName()", data)
+        );
+    }
+
+    public void testVersionAccess() throws Exception {
         Object result = script.eval("node.getBaseVersion().getCreated()", data);
         assertNotNull(result);
     }
 
+    public void testVersionIsWrapped() throws Exception {
+        assertEquals("nt:version", script.eval("node.baseVersion['jcr:primaryType']", data));
+        assertNotNull(script.eval("node.baseVersion.created", data));
+    }
+    
+    public void testVersionWrapperClass() throws Exception {
+        assertEquals(
+                "org.apache.sling.scripting.javascript.wrapper.ScriptableVersion", 
+                script.eval("node.baseVersion.javascriptWrapperClass.getName()", data)
+        );
+    }
 }