001: /*
002: * $Id: DefinitionDispatcherAction.java 471754 2006-11-06 14:55:09Z husted $
003: *
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: package org.apache.struts.tiles.actions;
023:
024: import java.io.IOException;
025: import java.io.PrintWriter;
026:
027: import javax.servlet.http.HttpServletRequest;
028: import javax.servlet.http.HttpServletResponse;
029:
030: import org.apache.commons.logging.Log;
031: import org.apache.commons.logging.LogFactory;
032: import org.apache.struts.action.Action;
033: import org.apache.struts.action.ActionForm;
034: import org.apache.struts.action.ActionForward;
035: import org.apache.struts.action.ActionMapping;
036: import org.apache.struts.tiles.ComponentDefinition;
037: import org.apache.struts.tiles.DefinitionsFactoryException;
038: import org.apache.struts.tiles.DefinitionsUtil;
039: import org.apache.struts.tiles.FactoryNotFoundException;
040: import org.apache.struts.tiles.NoSuchDefinitionException;
041: import org.apache.struts.tiles.TilesUtil;
042:
043: /**
044: * <p>An <strong>Action</strong> that dispatches to a Tiles Definition
045: * that is named by the request parameter whose name is specified
046: * by the <code>parameter</code> property of the corresponding
047: * ActionMapping.
048: * This action is useful in following situations:
049: * <li>
050: * <ul>To associate an Url to a definition</ul>
051: * <ul>To use Struts <html:link> tag on a definition</ul>
052: * </li>
053: * <p>To configure the use of this action in your
054: * <code>struts-config.xml</code> file, create an entry like this:</p>
055: *
056: * <code>
057: * <action path="/saveSubscription"
058: * type="org.apache.struts.tiles.actions.DefinitionDispatcherAction"
059: * parameter="def"/>
060: * <forward name="success" path="anything" //>
061: * <forward name="error" path="path.to.error.page" //>
062: * </code>
063: *
064: * <p>which will use the value of the request parameter named "def"
065: * to pick the appropriate definition name.
066: * <p> The value for success doesn't matter. The forward will forward to
067: * appropriate definition.
068: * <p> The value for error should denote a valid jsp path or definition name.
069: *
070: * @version $Rev: 471754 $ $Date: 2006-11-06 08:55:09 -0600 (Mon, 06 Nov 2006) $
071: */
072: public class DefinitionDispatcherAction extends Action {
073:
074: /**
075: * Commons Logging instance.
076: */
077: protected static Log log = LogFactory
078: .getLog(DefinitionDispatcherAction.class);
079:
080: /**
081: * Process the specified HTTP request, and create the corresponding HTTP
082: * response (or forward to another web component that will create it),
083: * with provision for handling exceptions thrown by the business logic.
084: *
085: * @param mapping The ActionMapping used to select this instance
086: * @param form The optional ActionForm bean for this request (if any)
087: * @param request The HTTP request we are processing
088: * @param response The HTTP response we are creating
089: *
090: * @exception Exception if the application business logic throws
091: * an exception
092: * @since Struts 1.1
093: */
094: public ActionForward execute(ActionMapping mapping,
095: ActionForm form, HttpServletRequest request,
096: HttpServletResponse response) throws Exception {
097:
098: // Identify the request parameter containing the method name
099: // If none defined, use "def"
100: String parameter = mapping.getParameter();
101: if (parameter == null) {
102: parameter = "def";
103: }
104:
105: // Identify the method name to be dispatched to
106: String name = request.getParameter(parameter);
107: if (name == null) {
108: log.error("Can't get parameter '" + parameter + "'.");
109:
110: return mapping.findForward("error");
111: }
112:
113: // Try to dispatch to requested definition
114: try {
115: // Read definition from factory, but we can create it here.
116: ComponentDefinition definition = TilesUtil.getDefinition(
117: name, request, getServlet().getServletContext());
118:
119: if (log.isDebugEnabled()) {
120: log.debug("Get Definition " + definition);
121: }
122:
123: DefinitionsUtil.setActionDefinition(request, definition);
124:
125: } catch (FactoryNotFoundException e) {
126: log.error("Can't get definition factory.", e);
127: return mapping.findForward("error");
128:
129: } catch (NoSuchDefinitionException e) {
130: log.error("Can't get definition '" + name + "'.", e);
131: return mapping.findForward("error");
132:
133: } catch (DefinitionsFactoryException e) {
134: log.error(
135: "General Factory error '" + e.getMessage() + "'.",
136: e);
137: return mapping.findForward("error");
138:
139: } catch (Exception e) {
140: log.error("General error '" + e.getMessage() + "'.", e);
141: return mapping.findForward("error");
142: }
143:
144: return mapping.findForward("success");
145:
146: }
147:
148: /**
149: * @deprecated This will be removed after Struts 1.2.
150: */
151: protected void printError(HttpServletResponse response, String msg)
152: throws IOException {
153: response.setContentType("text/plain");
154: PrintWriter writer = response.getWriter();
155: writer.println(msg);
156: writer.flush();
157: writer.close();
158: }
159: }
|