I've found that experimenting has worked a lot better once I started doing it in the open :-).
Point taken :-) Here's what I have so far, most definitely to be changed sometime soon.
Greg
/* * $Header: /home/cvspublic/jakarta-struts/contrib/struts-chain/src/java/org/apache/struts/chain/AbstractExceptionHandler.java,v 1.1 2003/08/31 21:53:00 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2003/08/31 21:53:00 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Struts", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */
package org.apache.struts.chain;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
import org.apache.commons.chain.web.servlet.ServletWebContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.chain.Constants;
import org.apache.struts.config.ActionConfig;
import org.apache.struts.config.ExceptionConfig;
import org.apache.struts.config.ForwardConfig;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.RequestUtils;
import org.apache.struts.tiles.TilesUtil;
import org.apache.struts.tiles.TilesUtilStrutsImpl;
import org.apache.struts.tiles.DefinitionsFactory;
import org.apache.struts.tiles.Controller;
import org.apache.struts.tiles.ComponentDefinition;
import org.apache.struts.tiles.ComponentContext;
import org.apache.struts.tiles.DefinitionsUtil;
/**
* <p>Determine if the ForwardConfig invokes a Tiles Definition and
* invoke it.</p>
*
* @author Greg Reddin
* @version $Revision: 1.1 $ $Date: 2003/09/26 21:53:00 $
*/
public class ProcessTilesDefinition extends AbstractPerformForward {
// ------------------------------------------------------ Instance Variables
private String moduleConfigKey = Constants.MODULE_CONFIG_KEY;
private static final Log log =
LogFactory.getLog(ProcessTilesDefinition.class);
// ---------------------------------------------------------- Public Methods
protected void perform(Context context,ForwardConfig forwardConfig)
throws Exception {
ServletWebContext swcontext = (ServletWebContext) context;
String forwardPath = forwardConfig.getPath();
String uri = null;
// Resolve module-relative paths
if (forwardPath.startsWith("/")) {
uri = RequestUtils.forwardURL(swcontext.getRequest(),
forwardConfig);
} else {
if (processTilesDefinition(context, forwardConfig)) {
return;
} else {
uri = forwardPath;
}
}
// Perform redirect or forward
if (forwardConfig.getRedirect()) {
if (uri.startsWith("/")) {
uri = swcontext.getRequest().getContextPath() + uri;
}
swcontext.getResponse().sendRedirect
(swcontext.getResponse().encodeRedirectURL(uri));
} else {
RequestDispatcher rd =
swcontext.getContext().getRequestDispatcher(uri);
rd.forward(swcontext.getRequest(), swcontext.getResponse());
}
}
/**
* <p>Invoke the appropriate Tiles Definition for this request
*
* @param context The <code>Context</code> for the current request
*
* @exception Exception if something goes wrong.
*
* @return <code>false</code> if a <code>ForwardConfig</code> is returned,
* else <code>true</code> to complete processing
*/
public boolean processTilesDefinition(Context context, ForwardConfig forwardConfig)
throws Exception {
ModuleConfig moduleConfig = (ModuleConfig)
context.getAttributes().get(this.moduleConfigKey);
ServletContext servletContext = ((ServletWebContext) context).getContext();
HttpServletRequest request = ((ServletWebContext) context).getRequest();
HttpServletResponse response = ((ServletWebContext) context).getResponse();
DefinitionsFactory definitionsFactory = ((TilesUtilStrutsImpl)
TilesUtil.getTilesUtil()).getDefinitionsFactory(
servletContext, moduleConfig);
if (definitionsFactory == null) {
if (log.isInfoEnabled()) {
log.info("Definition config not found for module" +
moduleConfig.getPrefix() + ". " +
"Have you declared to appropriate plug-in in " +
"struts-config.xml?");
return false;
}
} else {
boolean doInclude = false;
Controller controller = null;
ComponentContext tilesContext = null;
String definitionName = forwardConfig.getPath();
String uri = null;
try {
tilesContext = ComponentContext.getContext(request);
if (tilesContext == null) {
doInclude = false;
}
ComponentDefinition definition = definitionsFactory.getDefinition(
definitionName, request, servletContext);
if (definition != null) {
uri = definition.getPath();
controller = definition.getOrCreateController();
if (tilesContext == null) {
tilesContext = new
ComponentContext(definition.getAttributes());
ComponentContext.setContext(tilesContext, request);
} else {
tilesContext.addMissing(definition.getAttributes());
}
}
definition = DefinitionsUtil.getActionDefinition(request);
if (definition != null) {
if (definition.getPath() != null) {
uri = definition.getPath();
}
if (definition.getOrCreateController() != null) {
controller = definition.getOrCreateController();
}
if (tilesContext == null) {
tilesContext = new ComponentContext(
definition.getAttributes());
ComponentContext.setContext(tilesContext, request);
} else {
tilesContext.addMissing(definition.getAttributes());
}
}
} catch (Exception e) {
if (log.isErrorEnabled()) {
log.error("Can't create associated controller.");
}
}
if (uri == null) {
return false;
} else {
if (controller != null) {
controller.perform(tilesContext, request, response,
servletContext);
}
if (log.isDebugEnabled()) {
log.debug("uri=" + uri + " doInclude=" + doInclude);
}
RequestDispatcher rd = ((ServletWebContext)
context).getContext().getRequestDispatcher(uri);
if (doInclude) {
doInclude(uri, request, response, rd);
} else {
doForward(uri, request, response, rd);
}
}
}
return true;
}
protected void doInclude(String uri, HttpServletRequest request,
HttpServletResponse response, RequestDispatcher rd)
throws Exception {
rd.include(request, response);
}
protected void doForward(String uri, HttpServletRequest request,
HttpServletResponse response, RequestDispatcher rd)
throws Exception {
if (response.isCommitted()) {
doInclude(uri, request, response, rd);
}
rd.forward(request, response);
}
}
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
