com.liferay.portlet.PortletRequestImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portlet.PortletRequestImpl.java

Source

/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portlet;

import com.liferay.portal.ccpp.PortalProfileFactory;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
import com.liferay.portal.kernel.portlet.LiferayPortletSession;
import com.liferay.portal.kernel.portlet.LiferayWindowState;
import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
import com.liferay.portal.kernel.servlet.ProtectedPrincipal;
import com.liferay.portal.kernel.servlet.ServletContextPool;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.ContextPathUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.JavaConstants;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.xml.QName;
import com.liferay.portal.model.Portlet;
import com.liferay.portal.model.PortletApp;
import com.liferay.portal.model.PortletConstants;
import com.liferay.portal.model.PublicRenderParameter;
import com.liferay.portal.model.User;
import com.liferay.portal.service.RoleLocalServiceUtil;
import com.liferay.portal.servlet.NamespaceServletRequest;
import com.liferay.portal.servlet.SharedSessionServletRequest;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portal.util.WebKeys;
import com.liferay.portlet.portletconfiguration.util.PublicRenderParameterConfiguration;
import com.liferay.util.servlet.DynamicServletRequest;

import java.lang.reflect.Method;

import java.security.Principal;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.ccpp.Profile;

import javax.portlet.PortalContext;
import javax.portlet.PortletConfig;
import javax.portlet.PortletContext;
import javax.portlet.PortletMode;
import javax.portlet.PortletPreferences;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.PortletSession;
import javax.portlet.WindowState;

import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * @author Brian Wing Shun Chan
 * @author Brian Myunghun Kim
 * @author Sergey Ponomarev
 */
public abstract class PortletRequestImpl implements LiferayPortletRequest {

    public static PortletRequestImpl getPortletRequestImpl(PortletRequest portletRequest) {

        PortletRequestImpl portletRequestImpl = null;

        if (portletRequest instanceof PortletRequestImpl) {
            portletRequestImpl = (PortletRequestImpl) portletRequest;
        } else {

            // LPS-3311

            try {
                Method method = portletRequest.getClass().getMethod("getRequest");

                Object obj = method.invoke(portletRequest, (Object[]) null);

                portletRequestImpl = getPortletRequestImpl((PortletRequest) obj);
            } catch (Exception e) {
                throw new RuntimeException(
                        "Unable to get the portlet request from " + portletRequest.getClass().getName());
            }
        }

        return portletRequestImpl;
    }

