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