You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2008/02/27 08:39:35 UTC

svn commit: r631505 - in /incubator/sling/trunk: api/src/main/java/org/apache/sling/api/scripting/SlingBindings.java scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScript.java

Author: cziegeler
Date: Tue Feb 26 23:39:25 2008
New Revision: 631505

URL: http://svn.apache.org/viewvc?rev=631505&view=rev
Log:
SLING-264: Apply slightly modified patch from Alexander Saar to allow script execution outside of a request.

Modified:
    incubator/sling/trunk/api/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
    incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScript.java

Modified: incubator/sling/trunk/api/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/api/src/main/java/org/apache/sling/api/scripting/SlingBindings.java?rev=631505&r1=631504&r2=631505&view=diff
==============================================================================
--- incubator/sling/trunk/api/src/main/java/org/apache/sling/api/scripting/SlingBindings.java (original)
+++ incubator/sling/trunk/api/src/main/java/org/apache/sling/api/scripting/SlingBindings.java Tue Feb 26 23:39:25 2008
@@ -19,6 +19,7 @@
 package org.apache.sling.api.scripting;
 
 import java.io.PrintWriter;
+import java.io.Reader;
 import java.util.HashMap;
 
 import org.apache.sling.api.SlingHttpServletRequest;
@@ -60,6 +61,14 @@
 
     /**
      * The name of the global scripting variable providing the
+     * {@link java.io.Reader} object (value is "reader").
+     * <p>
+     * This bound variable is required in the bindings given the script.
+     */
+    public static final String READER = "reader";
+
+    /**
+     * The name of the global scripting variable providing the
      * {@link org.apache.sling.api.scripting.SlingScriptHelper} for the request
      * (value is "sling").
      * <p>
@@ -216,6 +225,30 @@
         Object value = get(REQUEST);
         if (value instanceof SlingHttpServletRequest) {
             return (SlingHttpServletRequest) value;
+        }
+
+        return null;
+    }
+
+    /**
+     * Sets the {@link #READER} property to <code>reader</code> if not
+     * <code>null</code>.
+     */
+    public void setReader(Reader reader) {
+        if (reader != null) {
+            put(READER, reader);
+        }
+    }
+
+    /**
+     * Returns the {@link #READER} property if not <code>null</code> and a
+     * <code>Reader</code> instance. Otherwise <code>null</code> is
+     * returned.
+     */
+    public Reader getReader() {
+        Object value = get(READER);
+        if (value instanceof Reader) {
+            return (Reader) value;
         }
 
         return null;

Modified: incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScript.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScript.java?rev=631505&r1=631504&r2=631505&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScript.java (original)
+++ incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScript.java Tue Feb 26 23:39:25 2008
@@ -20,6 +20,7 @@
 
 import static org.apache.sling.api.scripting.SlingBindings.LOG;
 import static org.apache.sling.api.scripting.SlingBindings.OUT;
+import static org.apache.sling.api.scripting.SlingBindings.READER;
 import static org.apache.sling.api.scripting.SlingBindings.REQUEST;
 import static org.apache.sling.api.scripting.SlingBindings.RESOURCE;
 import static org.apache.sling.api.scripting.SlingBindings.RESPONSE;
@@ -68,7 +69,7 @@
 	// name of the global variable containing the node to which the
 	// resource adapts (null if the resource does not adapt to a node
     private static final String NODE = "currentNode";
-    
+
     private Resource scriptResource;
 
     private ScriptEngine scriptEngine;
@@ -100,7 +101,7 @@
 
             ScriptContext ctx = new SimpleScriptContext();
             ctx.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
-            ctx.setReader(((SlingHttpServletRequest) bindings.get(REQUEST)).getReader());
+            ctx.setReader((Reader) bindings.get(READER));
             ctx.setWriter((Writer) bindings.get(OUT));
             ctx.setErrorWriter(new LogWriter((Logger) bindings.get(LOG)));
 
@@ -153,6 +154,7 @@
             SlingBindings props = new SlingBindings();
             props.setRequest((SlingHttpServletRequest) req);
             props.setResponse((SlingHttpServletResponse) res);
+            props.setReader(req.getReader());
             props.setFlush(true);
 
             res.setCharacterEncoding("UTF-8");
@@ -232,63 +234,74 @@
     private Bindings verifySlingBindings(String scriptName,
             SlingBindings slingBindings) throws IOException {
 
+    	Bindings bindings = new SimpleBindings();
+
         SlingHttpServletRequest request = slingBindings.getRequest();
-        if (request == null) {
-            throw fail(scriptName, REQUEST, "Missing or wrong type");
-        }
+        if (request != null) {
+            //throw fail(scriptName, REQUEST, "Missing or wrong type");
 
-        SlingHttpServletResponse response = slingBindings.getResponse();
-        if (response == null) {
-            throw fail(scriptName, RESPONSE, "Missing or wrong type");
-        }
+        	SlingHttpServletResponse response = slingBindings.getResponse();
+            if (response == null) {
+                throw fail(scriptName, RESPONSE, "Missing or wrong type");
+            }
 
-        Object resourceObject = slingBindings.get(RESOURCE);
-        if (resourceObject != null && !(resourceObject instanceof Resource)) {
-            throw fail(scriptName, RESOURCE, "Wrong type");
-        }
+            Object resourceObject = slingBindings.get(RESOURCE);
+            if (resourceObject != null && !(resourceObject instanceof Resource)) {
+                throw fail(scriptName, RESOURCE, "Wrong type");
+            }
 
-        Object writerObject = slingBindings.get(OUT);
-        if (writerObject != null && !(writerObject instanceof PrintWriter)) {
-            throw fail(scriptName, OUT, "Wrong type");
-        }
+            Object writerObject = slingBindings.get(OUT);
+            if (writerObject != null && !(writerObject instanceof PrintWriter)) {
+                throw fail(scriptName, OUT, "Wrong type");
+            }
 
-        SlingScriptHelper sling;
+            SlingScriptHelper sling;
 
-        Object slingObject = slingBindings.get(SLING);
-        if (slingObject == null) {
+            Object slingObject = slingBindings.get(SLING);
+            if (slingObject == null) {
 
-            sling = new ScriptHelper(this, request, response);
+                sling = new ScriptHelper(this, request, response);
 
-        } else if (slingObject instanceof SlingScriptHelper) {
+            } else if (slingObject instanceof SlingScriptHelper) {
 
-            sling = (SlingScriptHelper) slingObject;
+                sling = (SlingScriptHelper) slingObject;
 
-            if (sling.getRequest() != request) {
-                throw fail(scriptName, REQUEST,
-                    "Not the same as request field of SlingScriptHelper");
-            }
+                if (sling.getRequest() != request) {
+                    throw fail(scriptName, REQUEST,
+                        "Not the same as request field of SlingScriptHelper");
+                }
 
-            if (sling.getResponse() != response) {
-                throw fail(scriptName, RESPONSE,
-                    "Not the same as response field of SlingScriptHelper");
-            }
+                if (sling.getResponse() != response) {
+                    throw fail(scriptName, RESPONSE,
+                        "Not the same as response field of SlingScriptHelper");
+                }
 
-            if (resourceObject != null
-                && sling.getRequest().getResource() != resourceObject) {
-                throw fail(scriptName, RESOURCE,
-                    "Not the same as resource of the SlingScriptHelper request");
-            }
+                if (resourceObject != null
+                    && sling.getRequest().getResource() != resourceObject) {
+                    throw fail(scriptName, RESOURCE,
+                        "Not the same as resource of the SlingScriptHelper request");
+                }
 
-            if (writerObject != null
-                && sling.getResponse().getWriter() != writerObject) {
-                throw fail(scriptName, OUT,
-                    "Not the same as writer of the SlingScriptHelper response");
-            }
+                if (writerObject != null
+                    && sling.getResponse().getWriter() != writerObject) {
+                    throw fail(scriptName, OUT,
+                        "Not the same as writer of the SlingScriptHelper response");
+                }
+
+            } else {
 
-        } else {
+                throw fail(scriptName, SLING, "Wrong type");
 
-            throw fail(scriptName, SLING, "Wrong type");
+            }
 
+            // set base variables when executing inside a request
+            bindings.put(SLING, sling);
+            bindings.put(REQUEST, sling.getRequest());
+            bindings.put(READER, sling.getRequest().getReader());
+            bindings.put(RESPONSE, sling.getResponse());
+            bindings.put(RESOURCE, sling.getRequest().getResource());
+            bindings.put(OUT, sling.getResponse().getWriter());
+            bindings.put(NODE, sling.getRequest().getResource().adaptTo(Node.class));
         }
 
         Object logObject = slingBindings.get(LOG);
@@ -297,16 +310,7 @@
         } else if (!(logObject instanceof Logger)) {
             throw fail(scriptName, LOG, "Wrong type");
         }
-
-        // set base variables
-        Bindings bindings = new SimpleBindings();
-        bindings.put(SLING, sling);
-        bindings.put(REQUEST, sling.getRequest());
-        bindings.put(RESPONSE, sling.getResponse());
-        bindings.put(RESOURCE, sling.getRequest().getResource());
-        bindings.put(OUT, sling.getResponse().getWriter());
         bindings.put(LOG, logObject);
-        bindings.put(NODE, sling.getRequest().getResource().adaptTo(Node.class));
 
         // copy non-base variables
         for (Map.Entry<String, Object> entry : slingBindings.entrySet()) {