    public void cleanUp() {
        _request.removeAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);
        _request.removeAttribute(JavaConstants.JAVAX_PORTLET_REQUEST);
        _request.removeAttribute(JavaConstants.JAVAX_PORTLET_RESPONSE);
        _request.removeAttribute(PortletRequest.LIFECYCLE_PHASE);
    }

    public void defineObjects(PortletConfig portletConfig, PortletResponse portletResponse) {

        PortletConfigImpl portletConfigImpl = (PortletConfigImpl) portletConfig;

        setAttribute(WebKeys.PORTLET_ID, portletConfigImpl.getPortletId());
        setAttribute(JavaConstants.JAVAX_PORTLET_CONFIG, portletConfig);
        setAttribute(JavaConstants.JAVAX_PORTLET_REQUEST, this);
        setAttribute(JavaConstants.JAVAX_PORTLET_RESPONSE, portletResponse);
        setAttribute(PortletRequest.LIFECYCLE_PHASE, getLifecycle());
    }

    public Object getAttribute(String name) {
        if (name == null) {
            throw new IllegalArgumentException();
        }

        if (name.equals(PortletRequest.CCPP_PROFILE)) {
            return getCCPPProfile();
        } else if (name.equals(PortletRequest.USER_INFO)) {
            Object value = getUserInfo();

            if (value != null) {
                return value;
            }
        }

        return _request.getAttribute(name);
    }

    public Enumeration<String> getAttributeNames() {
        List<String> names = new ArrayList<String>();

        Enumeration<String> enu = _request.getAttributeNames();

        while (enu.hasMoreElements()) {
            String name = enu.nextElement();

            if (!name.equals(JavaConstants.JAVAX_SERVLET_INCLUDE_PATH_INFO)) {
                names.add(name);
            }
        }

        return Collections.enumeration(names);
    }

    public String getAuthType() {
        return _request.getAuthType();
    }

    public Profile getCCPPProfile() {
        if (_profile == null) {
            _profile = PortalProfileFactory.getCCPPProfile(_request);
        }

        return _profile;
    }

    public String getContextPath() {
        PortletContextImpl portletContextImpl = (PortletContextImpl) _portletContext;

        ServletContext servletContext = portletContextImpl.getServletContext();

        String servletContextName = servletContext.getServletContextName();

        if (ServletContextPool.containsKey(servletContextName)) {
            servletContext = ServletContextPool.get(servletContextName);

            return ContextPathUtil.getContextPath(servletContext);
        }

        return StringPool.SLASH.concat(_portletContext.getPortletContextName());
    }

    public Cookie[] getCookies() {
        return _request.getCookies();
    }

    public String getETag() {
        return null;
    }

    public HttpServletRequest getHttpServletRequest() {
        return _request;
    }

    public abstract String getLifecycle();

    public Locale getLocale() {
        Locale locale = _locale;

        if (locale == null) {
            locale = _request.getLocale();
        }

        if (locale == null) {
            locale = LocaleUtil.getDefault();
        }

        return locale;
    }

    public Enumeration<Locale> getLocales() {
        return _request.getLocales();
    }

    public String getMethod() {
        return _request.getMethod();
    }

    public HttpServletRequest getOriginalHttpServletRequest() {
        return _originalRequest;
    }

    public String getParameter(String name) {
        if (name == null) {
            throw new IllegalArgumentException();
        }

        if (_portletRequestDispatcherRequest != null) {
            return _portletRequestDispatcherRequest.getParameter(name);
        }

        return _request.getParameter(name);
    }

    public Map<String, String[]> getParameterMap() {
        if (_portletRequestDispatcherRequest != null) {
            return Collections.unmodifiableMap(_portletRequestDispatcherRequest.getParameterMap());
        }

        return Collections.unmodifiableMap(_request.getParameterMap());
    }

    public Enumeration<String> getParameterNames() {
        if (_portletRequestDispatcherRequest != null) {
            return _portletRequestDispatcherRequest.getParameterNames();
        }

        return _request.getParameterNames();
    }

    public String[] getParameterValues(String name) {
        if (name == null) {
            throw new IllegalArgumentException();
        }

        if (_portletRequestDispatcherRequest != null) {
            return _portletRequestDispatcherRequest.getParameterValues(name);
        }

        return _request.getParameterValues(name);
    }

    public PortalContext getPortalContext() {
        return _portalContext;
    }

    public Portlet getPortlet() {
        return _portlet;
    }

    public PortletContext getPortletContext() {
        return _portletContext;
    }

    public PortletMode getPortletMode() {
        return _portletMode;
    }

    public String getPortletName() {
        return _portletName;
    }

    public PortletSession getPortletSession() {
        return _session;
    }

    public PortletSession getPortletSession(boolean create) {
        /*HttpSession httpSes = _req.getSession(create);
            
        if (httpSes == null) {
           return null;
        }
        else {
           if (create) {
        _session = new PortletSessionImpl(
           _req, _portletName, _portletContext, _portalSessionId,
           _plid);
           }
            
           return _ses;
        }*/

        /*if ((_session == null) && create) {
           _req.getSession(create);
            
           _session = new PortletSessionImpl(
        _req, _portletName, _portletContext, _portalSessionId, _plid);
        }*/

        if (!create && _invalidSession) {
            return null;
        }

        return _session;
    }

    public PortletPreferences getPreferences() {
        return new PortletPreferencesWrapper(getPreferencesImpl(), getLifecycle());
    }

    public PortletPreferencesImpl getPreferencesImpl() {
        return (PortletPreferencesImpl) _preferences;
    }

    public Map<String, String[]> getPrivateParameterMap() {
        Map<String, String[]> parameterMap = new HashMap<String, String[]>();

        Enumeration<String> enu = getParameterNames();

        while (enu.hasMoreElements()) {
            String name = enu.nextElement();

            if (_portlet.getPublicRenderParameter(name) == null) {
                parameterMap.put(name, getParameterValues(name));
            }
        }

        return parameterMap;
    }

    public Enumeration<String> getProperties(String name) {
        List<String> values = new ArrayList<String>();

        String value = _portalContext.getProperty(name);

        if (value != null) {
            values.add(value);
        }

        return Collections.enumeration(values);
    }

    public String getProperty(String name) {
        return _portalContext.getProperty(name);
    }

    public Enumeration<String> getPropertyNames() {
        return _portalContext.getPropertyNames();
    }

    public Map<String, String[]> getPublicParameterMap() {
        Map<String, String[]> parameterMap = new HashMap<String, String[]>();

        Enumeration<String> enu = getParameterNames();

        while (enu.hasMoreElements()) {
            String name = enu.nextElement();

            if (_portlet.getPublicRenderParameter(name) != null) {
                parameterMap.put(name, getParameterValues(name));
            }
        }

        return parameterMap;
    }

    public String getRemoteUser() {
        return _remoteUser;
    }

    public Map<String, String[]> getRenderParameters() {
        return RenderParametersPool.get(_request, _plid, _portletName);
    }

    public String getRequestedSessionId() {
        if (_session != null) {
            return _session.getId();
        } else {
            HttpSession session = _request.getSession(false);

            if (session == null) {
                return StringPool.BLANK;
            } else {
                return session.getId();
            }
        }
    }

    public String getResponseContentType() {
        if (_wapTheme) {
            return ContentTypes.XHTML_MP;
        } else {
            return ContentTypes.TEXT_HTML;
        }
    }

    public Enumeration<String> getResponseContentTypes() {
        List<String> responseContentTypes = new ArrayList<String>();

        responseContentTypes.add(getResponseContentType());

        return Collections.enumeration(responseContentTypes);
    }

    public String getScheme() {
        return _request.getScheme();
    }

    public String getServerName() {
        return _request.getServerName();
    }

    public int getServerPort() {
        return _request.getServerPort();
    }

    public LinkedHashMap<String, String> getUserInfo() {
        return UserInfoFactory.getUserInfo(_remoteUserId, _portlet);
    }

    public Principal getUserPrincipal() {
        return _userPrincipal;
    }

    public String getWindowID() {
        return _portletName.concat(LiferayPortletSession.LAYOUT_SEPARATOR).concat(String.valueOf(_plid));
    }

    public WindowState getWindowState() {
        return _windowState;
    }

    public void invalidateSession() {
        _invalidSession = true;
    }

    public boolean isInvalidParameter(String name) {
        if (Validator.isNull(name) || name.startsWith(PortletQName.PUBLIC_RENDER_PARAMETER_NAMESPACE)
                || name.startsWith(PortletQName.REMOVE_PUBLIC_RENDER_PARAMETER_NAMESPACE)
                || PortalUtil.isReservedParameter(name)) {

            return true;
        } else {
            return false;
        }
    }

    public boolean isPortletModeAllowed(PortletMode portletMode) {
        if ((portletMode == null) || Validator.isNull(portletMode.toString())) {
            return true;
        } else {
            return _portlet.hasPortletMode(getResponseContentType(), portletMode);
        }
    }

    public boolean isPrivateRequestAttributes() {
        return _portlet.isPrivateRequestAttributes();
    }

    public boolean isRequestedSessionIdValid() {
        if (_session != null) {
            return _session.isValid();
        } else {
            return _request.isRequestedSessionIdValid();
        }
    }

    public boolean isSecure() {
        return _request.isSecure();
    }

    public boolean isUserInRole(String role) {
        if (_remoteUserId <= 0) {
            return false;
        } else {
            try {
                long companyId = PortalUtil.getCompanyId(_request);

                String roleLink = _portlet.getRoleMappers().get(role);

                if (Validator.isNotNull(roleLink)) {
                    return RoleLocalServiceUtil.hasUserRole(_remoteUserId, companyId, roleLink, true);
                } else {
                    return RoleLocalServiceUtil.hasUserRole(_remoteUserId, companyId, role, true);
                }
            } catch (Exception e) {
                _log.error(e);
            }

            return _request.isUserInRole(role);
        }
    }

    public boolean isWindowStateAllowed(WindowState windowState) {
        return PortalContextImpl.isSupportedWindowState(windowState);
    }

    public void removeAttribute(String name) {
        if (name == null) {
            throw new IllegalArgumentException();
        }

        _request.removeAttribute(name);
    }

    public void setAttribute(String name, Object obj) {
        if (name == null) {
            throw new IllegalArgumentException();
        }

        if (obj == null) {
            removeAttribute(name);
        } else {
            _request.setAttribute(name, obj);
        }
    }

    public void setPortletMode(PortletMode portletMode) {
        _portletMode = portletMode;
    }

    public void setPortletRequestDispatcherRequest(HttpServletRequest request) {
        _portletRequestDispatcherRequest = request;
    }

    public void setWindowState(WindowState windowState) {
        _windowState = windowState;
    }

    public boolean isTriggeredByActionURL() {
        return _triggeredByActionURL;
    }

    protected void init(HttpServletRequest request, Portlet portlet, InvokerPortlet invokerPortlet,
            PortletContext portletContext, WindowState windowState, PortletMode portletMode,
            PortletPreferences preferences, long plid) {

        ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);

        _portlet = portlet;
        _portletName = portlet.getPortletId();
        _publicRenderParameters = PublicRenderParametersPool.get(request, plid);

        String portletNamespace = PortalUtil.getPortletNamespace(_portletName);

        boolean portalSessionShared = false;

        PortletApp portletApp = portlet.getPortletApp();

        if (portletApp.isWARFile() && !portlet.isPrivateSessionAttributes()) {
            portalSessionShared = true;
        }

        request = new SharedSessionServletRequest(request, portalSessionShared);

        DynamicServletRequest dynamicRequest = null;

        if (portlet.isPrivateRequestAttributes()) {
            dynamicRequest = new NamespaceServletRequest(request, portletNamespace, portletNamespace, false);
        } else {
            dynamicRequest = new DynamicServletRequest(request, false);
        }

        boolean portletFocus = false;

        String ppid = ParamUtil.getString(request, "p_p_id");

        boolean windowStateRestoreCurrentView = ParamUtil.getBoolean(request, "p_p_state_rcv");

        if (_portletName.equals(ppid) && !(windowStateRestoreCurrentView && portlet.isRestoreCurrentView())) {

            // Request was targeted to this portlet

            if (themeDisplay.isLifecycleRender() || themeDisplay.isLifecycleResource()) {

                // Request was triggered by a render or resource URL

                portletFocus = true;
            } else if (themeDisplay.isLifecycleAction()) {
                _triggeredByActionURL = true;

                if (getLifecycle().equals(PortletRequest.ACTION_PHASE)) {

                    // Request was triggered by an action URL and is being
                    // processed by com.liferay.portlet.ActionRequestImpl

                    portletFocus = true;
                }
            }
        }

        Map<String, String[]> renderParameters = RenderParametersPool.get(request, plid, _portletName);

        if (portletFocus) {
            renderParameters = new HashMap<String, String[]>();

            if (getLifecycle().equals(PortletRequest.RENDER_PHASE) && !LiferayWindowState.isExclusive(request)
                    && !LiferayWindowState.isPopUp(request)) {

                RenderParametersPool.put(request, plid, _portletName, renderParameters);
            }

            Map<String, String[]> parameters = request.getParameterMap();

            for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
                String name = entry.getKey();

                if (isInvalidParameter(name)) {
                    continue;
                }

                String[] values = entry.getValue();

                if (themeDisplay.isLifecycleRender()) {
                    renderParameters.put(name, values);
                }

                if (values == null) {
                    continue;
                }

                name = removePortletNamespace(invokerPortlet, portletNamespace, name);

                dynamicRequest.setParameterValues(name, values);
            }
        } else {
            for (Map.Entry<String, String[]> entry : renderParameters.entrySet()) {

                String name = entry.getKey();
                String[] values = entry.getValue();

                name = removePortletNamespace(invokerPortlet, portletNamespace, name);

                dynamicRequest.setParameterValues(name, values);
            }
        }

        mergePublicRenderParameters(dynamicRequest, preferences, plid);

        _request = dynamicRequest;
        _originalRequest = request;
        _wapTheme = BrowserSnifferUtil.isWap(_request);
        _portlet = portlet;
        _portalContext = new PortalContextImpl();
        _portletContext = portletContext;
        _windowState = windowState;
        _portletMode = portletMode;
        _preferences = preferences;
        _portalSessionId = _request.getRequestedSessionId();
        _session = new PortletSessionImpl(_request, _portletName, _portletContext, _portalSessionId, plid);

        String remoteUser = request.getRemoteUser();

        String userPrincipalStrategy = portlet.getUserPrincipalStrategy();

        if (userPrincipalStrategy.equals(PortletConstants.USER_PRINCIPAL_STRATEGY_SCREEN_NAME)) {

            try {
                User user = PortalUtil.getUser(request);

                if (user != null) {
                    _remoteUser = user.getScreenName();
                    _remoteUserId = user.getUserId();
                    _userPrincipal = new ProtectedPrincipal(_remoteUser);
                }
            } catch (Exception e) {
                _log.error(e);
            }
        } else {
            long userId = PortalUtil.getUserId(request);

            if ((userId > 0) && (remoteUser == null)) {
                _remoteUser = String.valueOf(userId);
                _remoteUserId = userId;
                _userPrincipal = new ProtectedPrincipal(_remoteUser);
            } else {
                _remoteUser = remoteUser;
                _remoteUserId = GetterUtil.getLong(remoteUser);
                _userPrincipal = request.getUserPrincipal();
            }
        }

        _locale = themeDisplay.getLocale();
        _plid = plid;
    }

    protected void mergePublicRenderParameters(DynamicServletRequest dynamicRequest, PortletPreferences preferences,
            long plid) {

        Enumeration<PublicRenderParameter> publicRenderParameters = Collections
                .enumeration(_portlet.getPublicRenderParameters());

        while (publicRenderParameters.hasMoreElements()) {
            PublicRenderParameter publicRenderParameter = publicRenderParameters.nextElement();

            String ignoreKey = PublicRenderParameterConfiguration.getIgnoreKey(publicRenderParameter);

            boolean ignoreValue = GetterUtil.getBoolean(preferences.getValue(ignoreKey, null));

            if (ignoreValue) {
                continue;
            }

            String mappingKey = PublicRenderParameterConfiguration.getMappingKey(publicRenderParameter);

            String mappingValue = GetterUtil.getString(preferences.getValue(mappingKey, null));

            HttpServletRequest request = (HttpServletRequest) dynamicRequest.getRequest();

            String[] newValues = request.getParameterValues(mappingValue);

            if ((newValues != null) && (newValues.length != 0)) {
                newValues = ArrayUtil.remove(newValues, StringPool.NULL);
            }

            String name = publicRenderParameter.getIdentifier();

            if ((newValues == null) || (newValues.length == 0)) {
                QName qName = publicRenderParameter.getQName();

                String[] values = _publicRenderParameters.get(PortletQNameUtil.getPublicRenderParameterName(qName));

                if ((values) == null || (values.length == 0) || (Validator.isNull(values[0]))) {

                    continue;
                }

                if (dynamicRequest.getParameter(name) == null) {
                    dynamicRequest.setParameterValues(name, values);
                }
            } else {
                dynamicRequest.setParameterValues(name, newValues);
            }
        }
    }

    protected String removePortletNamespace(InvokerPortlet invokerPortlet, String portletNamespace, String name) {

        if (name.startsWith(portletNamespace) && !invokerPortlet.isFacesPortlet()) {

            name = name.substring(portletNamespace.length());
        }

        return name;
    }

    private static Log _log = LogFactoryUtil.getLog(PortletRequestImpl.class);

    private HttpServletRequest _request;
    private HttpServletRequest _originalRequest;
    private HttpServletRequest _portletRequestDispatcherRequest;
    private boolean _wapTheme;
    private Portlet _portlet;
    private String _portletName;
    private PortalContext _portalContext;
    private PortletContext _portletContext;
    private WindowState _windowState;
    private PortletMode _portletMode;
    private PortletPreferences _preferences;
    private PortletSessionImpl _session;
    private String _portalSessionId;
    private boolean _invalidSession;
    private String _remoteUser;
    private long _remoteUserId;
    private Principal _userPrincipal;
    private Profile _profile;
    private Locale _locale;
    private long _plid;
    private Map<String, String[]> _publicRenderParameters;
    private boolean _triggeredByActionURL;

}