KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > beehive > netui > pageflow > internal > DefaultForwardRedirectHandler


1 /*
2  * Copyright 2004 The Apache Software Foundation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * $Header:$
17  */

18 package org.apache.beehive.netui.pageflow.internal;
19
20 import org.apache.beehive.netui.pageflow.handler.ForwardRedirectHandler;
21 import org.apache.beehive.netui.pageflow.handler.FlowControllerHandlerContext;
22 import org.apache.beehive.netui.pageflow.PageFlowStack;
23 import org.apache.beehive.netui.util.logging.Logger;
24
25 import javax.servlet.http.HttpServletRequest JavaDoc;
26 import javax.servlet.http.HttpServletResponse JavaDoc;
27 import javax.servlet.ServletException JavaDoc;
28 import javax.servlet.RequestDispatcher JavaDoc;
29 import javax.servlet.ServletContext JavaDoc;
30 import java.io.IOException JavaDoc;
31
32 import org.apache.struts.upload.MultipartRequestWrapper;
33
34
35 /**
36  * Handler for redirects and server forwards.
37  */

38 public class DefaultForwardRedirectHandler
39         extends DefaultHandler
40         implements ForwardRedirectHandler
41 {
42     private static final Logger _log = Logger.getInstance( DefaultForwardRedirectHandler.class );
43     
44     
45     public DefaultForwardRedirectHandler( ServletContext JavaDoc servletContext )
46     {
47         init( null, null, servletContext );
48     }
49     
50     public void redirect( FlowControllerHandlerContext context, String JavaDoc uri )
51         throws IOException JavaDoc, ServletException JavaDoc
52     {
53         assert context.getResponse() instanceof HttpServletResponse JavaDoc :
54                 context.getResponse().getClass().getName() + " does not implement HttpServletResponse";
55         HttpServletResponse JavaDoc response = ( HttpServletResponse JavaDoc ) context.getResponse();
56         response.sendRedirect( response.encodeRedirectURL( uri ) );
57     }
58
59     public void forward( FlowControllerHandlerContext context, String JavaDoc uri )
60         throws IOException JavaDoc, ServletException JavaDoc
61     {
62         LegacySettings settings = LegacySettings.get( getServletContext() );
63         assert context.getRequest() instanceof HttpServletRequest JavaDoc :
64                 context.getRequest().getClass().getName() + " does not implement HttpServletRequest";
65         assert context.getResponse() instanceof HttpServletResponse JavaDoc :
66                 context.getResponse().getClass().getName() + " does not implement HttpServletResponse";
67         HttpServletRequest JavaDoc request = ( HttpServletRequest JavaDoc ) context.getRequest();
68         HttpServletResponse JavaDoc response = ( HttpServletResponse JavaDoc ) context.getResponse();
69         int requestCount = PageFlowRequestWrapper.get( request ).getForwardedRequestCount();
70         
71         //
72
// See if we've exceeded the maximum number of forwards.
73
//
74
int forwardOverflowCount = settings.getForwardOverflowCount();
75         if ( requestCount > forwardOverflowCount )
76         {
77             InternalUtils.sendDevTimeError( "PageFlow_Forward_Overflow", null,
78                                             HttpServletResponse.SC_INTERNAL_SERVER_ERROR, request, response,
79                                             getServletContext(),
80                                             new Object JavaDoc[]{ new Integer JavaDoc( forwardOverflowCount ), uri } );
81             return;
82         }
83         
84         //
85
// See if we've exceeded the maximum nesting depth.
86
//
87
PageFlowStack pfStack = PageFlowStack.get( request, false );
88         
89         int nestingOverflowCount = settings.getNestingOverflowCount();
90         if ( pfStack != null && pfStack.size() > nestingOverflowCount )
91         {
92             Object JavaDoc[] args = new Object JavaDoc[]{ new Integer JavaDoc( pfStack.size() ), new Integer JavaDoc( nestingOverflowCount ) };
93             InternalUtils.sendDevTimeError( "PageFlow_Nesting_Overflow", null,
94                                             HttpServletResponse.SC_INTERNAL_SERVER_ERROR, request, response,
95                                             getServletContext(), args );
96             return;
97         }
98             
99         //
100
// We're OK -- do the forward.
101
//
102
PageFlowRequestWrapper.get( request ).setForwardedRequestCount( requestCount + 1 );
103         
104         // Unwrap the multipart request, if there is one.
105
if ( request instanceof MultipartRequestWrapper )
106         {
107             request = ( ( MultipartRequestWrapper ) request ).getRequest();
108         }
109
110         //
111
// Note that we get a RequestDispatcher from the request, not from the ServletContext.
112
// The request may be a ScopedRequest, which provides a special RequestDispatcher.
113
//
114
RequestDispatcher JavaDoc rd = request.getRequestDispatcher( uri );
115
116         if ( rd == null )
117         {
118             if ( _log.isErrorEnabled() )
119             {
120                 _log.error( "Could not get requestDispatcher for URI " + uri );
121             }
122             
123             response.sendError( HttpServletResponse.SC_NOT_FOUND );
124             return;
125         }
126     
127         rd.forward( request, response );
128     }
129 }
130
Popular Tags