1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
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  /**
53   * <a href="PortletRequestUtil.java.html"><b><i>View Source</i></b></a>
54   *
55   * @author Brian Wing Shun Chan
56   * @author Raymond Augé
57   */
58  public class PortletRequestUtil {
59  
60      public static List<DiskFileItem> testMultipartWithCommonsFileUpload(
61              ActionRequest actionRequest)
62          throws Exception {
63  
64          // Check if the given request is a multipart request
65  
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 }