You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2011/12/21 23:02:15 UTC

svn commit: r1221900 - in /sling/trunk: bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/runtime/ launchpad/builder/src/main/bundles/ launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/ ...

Author: justin
Date: Wed Dec 21 22:02:14 2011
New Revision: 1221900

URL: http://svn.apache.org/viewvc?rev=1221900&view=rev
Log:
SLING-2340 - separating use cases for forward into normal and forwarding to an error page

Modified:
    sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/runtime/PageContextImpl.java
    sling/trunk/launchpad/builder/src/main/bundles/list.xml
    sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/JspForwardTest.java
    sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/forward-test.jsp

Modified: sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/runtime/PageContextImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/runtime/PageContextImpl.java?rev=1221900&r1=1221899&r2=1221900&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/runtime/PageContextImpl.java (original)
+++ sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/runtime/PageContextImpl.java Wed Dec 21 22:02:14 2011
@@ -50,6 +50,7 @@ import javax.servlet.jsp.tagext.BodyCont
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.sling.scripting.jsp.SlingPageException;
+import org.apache.sling.scripting.jsp.jasper.Constants;
 import org.apache.sling.scripting.jsp.jasper.compiler.Localizer;
 import org.apache.sling.scripting.jsp.jasper.el.ELContextImpl;
 import org.apache.sling.scripting.jsp.jasper.el.ExpressionEvaluatorImpl;
@@ -690,9 +691,65 @@ public class PageContextImpl extends Pag
 
 		final String path = getAbsolutePathRelativeToContext(relativeUrlPath);
 
-		throw new SlingPageException(path);
+		final String includeUri = (String) request.getAttribute(Constants.INC_SERVLET_PATH);
+
+        if (includeUri != null)
+            request.removeAttribute(Constants.INC_SERVLET_PATH);
+        try {
+            context.getRequestDispatcher(path).forward(request, response);
+        } finally {
+            if (includeUri != null) {
+                request.setAttribute(Constants.INC_SERVLET_PATH, includeUri);
+            }
+        }
  	}
 
+    public void forwardToErrorPage(final String relativeUrlPath) throws ServletException,
+            IOException {
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            try {
+                AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                    public Object run() throws Exception {
+                        doForwardToErrorPage(relativeUrlPath);
+                        return null;
+                    }
+                });
+            } catch (PrivilegedActionException e) {
+                Exception ex = e.getException();
+                if (ex instanceof IOException) {
+                    throw (IOException) ex;
+                } else {
+                    throw (ServletException) ex;
+                }
+            }
+        } else {
+            doForwardToErrorPage(relativeUrlPath);
+        }
+    }
+
+    private void doForwardToErrorPage(String relativeUrlPath) throws ServletException,
+            IOException {
+
+        // JSP.4.5 If the buffer was flushed, throw IllegalStateException
+        try {
+            out.clear();
+        } catch (IOException ex) {
+            IllegalStateException ise = new IllegalStateException(Localizer
+                    .getMessage("jsp.error.attempt_to_clear_flushed_buffer"));
+            ise.initCause(ex);
+            throw ise;
+        }
+
+        // Make sure that the response object is not the wrapper for include
+        while (response instanceof ServletResponseWrapperInclude) {
+            response = ((ServletResponseWrapperInclude) response).getResponse();
+        }
+
+        final String path = getAbsolutePathRelativeToContext(relativeUrlPath);
+
+        throw new SlingPageException(path);
+    }
+
 	public BodyContent pushBody() {
 		return (BodyContent) pushBody(null);
 	}
@@ -798,7 +855,7 @@ public class PageContextImpl extends Pag
 			request.setAttribute("javax.servlet.error.servlet_name", config
 					.getServletName());
 			try {
-				forward(errorPageURL);
+				forwardToErrorPage(errorPageURL);
 			} catch (IllegalStateException ise) {
 				include(errorPageURL);
 			}

