cedric 01/09/10 05:50:45
Modified: contrib/tiles/src/share/org/apache/struts/tiles
ActionComponentServlet.java
Log:
Allow to use an action path as insert or definition target page.
Revision Changes Path
1.2 +52 -30
jakarta-struts/contrib/tiles/src/share/org/apache/struts/tiles/ActionComponentServlet.java
Index: ActionComponentServlet.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/tiles/src/share/org/apache/struts/tiles/ActionComponentServlet.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ActionComponentServlet.java 2001/08/01 14:36:41 1.1
+++ ActionComponentServlet.java 2001/09/10 12:50:45 1.2
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/contrib/tiles/src/share/org/apache/struts/tiles/ActionComponentServlet.java,v
1.1 2001/08/01 14:36:41 cedric Exp $
- * $Revision: 1.1 $
- * $Date: 2001/08/01 14:36:41 $
+ * $Header:
/home/cvs/jakarta-struts/contrib/tiles/src/share/org/apache/struts/tiles/ActionComponentServlet.java,v
1.2 2001/09/10 12:50:45 cedric Exp $
+ * $Revision: 1.2 $
+ * $Date: 2001/09/10 12:50:45 $
* $Author: cedric $
*
*/
@@ -19,6 +19,7 @@
import java.io.IOException;
import java.io.FileNotFoundException;
import org.apache.struts.taglib.html.Constants;
+import org.apache.struts.upload.MultipartRequestWrapper;
/**
* This servlet extends struts one. It adds channels and screens dispatching
@@ -29,7 +30,7 @@
* now call 'processForward()'. Rest of the method is unchanged.
* This new method could now be overiden in order to dispatch request before
* forwarding.
- * Compliant to ActionServlet from struts 2001/03/13 22:31:50
+ * Compliant to ActionServlet from struts 2001/06/25 00:02:27
*/
public class ActionComponentServlet extends ActionServlet
{
@@ -143,14 +144,14 @@
log(" No errors detected, accepting input");
return (true);
}
-
+
//does our form have a multipart request?
if (formInstance.getMultipartRequestHandler() != null) {
//rollback the request
if (debug > 1) {
log(" Rolling back the multipart request");
}
-
+
formInstance.getMultipartRequestHandler().rollback();
}
@@ -169,6 +170,10 @@
if (debug >= 1)
log(" Validation error(s), redirecting to: " + uri);
request.setAttribute(Action.ERROR_KEY, errors);
+ //unwrap the multipart request if there is one
+ if (request instanceof MultipartRequestWrapper) {
+ request = ((MultipartRequestWrapper) request).getRequest();
+ }
processForward( uri, request, response);
return (false);
@@ -183,34 +188,51 @@
protected void processForward(String uri, HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
- // Do we do a forward (original) or an include.
- boolean hasParentComponent = false;
+ // Do we do a forward (original behavior) or an include ?
+ boolean doInclude = false;
try
{
- // Check if request comes from a parent component
- // This will be used to do an include rather than a forward
- Object parentContext = request.getAttribute(
ComponentConstants.COMPONENT_CONTEXT );
- hasParentComponent = (parentContext!=null );
+ // Get current tile context if any.
+ // If context exist, we will do an include
+ ComponentContext tileContext = ComponentContext.getContext( request );
+ doInclude = (tileContext!=null );
+ ComponentDefinition definition;
+
+ // Process tiles definition names only if a definition factory exist.
+ if( definitionsFactory != null )
+ { // Get definition of tiles/component corresponding to uri.
+ definition = definitionsFactory.getDefinition(uri, request,
getServletContext());
+ if( definition != null )
+ { // We have a definition.
+ // We use it to complete missing attribute in context.
+ uri = definition.getPath();
+ if( tileContext == null )
+ {
+ tileContext = new ComponentContext( definition.getAttributes() );
+ ComponentContext.setContext( tileContext, request);
+ }
+ else
+ tileContext.addMissing( definition.getAttributes() );
+ } // end if
+ } // end if
+ // Check if there is a definition set in jsp context.
+ definition = DefinitionsUtil.getActionDefinition(request);
+ if( definition != null )
+ { // We have a definition.
+ // We use it to complete missing attribute in context.
+ // We also overload uri.
+ uri = definition.getPath();
+ if( tileContext == null )
+ {
+ tileContext = new ComponentContext( definition.getAttributes() );
+ ComponentContext.setContext( tileContext, request);
+ }
+ else
+ tileContext.addMissing( definition.getAttributes() );
+ } // end if
- // Process instance names only if an instances description exist.
- if( definitionsFactory != null )
- {
- // Get definition of component corresponding to uri.
- // If definition is found, replace uri with path defined in definition.
- ComponentDefinition instance = definitionsFactory.getDefinition(uri, request,
getServletContext());
-
- if( instance != null )
- { // use component / template definition
-
- // Create component context, put it in request scope, and forward to url.
- ComponentContext context = new ComponentContext( instance );
- request.setAttribute( ComponentConstants.COMPONENT_CONTEXT, context);
- uri = instance.getPath();
- } // end if
- } // end if
-
}
catch( DefinitionsFactoryException ex )
{
@@ -228,7 +250,7 @@
// If request comes from a previous component, do an include.
// This allows to insert an action in a components.
- if( hasParentComponent )
+ if( doInclude )
rd.include(request, response);
else
rd.forward(request, response); // original behavior