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