1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet;
16  
17  import com.liferay.portal.kernel.portlet.LiferayPortletURL;
18  import com.liferay.portal.kernel.util.HttpUtil;
19  import com.liferay.portal.kernel.util.ParamUtil;
20  import com.liferay.portal.kernel.util.StringBundler;
21  import com.liferay.portal.kernel.util.StringPool;
22  import com.liferay.portal.kernel.util.Validator;
23  import com.liferay.portal.model.LayoutTypePortlet;
24  import com.liferay.portal.model.Portlet;
25  import com.liferay.portal.theme.ThemeDisplay;
26  import com.liferay.portal.util.PortalUtil;
27  import com.liferay.portal.util.WebKeys;
28  
29  import java.util.Enumeration;
30  import java.util.Iterator;
31  import java.util.Map;
32  
33  import javax.portlet.MimeResponse;
34  import javax.portlet.PortletException;
35  import javax.portlet.PortletMode;
36  import javax.portlet.PortletRequest;
37  import javax.portlet.PortletURL;
38  import javax.portlet.WindowState;
39  
40  import javax.servlet.http.HttpServletRequest;
41  
42  /**
43   * <a href="PortletURLUtil.java.html"><b><i>View Source</i></b></a>
44   *
45   * @author Brian Wing Shun Chan
46   */
47  public class PortletURLUtil {
48  
49      public static PortletURL getCurrent(
50          PortletRequest portletRequest, MimeResponse mimeResponse) {
51  
52          PortletURL portletURL = mimeResponse.createRenderURL();
53  
54          Enumeration<String> enu = portletRequest.getParameterNames();
55  
56          while (enu.hasMoreElements()) {
57              String param = enu.nextElement();
58              String[] values = portletRequest.getParameterValues(param);
59  
60              boolean addParam = true;
61  
62              // Don't set paramter values that are over 32 kb. See LEP-1755.
63  
64              for (int i = 0; i < values.length; i++) {
65                  if (values[i].length() > _CURRENT_URL_PARAMETER_THRESHOLD) {
66                      addParam = false;
67  
68                      break;
69                  }
70              }
71  
72              if (addParam) {
73                  portletURL.setParameter(param, values);
74              }
75          }
76  
77          return portletURL;
78      }
79  
80      public static PortletURL clone(
81              PortletURL portletURL, MimeResponse mimeResponse)
82          throws PortletException {
83  
84          LiferayPortletURL liferayPortletURL = (LiferayPortletURL)portletURL;
85  
86          return clone(
87              liferayPortletURL, liferayPortletURL.getLifecycle(), mimeResponse);
88      }
89  
90      public static PortletURL clone(
91              PortletURL portletURL, String lifecycle, MimeResponse mimeResponse)
92          throws PortletException {
93  
94          LiferayPortletURL liferayPortletURL = (LiferayPortletURL)portletURL;
95  
96          return clone(liferayPortletURL, lifecycle, mimeResponse);
97      }
98  
99      public static PortletURL clone(
100             LiferayPortletURL liferayPortletURL, String lifecycle,
101             MimeResponse mimeResponse)
102         throws PortletException {
103 
104         LiferayPortletURL newURLImpl = null;
105 
106         if (lifecycle.equals(PortletRequest.ACTION_PHASE)) {
107             newURLImpl = (LiferayPortletURL)mimeResponse.createActionURL();
108         }
109         else if (lifecycle.equals(PortletRequest.RENDER_PHASE)) {
110             newURLImpl = (LiferayPortletURL)mimeResponse.createRenderURL();
111         }
112 
113         newURLImpl.setPortletId(liferayPortletURL.getPortletId());
114 
115         WindowState windowState = liferayPortletURL.getWindowState();
116 
117         if (windowState != null) {
118             newURLImpl.setWindowState(windowState);
119         }
120 
121         PortletMode portletMode = liferayPortletURL.getPortletMode();
122 
123         if (portletMode != null) {
124             newURLImpl.setPortletMode(portletMode);
125         }
126 
127         newURLImpl.setParameters(liferayPortletURL.getParameterMap());
128 
129         return newURLImpl;
130     }
131 
132     public static String getRefreshURL(
133         HttpServletRequest request, ThemeDisplay themeDisplay) {
134 
135         StringBundler sb = new StringBundler();
136 
137         sb.append(themeDisplay.getPathMain());
138         sb.append("/portal/render_portlet?");
139 
140         long plid = themeDisplay.getPlid();
141 
142         sb.append("p_l_id=");
143         sb.append(plid);
144 
145         Portlet portlet = (Portlet)request.getAttribute(
146             WebKeys.RENDER_PORTLET);
147 
148         String portletId = portlet.getPortletId();
149 
150         sb.append("&p_p_id=");
151         sb.append(portletId);
152 
153         sb.append("&p_p_lifecycle=0");
154 
155         WindowState windowState = WindowState.NORMAL;
156 
157         LayoutTypePortlet layoutTypePortlet =
158             themeDisplay.getLayoutTypePortlet();
159 
160         if (layoutTypePortlet.hasStateMaxPortletId(portletId)) {
161             windowState = WindowState.MAXIMIZED;
162         }
163         else if (layoutTypePortlet.hasStateMinPortletId(portletId)) {
164             windowState = WindowState.MINIMIZED;
165         }
166 
167         sb.append("&p_p_state=");
168         sb.append(windowState);
169 
170         sb.append("&p_p_mode=view");
171 
172         String columnId = (String)request.getAttribute(
173             WebKeys.RENDER_PORTLET_COLUMN_ID);
174 
175         sb.append("&p_p_col_id=");
176         sb.append(columnId);
177 
178         Integer columnPos = (Integer)request.getAttribute(
179             WebKeys.RENDER_PORTLET_COLUMN_POS);
180 
181         sb.append("&p_p_col_pos=");
182         sb.append(columnPos);
183 
184         Integer columnCount = (Integer)request.getAttribute(
185             WebKeys.RENDER_PORTLET_COLUMN_COUNT);
186 
187         sb.append("&p_p_col_count=");
188         sb.append(columnCount);
189 
190         if (portlet.isStatic()) {
191             sb.append("&p_p_static=1");
192 
193             if (portlet.isStaticStart()) {
194                 sb.append("&p_p_static_start=1");
195             }
196         }
197 
198         sb.append("&p_p_isolated=1");
199 
200         String doAsUserId = themeDisplay.getDoAsUserId();
201 
202         if (Validator.isNotNull(doAsUserId)) {
203             sb.append("&doAsUserId=");
204             sb.append(HttpUtil.encodeURL(doAsUserId));
205         }
206 
207         String currentURL = PortalUtil.getCurrentURL(request);
208 
209         sb.append("&currentURL=");
210         sb.append(HttpUtil.encodeURL(currentURL));
211 
212         String ppid = ParamUtil.getString(request, "p_p_id");
213 
214         if (ppid.equals(portletId)) {
215             Enumeration<String> enu = request.getParameterNames();
216 
217             while (enu.hasMoreElements()) {
218                 String name = enu.nextElement();
219 
220                 if (!PortalUtil.isReservedParameter(name)) {
221                     String[] values = request.getParameterValues(name);
222 
223                     for (int i = 0; i < values.length; i++) {
224                         sb.append(StringPool.AMPERSAND);
225                         sb.append(name);
226                         sb.append(StringPool.EQUAL);
227                         sb.append(HttpUtil.encodeURL(values[i]));
228                     }
229                 }
230             }
231 
232             Map<String, String[]> renderParameters = RenderParametersPool.get(
233                 request, plid, ppid);
234 
235             Iterator<String> itr = renderParameters.keySet().iterator();
236 
237             while (itr.hasNext()) {
238                 String name = itr.next();
239 
240                 String[] values = renderParameters.get(name);
241 
242                 for (int i = 0; i < values.length; i++) {
243                     sb.append(StringPool.AMPERSAND);
244                     sb.append(name);
245                     sb.append(StringPool.EQUAL);
246                     sb.append(HttpUtil.encodeURL(values[i]));
247                 }
248             }
249         }
250 
251         return sb.toString();
252     }
253 
254     private static final int _CURRENT_URL_PARAMETER_THRESHOLD = 32768;
255 
256 }