001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.portlet;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.util.HttpUtil;
020    import com.liferay.portal.kernel.util.StringPool;
021    import com.liferay.portal.kernel.util.StringUtil;
022    import com.liferay.portal.kernel.util.Validator;
023    import com.liferay.portal.kernel.util.WebKeys;
024    import com.liferay.portal.kernel.xml.simple.Element;
025    import com.liferay.portal.theme.ThemeDisplay;
026    
027    import java.io.Serializable;
028    
029    import java.util.Collection;
030    import java.util.Enumeration;
031    import java.util.HashMap;
032    import java.util.Iterator;
033    import java.util.Locale;
034    import java.util.Map;
035    import java.util.Set;
036    
037    import javax.portlet.ActionRequest;
038    import javax.portlet.MimeResponse;
039    import javax.portlet.PortletMode;
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.WindowState;
048    import javax.portlet.WindowStateException;
049    
050    /**
051     * @author Shuyang Zhou
052     */
053    public class PortletRequestModel implements Serializable {
054    
055            public PortletRequestModel(
056                    PortletRequest portletRequest, PortletResponse portletResponse) {
057    
058                    _containerNamespace = portletRequest.getContextPath();
059                    _contentType = portletRequest.getResponseContentType();
060                    _serverName = portletRequest.getServerName();
061                    _serverPort = portletRequest.getServerPort();
062                    _secure = portletRequest.isSecure();
063                    _authType = portletRequest.getAuthType();
064                    _remoteUser = portletRequest.getRemoteUser();
065                    _contextPath = portletRequest.getContextPath();
066                    _locale = portletRequest.getLocale();
067                    _portletMode = portletRequest.getPortletMode();
068                    _portletSessionId = portletRequest.getRequestedSessionId();
069                    _scheme = portletRequest.getScheme();
070                    _windowState = portletRequest.getWindowState();
071    
072                    if (portletRequest instanceof ActionRequest) {
073                            _lifecycle = RenderRequest.ACTION_PHASE;
074                    }
075                    else if (portletRequest instanceof RenderRequest) {
076                            _lifecycle = RenderRequest.RENDER_PHASE;
077                    }
078                    else if (portletRequest instanceof ResourceRequest) {
079                            _lifecycle = RenderRequest.RESOURCE_PHASE;
080                    }
081                    else {
082                            _lifecycle = null;
083                    }
084    
085                    String portletNamespace = null;
086                    String actionURLString = null;
087                    String renderURLString = null;
088                    String renderURLExclusiveString = null;
089                    String renderURLMaximizedString = null;
090                    String renderURLMinimizedString = null;
091                    String renderURLNormalString = null;
092                    String renderURLPopUp = null;
093    
094                    if (portletResponse instanceof MimeResponse) {
095                            MimeResponse mimeResponse = (MimeResponse)portletResponse;
096    
097                            portletNamespace = mimeResponse.getNamespace();
098    
099                            try {
100                                    PortletURL actionURL = mimeResponse.createActionURL();
101    
102                                    actionURLString = actionURL.toString();
103                            }
104                            catch (IllegalStateException ise) {
105                                    if (_log.isWarnEnabled()) {
106                                            _log.warn(ise.getMessage());
107                                    }
108                            }
109    
110                            try {
111                                    PortletURL renderURL = mimeResponse.createRenderURL();
112    
113                                    renderURLString = renderURL.toString();
114    
115                                    try {
116                                            renderURL.setWindowState(LiferayWindowState.EXCLUSIVE);
117    
118                                            renderURLExclusiveString = renderURL.toString();
119                                    }
120                                    catch (WindowStateException wse) {
121                                    }
122    
123                                    try {
124                                            renderURL.setWindowState(LiferayWindowState.MAXIMIZED);
125    
126                                            renderURLMaximizedString = renderURL.toString();
127                                    }
128                                    catch (WindowStateException wse) {
129                                    }
130    
131                                    try {
132                                            renderURL.setWindowState(LiferayWindowState.MINIMIZED);
133    
134                                            renderURLMinimizedString = renderURL.toString();
135                                    }
136                                    catch (WindowStateException wse) {
137                                    }
138    
139                                    try {
140                                            renderURL.setWindowState(LiferayWindowState.NORMAL);
141    
142                                            renderURLNormalString = renderURL.toString();
143                                    }
144                                    catch (WindowStateException wse) {
145                                    }
146    
147                                    try {
148                                            renderURL.setWindowState(LiferayWindowState.POP_UP);
149    
150                                            renderURLPopUp = renderURL.toString();
151                                    }
152                                    catch (WindowStateException wse) {
153                                    }
154                            }
155                            catch (IllegalStateException ise) {
156                                    if (_log.isWarnEnabled()) {
157                                            _log.warn(ise.getMessage());
158                                    }
159                            }
160    
161                            ResourceURL resourceURL = mimeResponse.createResourceURL();
162    
163                            String resourceURLString = HttpUtil.removeParameter(
164                                    resourceURL.toString(), portletNamespace + "struts_action");
165    
166                            resourceURLString = HttpUtil.removeParameter(
167                                    resourceURLString, portletNamespace + "redirect");
168    
169                            _resourceURL = resourceURL.toString();
170                    }
171                    else {
172                            _resourceURL = null;
173                    }
174    
175                    _portletNamespace = portletNamespace;
176                    _actionURL = actionURLString;
177                    _renderURL = renderURLString;
178                    _renderURLExclusive = renderURLExclusiveString;
179                    _renderURLMaximized = renderURLMaximizedString;
180                    _renderURLMinimized = renderURLMinimizedString;
181                    _renderURLNormal = renderURLNormalString;
182                    _renderURLPopUp = renderURLPopUp;
183    
184                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
185                            WebKeys.THEME_DISPLAY);
186    
187                    if (themeDisplay != null) {
188                            _themeDisplayModel = new ThemeDisplayModel(themeDisplay);
189                    }
190                    else {
191                            _themeDisplayModel = null;
192                    }
193    
194                    _parameters = new HashMap<String, String[]>(
195                            portletRequest.getParameterMap());
196    
197                    _attributes = new HashMap<String, Object>();
198    
199                    Enumeration<String> enumeration = portletRequest.getAttributeNames();
200    
201                    while (enumeration.hasMoreElements()) {
202                            String name = enumeration.nextElement();
203    
204                            Object value = portletRequest.getAttribute(name);
205    
206                            _attributes.put(name, value);
207                    }
208    
209                    PortletSession portletSession = portletRequest.getPortletSession();
210    
211                    try {
212                            _portletScopeSessioAttributes = portletSession.getAttributeMap(
213                                    PortletSession.PORTLET_SCOPE);
214    
215                            _applicationScopeSessionAttributes = portletSession.getAttributeMap(
216                                    PortletSession.APPLICATION_SCOPE);
217                    }
218                    catch (IllegalStateException ise) {
219                            if (_log.isWarnEnabled()) {
220                                    _log.warn(ise.getMessage());
221                            }
222                    }
223            }
224    
225            public String getActionURL() {
226                    return _actionURL;
227            }
228    
229            public Map<String, Object> getApplicationScopeSessionAttributes() {
230                    return _applicationScopeSessionAttributes;
231            }
232    
233            public Map<String, Object> getAttributes() {
234                    return _attributes;
235            }
236    
237            public String getAuthType() {
238                    return _authType;
239            }
240    
241            public String getContainerNamespace() {
242                    return _containerNamespace;
243            }
244    
245            public String getContentType() {
246                    return _contentType;
247            }
248    
249            public String getContextPath() {
250                    return _contextPath;
251            }
252    
253            public String getLifecycle() {
254                    return _lifecycle;
255            }
256    
257            public Locale getLocale() {
258                    return _locale;
259            }
260    
261            public Map<String, String[]> getParameters() {
262                    return _parameters;
263            }
264    
265            public PortletMode getPortletMode() {
266                    return _portletMode;
267            }
268    
269            public String getPortletNamespace() {
270                    return _portletNamespace;
271            }
272    
273            public Map<String, Object> getPortletScopeSessioAttributes() {
274                    return _portletScopeSessioAttributes;
275            }
276    
277            public String getPortletSessionId() {
278                    return _portletSessionId;
279            }
280    
281            public String getRemoteUser() {
282                    return _remoteUser;
283            }
284    
285            public String getRenderURL() {
286                    return _renderURL;
287            }
288    
289            public String getRenderURLExclusive() {
290                    return _renderURLExclusive;
291            }
292    
293            public String getRenderURLMaximized() {
294                    return _renderURLMaximized;
295            }
296    
297            public String getRenderURLMinimized() {
298                    return _renderURLMinimized;
299            }
300    
301            public String getRenderURLNormal() {
302                    return _renderURLNormal;
303            }
304    
305            public String getRenderURLPopUp() {
306                    return _renderURLPopUp;
307            }
308    
309            public String getResourceURL() {
310                    return _resourceURL;
311            }
312    
313            public String getScheme() {
314                    return _scheme;
315            }
316    
317            public String getServerName() {
318                    return _serverName;
319            }
320    
321            public int getServerPort() {
322                    return _serverPort;
323            }
324    
325            public ThemeDisplayModel getThemeDisplayModel() {
326                    return _themeDisplayModel;
327            }
328    
329            public WindowState getWindowState() {
330                    return _windowState;
331            }
332    
333            public boolean isSecure() {
334                    return _secure;
335            }
336    
337            public Map<String, Object> toMap() {
338                    Map<String, Object> portletRequestModelMap =
339                            new HashMap<String, Object>();
340    
341                    portletRequestModelMap.put("container-type", "portlet");
342                    portletRequestModelMap.put("container-namespace", _contextPath);
343                    portletRequestModelMap.put("content-type", _contentType);
344                    portletRequestModelMap.put("server-name", _serverName);
345                    portletRequestModelMap.put("server-port", _serverPort);
346                    portletRequestModelMap.put("secure", _secure);
347                    portletRequestModelMap.put("auth-type", _authType);
348                    portletRequestModelMap.put("remote-user", _remoteUser);
349                    portletRequestModelMap.put("context-path", _contextPath);
350                    portletRequestModelMap.put("locale", _locale);
351                    portletRequestModelMap.put("portlet-mode", _portletMode);
352                    portletRequestModelMap.put("portlet-session-id", _portletSessionId);
353                    portletRequestModelMap.put("scheme", _scheme);
354                    portletRequestModelMap.put("window-state", _windowState);
355                    portletRequestModelMap.put("lifecycle", _lifecycle);
356    
357                    if (_portletNamespace != null) {
358                            portletRequestModelMap.put("portlet-namespace", _portletNamespace);
359    
360                            if (_actionURL != null) {
361                                    portletRequestModelMap.put("action-url", "_actionURL");
362                            }
363    
364                            if (_renderURL != null) {
365                                    portletRequestModelMap.put("render-url", _renderURL);
366    
367                                    if (_renderURLExclusive != null) {
368                                            portletRequestModelMap.put(
369                                                    "render-url-exclusive", _renderURLExclusive);
370                                    }
371    
372                                    if (_renderURLMaximized != null) {
373                                            portletRequestModelMap.put(
374                                                    "render-url-maximized", _renderURLMaximized);
375                                    }
376    
377                                    if (_renderURLMinimized != null) {
378                                            portletRequestModelMap.put(
379                                                    "render-url-minimized", _renderURLMinimized);
380                                    }
381    
382                                    if (_renderURLNormal != null) {
383                                            portletRequestModelMap.put(
384                                                    "render-url-normal", _renderURLNormal);
385                                    }
386    
387                                    if (_renderURLPopUp != null) {
388                                            portletRequestModelMap.put(
389                                                    "render-url-pop-up", _renderURLPopUp);
390                                    }
391                            }
392    
393                            portletRequestModelMap.put("resource-url", _resourceURL);
394                    }
395    
396                    if (_themeDisplayModel != null) {
397                            Map<String, Object> themeDisplayModelMap =
398                                    new HashMap<String, Object>();
399    
400                            portletRequestModelMap.put("theme-display", themeDisplayModelMap);
401    
402                            themeDisplayModelMap.put(
403                                    "cdn-host", _themeDisplayModel.getCdnHost());
404                            themeDisplayModelMap.put(
405                                    "company-id", _themeDisplayModel.getCompanyId());
406                            themeDisplayModelMap.put(
407                                    "do-as-user-id", _themeDisplayModel.getDoAsUserId());
408                            themeDisplayModelMap.put(
409                                    "i18n-language-id", _themeDisplayModel.getI18nLanguageId());
410                            themeDisplayModelMap.put(
411                                    "i18n-path", _themeDisplayModel.getI18nPath());
412                            themeDisplayModelMap.put(
413                                    "language-id", _themeDisplayModel.getLanguageId());
414                            themeDisplayModelMap.put("locale", _themeDisplayModel.getLocale());
415                            themeDisplayModelMap.put(
416                                    "path-context", _themeDisplayModel.getPathContext());
417                            themeDisplayModelMap.put(
418                                    "path-friendly-url-private-group",
419                                    _themeDisplayModel.getPathFriendlyURLPrivateGroup());
420                            themeDisplayModelMap.put(
421                                    "path-friendly-url-private-user",
422                                    _themeDisplayModel.getPathFriendlyURLPrivateUser());
423                            themeDisplayModelMap.put(
424                                    "path-friendly-url-public",
425                                    _themeDisplayModel.getPathFriendlyURLPublic());
426                            themeDisplayModelMap.put(
427                                    "path-image", _themeDisplayModel.getPathImage());
428                            themeDisplayModelMap.put(
429                                    "path-main", _themeDisplayModel.getPathMain());
430                            themeDisplayModelMap.put(
431                                    "path-theme-images", _themeDisplayModel.getPathThemeImages());
432                            themeDisplayModelMap.put("plid", _themeDisplayModel.getPlid());
433                            themeDisplayModelMap.put(
434                                    "portal-url", _themeDisplayModel.getPortalURL());
435                            themeDisplayModelMap.put(
436                                    "real-user-id", _themeDisplayModel.getRealUserId());
437                            themeDisplayModelMap.put(
438                                    "scope-group-id", _themeDisplayModel.getScopeGroupId());
439                            themeDisplayModelMap.put("secure", _themeDisplayModel.isSecure());
440                            themeDisplayModelMap.put(
441                                    "server-name", _themeDisplayModel.getServerName());
442                            themeDisplayModelMap.put(
443                                    "server-port", _themeDisplayModel.getServerPort());
444                            themeDisplayModelMap.put(
445                                    "time-zone", _themeDisplayModel.getTimeZone().getID());
446                            themeDisplayModelMap.put(
447                                    "url-portal", _themeDisplayModel.getURLPortal());
448                            themeDisplayModelMap.put("user-id", _themeDisplayModel.getUserId());
449    
450                            PortletDisplayModel portletDisplayModel =
451                                    _themeDisplayModel.getPortletDisplayModel();
452    
453                            if (portletDisplayModel != null) {
454                                    Map<String, Object> portletDisplayModelMap =
455                                            new HashMap<String, Object>();
456    
457                                    themeDisplayModelMap.put(
458                                            "portlet-display", portletDisplayModelMap);
459    
460                                    portletDisplayModelMap.put("id", portletDisplayModel.getId());
461                                    portletDisplayModelMap.put(
462                                            "instance-id", portletDisplayModel.getInstanceId());
463                                    portletDisplayModelMap.put(
464                                            "portlet-name", portletDisplayModel.getPortletName());
465                                    portletDisplayModelMap.put(
466                                            "resource-pk", portletDisplayModel.getResourcePK());
467                                    portletDisplayModelMap.put(
468                                            "root-portlet-id", portletDisplayModel.getRootPortletId());
469                                    portletDisplayModelMap.put(
470                                            "title", portletDisplayModel.getTitle());
471                            }
472                    }
473    
474                    portletRequestModelMap.put("parameters", _parameters);
475    
476                    _attributes = filterInvalidAttributes(_attributes);
477    
478                    portletRequestModelMap.put("attributes", _attributes);
479    
480                    Map<String, Object> portletSessionMap = new HashMap<String, Object>();
481    
482                    portletRequestModelMap.put("portlet-session", portletSessionMap);
483    
484                    _portletScopeSessioAttributes = filterInvalidAttributes(
485                            _portletScopeSessioAttributes);
486    
487                    portletSessionMap.put(
488                            "portlet-attributes", _portletScopeSessioAttributes);
489    
490                    _applicationScopeSessionAttributes = filterInvalidAttributes(
491                            _applicationScopeSessionAttributes);
492    
493                    portletSessionMap.put(
494                            "application-attributes", _applicationScopeSessionAttributes);
495    
496                    return portletRequestModelMap;
497            }
498    
499            public String toXML() {
500                    Element requestElement = new Element("request");
501    
502                    requestElement.addElement("container-type", "portlet");
503                    requestElement.addElement("container-namespace", _contextPath);
504                    requestElement.addElement("content-type", _contentType);
505                    requestElement.addElement("server-name", _serverName);
506                    requestElement.addElement("server-port", _serverPort);
507                    requestElement.addElement("secure", _secure);
508                    requestElement.addElement("auth-type", _authType);
509                    requestElement.addElement("remote-user", _remoteUser);
510                    requestElement.addElement("context-path", _contextPath);
511                    requestElement.addElement("locale", _locale);
512                    requestElement.addElement("portlet-mode", _portletMode);
513                    requestElement.addElement("portlet-session-id", _portletSessionId);
514                    requestElement.addElement("scheme", _scheme);
515                    requestElement.addElement("window-state", _windowState);
516                    requestElement.addElement("lifecycle", _lifecycle);
517    
518                    if (_portletNamespace != null) {
519                            requestElement.addElement("portlet-namespace", _portletNamespace);
520    
521                            if (_actionURL != null) {
522                                    requestElement.addElement("action-url", _actionURL);
523                            }
524    
525                            if (_renderURL != null) {
526                                    requestElement.addElement("render-url", _renderURL);
527    
528                                    if (_renderURLExclusive != null) {
529                                            requestElement.addElement(
530                                                    "render-url-exclusive", _renderURLExclusive);
531                                    }
532    
533                                    if (_renderURLMaximized != null) {
534                                            requestElement.addElement(
535                                                    "render-url-maximized", _renderURLMaximized);
536                                    }
537    
538                                    if (_renderURLMinimized != null) {
539                                            requestElement.addElement(
540                                                    "render-url-minimized", _renderURLMinimized);
541                                    }
542    
543                                    if (_renderURLNormal != null) {
544                                            requestElement.addElement(
545                                                    "render-url-normal", _renderURLNormal);
546                                    }
547    
548                                    if (_renderURLPopUp != null) {
549                                            requestElement.addElement(
550                                                    "render-url-pop-up", _renderURLPopUp);
551                                    }
552                            }
553    
554                            requestElement.addElement("resource-url", _resourceURL);
555                    }
556    
557                    if (_themeDisplayModel != null) {
558                            Element themeDisplayElement = requestElement.addElement(
559                                    "theme-display");
560    
561                            themeDisplayElement.addElement(
562                                    "cdn-host", _themeDisplayModel.getCdnHost());
563                            themeDisplayElement.addElement(
564                                    "company-id", _themeDisplayModel.getCompanyId());
565                            themeDisplayElement.addElement(
566                                    "do-as-user-id", _themeDisplayModel.getDoAsUserId());
567                            themeDisplayElement.addElement(
568                                    "i18n-language-id", _themeDisplayModel.getI18nLanguageId());
569                            themeDisplayElement.addElement(
570                                    "i18n-path", _themeDisplayModel.getI18nPath());
571                            themeDisplayElement.addElement(
572                                    "language-id", _themeDisplayModel.getLanguageId());
573                            themeDisplayElement.addElement(
574                                    "locale", _themeDisplayModel.getLocale());
575                            themeDisplayElement.addElement(
576                                    "path-context", _themeDisplayModel.getPathContext());
577                            themeDisplayElement.addElement(
578                                    "path-friendly-url-private-group",
579                                    _themeDisplayModel.getPathFriendlyURLPrivateGroup());
580                            themeDisplayElement.addElement(
581                                    "path-friendly-url-private-user",
582                                    _themeDisplayModel.getPathFriendlyURLPrivateUser());
583                            themeDisplayElement.addElement(
584                                    "path-friendly-url-public",
585                                    _themeDisplayModel.getPathFriendlyURLPublic());
586                            themeDisplayElement.addElement(
587                                    "path-image", _themeDisplayModel.getPathImage());
588                            themeDisplayElement.addElement(
589                                    "path-main", _themeDisplayModel.getPathMain());
590                            themeDisplayElement.addElement(
591                                    "path-theme-images", _themeDisplayModel.getPathThemeImages());
592                            themeDisplayElement.addElement(
593                                    "plid", _themeDisplayModel.getPlid());
594                            themeDisplayElement.addElement(
595                                    "portal-url", _themeDisplayModel.getPortalURL());
596                            themeDisplayElement.addElement(
597                                    "real-user-id", _themeDisplayModel.getRealUserId());
598                            themeDisplayElement.addElement(
599                                    "scope-group-id", _themeDisplayModel.getScopeGroupId());
600                            themeDisplayElement.addElement(
601                                    "secure", _themeDisplayModel.isSecure());
602                            themeDisplayElement.addElement(
603                                    "server-name", _themeDisplayModel.getServerName());
604                            themeDisplayElement.addElement(
605                                    "server-port", _themeDisplayModel.getServerPort());
606                            themeDisplayElement.addElement(
607                                    "time-zone", _themeDisplayModel.getTimeZone().getID());
608                            themeDisplayElement.addElement(
609                                    "url-portal", _themeDisplayModel.getURLPortal());
610                            themeDisplayElement.addElement(
611                                    "user-id", _themeDisplayModel.getUserId());
612    
613                            PortletDisplayModel portletDisplayModel =
614                                    _themeDisplayModel.getPortletDisplayModel();
615    
616                            if (portletDisplayModel != null) {
617                                    Element portletDisplayElement = themeDisplayElement.addElement(
618                                            "portlet-display");
619    
620                                    portletDisplayElement.addElement(
621                                            "id", portletDisplayModel.getId());
622                                    portletDisplayElement.addElement(
623                                            "instance-id", portletDisplayModel.getInstanceId());
624                                    portletDisplayElement.addElement(
625                                            "portlet-name", portletDisplayModel.getPortletName());
626                                    portletDisplayElement.addElement(
627                                            "resource-pk", portletDisplayModel.getResourcePK());
628                                    portletDisplayElement.addElement(
629                                            "root-portlet-id", portletDisplayModel.getRootPortletId());
630                                    portletDisplayElement.addElement(
631                                            "title", portletDisplayModel.getTitle());
632                            }
633                    }
634    
635                    Element parametersElement = requestElement.addElement("parameters");
636    
637                    for (Map.Entry<String, String[]> entry : _parameters.entrySet()) {
638                            Element parameterElement = parametersElement.addElement(
639                                    "parameter");
640    
641                            parameterElement.addElement("name", entry.getKey());
642    
643                            for (String value : entry.getValue()) {
644                                    parameterElement.addElement("value", value);
645                            }
646                    }
647    
648                    Element attributesElement = requestElement.addElement("attributes");
649    
650                    for (Map.Entry<String, Object> entry : _attributes.entrySet()) {
651                            String name = entry.getKey();
652    
653                            if (!_isValidAttributeName(name)) {
654                                    continue;
655                            }
656    
657                            Object value = entry.getValue();
658    
659                            if (!_isValidAttributeValue(value)) {
660                                    continue;
661                            }
662    
663                            Element attributeElement = attributesElement.addElement(
664                                    "attribute");
665    
666                            attributeElement.addElement("name", name);
667                            attributeElement.addElement("value", value);
668                    }
669    
670                    Element portletSessionElement = requestElement.addElement(
671                            "portlet-session");
672    
673                    attributesElement = portletSessionElement.addElement(
674                            "portlet-attributes");
675    
676                    for (Map.Entry<String, Object> entry :
677                                    _portletScopeSessioAttributes.entrySet()) {
678    
679                            String name = entry.getKey();
680    
681                            if (!_isValidAttributeName(name)) {
682                                    continue;
683                            }
684    
685                            Object value = entry.getValue();
686    
687                            if (!_isValidAttributeValue(value)) {
688                                    continue;
689                            }
690    
691                            Element attributeElement = attributesElement.addElement(
692                                    "attribute");
693    
694                            attributeElement.addElement("name", name);
695                            attributeElement.addElement("value", value);
696                    }
697    
698                    attributesElement = portletSessionElement.addElement(
699                            "application-attributes");
700    
701                    for (Map.Entry<String, Object> entry :
702                                    _applicationScopeSessionAttributes.entrySet()) {
703    
704                            String name = entry.getKey();
705    
706                            if (!_isValidAttributeName(name)) {
707                                    continue;
708                            }
709    
710                            Object value = entry.getValue();
711    
712                            if (!_isValidAttributeValue(value)) {
713                                    continue;
714                            }
715    
716                            Element attributeElement = attributesElement.addElement(
717                                    "attribute");
718    
719                            attributeElement.addElement("name", name);
720                            attributeElement.addElement("value", value);
721                    }
722    
723                    return requestElement.toXMLString();
724            }
725    
726            protected PortletRequestModel() {
727                    _actionURL = null;
728                    _authType = null;
729                    _containerNamespace = null;
730                    _contentType = null;
731                    _contextPath = null;
732                    _lifecycle = null;
733                    _locale = null;
734                    _parameters = null;
735                    _portletMode = null;
736                    _portletNamespace = null;
737                    _portletSessionId = null;
738                    _remoteUser = null;
739                    _renderURL = null;
740                    _renderURLExclusive = null;
741                    _renderURLMaximized = null;
742                    _renderURLMinimized = null;
743                    _renderURLNormal = null;
744                    _renderURLPopUp = null;
745                    _resourceURL = null;
746                    _scheme = null;
747                    _secure = false;
748                    _serverName = null;
749                    _serverPort = 0;
750                    _themeDisplayModel = null;
751                    _windowState = null;
752            }
753    
754            protected Map<String, Object> filterInvalidAttributes(
755                    Map<String, Object> map) {
756    
757                    Set<Map.Entry<String, Object>> set = map.entrySet();
758    
759                    Iterator<Map.Entry<String, Object>> iterator = set.iterator();
760    
761                    while (iterator.hasNext()) {
762                            Map.Entry<String, Object> entry = iterator.next();
763    
764                            if (!_isValidAttributeName(entry.getKey()) ||
765                                    !_isValidAttributeValue(entry.getValue())) {
766    
767                                    iterator.remove();
768                            }
769                    }
770    
771                    return map;
772            }
773    
774            private static boolean _isValidAttributeName(String name) {
775                    if (StringUtil.equalsIgnoreCase(name, "j_password") ||
776                            StringUtil.equalsIgnoreCase(name, "LAYOUT_CONTENT") ||
777                            StringUtil.equalsIgnoreCase(name, "LAYOUTS") ||
778                            StringUtil.equalsIgnoreCase(name, "PORTLET_RENDER_PARAMETERS") ||
779                            StringUtil.equalsIgnoreCase(name, "USER_PASSWORD") ||
780                            name.startsWith("javax.") ||
781                            name.startsWith("liferay-ui:")) {
782    
783                            return false;
784                    }
785                    else {
786                            return true;
787                    }
788            }
789    
790            private static boolean _isValidAttributeValue(Object obj) {
791                    if (obj == null) {
792                            return false;
793                    }
794                    else if (obj instanceof Collection<?>) {
795                            Collection<?> col = (Collection<?>)obj;
796    
797                            return !col.isEmpty();
798                    }
799                    else if (obj instanceof Map<?, ?>) {
800                            Map<?, ?> map = (Map<?, ?>)obj;
801    
802                            return !map.isEmpty();
803                    }
804                    else {
805                            String objString = String.valueOf(obj);
806    
807                            if (Validator.isNull(objString)) {
808                                    return false;
809                            }
810    
811                            String hashCode = StringPool.AT.concat(
812                                    StringUtil.toHexString(obj.hashCode()));
813    
814                            if (objString.endsWith(hashCode)) {
815                                    return false;
816                            }
817    
818                            return true;
819                    }
820            }
821    
822            private static final Log _log = LogFactoryUtil.getLog(
823                    PortletRequestModel.class);
824    
825            private final String _actionURL;
826            private Map<String, Object> _applicationScopeSessionAttributes;
827            private Map<String, Object> _attributes;
828            private final String _authType;
829            private final String _containerNamespace;
830            private final String _contentType;
831            private final String _contextPath;
832            private final String _lifecycle;
833            private final Locale _locale;
834            private final Map<String, String[]> _parameters;
835            private final PortletMode _portletMode;
836            private final String _portletNamespace;
837            private Map<String, Object> _portletScopeSessioAttributes;
838            private final String _portletSessionId;
839            private final String _remoteUser;
840            private final String _renderURL;
841            private final String _renderURLExclusive;
842            private final String _renderURLMaximized;
843            private final String _renderURLMinimized;
844            private final String _renderURLNormal;
845            private final String _renderURLPopUp;
846            private final String _resourceURL;
847            private final String _scheme;
848            private final boolean _secure;
849            private final String _serverName;
850            private final int _serverPort;
851            private final ThemeDisplayModel _themeDisplayModel;
852            private final WindowState _windowState;
853    
854    }