001: /*
002: * ====================================================================
003: * JAFFA - Java Application Framework For All
004: *
005: * Copyright (C) 2002 JAFFA Development Group
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * Redistribution and use of this software and associated documentation ("Software"),
022: * with or without modification, are permitted provided that the following conditions are met:
023: * 1. Redistributions of source code must retain copyright statements and notices.
024: * Redistributions must also contain a copy of this document.
025: * 2. Redistributions in binary form must reproduce the above copyright notice,
026: * this list of conditions and the following disclaimer in the documentation
027: * and/or other materials provided with the distribution.
028: * 3. The name "JAFFA" must not be used to endorse or promote products derived from
029: * this Software without prior written permission. For written permission,
030: * please contact mail to: jaffagroup@yahoo.com.
031: * 4. Products derived from this Software may not be called "JAFFA" nor may "JAFFA"
032: * appear in their names without prior written permission.
033: * 5. Due credit should be given to the JAFFA Project (http://jaffa.sourceforge.net).
034: *
035: * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: */
049:
050: package org.jaffa.presentation.portlet;
051:
052: import javax.servlet.http.HttpServletRequest;
053: import javax.servlet.http.HttpServletResponse;
054: import javax.servlet.ServletException;
055: import org.apache.struts.action.ActionForward;
056: import org.apache.struts.action.ActionMapping;
057: import org.apache.struts.action.ActionForm;
058: import org.apache.log4j.Logger;
059: import org.jaffa.presentation.portlet.component.ComponentManager;
060: import org.jaffa.presentation.portlet.component.Component;
061: import org.jaffa.presentation.portlet.FormKey;
062: import org.jaffa.presentation.portlet.session.UserSession;
063: import java.security.AccessControlException;
064: import org.jaffa.exceptions.ApplicationExceptions;
065:
066: /** This Action invokes the component passed in the request-stream
067: *
068: * The internal parameters that can be passed are
069: * component -> The name of the component to execute
070: * finalUrl -> The place to go after executing the component. This should be a valid forward mapping as defined in the struts-config.xml file.
071: * All other paramters will be introspected on the component being executed, prior to
072: * calling its 'display()' method.
073: */
074: public class StartComponentAction extends ActionBase {
075: private static Logger log = Logger
076: .getLogger(StartComponentAction.class);
077:
078: /** Constant to denote the 'component' parameter passed to this Action.*/
079: public static final String COMPONENT_PARAMETER = "component";
080:
081: /** Constant to denote the 'finalUrl' parameter passed to this Action.*/
082: public static final String FINALURL_PARAMETER = "finalUrl";
083:
084: /** Where to go (via struts forwards) if component access is denied */
085: private static final String NO_ACCESS_FORWARD = "jaffa_noComponentAccess";
086:
087: /** Invokes the component passed in the request stream.
088: * @throws Exception if the application business logic throws an exception
089: * @return A FormKey instance which describes the current Component & Form
090: */
091: public FormKey defaultAction() throws Exception {
092:
093: // Get the component & finalUrl parameter-values from the request-stream
094: String initialComponent = request
095: .getParameter(COMPONENT_PARAMETER);
096: String finalUrl = request.getParameter(FINALURL_PARAMETER);
097: if (log.isDebugEnabled())
098: log.debug("Received the Initial Parameters - component="
099: + initialComponent + ", finalUrl=" + finalUrl);
100:
101: // set the default value for initialComponent
102: if (initialComponent == null) {
103: String str = "The parameter " + COMPONENT_PARAMETER
104: + " should be passed";
105: log.error(str);
106: throw new IllegalArgumentException(str);
107: }
108:
109: /**********************************************************
110: * Create Component To Run
111: * **********************************************************/
112: if (log.isDebugEnabled())
113: log.debug("Calling the ComponentManager to run "
114: + initialComponent);
115:
116: Component comp = null;
117: try {
118: comp = ComponentManager.run(initialComponent, UserSession
119: .getUserSession(request));
120: } catch (AccessControlException e) {
121: // No access to component, direct to an error page
122: request.setAttribute("componentName", initialComponent);
123: return new FormKey(NO_ACCESS_FORWARD, null);
124: }
125:
126: // Set the ReturnToFromKey property of the component
127: if (finalUrl != null)
128: comp.setReturnToFormKey(new FormKey(finalUrl, null));
129:
130: // Set the parameters on the component using reflection
131: comp.reflectAndSetParms(request);
132:
133: FormKey fk;
134: try {
135: // get the formKey for the component
136: fk = comp.display();
137: } catch (ApplicationExceptions e) {
138: String str = "Error in invoking the display method of the Component "
139: + comp.getClass().getName();
140: if (log.isDebugEnabled())
141: log.debug(str);
142: throw e;
143: } catch (Exception e) {
144: String str = "Error in invoking the display method of the Component "
145: + comp.getClass().getName();
146: log.error(str, e);
147: throw e;
148: }
149:
150: // Initialize the HistoryNav by setting an appropriate attribute in the request stream
151: HistoryNav.initializeHistoryNav(request, finalUrl);
152: return fk;
153: }
154:
155: }
|