001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet;
016    
017    import com.liferay.portal.kernel.portlet.LiferayPortlet;
018    import com.liferay.portal.kernel.util.GetterUtil;
019    import com.liferay.portal.kernel.util.Validator;
020    import com.liferay.portal.struts.PortletRequestProcessor;
021    import com.liferay.portal.struts.StrutsUtil;
022    import com.liferay.portal.util.PortalUtil;
023    import com.liferay.portal.util.WebKeys;
024    
025    import java.io.IOException;
026    
027    import java.util.Map;
028    
029    import javax.portlet.ActionRequest;
030    import javax.portlet.ActionResponse;
031    import javax.portlet.PortletConfig;
032    import javax.portlet.PortletException;
033    import javax.portlet.PortletRequest;
034    import javax.portlet.RenderRequest;
035    import javax.portlet.RenderResponse;
036    import javax.portlet.ResourceRequest;
037    import javax.portlet.ResourceResponse;
038    
039    import javax.servlet.ServletException;
040    
041    /**
042     * @author Brian Wing Shun Chan
043     */
044    public class StrutsPortlet extends LiferayPortlet {
045    
046            @Override
047            public void doAbout(
048                            RenderRequest renderRequest, RenderResponse renderResponse)
049                    throws IOException, PortletException {
050    
051                    renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, aboutAction);
052    
053                    include(renderRequest, renderResponse);
054            }
055    
056            @Override
057            public void doConfig(
058                            RenderRequest renderRequest, RenderResponse renderResponse)
059                    throws IOException, PortletException {
060    
061                    renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, configAction);
062    
063                    include(renderRequest, renderResponse);
064            }
065    
066            @Override
067            public void doEdit(
068                            RenderRequest renderRequest, RenderResponse renderResponse)
069                    throws IOException, PortletException {
070    
071                    if (renderRequest.getPreferences() == null) {
072                            super.doEdit(renderRequest, renderResponse);
073                    }
074                    else {
075                            renderRequest.setAttribute(
076                                    WebKeys.PORTLET_STRUTS_ACTION, editAction);
077    
078                            include(renderRequest, renderResponse);
079                    }
080            }
081    
082            @Override
083            public void doEditDefaults(
084                            RenderRequest renderRequest, RenderResponse renderResponse)
085                    throws IOException, PortletException {
086    
087                    if (renderRequest.getPreferences() == null) {
088                            super.doEdit(renderRequest, renderResponse);
089                    }
090                    else {
091                            renderRequest.setAttribute(
092                                    WebKeys.PORTLET_STRUTS_ACTION, editDefaultsAction);
093    
094                            include(renderRequest, renderResponse);
095                    }
096            }
097    
098            @Override
099            public void doEditGuest(
100                            RenderRequest renderRequest, RenderResponse renderResponse)
101                    throws IOException, PortletException {
102    
103                    if (renderRequest.getPreferences() == null) {
104                            super.doEdit(renderRequest, renderResponse);
105                    }
106                    else {
107                            renderRequest.setAttribute(
108                                    WebKeys.PORTLET_STRUTS_ACTION, editGuestAction);
109    
110                            include(renderRequest, renderResponse);
111                    }
112            }
113    
114            @Override
115            public void doHelp(
116                            RenderRequest renderRequest, RenderResponse renderResponse)
117                    throws IOException, PortletException {
118    
119                    renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, helpAction);
120    
121                    include(renderRequest, renderResponse);
122            }
123    
124            @Override
125            public void doPreview(
126                            RenderRequest renderRequest, RenderResponse renderResponse)
127                    throws IOException, PortletException {
128    
129                    renderRequest.setAttribute(
130                            WebKeys.PORTLET_STRUTS_ACTION, previewAction);
131    
132                    include(renderRequest, renderResponse);
133            }
134    
135            @Override
136            public void doPrint(
137                            RenderRequest renderRequest, RenderResponse renderResponse)
138                    throws IOException, PortletException {
139    
140                    renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, printAction);
141    
142                    include(renderRequest, renderResponse);
143            }
144    
145            @Override
146            public void doView(
147                            RenderRequest renderRequest, RenderResponse renderResponse)
148                    throws IOException, PortletException {
149    
150                    renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, viewAction);
151    
152                    include(renderRequest, renderResponse);
153            }
154    
155            @Override
156            public void init(PortletConfig portletConfig) throws PortletException {
157                    super.init(portletConfig);
158    
159                    aboutAction = getInitParameter("about-action");
160                    configAction = getInitParameter("config-action");
161                    editAction = getInitParameter("edit-action");
162                    editDefaultsAction = getInitParameter("edit-defaults-action");
163                    editGuestAction = getInitParameter("edit-guest-action");
164                    helpAction = getInitParameter("help-action");
165                    previewAction = getInitParameter("preview-action");
166                    printAction = getInitParameter("print-action");
167                    viewAction = getInitParameter("view-action");
168    
169                    copyRequestParameters = GetterUtil.getBoolean(
170                            getInitParameter("copy-request-parameters"), true);
171    
172                    _portletConfig = (PortletConfigImpl)portletConfig;
173            }
174    
175            @Override
176            public void processAction(
177                            ActionRequest actionRequest, ActionResponse actionResponse)
178                    throws IOException, PortletException {
179    
180                    String path = actionRequest.getParameter("struts_action");
181    
182                    if (Validator.isNotNull(path)) {
183    
184                            // Call processAction of com.liferay.portal.struts.PortletAction
185    
186                            try {
187                                    PortletRequestProcessor processor = _getPortletRequestProcessor(
188                                            actionRequest);
189    
190                                    processor.process(actionRequest, actionResponse, path);
191                            }
192                            catch (ServletException se) {
193                                    throw new PortletException(se);
194                            }
195                    }
196    
197                    if (copyRequestParameters) {
198                            PortalUtil.copyRequestParameters(actionRequest, actionResponse);
199                    }
200            }
201    
202            @Override
203            public void serveResource(
204                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
205                    throws IOException, PortletException {
206    
207                    resourceRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, viewAction);
208    
209                    // Call serveResource of com.liferay.portal.struts.PortletAction
210    
211                    try {
212                            PortletRequestProcessor processor = _getPortletRequestProcessor(
213                                    resourceRequest);
214    
215                            processor.process(resourceRequest, resourceResponse);
216                    }
217                    catch (ServletException se) {
218                            throw new PortletException(se);
219                    }
220            }
221    
222            protected void include(
223                            RenderRequest renderRequest, RenderResponse renderResponse)
224                    throws IOException, PortletException {
225    
226                    // Call render of com.liferay.portal.struts.PortletAction
227    
228                    Map<String, Object> strutsAttributes = null;
229    
230                    if (_portletConfig.isWARFile()) {
231                            strutsAttributes = StrutsUtil.removeStrutsAttributes(
232                                    getPortletContext(), renderRequest);
233                    }
234    
235                    try {
236                            PortletRequestProcessor processor = _getPortletRequestProcessor(
237                                    renderRequest);
238    
239                            processor.process(renderRequest, renderResponse);
240                    }
241                    catch (ServletException se) {
242                            throw new PortletException(se);
243                    }
244                    finally {
245                            if (_portletConfig.isWARFile()) {
246                                    StrutsUtil.setStrutsAttributes(renderRequest, strutsAttributes);
247                            }
248                    }
249    
250                    if (copyRequestParameters) {
251                            PortalUtil.clearRequestParameters(renderRequest);
252                    }
253            }
254    
255            protected String aboutAction;
256            protected String configAction;
257            protected boolean copyRequestParameters;
258            protected String editAction;
259            protected String editDefaultsAction;
260            protected String editGuestAction;
261            protected String helpAction;
262            protected String previewAction;
263            protected String printAction;
264            protected String viewAction;
265    
266            private PortletRequestProcessor _getPortletRequestProcessor(
267                    PortletRequest portletRequest) {
268    
269                    return (PortletRequestProcessor)getPortletContext().getAttribute(
270                            WebKeys.PORTLET_STRUTS_PROCESSOR);
271            }
272    
273            private PortletConfigImpl _portletConfig;
274    
275    }