1
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
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
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("¤tURL=");
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 }