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;
/**