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.MapUtil;
021    import com.liferay.portal.kernel.util.PredicateFilter;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.kernel.util.StringUtil;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.kernel.util.WebKeys;
026    import com.liferay.portal.kernel.xml.simple.Element;
027    import com.liferay.portal.theme.ThemeDisplay;
028    
029    import java.io.Serializable;
030    
031    import java.util.Collection;
032    import java.util.Enumeration;
033    import java.util.HashMap;
034    import java.util.Locale;
035    import java.util.Map;
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<>(portletRequest.getParameterMap());
195    
196                    _attributes = new HashMap<>();
197    
198                    Enumeration<String> enumeration = portletRequest.getAttributeNames();
199    
200                    while (enumeration.hasMoreElements()) {
201                            String name = enumeration.nextElement();
202    
203                            Object value = portletRequest.getAttribute(name);
204    
205                            _attributes.put(name, value);
206                    }
207    
208                    PortletSession portletSession = portletRequest.getPortletSession();
209    
210                    try {
211                            _portletScopeSessioAttributes = portletSession.getAttributeMap(
212                                    PortletSession.PORTLET_SCOPE);
213    
214                            _applicationScopeSessionAttributes = portletSession.getAttributeMap(
215                                    PortletSession.APPLICATION_SCOPE);
216                    }
217                    catch (IllegalStateException ise) {
218                            if (_log.isWarnEnabled()) {
219                                    _log.warn(ise.getMessage());
220                            }
221                    }
222            }
223    
224            public String getActionURL() {
225                    return _actionURL;
226            }
227    
228            public Map<String, Object> getApplicationScopeSessionAttributes() {
229                    return _applicationScopeSessionAttributes;
230            }
231    
232            public Map<String, Object> getAttributes() {
233                    return _attributes;
234            }
235    
236            public String getAuthType() {
237                    return _authType;
238            }
239    
240            public String getContainerNamespace() {
241                    return _containerNamespace;
242            }
243    
244            public String getContentType() {
245                    return _contentType;
246            }
247    
248            public String getContextPath() {
249                    return _contextPath;
250            }
251    
252            public String getLifecycle() {
253                    return _lifecycle;
254            }
255    
256            public Locale getLocale() {
257                    return _locale;
258            }
259    
260            public Map<String, String[]> getParameters() {
261                    return _parameters;
262            }
263    
264            public PortletMode getPortletMode() {
265                    return _portletMode;
266            }
267    
268            public String getPortletNamespace() {
269                    return _portletNamespace;
270            }
271    
272            public Map<String, Object> getPortletScopeSessioAttributes() {
273                    return _portletScopeSessioAttributes;
274            }
275    
276            public String getPortletSessionId() {
277                    return _portletSessionId;
278            }
279    
280            public String getRemoteUser() {
281                    return _remoteUser;
282            }
283    
284            public String getRenderURL() {
285                    return _renderURL;
286            }
287    
288            public String getRenderURLExclusive() {
289                    return _renderURLExclusive;
290            }
291    
292            public String getRenderURLMaximized() {
293                    return _renderURLMaximized;
294            }
295    
296            public String getRenderURLMinimized() {
297                    return _renderURLMinimized;
298            }
299    
300            public String getRenderURLNormal() {
301                    return _renderURLNormal;
302            }
303    
304            public String getRenderURLPopUp() {
305                    return _renderURLPopUp;
306            }
307    
308            public String getResourceURL() {
309                    return _resourceURL;
310            }
311    
312            public String getScheme() {
313                    return _scheme;
314            }
315    
316            public String getServerName() {
317                    return _serverName;
318            }
319    
320            public int getServerPort() {
321                    return _serverPort;
322            }
323    
324            public ThemeDisplayModel getThemeDisplayModel() {
325                    return _themeDisplayModel;
326            }
327    
328            public WindowState getWindowState() {
329                    return _windowState;
330            }
331    
332            public boolean isSecure() {
333                    return _secure;
334            }
335    
336            public Map<String, Object> toMap() {
337                    Map<String, Object> portletRequestModelMap = new HashMap<>();
338    
339                    portletRequestModelMap.put("container-type", "portlet");
340                    portletRequestModelMap.put("container-namespace", _contextPath);
341                    portletRequestModelMap.put("content-type", _contentType);
342                    portletRequestModelMap.put("server-name", _serverName);
343                    portletRequestModelMap.put("server-port", _serverPort);
344                    portletRequestModelMap.put("secure", _secure);
345                    portletRequestModelMap.put("auth-type", _authType);
346                    portletRequestModelMap.put("remote-user", _remoteUser);
347                    portletRequestModelMap.put("context-path", _contextPath);
348                    portletRequestModelMap.put("locale", _locale);
349                    portletRequestModelMap.put("portlet-mode", _portletMode);
350                    portletRequestModelMap.put("portlet-session-id", _portletSessionId);
351                    portletRequestModelMap.put("scheme", _scheme);
352                    portletRequestModelMap.put("window-state", _windowState);
353                    portletRequestModelMap.put("lifecycle", _lifecycle);
354    
355                    if (_portletNamespace != null) {
356                            portletRequestModelMap.put("portlet-namespace", _portletNamespace);
357    
358                            if (_actionURL != null) {
359                                    portletRequestModelMap.put("action-url", "_actionURL");
360                            }
361    
362                            if (_renderURL != null) {
363                                    portletRequestModelMap.put("render-url", _renderURL);
364    
365                                    if (_renderURLExclusive != null) {
366                                            portletRequestModelMap.put(
367                                                    "render-url-exclusive", _renderURLExclusive);
368                                    }
369    
370                                    if (_renderURLMaximized != null) {
371                                            portletRequestModelMap.put(
372                                                    "render-url-maximized", _renderURLMaximized);
373                                    }
374    
375                                    if (_renderURLMinimized != null) {
376                                            portletRequestModelMap.put(
377                                                    "render-url-minimized", _renderURLMinimized);
378                                    }
379    
380                                    if (_renderURLNormal != null) {
381                                            portletRequestModelMap.put(
382                                                    "render-url-normal", _renderURLNormal);
383                                    }
384    
385                                    if (_renderURLPopUp != null) {
386                                            portletRequestModelMap.put(
387                                                    "render-url-pop-up", _renderURLPopUp);
388                                    }
389                            }
390    
391                            portletRequestModelMap.put("resource-url", _resourceURL);
392                    }
393    
394                    if (_themeDisplayModel != null) {
395                            Map<String, Object> themeDisplayModelMap = new HashMap<>();
396    
397                            portletRequestModelMap.put("theme-display", themeDisplayModelMap);
398    
399                            themeDisplayModelMap.put(
400                                    "cdn-host", _themeDisplayModel.getCdnHost());
401                            themeDisplayModelMap.put(
402                                    "company-id", _themeDisplayModel.getCompanyId());
403                            themeDisplayModelMap.put(
404                                    "do-as-user-id", _themeDisplayModel.getDoAsUserId());
405                            themeDisplayModelMap.put(
406                                    "i18n-language-id", _themeDisplayModel.getI18nLanguageId());
407                            themeDisplayModelMap.put(
408                                    "i18n-path", _themeDisplayModel.getI18nPath());
409                            themeDisplayModelMap.put(
410                                    "language-id", _themeDisplayModel.getLanguageId());
411                            themeDisplayModelMap.put("locale", _themeDisplayModel.getLocale());
412                            themeDisplayModelMap.put(
413                                    "path-context", _themeDisplayModel.getPathContext());
414                            themeDisplayModelMap.put(
415                                    "path-friendly-url-private-group",
416                                    _themeDisplayModel.getPathFriendlyURLPrivateGroup());
417                            themeDisplayModelMap.put(
418                                    "path-friendly-url-private-user",
419                                    _themeDisplayModel.getPathFriendlyURLPrivateUser());
420                            themeDisplayModelMap.put(
421                                    "path-friendly-url-public",
422                                    _themeDisplayModel.getPathFriendlyURLPublic());
423                            themeDisplayModelMap.put(
424                                    "path-image", _themeDisplayModel.getPathImage());
425                            themeDisplayModelMap.put(
426                                    "path-main", _themeDisplayModel.getPathMain());
427                            themeDisplayModelMap.put(
428                                    "path-theme-images", _themeDisplayModel.getPathThemeImages());
429                            themeDisplayModelMap.put("plid", _themeDisplayModel.getPlid());
430                            themeDisplayModelMap.put(
431                                    "portal-url", _themeDisplayModel.getPortalURL());
432                            themeDisplayModelMap.put(
433                                    "real-user-id", _themeDisplayModel.getRealUserId());
434                            themeDisplayModelMap.put(
435                                    "scope-group-id", _themeDisplayModel.getScopeGroupId());
436                            themeDisplayModelMap.put("secure", _themeDisplayModel.isSecure());
437                            themeDisplayModelMap.put(
438                                    "server-name", _themeDisplayModel.getServerName());
439                            themeDisplayModelMap.put(
440                                    "server-port", _themeDisplayModel.getServerPort());
441                            themeDisplayModelMap.put(
442                                    "time-zone", _themeDisplayModel.getTimeZone().getID());
443                            themeDisplayModelMap.put(
444                                    "url-portal", _themeDisplayModel.getURLPortal());
445                            themeDisplayModelMap.put("user-id", _themeDisplayModel.getUserId());
446    
447                            PortletDisplayModel portletDisplayModel =
448                                    _themeDisplayModel.getPortletDisplayModel();
449    
450                            if (portletDisplayModel != null) {
451                                    Map<String, Object> portletDisplayModelMap = new HashMap<>();
452    
453                                    themeDisplayModelMap.put(
454                                            "portlet-display", portletDisplayModelMap);
455    
456                                    portletDisplayModelMap.put("id", portletDisplayModel.getId());
457                                    portletDisplayModelMap.put(
458                                            "instance-id", portletDisplayModel.getInstanceId());
459                                    portletDisplayModelMap.put(
460                                            "portlet-name", portletDisplayModel.getPortletName());
461                                    portletDisplayModelMap.put(
462                                            "resource-pk", portletDisplayModel.getResourcePK());
463                                    portletDisplayModelMap.put(
464                                            "root-portlet-id", portletDisplayModel.getRootPortletId());
465                                    portletDisplayModelMap.put(
466                                            "title", portletDisplayModel.getTitle());
467                            }
468                    }
469    
470                    portletRequestModelMap.put("parameters", _parameters);
471    
472                    _attributes = filterInvalidAttributes(_attributes);
473    
474                    portletRequestModelMap.put("attributes", _attributes);
475    
476                    Map<String, Object> portletSessionMap = new HashMap<>();
477    
478                    portletRequestModelMap.put("portlet-session", portletSessionMap);
479    
480                    _portletScopeSessioAttributes = filterInvalidAttributes(
481                            _portletScopeSessioAttributes);
482    
483                    portletSessionMap.put(
484                            "portlet-attributes", _portletScopeSessioAttributes);
485    
486                    _applicationScopeSessionAttributes = filterInvalidAttributes(
487                            _applicationScopeSessionAttributes);
488    
489                    portletSessionMap.put(
490                            "application-attributes", _applicationScopeSessionAttributes);
491    
492                    return portletRequestModelMap;
493            }
494    
495            public String toXML() {
496                    Element requestElement = new Element("request");
497    
498                    requestElement.addElement("container-type", "portlet");
499                    requestElement.addElement("container-namespace", _contextPath);
500                    requestElement.addElement("content-type", _contentType);
501                    requestElement.addElement("server-name", _serverName);
502                    requestElement.addElement("server-port", _serverPort);
503                    requestElement.addElement("secure", _secure);
504                    requestElement.addElement("auth-type", _authType);
505                    requestElement.addElement("remote-user", _remoteUser);
506                    requestElement.addElement("context-path", _contextPath);
507                    requestElement.addElement("locale", _locale);
508                    requestElement.addElement("portlet-mode", _portletMode);
509                    requestElement.addElement("portlet-session-id", _portletSessionId);
510                    requestElement.addElement("scheme", _scheme);
511                    requestElement.addElement("window-state", _windowState);
512                    requestElement.addElement("lifecycle", _lifecycle);
513    
514                    if (_portletNamespace != null) {
515                            requestElement.addElement("portlet-namespace", _portletNamespace);
516    
517                            if (_actionURL != null) {
518                                    requestElement.addElement("action-url", _actionURL);
519                            }
520    
521                            if (_renderURL != null) {
522                                    requestElement.addElement("render-url", _renderURL);
523    
524                                    if (_renderURLExclusive != null) {
525                                            requestElement.addElement(
526                                                    "render-url-exclusive", _renderURLExclusive);
527                                    }
528    
529                                    if (_renderURLMaximized != null) {
530                                            requestElement.addElement(
531                                                    "render-url-maximized", _renderURLMaximized);
532                                    }
533    
534                                    if (_renderURLMinimized != null) {
535                                            requestElement.addElement(
536                                                    "render-url-minimized", _renderURLMinimized);
537                                    }
538    
539                                    if (_renderURLNormal != null) {
540                                            requestElement.addElement(
541                                                    "render-url-normal", _renderURLNormal);
542                                    }
543    
544                                    if (_renderURLPopUp != null) {
545                                            requestElement.addElement(
546                                                    "render-url-pop-up", _renderURLPopUp);
547                                    }
548                            }
549    
550                            requestElement.addElement("resource-url", _resourceURL);
551                    }
552    
553                    if (_themeDisplayModel != null) {
554                            Element themeDisplayElement = requestElement.addElement(
555                                    "theme-display");
556    
557                            themeDisplayElement.addElement(
558                                    "cdn-host", _themeDisplayModel.getCdnHost());
559                            themeDisplayElement.addElement(
560                                    "company-id", _themeDisplayModel.getCompanyId());
561                            themeDisplayElement.addElement(
562                                    "do-as-user-id", _themeDisplayModel.getDoAsUserId());
563                            themeDisplayElement.addElement(
564                                    "i18n-language-id", _themeDisplayModel.getI18nLanguageId());
565                            themeDisplayElement.addElement(
566                                    "i18n-path", _themeDisplayModel.getI18nPath());
567                            themeDisplayElement.addElement(
568                                    "language-id", _themeDisplayModel.getLanguageId());
569                            themeDisplayElement.addElement(
570                                    "locale", _themeDisplayModel.getLocale());
571                            themeDisplayElement.addElement(
572                                    "path-context", _themeDisplayModel.getPathContext());
573                            themeDisplayElement.addElement(
574                                    "path-friendly-url-private-group",
575                                    _themeDisplayModel.getPathFriendlyURLPrivateGroup());
576                            themeDisplayElement.addElement(
577                                    "path-friendly-url-private-user",
578                                    _themeDisplayModel.getPathFriendlyURLPrivateUser());
579                            themeDisplayElement.addElement(
580                                    "path-friendly-url-public",
581                                    _themeDisplayModel.getPathFriendlyURLPublic());
582                            themeDisplayElement.addElement(
583                                    "path-image", _themeDisplayModel.getPathImage());
584                            themeDisplayElement.addElement(
585                                    "path-main", _themeDisplayModel.getPathMain());
586                            themeDisplayElement.addElement(
587                                    "path-theme-images", _themeDisplayModel.getPathThemeImages());
588                            themeDisplayElement.addElement(
589                                    "plid", _themeDisplayModel.getPlid());
590                            themeDisplayElement.addElement(
591                                    "portal-url", _themeDisplayModel.getPortalURL());
592                            themeDisplayElement.addElement(
593                                    "real-user-id", _themeDisplayModel.getRealUserId());
594                            themeDisplayElement.addElement(
595                                    "scope-group-id", _themeDisplayModel.getScopeGroupId());
596                            themeDisplayElement.addElement(
597                                    "secure", _themeDisplayModel.isSecure());
598                            themeDisplayElement.addElement(
599                                    "server-name", _themeDisplayModel.getServerName());
600                            themeDisplayElement.addElement(
601                                    "server-port", _themeDisplayModel.getServerPort());
602                            themeDisplayElement.addElement(
603                                    "time-zone", _themeDisplayModel.getTimeZone().getID());
604                            themeDisplayElement.addElement(
605                                    "url-portal", _themeDisplayModel.getURLPortal());
606                            themeDisplayElement.addElement(
607                                    "user-id", _themeDisplayModel.getUserId());
608    
609                            PortletDisplayModel portletDisplayModel =
610                                    _themeDisplayModel.getPortletDisplayModel();
611    
612                            if (portletDisplayModel != null) {
613                                    Element portletDisplayElement = themeDisplayElement.addElement(
614                                            "portlet-display");
615    
616                                    portletDisplayElement.addElement(
617                                            "id", portletDisplayModel.getId());
618                                    portletDisplayElement.addElement(
619                                            "instance-id", portletDisplayModel.getInstanceId());
620                                    portletDisplayElement.addElement(
621                                            "portlet-name", portletDisplayModel.getPortletName());
622                                    portletDisplayElement.addElement(
623                                            "resource-pk", portletDisplayModel.getResourcePK());
624                                    portletDisplayElement.addElement(
625                                            "root-portlet-id", portletDisplayModel.getRootPortletId());
626                                    portletDisplayElement.addElement(
627                                            "title", portletDisplayModel.getTitle());
628                            }
629                    }
630    
631                    Element parametersElement = requestElement.addElement("parameters");
632    
633                    for (Map.Entry<String, String[]> entry : _parameters.entrySet()) {
634                            Element parameterElement = parametersElement.addElement(
635                                    "parameter");
636    
637                            parameterElement.addElement("name", entry.getKey());
638    
639                            for (String value : entry.getValue()) {
640                                    parameterElement.addElement("value", value);
641                            }
642                    }
643    
644                    Element attributesElement = requestElement.addElement("attributes");
645    
646                    for (Map.Entry<String, Object> entry : _attributes.entrySet()) {
647                            String name = entry.getKey();
648    
649                            if (!_isValidAttributeName(name)) {
650                                    continue;
651                            }
652    
653                            Object value = entry.getValue();
654    
655                            if (!_isValidAttributeValue(value)) {
656                                    continue;
657                            }
658    
659                            Element attributeElement = attributesElement.addElement(
660                                    "attribute");
661    
662                            attributeElement.addElement("name", name);
663                            attributeElement.addElement("value", value);
664                    }
665    
666                    Element portletSessionElement = requestElement.addElement(
667                            "portlet-session");
668    
669                    attributesElement = portletSessionElement.addElement(
670                            "portlet-attributes");
671    
672                    for (Map.Entry<String, Object> entry :
673                                    _portletScopeSessioAttributes.entrySet()) {
674    
675                            String name = entry.getKey();
676    
677                            if (!_isValidAttributeName(name)) {
678                                    continue;
679                            }
680    
681                            Object value = entry.getValue();
682    
683                            if (!_isValidAttributeValue(value)) {
684                                    continue;
685                            }
686    
687                            Element attributeElement = attributesElement.addElement(
688                                    "attribute");
689    
690                            attributeElement.addElement("name", name);
691                            attributeElement.addElement("value", value);
692                    }
693    
694                    attributesElement = portletSessionElement.addElement(
695                            "application-attributes");
696    
697                    for (Map.Entry<String, Object> entry :
698                                    _applicationScopeSessionAttributes.entrySet()) {
699    
700                            String name = entry.getKey();
701    
702                            if (!_isValidAttributeName(name)) {
703                                    continue;
704                            }
705    
706                            Object value = entry.getValue();
707    
708                            if (!_isValidAttributeValue(value)) {
709                                    continue;
710                            }
711    
712                            Element attributeElement = attributesElement.addElement(
713                                    "attribute");
714    
715                            attributeElement.addElement("name", name);
716                            attributeElement.addElement("value", value);
717                    }
718    
719                    return requestElement.toXMLString();
720            }
721    
722            protected PortletRequestModel() {
723                    _actionURL = null;
724                    _authType = null;
725                    _containerNamespace = null;
726                    _contentType = null;
727                    _contextPath = null;
728                    _lifecycle = null;
729                    _locale = null;
730                    _parameters = null;
731                    _portletMode = null;
732                    _portletNamespace = null;
733                    _portletSessionId = null;
734                    _remoteUser = null;
735                    _renderURL = null;
736                    _renderURLExclusive = null;
737                    _renderURLMaximized = null;
738                    _renderURLMinimized = null;
739                    _renderURLNormal = null;
740                    _renderURLPopUp = null;
741                    _resourceURL = null;
742                    _scheme = null;
743                    _secure = false;
744                    _serverName = null;
745                    _serverPort = 0;
746                    _themeDisplayModel = null;
747                    _windowState = null;
748            }
749    
750            protected Map<String, Object> filterInvalidAttributes(
751                    Map<String, Object> map) {
752    
753                    PredicateFilter<Map.Entry<String, Object>> predicateFilter =
754                            new PredicateFilter<Map.Entry<String, Object>>() {
755    
756                                    @Override
757                                    public boolean filter(Map.Entry<String, Object> entry) {
758                                            if (_isValidAttributeName(entry.getKey()) &&
759                                                    _isValidAttributeValue(entry.getValue())) {
760    
761                                                    return true;
762                                            }
763    
764                                            return false;
765                                    }
766    
767                            };
768    
769                    return MapUtil.filter(map, predicateFilter);
770            }
771    
772            private static boolean _isValidAttributeName(String name) {
773                    if (StringUtil.equalsIgnoreCase(
774                                    name, WebKeys.PORTLET_RENDER_PARAMETERS) ||
775                            StringUtil.equalsIgnoreCase(name, "j_password") ||
776                            StringUtil.equalsIgnoreCase(name, "LAYOUT_CONTENT") ||
777                            StringUtil.equalsIgnoreCase(name, "LAYOUTS") ||
778                            StringUtil.equalsIgnoreCase(name, "USER_PASSWORD") ||
779                            name.startsWith("javax.") || name.startsWith("liferay-ui:")) {
780    
781                            return false;
782                    }
783                    else {
784                            return true;
785                    }
786            }
787    
788            private static boolean _isValidAttributeValue(Object obj) {
789                    if (obj == null) {
790                            return false;
791                    }
792                    else if (obj instanceof Collection<?>) {
793                            Collection<?> col = (Collection<?>)obj;
794    
795                            return !col.isEmpty();
796                    }
797                    else if (obj instanceof Map<?, ?>) {
798                            Map<?, ?> map = (Map<?, ?>)obj;
799    
800                            return !map.isEmpty();
801                    }
802                    else {
803                            String objString = String.valueOf(obj);
804    
805                            if (Validator.isNull(objString)) {
806                                    return false;
807                            }
808    
809                            String hashCode = StringPool.AT.concat(
810                                    StringUtil.toHexString(obj.hashCode()));
811    
812                            if (objString.endsWith(hashCode)) {
813                                    return false;
814                            }
815    
816                            return true;
817                    }
818            }
819    
820            private static final Log _log = LogFactoryUtil.getLog(
821                    PortletRequestModel.class);
822    
823            private final String _actionURL;
824            private Map<String, Object> _applicationScopeSessionAttributes;
825            private Map<String, Object> _attributes;
826            private final String _authType;
827            private final String _containerNamespace;
828            private final String _contentType;
829            private final String _contextPath;
830            private final String _lifecycle;
831            private final Locale _locale;
832            private final Map<String, String[]> _parameters;
833            private final PortletMode _portletMode;
834            private final String _portletNamespace;
835            private Map<String, Object> _portletScopeSessioAttributes;
836            private final String _portletSessionId;
837            private final String _remoteUser;
838            private final String _renderURL;
839            private final String _renderURLExclusive;
840            private final String _renderURLMaximized;
841            private final String _renderURLMinimized;
842            private final String _renderURLNormal;
843            private final String _renderURLPopUp;
844            private final String _resourceURL;
845            private final String _scheme;
846            private final boolean _secure;
847            private final String _serverName;
848            private final int _serverPort;
849            private final ThemeDisplayModel _themeDisplayModel;
850            private final WindowState _windowState;
851    
852    }