1
14
15 package com.liferay.util.portlet;
16
17 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
18 import com.liferay.portal.kernel.log.Log;
19 import com.liferay.portal.kernel.log.LogFactoryUtil;
20 import com.liferay.portal.kernel.portlet.LiferayWindowState;
21 import com.liferay.portal.kernel.util.HttpUtil;
22 import com.liferay.portal.kernel.util.StreamUtil;
23 import com.liferay.portal.kernel.util.StringPool;
24 import com.liferay.portal.kernel.util.Validator;
25 import com.liferay.portal.kernel.util.WebKeys;
26 import com.liferay.portal.kernel.xml.simple.Element;
27 import com.liferay.portal.theme.PortletDisplay;
28 import com.liferay.portal.theme.ThemeDisplay;
29
30 import java.io.InputStream;
31
32 import java.util.Collection;
33 import java.util.Enumeration;
34 import java.util.List;
35 import java.util.Map;
36
37 import javax.portlet.ActionRequest;
38 import javax.portlet.MimeResponse;
39 import javax.portlet.PortletRequest;
40 import javax.portlet.PortletResponse;
41 import javax.portlet.PortletSession;
42 import javax.portlet.PortletURL;
43 import javax.portlet.RenderRequest;
44 import javax.portlet.ResourceRequest;
45 import javax.portlet.ResourceURL;
46 import javax.portlet.WindowStateException;
47
48 import org.apache.commons.fileupload.disk.DiskFileItem;
49 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
50 import org.apache.commons.fileupload.portlet.PortletFileUpload;
51
52
58 public class PortletRequestUtil {
59
60 public static List<DiskFileItem> testMultipartWithCommonsFileUpload(
61 ActionRequest actionRequest)
62 throws Exception {
63
64
66 boolean multiPartContent = PortletFileUpload.isMultipartContent(
67 actionRequest);
68
69 if (multiPartContent) {
70 _log.info("The given request is a multipart request");
71 }
72 else {
73 _log.info("The given request is NOT a multipart request");
74 }
75
76 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
77
78 PortletFileUpload portletFileUpload = new PortletFileUpload(
79 diskFileItemFactory);
80
81 List<DiskFileItem> diskFileItems = portletFileUpload.parseRequest(
82 actionRequest);
83
84 if (_log.isInfoEnabled()) {
85 _log.info(
86 "Apache commons upload was able to parse " +
87 diskFileItems.size() + " items");
88 }
89
90 for (int i = 0; i < diskFileItems.size(); i++) {
91 DiskFileItem diskFileItem = diskFileItems.get(i);
92
93 if (_log.isInfoEnabled()) {
94 _log.info("Item " + i + " " + diskFileItem);
95 }
96 }
97
98 return diskFileItems;
99 }
100
101 public static int testMultipartWithPortletInputStream(
102 ActionRequest actionRequest)
103 throws Exception {
104
105 InputStream inputStream = actionRequest.getPortletInputStream();
106
107 if (inputStream != null) {
108 UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
109 new UnsyncByteArrayOutputStream();
110
111 StreamUtil.transfer(inputStream, unsyncByteArrayOutputStream);
112
113 int size = unsyncByteArrayOutputStream.size();
114
115 if (_log.isInfoEnabled()) {
116 _log.info(
117 "Byte array size from the raw input stream is " + size);
118 }
119
120 return size;
121 }
122
123 return -1;
124 }
125
126 public static String toXML(
127 PortletRequest portletRequest, PortletResponse portletResponse) {
128
129 Element requestElement = new Element("request");
130
131 requestElement.addElement("container-type", "portlet");
132 requestElement.addElement("container-type", "portlet");
133 requestElement.addElement(
134 "container-namespace", portletRequest.getContextPath());
135 requestElement.addElement(
136 "content-type", portletRequest.getResponseContentType());
137 requestElement.addElement(
138 "server-name", portletRequest.getServerName());
139 requestElement.addElement(
140 "server-port", portletRequest.getServerPort());
141 requestElement.addElement("secure", portletRequest.isSecure());
142 requestElement.addElement("auth-type", portletRequest.getAuthType());
143 requestElement.addElement(
144 "remote-user", portletRequest.getRemoteUser());
145 requestElement.addElement(
146 "context-path", portletRequest.getContextPath());
147 requestElement.addElement("locale", portletRequest.getLocale());
148 requestElement.addElement(
149 "portlet-mode", portletRequest.getPortletMode());
150 requestElement.addElement(
151 "portlet-session-id", portletRequest.getRequestedSessionId());
152 requestElement.addElement("scheme", portletRequest.getScheme());
153 requestElement.addElement(
154 "window-state", portletRequest.getWindowState());
155
156 if (portletRequest instanceof ActionRequest) {
157 requestElement.addElement("lifecycle", RenderRequest.ACTION_PHASE);
158 }
159 else if (portletRequest instanceof RenderRequest) {
160 requestElement.addElement("lifecycle", RenderRequest.RENDER_PHASE);
161 }
162 else if (portletRequest instanceof ResourceRequest) {
163 requestElement.addElement(
164 "lifecycle", RenderRequest.RESOURCE_PHASE);
165 }
166
167 if (portletResponse instanceof MimeResponse) {
168 _mimeResponseToXML((MimeResponse)portletResponse, requestElement);
169 }
170
171 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
172 WebKeys.THEME_DISPLAY);
173
174 if (themeDisplay != null) {
175 Element themeDisplayElement = requestElement.addElement(
176 "theme-display");
177
178 _themeDisplayToXML(themeDisplay, themeDisplayElement);
179 }
180
181 Element parametersElement = requestElement.addElement("parameters");
182
183 Enumeration<String> enu = portletRequest.getParameterNames();
184
185 while (enu.hasMoreElements()) {
186 String name = enu.nextElement();
187
188 Element parameterElement = parametersElement.addElement(
189 "parameter");
190
191 parameterElement.addElement("name", name);
192
193 String[] values = portletRequest.getParameterValues(name);
194
195 for (int i = 0; i < values.length; i++) {
196 parameterElement.addElement("value", values[i]);
197 }
198 }
199
200 Element attributesElement = requestElement.addElement("attributes");
201
202 enu = portletRequest.getAttributeNames();
203
204 while (enu.hasMoreElements()) {
205 String name = enu.nextElement();
206
207 if (!_isValidAttributeName(name)) {
208 continue;
209 }
210
211 Object value = portletRequest.getAttribute(name);
212
213 if (!_isValidAttributeValue(value)) {
214 continue;
215 }
216
217 Element attributeElement = attributesElement.addElement(
218 "attribute");
219
220 attributeElement.addElement("name", name);
221 attributeElement.addElement("value", value);
222 }
223
224 Element portletSessionElement = requestElement.addElement(
225 "portlet-session");
226
227 attributesElement = portletSessionElement.addElement(
228 "portlet-attributes");
229
230 PortletSession portletSession = portletRequest.getPortletSession();
231
232 try {
233 enu = portletSession.getAttributeNames(
234 PortletSession.PORTLET_SCOPE);
235
236 while (enu.hasMoreElements()) {
237 String name = enu.nextElement();
238
239 if (!_isValidAttributeName(name)) {
240 continue;
241 }
242
243 Object value = portletSession.getAttribute(
244 name, PortletSession.PORTLET_SCOPE);
245
246 if (!_isValidAttributeValue(value)) {
247 continue;
248 }
249
250 Element attributeElement = attributesElement.addElement(
251 "attribute");
252
253 attributeElement.addElement("name", name);
254 attributeElement.addElement("value", value);
255 }
256
257 attributesElement = portletSessionElement.addElement(
258 "application-attributes");
259
260 enu = portletSession.getAttributeNames(
261 PortletSession.APPLICATION_SCOPE);
262
263 while (enu.hasMoreElements()) {
264 String name = enu.nextElement();
265
266 if (!_isValidAttributeName(name)) {
267 continue;
268 }
269
270 Object value = portletSession.getAttribute(
271 name, PortletSession.APPLICATION_SCOPE);
272
273 if (!_isValidAttributeValue(value)) {
274 continue;
275 }
276
277 Element attributeElement = attributesElement.addElement(
278 "attribute");
279
280 attributeElement.addElement("name", name);
281 attributeElement.addElement("value", value);
282 }
283 }
284 catch (IllegalStateException ise) {
285 if (_log.isWarnEnabled()) {
286 _log.warn(ise.getMessage());
287 }
288 }
289
290 return requestElement.toXMLString();
291 }
292
293 private static boolean _isValidAttributeName(String name) {
294 if (name.equalsIgnoreCase("j_password") ||
295 name.equalsIgnoreCase("LAYOUT_CONTENT") ||
296 name.equalsIgnoreCase("LAYOUTS") ||
297 name.equalsIgnoreCase("PORTLET_RENDER_PARAMETERS") ||
298 name.equalsIgnoreCase("USER_PASSWORD") ||
299 name.startsWith("javax.") ||
300 name.startsWith("liferay-ui:")) {
301
302 return false;
303 }
304 else {
305 return true;
306 }
307 }
308
309 private static boolean _isValidAttributeValue(Object obj) {
310 if (obj == null) {
311 return false;
312 }
313 else if (obj instanceof Collection<?>) {
314 Collection<?> col = (Collection<?>)obj;
315
316 if (col.size() == 0) {
317 return false;
318 }
319 else {
320 return true;
321 }
322 }
323 else if (obj instanceof Map<?, ?>) {
324 Map<?, ?> map = (Map<?, ?>)obj;
325
326 if (map.size() == 0) {
327 return false;
328 }
329 else {
330 return true;
331 }
332 }
333 else {
334 String objString = String.valueOf(obj);
335
336 if (Validator.isNull(objString)) {
337 return false;
338 }
339
340 String hashCode =
341 StringPool.AT + Integer.toHexString(obj.hashCode());
342
343 if (objString.endsWith(hashCode)) {
344 return false;
345 }
346
347 return true;
348 }
349 }
350
351 private static void _mimeResponseToXML(
352 MimeResponse mimeResponse, Element requestElement) {
353
354 String namespace = mimeResponse.getNamespace();
355
356 requestElement.addElement("portlet-namespace", namespace);
357
358 try {
359 PortletURL actionURL = mimeResponse.createActionURL();
360
361 requestElement.addElement("action-url", actionURL);
362 }
363 catch (IllegalStateException ise) {
364 if (_log.isWarnEnabled()) {
365 _log.warn(ise.getMessage());
366 }
367 }
368
369 try {
370 PortletURL renderURL = mimeResponse.createRenderURL();
371
372 requestElement.addElement("render-url", renderURL);
373
374 try {
375 renderURL.setWindowState(LiferayWindowState.EXCLUSIVE);
376
377 requestElement.addElement("render-url-exclusive", renderURL);
378 }
379 catch (WindowStateException wse) {
380 }
381
382 try {
383 renderURL.setWindowState(LiferayWindowState.MAXIMIZED);
384
385 requestElement.addElement("render-url-maximized", renderURL);
386 }
387 catch (WindowStateException wse) {
388 }
389
390 try {
391 renderURL.setWindowState(LiferayWindowState.MINIMIZED);
392
393 requestElement.addElement("render-url-minimized", renderURL);
394 }
395 catch (WindowStateException wse) {
396 }
397
398 try {
399 renderURL.setWindowState(LiferayWindowState.NORMAL);
400
401 requestElement.addElement("render-url-normal", renderURL);
402 }
403 catch (WindowStateException wse) {
404 }
405
406 try {
407 renderURL.setWindowState(LiferayWindowState.POP_UP);
408
409 requestElement.addElement("render-url-pop-up", renderURL);
410 }
411 catch (WindowStateException wse) {
412 }
413 }
414 catch (IllegalStateException ise) {
415 if (_log.isWarnEnabled()) {
416 _log.warn(ise.getMessage());
417 }
418 }
419
420 ResourceURL resourceURL = mimeResponse.createResourceURL();
421
422 String resourceURLString = HttpUtil.removeParameter(
423 resourceURL.toString(), namespace + "struts_action");
424
425 resourceURLString = HttpUtil.removeParameter(
426 resourceURLString, namespace + "redirect");
427
428 requestElement.addElement("resource-url", resourceURLString);
429 }
430
431 private static void _portletDisplayToXML(
432 PortletDisplay portletDisplay, Element portletDisplayElement) {
433
434 portletDisplayElement.addElement("id", portletDisplay.getId());
435 portletDisplayElement.addElement(
436 "instance-id", portletDisplay.getInstanceId());
437 portletDisplayElement.addElement(
438 "portlet-name", portletDisplay.getPortletName());
439 portletDisplayElement.addElement(
440 "resource-pk", portletDisplay.getResourcePK());
441 portletDisplayElement.addElement(
442 "root-portlet-id", portletDisplay.getRootPortletId());
443 portletDisplayElement.addElement("title", portletDisplay.getTitle());
444 }
445
446 private static void _themeDisplayToXML(
447 ThemeDisplay themeDisplay, Element themeDisplayElement) {
448
449 themeDisplayElement.addElement("cdn-host", themeDisplay.getCDNHost());
450 themeDisplayElement.addElement(
451 "company-id", themeDisplay.getCompanyId());
452 themeDisplayElement.addElement(
453 "do-as-user-id", themeDisplay.getDoAsUserId());
454 themeDisplayElement.addElement(
455 "i18n-language-id", themeDisplay.getI18nLanguageId());
456 themeDisplayElement.addElement("i18n-path", themeDisplay.getI18nPath());
457 themeDisplayElement.addElement(
458 "language-id", themeDisplay.getLanguageId());
459 themeDisplayElement.addElement("locale", themeDisplay.getLocale());
460 themeDisplayElement.addElement(
461 "path-context", themeDisplay.getPathContext());
462 themeDisplayElement.addElement(
463 "path-friendly-url-private-group",
464 themeDisplay.getPathFriendlyURLPrivateGroup());
465 themeDisplayElement.addElement(
466 "path-friendly-url-private-user",
467 themeDisplay.getPathFriendlyURLPrivateUser());
468 themeDisplayElement.addElement(
469 "path-friendly-url-public",
470 themeDisplay.getPathFriendlyURLPublic());
471 themeDisplayElement.addElement(
472 "path-image", themeDisplay.getPathImage());
473 themeDisplayElement.addElement("path-main", themeDisplay.getPathMain());
474 themeDisplayElement.addElement(
475 "path-theme-images", themeDisplay.getPathThemeImages());
476 themeDisplayElement.addElement("plid", themeDisplay.getPlid());
477 themeDisplayElement.addElement(
478 "portal-url", HttpUtil.removeProtocol(themeDisplay.getPortalURL()));
479 themeDisplayElement.addElement(
480 "real-user-id", themeDisplay.getRealUserId());
481 themeDisplayElement.addElement(
482 "scope-group-id", themeDisplay.getScopeGroupId());
483 themeDisplayElement.addElement("secure", themeDisplay.isSecure());
484 themeDisplayElement.addElement(
485 "server-name", themeDisplay.getServerName());
486 themeDisplayElement.addElement(
487 "server-port", themeDisplay.getServerPort());
488 themeDisplayElement.addElement(
489 "time-zone", themeDisplay.getTimeZone().getID());
490 themeDisplayElement.addElement(
491 "url-portal", HttpUtil.removeProtocol(themeDisplay.getURLPortal()));
492 themeDisplayElement.addElement("user-id", themeDisplay.getUserId());
493
494 if (themeDisplay.getPortletDisplay() != null) {
495 Element portletDisplayElement = themeDisplayElement.addElement(
496 "portlet-display");
497
498 _portletDisplayToXML(
499 themeDisplay.getPortletDisplay(), portletDisplayElement);
500 }
501 }
502
503 private static Log _log = LogFactoryUtil.getLog(PortletRequestUtil.class);
504
505 }