Author: bdelacretaz
Date: Wed Jan 23 02:45:27 2008
New Revision: 614485

URL: http://svn.apache.org/viewvc?rev=614485&view=rev
Log:
SLING-154 - wrappers for JCR objects, not perfect yet but better

Added:
    
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapper.java
   (with props)
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/ScriptableNode.java
    
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptablePrintWriter.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/javascript/helper/EspReaderTest.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=614485&r1=614484&r2=614485&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 02:45:27 2008
@@ -23,6 +23,7 @@
 import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
 import org.apache.sling.scripting.javascript.helper.SlingContextFactory;
 import org.apache.sling.scripting.javascript.helper.SlingWrapFactory;
+import org.apache.sling.scripting.javascript.helper.SlingWrapper;
 import org.apache.sling.scripting.javascript.wrapper.ScriptableItemMap;
 import org.apache.sling.scripting.javascript.wrapper.ScriptableNode;
 import org.apache.sling.scripting.javascript.wrapper.ScriptablePrintWriter;
@@ -41,7 +42,7 @@
 
     public final static String ESP_SCRIPT_EXTENSION = "esp";
 
-    private static final Class<?>[] WRAPPER_CLASSES = {
+    private static final Class<?>[] HOSTOBJECT_CLASSES = {
         ScriptableResource.class, ScriptableNode.class,
         ScriptableProperty.class, ScriptableItemMap.class,
         ScriptablePrintWriter.class };
@@ -85,14 +86,20 @@
             final Context rhinoContext = Context.enter();
             rootScope = rhinoContext.initStandardObjects();
 
-            for (Class<?> clazz : WRAPPER_CLASSES) {
+            for (Class<?> clazz : HOSTOBJECT_CLASSES) {
                 try {
-                    ScriptableObject.defineClass(rootScope, clazz);
 
-                    Scriptable hostObject = (Scriptable) clazz.newInstance();
-                    SlingWrapFactory.INSTANCE.registerWrapper(clazz,
-                        hostObject.getClassName());
+                    // register the host object
+                    ScriptableObject.defineClass(rootScope, clazz);
 
+                    // only register SlignWrappers with our wrapper factory
+                    if (SlingWrapper.class.isAssignableFrom(clazz)) {
+                        final SlingWrapper hostObject = (SlingWrapper) 
clazz.newInstance();
+                        for (Class<?> c : hostObject.getWrappedClasses()) {
+                            SlingWrapFactory.INSTANCE.registerWrapper(c,
+                                hostObject.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=614485&r1=614484&r2=614485&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 02:45:27 2008
@@ -67,6 +67,9 @@
     }
 
     private String getHostObjectName(Class<?> javaClass) {
+        if(javaClass==null) {
+            return null;
+        }
         String hostObjectName = wrappers.get(javaClass);
         if (hostObjectName == null) {
             hostObjectName = getHostObjectName(javaClass.getSuperclass());
@@ -75,7 +78,7 @@
                 Class<?>[] javaInterfaces = javaClass.getInterfaces();
                 for (int i = 0; i < javaInterfaces.length
                     && hostObjectName == null; i++) {
-                    hostObjectName = getHostObjectName(javaClass);
+                    hostObjectName = getHostObjectName(javaInterfaces[i]);
                 }
             }
         }

Added: 
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapper.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapper.java?rev=614485&view=auto
==============================================================================
--- 
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapper.java
 (added)
+++ 
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapper.java
 Wed Jan 23 02:45:27 2008
@@ -0,0 +1,36 @@
+/*
+ * 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.helper;
+
+import org.mozilla.javascript.Wrapper;
+
+/** Wrapper with an additional methods to indicate the wrapped classes */
+public interface SlingWrapper extends Wrapper {
+
+    /**
+     * The name of the JavaScript host object "class"
+     */
+    String getClassName();
+    
+    /**
+     * The list of Java classes wrapped by this wrapper
+     */
+    Class<?> [] getWrappedClasses();
+    
+}
\ No newline at end of file

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

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

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=614485&r1=614484&r2=614485&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 Jan 23 02:45:27 2008
@@ -23,10 +23,10 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 
+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;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,9 +34,10 @@
  * A wrapper for JCR nodes that exposes all properties and child nodes as
  * properties of a Javascript object.
  */
-public class ScriptableNode extends ScriptableObject implements Wrapper {
+public class ScriptableNode extends ScriptableObject implements SlingWrapper {
 
     public static final String CLASSNAME = "Node";
+    public static final Class<?> [] WRAPPED_CLASSES = { Node.class };
 
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -59,6 +60,10 @@
         return CLASSNAME;
     }
 
+    public Class<?> [] getWrappedClasses() {
+        return WRAPPED_CLASSES;
+    }
+    
     public ScriptableItemMap jsGet_children() {
         try {
             return new ScriptableItemMap(node.getNodes());
@@ -222,14 +227,14 @@
     }
 
     @Override
-    public Object getDefaultValue(Class typeHint) {
+    public String toString() {
         try {
             return node.getPath();
         } catch (RepositoryException e) {
-            return super.getDefaultValue(typeHint);
+            return node.toString();
         }
     }
-
+    
     // ---------- Wrapper interface 
--------------------------------------------
 
     // returns the wrapped node

Modified: 
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptablePrintWriter.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptablePrintWriter.java?rev=614485&r1=614484&r2=614485&view=diff
==============================================================================
--- 
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptablePrintWriter.java
 (original)
+++ 
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptablePrintWriter.java
 Wed Jan 23 02:45:27 2008
@@ -22,6 +22,7 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.scripting.javascript.helper.SlingWrapper;
 import org.mozilla.javascript.Context;
 import org.mozilla.javascript.Function;
 import org.mozilla.javascript.ScriptRuntime;
@@ -29,9 +30,10 @@
 import org.mozilla.javascript.ScriptableObject;
 import org.mozilla.javascript.Wrapper;
 
-public class ScriptablePrintWriter extends ScriptableObject implements Wrapper 
{
+public class ScriptablePrintWriter extends ScriptableObject implements 
SlingWrapper {
 
     public static final String CLASSNAME = "PrintWriter";
+    public static final Class<?> [] WRAPPED_CLASSES = { PrintWriter.class };
 
     private PrintWriter writer;
 
@@ -54,6 +56,10 @@
         return CLASSNAME;
     }
 
+    public Class<?> [] getWrappedClasses() {
+        return WRAPPED_CLASSES;
+    }
+    
     // print args to writer if any
     // this method supports write(Object)
     public static void jsFunction_write(Context cx, Scriptable thisObj,

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=614485&r1=614484&r2=614485&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 02:45:27 2008
@@ -30,7 +30,8 @@
 public class ScriptableProperty extends ScriptableObject implements Wrapper {
 
     public static final String CLASSNAME = "Property";
-
+    public static final Class<?> [] WRAPPED_CLASSES = { Property.class };
+    
     private Property property;
 
     public ScriptableProperty() {
@@ -49,6 +50,10 @@
         return CLASSNAME;
     }
 
+    public Class<?> [] getWrappedClasses() {
+        return WRAPPED_CLASSES;
+    }
+    
     public Object jsGet_value() {
         try {
             return property.getValue();
@@ -202,14 +207,14 @@
     }
 
     @Override
-    public Object getDefaultValue(Class typeHint) {
+    public String toString() {
         try {
-            return property.getPath();
+            return property.getString();
         } catch (RepositoryException e) {
-            return super.getDefaultValue(typeHint);
+            return property.toString();
         }
     }
-
+    
     //---------- Wrapper interface --------------------------------------------
 
     public Object unwrap() {

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=614485&r1=614484&r2=614485&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 Jan 23 02:45:27 2008
@@ -19,19 +19,21 @@
 import javax.jcr.Node;
 
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.scripting.javascript.helper.SlingWrapper;
 import org.mozilla.javascript.Context;
+import org.mozilla.javascript.ScriptRuntime;
 import org.mozilla.javascript.ScriptableObject;
 import org.mozilla.javascript.Undefined;
-import org.mozilla.javascript.Wrapper;
 
 /**
  * Resource in JavaScript has following signature: [Object] getData(); [Object]
  * data [Item] getItem(); [Item] item [String] getResourceType(); [String] type
  * [String] getPath(); [String] path
  */
-public class ScriptableResource extends ScriptableObject implements Wrapper {
+public class ScriptableResource extends ScriptableObject implements 
SlingWrapper {
 
     public static final String CLASSNAME = "Resource";
+    public static final Class<?> [] WRAPPED_CLASSES = { Resource.class };
 
     private Resource resource;
 
@@ -46,6 +48,10 @@
         this.resource = (Resource) res;
     }
 
+    public Class<?> [] getWrappedClasses() {
+        return WRAPPED_CLASSES;
+    }
+    
     @Override
     public String getClassName() {
         return CLASSNAME;
@@ -58,7 +64,11 @@
 
     public Object jsFunction_getNode() {
         Node node = resource.adaptTo(Node.class);
-        return node != null ? node : Undefined.instance;
+        Object result = Undefined.instance;
+        if(node != null) {
+            result = ScriptRuntime.toObject(this,node);
+        }
+        return result;
     }
 
     /** alias for getNode */

Modified: 
incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/javascript/helper/EspReaderTest.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/javascript/helper/EspReaderTest.java?rev=614485&r1=614484&r2=614485&view=diff
==============================================================================
--- 
incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/javascript/helper/EspReaderTest.java
 (original)
+++ 
incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/javascript/helper/EspReaderTest.java
 Wed Jan 23 02:45:27 2008
@@ -22,8 +22,6 @@
 import java.io.Reader;
 import java.io.StringReader;
 
-import org.apache.sling.scripting.javascript.helper.EspReader;
-
 import junit.framework.TestCase;
 
 /**


Reply via email to