Modified: sling/trunk/launchpad/builder/src/main/bundles/list.xml
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/builder/src/main/bundles/list.xml?rev=1221900&r1=1221899&r2=1221900&view=diff
==============================================================================
--- sling/trunk/launchpad/builder/src/main/bundles/list.xml (original)
+++ sling/trunk/launchpad/builder/src/main/bundles/list.xml Wed Dec 21 22:02:14 2011
@@ -180,7 +180,7 @@
         <bundle>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.scripting.jsp</artifactId>
-            <version>2.0.17-SNAPSHOT</version>
+            <version>2.0.19-SNAPSHOT</version>
         </bundle>
         <bundle>
             <groupId>org.apache.sling</groupId>

Modified: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/JspForwardTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/JspForwardTest.java?rev=1221900&r1=1221899&r2=1221900&view=diff
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/JspForwardTest.java (original)
+++ sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/JspForwardTest.java Wed Dec 21 22:02:14 2011
@@ -36,6 +36,7 @@ import org.apache.sling.servlets.post.Sl
     private String nodeUrlC;
     private String nodeUrlD;
     private String nodeUrlE;
+    private String nodeUrlF;
     private String scriptPath;
     private String forcedResourceType;
     private Set<String> toDelete = new HashSet<String>();
@@ -66,8 +67,14 @@ import org.apache.sling.servlets.post.Sl
         props.put("pathToInclude", pathToInclude + ".html");
         nodeUrlE = testClient.createNode(url, props);
 
+        // Node F is like E but uses jsp:include
+        props.put("pathToInclude", pathToInclude + ".html");
+        props.put("forwardStyle", "jsp");
+        nodeUrlF = testClient.createNode(url, props);
+
         // Node C is used for the infinite loop detection test
         props.remove("pathToInclude");
+        props.remove("forwardStyle");
         props.put("testInfiniteLoop","true");
         nodeUrlC = testClient.createNode(url, props);
 
@@ -117,6 +124,13 @@ import org.apache.sling.servlets.post.Sl
         assertTrue("Text of node A is not included (" + content + ")",!content.contains(testTextB));
     }
 
+    public void testWithJspForward() throws IOException {
+        final String content = getContent(nodeUrlF + ".html", CONTENT_TYPE_HTML);
+        assertTrue("Content includes JSP marker",content.contains("JSP template"));
+        assertTrue("Content contains formatted test text",content.contains("<p class=\"main\">" + testTextA + "</p>"));
+        assertTrue("Text of node A is not included (" + content + ")",!content.contains(testTextB));
+    }
+
     public void testInfiniteLoopDetection() throws IOException {
         // Node C has a property that causes an infinite include loop,
         // Sling must indicate the problem in its response

Modified: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/forward-test.jsp
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/forward-test.jsp?rev=1221900&r1=1221899&r2=1221900&view=diff
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/forward-test.jsp (original)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/forward-test.jsp Wed Dec 21 22:02:14 2011
@@ -39,6 +39,7 @@ private String getProperty(javax.jcr.Nod
 String pathToInclude = getProperty(currentNode, "pathToInclude");
 String forceResourceType = getProperty(currentNode, "forceResourceType");
 String testInfiniteLoop = getProperty(currentNode, "testInfiniteLoop");
+String forwardStyle = getProperty(currentNode, "forwardStyle");
 
 // Test 3: Forced Resource Type
 if(pathToInclude != null && forceResourceType != null) {
@@ -49,7 +50,11 @@ else
 
 // Test 1: Simple Forward 
 if(pathToInclude != null) {
-    %><sling:forward path="<%= pathToInclude %>"/><%
+    if ("jsp".equals(forwardStyle)) {
+        %><jsp:forward page="<%= pathToInclude %>"/><%
+    } else {
+        %><sling:forward path="<%= pathToInclude %>"/><%
+    }
 }
 
 else