001    /**
002     * Copyright (c) 2000-present 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.exception.PortalException;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
021    import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
022    import com.liferay.portal.kernel.portlet.LiferayPortletURL;
023    import com.liferay.portal.kernel.util.JavaConstants;
024    import com.liferay.portal.kernel.util.WebKeys;
025    import com.liferay.portal.model.Group;
026    import com.liferay.portal.model.Layout;
027    import com.liferay.portal.model.impl.VirtualLayout;
028    import com.liferay.portal.service.LayoutLocalServiceUtil;
029    import com.liferay.portal.theme.ThemeDisplay;
030    import com.liferay.portal.util.PortalUtil;
031    
032    import javax.portlet.PortletRequest;
033    import javax.portlet.PortletResponse;
034    import javax.portlet.PortletURL;
035    import javax.portlet.WindowState;
036    import javax.portlet.WindowStateException;
037    
038    import javax.servlet.http.HttpServletRequest;
039    
040    /**
041     * @author Adolfo P??rez
042     * @author Roberto D??az
043     */
044    public class RequestBackedPortletURLFactoryUtil {
045    
046            public static RequestBackedPortletURLFactory create(
047                    HttpServletRequest request) {
048    
049                    return new HttpServletRequestRequestBackedPortletURLFactory(request);
050            }
051    
052            public static RequestBackedPortletURLFactory create(
053                    PortletRequest portletRequest) {
054    
055                    PortletResponse portletResponse =
056                            (PortletResponse)portletRequest.getAttribute(
057                                    JavaConstants.JAVAX_PORTLET_RESPONSE);
058    
059                    if (portletResponse == null) {
060                            return create(PortalUtil.getHttpServletRequest(portletRequest));
061                    }
062    
063                    return new LiferayPortletResponseRequestBackedPortletURLFactory(
064                            PortalUtil.getLiferayPortletRequest(portletRequest),
065                            PortalUtil.getLiferayPortletResponse(portletResponse));
066            }
067    
068            private static Layout _getControlPanelLayout(long companyId, Group group) {
069                    Layout layout = null;
070    
071                    try {
072                            long plid = PortalUtil.getControlPanelPlid(companyId);
073    
074                            layout = LayoutLocalServiceUtil.getLayout(plid);
075                    }
076                    catch (PortalException pe) {
077                            _log.error("Unable to get control panel layout", pe);
078    
079                            return null;
080                    }
081    
082                    if (group.isControlPanel()) {
083                            return layout;
084                    }
085    
086                    return new VirtualLayout(layout, group);
087            }
088    
089            private static PortletURL _populateControlPanelPortletURL(
090                    LiferayPortletURL liferayPortletURL, long refererGroupId,
091                    long refererPlid) {
092    
093                    if (refererGroupId > 0) {
094                            liferayPortletURL.setRefererGroupId(refererGroupId);
095                    }
096    
097                    if (refererPlid > 0) {
098                            liferayPortletURL.setRefererPlid(refererPlid);
099                    }
100    
101                    try {
102                            liferayPortletURL.setWindowState(WindowState.MAXIMIZED);
103                    }
104                    catch (WindowStateException wse) {
105                    }
106    
107                    return liferayPortletURL;
108            }
109    
110            private static final Log _log = LogFactoryUtil.getLog(
111                    RequestBackedPortletURLFactoryUtil.class);
112    
113            private static class HttpServletRequestRequestBackedPortletURLFactory
114                    implements RequestBackedPortletURLFactory {
115    
116                    @Override
117                    public PortletURL createActionURL(String portletId) {
118                            String actionPhase = PortletRequest.ACTION_PHASE;
119    
120                            return createPortletURL(portletId, actionPhase);
121                    }
122    
123                    @Override
124                    public PortletURL createControlPanelActionURL(
125                            String portletId, Group group, long refererGroupId,
126                            long refererPlid) {
127    
128                            return createControlPanelPortletURL(
129                                    portletId, group, refererGroupId, refererPlid,
130                                    PortletRequest.ACTION_PHASE);
131                    }
132    
133                    @Override
134                    public PortletURL createControlPanelPortletURL(
135                            String portletId, Group group, long refererGroupId,
136                            long refererPlid, String lifecycle) {
137    
138                            ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
139                                    WebKeys.THEME_DISPLAY);
140    
141                            if (group == null) {
142                                    group = themeDisplay.getScopeGroup();
143                            }
144    
145                            LiferayPortletURL liferayPortletURL = PortletURLFactoryUtil.create(
146                                    _request, portletId,
147                                    _getControlPanelLayout(themeDisplay.getCompanyId(), group),
148                                    lifecycle);
149    
150                            return _populateControlPanelPortletURL(
151                                    liferayPortletURL, refererGroupId, refererPlid);
152                    }
153    
154                    @Override
155                    public PortletURL createControlPanelRenderURL(
156                            String portletId, Group group, long refererGroupId,
157                            long refererPlid) {
158    
159                            return createControlPanelPortletURL(
160                                    portletId, group, refererGroupId, refererPlid,
161                                    PortletRequest.RENDER_PHASE);
162                    }
163    
164                    @Override
165                    public PortletURL createControlPanelResourceURL(
166                            String portletId, Group group, long refererGroupId,
167                            long refererPlid) {
168    
169                            return createControlPanelPortletURL(
170                                    portletId, group, refererGroupId, refererPlid,
171                                    PortletRequest.RESOURCE_PHASE);
172                    }
173    
174                    @Override
175                    public PortletURL createPortletURL(String portletId, String lifecycle) {
176                            ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
177                                    WebKeys.THEME_DISPLAY);
178    
179                            return PortletURLFactoryUtil.create(
180                                    _request, portletId, themeDisplay.getPlid(), lifecycle);
181                    }
182    
183                    @Override
184                    public PortletURL createRenderURL(String portletId) {
185                            return createPortletURL(portletId, PortletRequest.RENDER_PHASE);
186                    }
187    
188                    @Override
189                    public PortletURL createResourceURL(String portletId) {
190                            return createPortletURL(portletId, PortletRequest.RESOURCE_PHASE);
191                    }
192    
193                    private HttpServletRequestRequestBackedPortletURLFactory(
194                            HttpServletRequest request) {
195    
196                            _request = request;
197                    }
198    
199                    private final HttpServletRequest _request;
200    
201            }
202    
203            private static class LiferayPortletResponseRequestBackedPortletURLFactory
204                    implements RequestBackedPortletURLFactory {
205    
206                    @Override
207                    public PortletURL createActionURL(String portletId) {
208                            return _liferayPortletResponse.createActionURL(portletId);
209                    }
210    
211                    @Override
212                    public PortletURL createControlPanelActionURL(
213                            String portletId, Group group, long refererGroupId,
214                            long refererPlid) {
215    
216                            return createControlPanelPortletURL(
217                                    portletId, group, refererGroupId, refererPlid,
218                                    PortletRequest.ACTION_PHASE);
219                    }
220    
221                    @Override
222                    public PortletURL createControlPanelPortletURL(
223                            String portletId, Group group, long refererGroupId,
224                            long refererPlid, String lifecycle) {
225    
226                            ThemeDisplay themeDisplay =
227                                    (ThemeDisplay)_liferayPortletRequest.getAttribute(
228                                            WebKeys.THEME_DISPLAY);
229    
230                            if (group == null) {
231                                    group = themeDisplay.getScopeGroup();
232                            }
233    
234                            LiferayPortletURL liferayPortletURL = PortletURLFactoryUtil.create(
235                                    _liferayPortletRequest, portletId,
236                                    _getControlPanelLayout(themeDisplay.getCompanyId(), group),
237                                    lifecycle);
238    
239                            return _populateControlPanelPortletURL(
240                                    liferayPortletURL, refererGroupId, refererPlid);
241                    }
242    
243                    @Override
244                    public PortletURL createControlPanelRenderURL(
245                            String portletId, Group group, long refererGroupId,
246                            long refererPlid) {
247    
248                            return createControlPanelPortletURL(
249                                    portletId, group, refererGroupId, refererPlid,
250                                    PortletRequest.RENDER_PHASE);
251                    }
252    
253                    @Override
254                    public PortletURL createControlPanelResourceURL(
255                            String portletId, Group group, long refererGroupId,
256                            long refererPlid) {
257    
258                            return createControlPanelPortletURL(
259                                    portletId, group, refererGroupId, refererPlid,
260                                    PortletRequest.RESOURCE_PHASE);
261                    }
262    
263                    @Override
264                    public PortletURL createPortletURL(String portletId, String lifecycle) {
265                            return _liferayPortletResponse.createLiferayPortletURL(
266                                    portletId, lifecycle);
267                    }
268    
269                    @Override
270                    public PortletURL createRenderURL(String portletId) {
271                            return _liferayPortletResponse.createRenderURL(portletId);
272                    }
273    
274                    @Override
275                    public PortletURL createResourceURL(String portletId) {
276                            return _liferayPortletResponse.createResourceURL(portletId);
277                    }
278    
279                    private LiferayPortletResponseRequestBackedPortletURLFactory(
280                            LiferayPortletRequest liferayPortletRequest,
281                            LiferayPortletResponse liferayPortletResponse) {
282    
283                            _liferayPortletRequest = liferayPortletRequest;
284                            _liferayPortletResponse = liferayPortletResponse;
285                    }
286    
287                    private final LiferayPortletRequest _liferayPortletRequest;
288                    private final LiferayPortletResponse _liferayPortletResponse;
289    
290            }
291    
292    }