You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beehive.apache.org by ri...@apache.org on 2005/05/13 22:29:26 UTC

svn commit: r170084 - in /incubator/beehive/trunk/netui: src/pageflow/org/apache/beehive/netui/pageflow/ src/pageflow/org/apache/beehive/netui/pageflow/internal/ test/webapps/drt/coreWeb/miniTests/servletInclude/ test/webapps/drt/testRecorder/tests/

Author: rich
Date: Fri May 13 13:29:25 2005
New Revision: 170084

URL: http://svn.apache.org/viewcvs?rev=170084&view=rev
Log:
Fixes for:
    - http://issues.apache.org/jira/browse/BEEHIVE-722 : NoClassDefFoundError when hitting an action with a similar name to a public class
    - http://issues.apache.org/jira/browse/BEEHIVE-725 : Page inputs do not work when a Page Flow action is hit through a Servlet include

tests: bvt in netui, bvt.jsf-ri and bvt.myfaces in netui/test/webapps/jsf (WinXP)
BB: self (linux)


Modified:
    incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowActionServlet.java
    incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java
    incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
    incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/FacesBackingBeanFactory.java
    incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/Controller.jpf
    incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/index.jsp
    incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/ServletInclude.xml

Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowActionServlet.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowActionServlet.java?rev=170084&r1=170083&r2=170084&view=diff
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowActionServlet.java (original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowActionServlet.java Fri May 13 13:29:25 2005
@@ -21,6 +21,7 @@
 
 import org.apache.beehive.netui.pageflow.internal.InternalConstants;
 import org.apache.beehive.netui.pageflow.internal.PageFlowRequestWrapper;
+import org.apache.beehive.netui.pageflow.internal.InternalUtils;
 import org.apache.beehive.netui.pageflow.handler.Handlers;
 import org.apache.beehive.netui.pageflow.handler.FlowControllerHandlerContext;
 import org.apache.beehive.netui.pageflow.handler.ForwardRedirectHandler;
@@ -142,7 +143,7 @@
     {
         // If this is a direct request for a shared flow (.jpfs) or a Faces backing bean (.jsfb), return a 404 status.
         // These are not web-addressable.
-        String servletPath = request.getServletPath();
+        String servletPath = InternalUtils.getDecodedServletPath( request );
         if ( servletPath.endsWith( InternalConstants.SHARED_FLOW_EXTENSION ) ||
              servletPath.endsWith( InternalConstants.FACES_BACKING_EXTENSION ) )
         {

Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java?rev=170084&r1=170083&r2=170084&view=diff
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java (original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java Fri May 13 13:29:25 2005
@@ -115,7 +115,7 @@
                 return;           
             }
             
-            String servletPath = httpRequest.getServletPath();
+            String servletPath = InternalUtils.getDecodedServletPath( httpRequest );
             String extension = FileUtils.getFileExtension( servletPath );
             Set validFileExtensions = getValidFileExtensions();
             

Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java?rev=170084&r1=170083&r2=170084&view=diff
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java (original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java Fri May 13 13:29:25 2005
@@ -30,6 +30,7 @@
 import org.apache.beehive.netui.pageflow.handler.ReloadableClassHandler;
 import org.apache.beehive.netui.pageflow.interceptor.InterceptorException;
 import org.apache.beehive.netui.pageflow.interceptor.Interceptors;
+import org.apache.beehive.netui.pageflow.interceptor.Interceptor;
 import org.apache.beehive.netui.pageflow.interceptor.action.ActionInterceptorContext;
 import org.apache.beehive.netui.pageflow.interceptor.action.InterceptorForward;
 import org.apache.beehive.netui.pageflow.interceptor.action.internal.ActionInterceptors;
@@ -2012,9 +2013,16 @@
                     
                     if ( _log.isDebugEnabled() )
                     {
-                        _log.debug( "Action interceptor " + context.getOverridingInterceptor().getClass().getName()
-                                   + " before action " + actionName + ": forwarding to "
-                                    + fwd != null ? fwd.getPath() : "null [no forward]" );
+                        
+                        Interceptor overridingInterceptor = context.getOverridingInterceptor();
+                        StringBuffer msg = new StringBuffer();
+                        msg.append( "Action interceptor " );
+                        msg.append( overridingInterceptor.getClass().getName() );
+                        msg.append( " before action " );
+                        msg.append( actionName );
+                        msg.append( ": forwarding to " );
+                        msg.append( fwd != null ? fwd.getPath() : "null [no forward]" );
+                        _log.debug( msg.toString() );
                     }
                     
                     return fwd;

Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/FacesBackingBeanFactory.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/FacesBackingBeanFactory.java?rev=170084&r1=170083&r2=170084&view=diff
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/FacesBackingBeanFactory.java (original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/FacesBackingBeanFactory.java Fri May 13 13:29:25 2005
@@ -52,81 +52,35 @@
         {
             FacesBackingBean bean = null;
             
-            try
+            if ( FileUtils.uriEndsWith( uri, FACES_EXTENSION ) || FileUtils.uriEndsWith( uri, JSF_EXTENSION ) )
             {
-                Class backingClass =
-                    Handlers.get( servletContext ).getReloadableClassHandler().loadCachedClass( backingClassName );
+                bean = loadFacesBackingBean( request, servletContext, backingClassName );
                 
-                if ( backingClass == null )
-                {
-                    if ( _log.isTraceEnabled() )
-                    {
-                        _log.trace( "No backing bean class " + backingClassName + " found for request "
-                                    + request.getRequestURI() );
-                    }
-                }
-                else
+                //
+                // If we didn't create (or failed to create) a backing bean, and if this is a JSF request, then create
+                // a default one.  This ensures that there will be a place for things like page inputs, that get stored
+                // in the backing bean across postbacks to the same JSF.
+                //
+                if ( bean == null ) bean = new DefaultFacesBackingBean();
+                
+                //
+                // If we created a backing bean, invoke its create callback, and tell it to store itself in the session.
+                //
+                if ( bean != null )
                 {
-                    AnnotationReader annReader = AnnotationReader.getAnnotationReader( backingClass, servletContext );
-                    
-                    if ( annReader.getJpfAnnotation( backingClass, "FacesBacking" ) != null )
+                    try
                     {
-                        if ( _log.isDebugEnabled() )
-                        {
-                            _log.debug( "Found backing class " + backingClassName + " for request "
-                                        + request.getRequestURI() + "; creating a new instance." );
-                        }
-                        
-                        bean = ( FacesBackingBean ) backingClass.newInstance();
+                        bean.create( request, response, servletContext );
                     }
-                    else
+                    catch ( Exception e )
                     {
-                        if ( _log.isDebugEnabled() )
-                        {
-                            _log.debug( "Found matching backing class " + backingClassName + " for request " 
-                                        + request.getRequestURI() + ", but it does not have the "
-                                        + ANNOTATION_QUALIFIER + "FacesBacking" + " annotation." );
-                        }
+                        _log.error( "Error while creating backing bean instance of " + backingClassName, e );
                     }
+                    
+                    bean.persistInSession( request, response );
+                    return bean;
                 }
             }
-            catch ( InstantiationException e )
-            {
-                _log.error( "Could not create backing bean instance of " + backingClassName, e );
-            }
-            catch ( IllegalAccessException e )
-            {
-                _log.error( "Could not create backing bean instance of " + backingClassName, e );
-            }
-            
-            //
-            // If we didn't create (or failed to create) a backing bean, and if this is a JSF request, then create
-            // a default one.  This ensures that there will be a place for things like page inputs, that get stored
-            // in the backing bean across postbacks to the same JSF.
-            //
-            if ( bean == null && 
-                 ( FileUtils.uriEndsWith( uri, FACES_EXTENSION ) || FileUtils.uriEndsWith( uri, JSF_EXTENSION ) ) )
-            {
-                bean = new DefaultFacesBackingBean();
-            }
-            
-            //
-            // If we created a backing bean, invoke its create callback, and tell it to store itself in the session.
-            //
-            if ( bean != null )
-            {
-                try
-                {
-                    bean.create( request, response, servletContext );
-                }
-                catch ( Exception e )
-                {
-                    _log.error( "Error while creating backing bean instance of " + backingClassName, e );
-                }
-                
-                bean.persistInSession( request, response );
-                return bean;
-            }
             
             //
             // We didn't create a backing bean.  If there's one in the session (an inappropriate one), remove it.
@@ -146,6 +100,59 @@
         }
         
         return currentBean;
+    }
+    
+    private static FacesBackingBean loadFacesBackingBean( HttpServletRequest request, ServletContext servletContext,
+                                                          String backingClassName )
+    {
+        try
+        {
+            Class backingClass =
+                Handlers.get( servletContext ).getReloadableClassHandler().loadCachedClass( backingClassName );
+                
+            if ( backingClass == null )
+            {
+                if ( _log.isTraceEnabled() )
+                {
+                    _log.trace( "No backing bean class " + backingClassName + " found for request "
+                                + request.getRequestURI() );
+                }
+            }
+            else
+            {
+                AnnotationReader annReader = AnnotationReader.getAnnotationReader( backingClass, servletContext );
+                    
+                if ( annReader.getJpfAnnotation( backingClass, "FacesBacking" ) != null )
+                {
+                    if ( _log.isDebugEnabled() )
+                    {
+                        _log.debug( "Found backing class " + backingClassName + " for request "
+                                    + request.getRequestURI() + "; creating a new instance." );
+                    }
+                        
+                    return ( FacesBackingBean ) backingClass.newInstance();
+                }
+                else
+                {
+                    if ( _log.isDebugEnabled() )
+                    {
+                        _log.debug( "Found matching backing class " + backingClassName + " for request " 
+                                    + request.getRequestURI() + ", but it does not have the "
+                                    + ANNOTATION_QUALIFIER + "FacesBacking" + " annotation." );
+                    }
+                }
+            }
+        }
+        catch ( InstantiationException e )
+        {
+            _log.error( "Could not create backing bean instance of " + backingClassName, e );
+        }
+        catch ( IllegalAccessException e )
+        {
+            _log.error( "Could not create backing bean instance of " + backingClassName, e );
+        }
+        
+        return null;
     }
     
     private static class DefaultFacesBackingBean

Modified: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/Controller.jpf
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/Controller.jpf?rev=170084&r1=170083&r2=170084&view=diff
==============================================================================
--- incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/Controller.jpf (original)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/Controller.jpf Fri May 13 13:29:25 2005
@@ -3,13 +3,19 @@
 import org.apache.beehive.netui.pageflow.*;
 import org.apache.beehive.netui.pageflow.annotations.*;
 
-@Jpf.Controller(
-    simpleActions={
-        @Jpf.SimpleAction(name="begin", path="index.jsp")
-    }
-)
+@Jpf.Controller()
 public class Controller extends PageFlowController
 {
+    @Jpf.Action(
+        forwards={
+            @Jpf.Forward(name="index", path="index.jsp")
+        }
+    )
+    public Forward begin()
+    {
+        return new Forward( "index", "somePageInput", "got it!" );
+    }
+
     @Jpf.Action(
         forwards={
             @Jpf.Forward(name="index", path="index.jsp")

Modified: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/index.jsp
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/index.jsp?rev=170084&r1=170083&r2=170084&view=diff
==============================================================================
--- incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/index.jsp (original)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/servletInclude/index.jsp Fri May 13 13:29:25 2005
@@ -11,6 +11,9 @@
     <netui:body>
         <h3>${pageFlow.URI}</h3>
 
+        page input passed from page flow: <b>${pageInput.somePageInput}</b>
+        <br/>
+        <br/>
         <netui:anchor action="begin">begin</netui:anchor>
 
         <netui:form action="submit">

Modified: incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/ServletInclude.xml
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/ServletInclude.xml?rev=170084&r1=170083&r2=170084&view=diff
==============================================================================
--- incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/ServletInclude.xml (original)
+++ incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/ServletInclude.xml Fri May 13 13:29:25 2005
@@ -2,7 +2,7 @@
 <ses:recorderSession xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session">
    <ses:sessionName>ServletInclude</ses:sessionName>
    <ses:tester>rich</ses:tester>
-   <ses:startDate>02 Mar 2005, 12:08:22.992 AM MST</ses:startDate>
+   <ses:startDate>13 May 2005, 01:49:39.323 PM MDT</ses:startDate>
    <ses:description>Sanity check of doing a Servlet include (through RequestDispatcher) of a .jpf URI.</ses:description>
    <ses:tests>
       <ses:test>
@@ -12,13 +12,17 @@
             <ses:protocolVersion>1.1</ses:protocolVersion>
             <ses:host>localhost</ses:host>
             <ses:port>8080</ses:port>
-            <ses:uri>/coreWeb/includejpf</ses:uri>
+            <ses:uri>/coreWeb/miniTests/servletInclude/Controller.jpf</ses:uri>
             <ses:method>GET</ses:method>
             <ses:parameters/>
             <ses:cookies>
                <ses:cookie>
                   <ses:name>JSESSIONID</ses:name>
-                  <ses:value>AAF54419C1437566485D7E59824A02B7</ses:value>
+                  <ses:value>6B87C1BD0C56B964DC15FD5033AB96E1</ses:value>
+               </ses:cookie>
+               <ses:cookie>
+                  <ses:name>JSESSIONID</ses:name>
+                  <ses:value>CFBQTB26tGqQp3QwVHnvD2xyvLhjJ3vq2X6qVKXX6Qt4ty6LBvPL!-574685435</ses:value>
                </ses:cookie>
             </ses:cookies>
             <ses:headers>
@@ -44,7 +48,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>cookie</ses:name>
-                  <ses:value>JSESSIONID=AAF54419C1437566485D7E59824A02B7</ses:value>
+                  <ses:value>JSESSIONID=6B87C1BD0C56B964DC15FD5033AB96E1; JSESSIONID=CFBQTB26tGqQp3QwVHnvD2xyvLhjJ3vq2X6qVKXX6Qt4ty6LBvPL!-574685435</ses:value>
                </ses:header>
                <ses:header>
                   <ses:name>host</ses:name>
@@ -56,7 +60,7 @@
                </ses:header>
                <ses:header>
                   <ses:name>user-agent</ses:name>
-                  <ses:value>Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0</ses:value>
+                  <ses:value>Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4</ses:value>
                </ses:header>
             </ses:headers>
          </ses:request>
@@ -73,6 +77,9 @@
     <body>
         <h3>/miniTests/servletInclude/Controller.jpf</h3>
 
+        page input passed from page flow: <b>got it!</b>
+        <br/>
+        <br/>
         <a href="/coreWeb/miniTests/servletInclude/begin.do">begin</a>
 
         <form action="/coreWeb/miniTests/servletInclude/submit.do" method="post">
@@ -85,7 +92,111 @@
 </html>]]></ses:responseBody>
          </ses:response>
       </ses:test>
+      <ses:test>
+         <ses:testNumber>2</ses:testNumber>
+         <ses:request>
+            <ses:protocol>HTTP</ses:protocol>
+            <ses:protocolVersion>1.1</ses:protocolVersion>
+            <ses:host>localhost</ses:host>
+            <ses:port>8080</ses:port>
+            <ses:uri>/coreWeb/miniTests/servletInclude/submit.do</ses:uri>
+            <ses:method>POST</ses:method>
+            <ses:parameters>
+               <ses:parameter>
+                  <ses:name>{actionForm.foo}</ses:name>
+                  <ses:value>hi</ses:value>
+               </ses:parameter>
+            </ses:parameters>
+            <ses:cookies>
+               <ses:cookie>
+                  <ses:name>JSESSIONID</ses:name>
+                  <ses:value>6B87C1BD0C56B964DC15FD5033AB96E1</ses:value>
+               </ses:cookie>
+               <ses:cookie>
+                  <ses:name>JSESSIONID</ses:name>
+                  <ses:value>CFBQTB26tGqQp3QwVHnvD2xyvLhjJ3vq2X6qVKXX6Qt4ty6LBvPL!-574685435</ses:value>
+               </ses:cookie>
+            </ses:cookies>
+            <ses:headers>
+               <ses:header>
+                  <ses:name>accept</ses:name>
+                  <ses:value>text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>accept-charset</ses:name>
+                  <ses:value>ISO-8859-1,utf-8;q=0.7,*;q=0.7</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>accept-encoding</ses:name>
+                  <ses:value>gzip,deflate</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>accept-language</ses:name>
+                  <ses:value>en-us,en;q=0.5</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>connection</ses:name>
+                  <ses:value>keep-alive</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>content-length</ses:name>
+                  <ses:value>23</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>content-type</ses:name>
+                  <ses:value>application/x-www-form-urlencoded</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>cookie</ses:name>
+                  <ses:value>JSESSIONID=6B87C1BD0C56B964DC15FD5033AB96E1; JSESSIONID=CFBQTB26tGqQp3QwVHnvD2xyvLhjJ3vq2X6qVKXX6Qt4ty6LBvPL!-574685435</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>host</ses:name>
+                  <ses:value>localhost:8080</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>keep-alive</ses:name>
+                  <ses:value>300</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>referer</ses:name>
+                  <ses:value>http://localhost:8080/coreWeb/miniTests/servletInclude/Controller.jpf</ses:value>
+               </ses:header>
+               <ses:header>
+                  <ses:name>user-agent</ses:name>
+                  <ses:value>Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4</ses:value>
+               </ses:header>
+            </ses:headers>
+         </ses:request>
+         <ses:response>
+            <ses:statusCode>200</ses:statusCode>
+            <ses:reason/>
+            <ses:responseBody><![CDATA[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+	"http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+
+    <head>
+        <base href="http://localhost:8080/coreWeb/miniTests/servletInclude/index.jsp">
+    </head>
+    <body>
+        <h3>/miniTests/servletInclude/Controller.jpf</h3>
+
+        page input passed from page flow: <b></b>
+        <br/>
+        <br/>
+        <a href="/coreWeb/miniTests/servletInclude/begin.do">begin</a>
+
+        <form action="/coreWeb/miniTests/servletInclude/submit.do" method="post">
+            foo: <input type="text" name="{actionForm.foo}" value="hi">
+            <br/>
+            <input type="submit" value="submit">
+        </form>
+    </body>
+
+</html>]]></ses:responseBody>
+         </ses:response>
+      </ses:test>
    </ses:tests>
-   <ses:endDate>02 Mar 2005, 12:08:49.149 AM MST</ses:endDate>
-   <ses:testCount>1</ses:testCount>
+   <ses:endDate>13 May 2005, 01:50:13.492 PM MDT</ses:endDate>
+   <ses:testCount>2</ses:testCount>
 </ses:recorderSession>