001: /* ====================================================================
002: * The Jcorporate Apache Style Software License, Version 1.2 05-07-2002
003: *
004: * Copyright (c) 1995-2002 Jcorporate Ltd. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by Jcorporate Ltd.
021: * (http://www.jcorporate.com/)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. "Jcorporate" and product names such as "Expresso" must
026: * not be used to endorse or promote products derived from this
027: * software without prior written permission. For written permission,
028: * please contact info@jcorporate.com.
029: *
030: * 5. Products derived from this software may not be called "Expresso",
031: * or other Jcorporate product names; nor may "Expresso" or other
032: * Jcorporate product names appear in their name, without prior
033: * written permission of Jcorporate Ltd.
034: *
035: * 6. No product derived from this software may compete in the same
036: * market space, i.e. framework, without prior written permission
037: * of Jcorporate Ltd. For written permission, please contact
038: * partners@jcorporate.com.
039: *
040: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
041: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
042: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
043: * DISCLAIMED. IN NO EVENT SHALL JCORPORATE LTD OR ITS CONTRIBUTORS
044: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
045: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
046: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
047: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
048: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
049: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
050: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
051: * SUCH DAMAGE.
052: * ====================================================================
053: *
054: * This software consists of voluntary contributions made by many
055: * individuals on behalf of the Jcorporate Ltd. Contributions back
056: * to the project(s) are encouraged when you make modifications.
057: * Please send them to support@jcorporate.com. For more information
058: * on Jcorporate Ltd. and its products, please see
059: * <http://www.jcorporate.com/>.
060: *
061: * Portions of this software are based upon other open source
062: * products and are subject to their respective licenses.
063: */
064: package com.jcorporate.expresso.core.controller;
065:
066: import com.jcorporate.expresso.core.misc.ConfigManager;
067: import org.apache.commons.logging.Log;
068: import org.apache.commons.logging.LogFactory;
069: import org.apache.struts.action.Action;
070: import org.apache.struts.action.ActionForm;
071: import org.apache.struts.action.ActionMapping;
072: import org.apache.struts.action.ActionServlet;
073: import org.apache.struts.config.ActionConfig;
074: import org.apache.struts.config.ForwardConfig;
075: import org.apache.struts.config.ModuleConfig;
076: import org.apache.struts.tiles.TilesRequestProcessor;
077: import org.apache.struts.util.RequestUtils;
078:
079: import javax.servlet.ServletException;
080: import javax.servlet.http.HttpServletRequest;
081: import javax.servlet.http.HttpServletResponse;
082: import java.io.IOException;
083:
084: /**
085: * Title: Expresso Project Description: Copyright: Copyright (c)
086: * 2001, 2002, 2003 Company: Jcorporate
087: *
088: * @author Peter Pilgrim, Wed Feb 12 20:13:46 GMT 2003
089: * @version $Id: ExpressoRequestProcessor.java,v 1.10 2004/11/17 20:48:06 lhamel Exp $
090: */
091: public class ExpressoRequestProcessor extends TilesRequestProcessor {
092: /**
093: * Commons Logging instance.
094: */
095: protected static Log log = LogFactory
096: .getLog(ExpressoRequestProcessor.class);
097:
098: /**
099: * Default constructor
100: */
101: public ExpressoRequestProcessor() {
102: super ();
103: }
104:
105: /**
106: * Creates and return the <code>Action</code> controller. Request processor
107: * normally cache there action instances internally, therefore only an
108: * <code>Action</code> is normally created just once.
109: *
110: * @param className the class name of the action to create
111: * @return the action controller or <code>null</code> if the action cannot
112: * be created at all.
113: */
114: public Action createAction(String className) {
115: Action instance = null;
116:
117: synchronized (actions) {
118: // Return any existing Action instance of this class
119: instance = (Action) actions.get(className);
120:
121: if (instance != null) {
122: if (log.isTraceEnabled()) {
123: log.trace(" Returning existing Action instance");
124: }
125:
126: return (instance);
127: }
128:
129: // Create and return a new Action instance
130: if (log.isTraceEnabled()) {
131: log.trace(" Creating new Action instance");
132: }
133:
134: try {
135: instance = (Action) RequestUtils
136: .applicationInstance(className);
137: instance.setServlet(this .servlet);
138: actions.put(className, instance);
139: } catch (Throwable t) {
140: log.error("Unable to create Action instance", t);
141:
142: return (null);
143: }
144: }
145:
146: return (instance);
147: }
148:
149: /**
150: * Initialize this request processor instance.
151: *
152: * @param servlet The ActionServlet we are associated with
153: * @param moduleConfig The ModuleConfig we are associated with.
154: * @throws ServletException If an error occur during initialization
155: */
156: public void init(ActionServlet servlet, ModuleConfig moduleConfig)
157: throws ServletException {
158: super .init(servlet, moduleConfig);
159: }
160:
161: /**
162: * This method is call for each request. By default it does nothing with
163: * the requests, but Expresso Framework may use this call in the future to
164: * handle security and authentication.
165: *
166: * @param request The servlet request object
167: * @param response The servlet response object
168: * @return true if successful
169: */
170: public boolean processPrepocess(HttpServletRequest request,
171: HttpServletResponse response) {
172: return true;
173: }
174:
175: /**
176: * This method was created specifically to allow dynamic URL forwarding since
177: * we cannot muck with the Struts 1.1 configuration due to the 'freeze()'
178: * method. It checks for
179: *
180: * @param request The servlet request
181: * @param response The servlet response
182: * @param forward the default forward config that Struts was handed by
183: * the controller
184: */
185: protected void processForwardConfig(HttpServletRequest request,
186: HttpServletResponse response, ForwardConfig forward)
187: throws java.io.IOException, javax.servlet.ServletException {
188:
189: //Grab any specified page styles from the session
190: String pageStyle = request.getParameter("pageStyle");
191: if (pageStyle != null && pageStyle.length() > 0) {
192: ForwardConfig forwardConfig = DynamicForwarder
193: .redeemConfig(pageStyle, request);
194: if (forwardConfig != null) {
195: if (log.isDebugEnabled()) {
196: log.debug("Redeemed page style: "
197: + forwardConfig.getPath());
198: }
199: forward = forwardConfig;
200: } else {
201: if (log.isDebugEnabled()) {
202: log
203: .debug("Redeemed forward config, but forward config was null");
204: }
205: }
206: }
207:
208: super .processForwardConfig(request, response, forward);
209: }
210:
211: /**
212: * subclass in order to allow ExpressoActionServlet to be a dispatcher
213: * for any finite-state-machine request which includes parameters for controller &
214: * state. if ExpressoActionServlet does not play this role, URLs must have
215: * a known controller embedded, which is not good for a JSP, for example,
216: * that isn't supposed to know about controllers. instead,
217: * ExpressoServletAction can be the "universal dispatcher"
218: * <p/>
219: * <p>Identify and return the path component (from the request URI) that
220: * we will use to select an <code>ActionMapping</code> with which to dispatch.
221: * If no such path can be identified, create an error response and return
222: * <code>null</code>.</p>
223: *
224: * @param httpServletRequest The servlet request we are processing
225: * @return String
226: */
227: protected String processPath(HttpServletRequest httpServletRequest,
228: HttpServletResponse httpServletResponse) throws IOException {
229: String path = super .processPath(httpServletRequest,
230: httpServletResponse);
231:
232: String controller = httpServletRequest
233: .getParameter(Controller.CONTROLLER_PARAM_KEY);
234: if (controller != null) {
235: // do reverse-lookup from controller class to mapping
236: ActionConfig mapping = ConfigManager.getActionConfig(
237: controller, httpServletRequest
238: .getParameter(Controller.STATE_PARAM_KEY));
239: if (mapping != null) {
240: path = mapping.getPath();
241: }
242: }
243:
244: return path;
245: }
246:
247: /**
248: * @todo add this method.. We don't want RequestProcessor to handle redirection if validation fails *RD* Mon Jul 27 2004
249: */
250: protected boolean processValidate(HttpServletRequest request,
251: HttpServletResponse response, ActionForm form,
252: ActionMapping mapping) throws IOException, ServletException {
253: return true;
254: }
255:
256: }
|