001: /*
002: * $Header: /export/home/cvsroot/MyPersonalizerRepository/MyPersonalizer/Subsystems/Kernel/Sources/es/udc/mypersonalizer/kernel/controller/requestprocessor/MyPersonalizerRequestProcessor.java,v 1.1.1.1 2004/03/25 12:08:38 fbellas Exp $
003: * $Revision: 1.1.1.1 $
004: * $Date: 2004/03/25 12:08:38 $
005: *
006: * =============================================================================
007: *
008: * Copyright (c) 2003, The MyPersonalizer Development Group
009: * (http://www.tic.udc.es/~fbellas/mypersonalizer/index.html) at
010: * University Of A Coruna
011: * All rights reserved.
012: *
013: * Redistribution and use in source and binary forms, with or without
014: * modification, are permitted provided that the following conditions are met:
015: *
016: * - Redistributions of source code must retain the above copyright notice,
017: * this list of conditions and the following disclaimer.
018: *
019: * - Redistributions in binary form must reproduce the above copyright notice,
020: * this list of conditions and the following disclaimer in the documentation
021: * and/or other materials provided with the distribution.
022: *
023: * - Neither the name of the University Of A Coruna nor the names of its
024: * contributors may be used to endorse or promote products derived from
025: * this software without specific prior written permission.
026: *
027: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
028: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
029: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
030: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
031: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
032: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
033: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
034: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
035: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
036: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
037: * POSSIBILITY OF SUCH DAMAGE.
038: *
039: */
040:
041: package es.udc.mypersonalizer.kernel.controller.requestprocessor;
042:
043: import es.udc.mypersonalizer.kernel.config.MyPersonalizerRequestProcessorConfig;
044: import es.udc.mypersonalizer.kernel.config.KernelConfig;
045: import es.udc.mypersonalizer.kernel.config.KernelConfigManager;
046: import es.udc.mypersonalizer.kernel.log.Log;
047: import es.udc.mypersonalizer.kernel.log.LogManager;
048: import es.udc.mypersonalizer.kernel.log.LogNamingConventions;
049: import es.udc.mypersonalizer.kernel.util.exceptions.IllegalConcurrentAccessException;
050: import es.udc.mypersonalizer.kernel.controller.actions.DefaultAction;
051: import java.io.IOException;
052: import java.util.*;
053: import javax.servlet.ServletException;
054: import javax.servlet.http.HttpServletRequest;
055: import javax.servlet.http.HttpServletResponse;
056: import org.apache.struts.action.Action;
057: import org.apache.struts.action.ActionForm;
058: import org.apache.struts.action.ActionForward;
059: import org.apache.struts.action.ActionMapping;
060: import org.apache.struts.action.RequestProcessor;
061:
062: /** This is a sublcass of Jakarta Struts' RequestProcessor, which
063: * function is to manage controller requests in an MVC architecture.<p>
064: *
065: * The functionality it adds is processing filters: before each request
066: * is processed (by super.processActionPerform), MyPersonalizerRequestProcessor
067: * applies a chain of filters to the request, so that functionality like
068: * session managing, cookie checking or requiring authentication for
069: * actions can be enabled through filters.<p>
070: *
071: * The chain of filters that will be applied is defined with configuration
072: * parameters, and it is read when the class MyPersonalizerRequestProcessor
073: * is first loaded. For each filter, a unique instance of its class is
074: * created and then pushed into the chain.<p>
075: *
076: * For each filter, the following configuration parameters are needed:
077: * <ol>
078: * <li>Its class</li>
079: * <li>Optionally, the filter's configuration parameters</li>
080: * </ol>
081: *
082: * The order in which filters are defined in configuration parameters
083: * determines its execution order when a request arrives.
084: *
085: * This configuration data is taken from a {@link
086: * MyPersonalizerRequestProcessorConfig} object created with the data from
087: * configuration files.
088: *
089: * @author Daniel Fernandez
090: * @author Fernando Bellas
091: * @since 1.0
092: */
093: public class MyPersonalizerRequestProcessor extends RequestProcessor {
094:
095: /**
096: * The head of the filter chain
097: */
098: private static PreProcessingFilter firstPreProcessingFilter = null;
099:
100: /*
101: * Static block: Configuration parameters are read here, and filters
102: * are created and pushed into the chain as they are read and configured.
103: */
104: static {
105:
106: try {
107: KernelConfig kernelConfig = KernelConfigManager.getConfig();
108:
109: MyPersonalizerRequestProcessorConfig myPersonalizerRequestProcessorConfig = kernelConfig
110: .getKernelControllerConfig()
111: .getMyPersonalizerRequestProcessorConfig();
112:
113: List filterClassNames = myPersonalizerRequestProcessorConfig
114: .getFilterClassNames();
115:
116: PreProcessingFilter currentFilter = null;
117:
118: Iterator filterClassNamesIter = filterClassNames.iterator();
119: while (filterClassNamesIter.hasNext()) {
120: String filterClassName = (String) filterClassNamesIter
121: .next();
122: Class filterClass = Class.forName(filterClassName);
123: PreProcessingFilter filter = (PreProcessingFilter) filterClass
124: .newInstance();
125:
126: if (currentFilter == null) {
127: firstPreProcessingFilter = filter;
128: } else {
129: currentFilter.setNextFilter(filter);
130: }
131: currentFilter = filter;
132:
133: }
134:
135: } catch (Exception e) {
136:
137: Log mypersonalizerLog = LogManager
138: .getLog(LogNamingConventions.MYPERSONALIZER);
139: mypersonalizerLog.write(
140: "Could not initialize configuration for "
141: + "MyPersonalizerRequestProcessor", e,
142: MyPersonalizerRequestProcessor.class);
143:
144: }
145:
146: }
147:
148: /**
149: * Instantiates an object of this class
150: */
151: public MyPersonalizerRequestProcessor() {
152: }
153:
154: /**
155: * Executes all the filters assigned to this action and, if filters do
156: * not fail, executes the required action by calling
157: * RequestProcessor.processActionPerform.<p>
158: *
159: * If an exception occurs during the filters' execution,
160: * this class performs a forward action towards the struts-defined
161: * mandatory forward "InternalError" as defined in
162: * <code>DefaultAction</code>
163: *
164: * @param request the HttpServletRequest containing the request parameters
165: * @param response the HttpServletResponse associated
166: * @param action the Struts' Action required to be executed
167: * @param form the Struts' ActionForm related to this action
168: * @param mapping the Struts' ActionMapping
169: * @return a ActionForward which constitutes the result of the execution
170: * @throws IOException if an input/output error ocurrs
171: * @throws ServletException if a servlet-relate error occurs
172: */
173: protected ActionForward processActionPerform(
174: HttpServletRequest request, HttpServletResponse response,
175: Action action, ActionForm form, ActionMapping mapping)
176: throws IOException, ServletException {
177:
178: ActionForward actionForward = null;
179:
180: if (firstPreProcessingFilter != null) {
181:
182: try {
183:
184: actionForward = firstPreProcessingFilter.process(
185: request, response, action, form, mapping);
186:
187: } catch (Exception e) {
188:
189: Log mypersonalizerLog = LogManager
190: .getLog(LogNamingConventions.MYPERSONALIZER);
191:
192: if (e instanceof IllegalConcurrentAccessException) {
193:
194: mypersonalizerLog.write(
195: "An illegal concurrent access happened", e,
196: this .getClass());
197:
198: return mapping
199: .findForward(DefaultAction.ILLEGAL_CONCURRENT_ACCESS_GLOBAL_FORWARD);
200:
201: } else {
202:
203: mypersonalizerLog.write(
204: "An internal error happened", e, this
205: .getClass());
206:
207: return mapping
208: .findForward(DefaultAction.INTERNAL_ERROR_GLOBAL_FORWARD);
209:
210: }
211:
212: }
213:
214: }
215:
216: if (actionForward == null) {
217: return super.processActionPerform(request, response,
218: action, form, mapping);
219: } else {
220: return actionForward;
221: }
222: }
223:
224: }
|