com.liferay.wsrp.consumer.portlet.ConsumerPortlet.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.wsrp.consumer.portlet.ConsumerPortlet.java

Source

/**
 * Copyright (c) 2000-present 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.wsrp.consumer.portlet;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
import com.liferay.portal.kernel.portlet.LiferayPortletURL;
import com.liferay.portal.kernel.portlet.PortletResponseUtil;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.Base64;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.Http;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.StreamUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.TransientValue;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
import com.liferay.portal.model.Address;
import com.liferay.portal.model.Company;
import com.liferay.portal.model.EmailAddress;
import com.liferay.portal.model.ListType;
import com.liferay.portal.model.Phone;
import com.liferay.portal.model.User;
import com.liferay.portal.model.Website;
import com.liferay.portal.security.auth.AuthTokenUtil;
import com.liferay.portal.service.AddressLocalServiceUtil;
import com.liferay.portal.service.EmailAddressLocalServiceUtil;
import com.liferay.portal.service.ListTypeServiceUtil;
import com.liferay.portal.service.PhoneLocalServiceUtil;
import com.liferay.portal.service.WebsiteLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.Encryptor;
import com.liferay.wsrp.axis.WSRPHTTPSender;
import com.liferay.wsrp.model.WSRPConsumer;
import com.liferay.wsrp.model.WSRPConsumerPortlet;
import com.liferay.wsrp.proxy.Stub;
import com.liferay.wsrp.service.WSRPConsumerLocalServiceUtil;
import com.liferay.wsrp.service.WSRPConsumerPortletLocalServiceUtil;
import com.liferay.wsrp.servlet.ServiceHolder;
import com.liferay.wsrp.util.ConsumerRequestExtensionsHelper;
import com.liferay.wsrp.util.ExtensionHelperUtil;
import com.liferay.wsrp.util.MarkupCharacterSetsUtil;
import com.liferay.wsrp.util.PortletPropsValues;
import com.liferay.wsrp.util.WSRPConsumerManager;
import com.liferay.wsrp.util.WSRPConsumerManagerFactory;
import com.liferay.wsrp.util.WebKeys;

import java.io.IOException;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.EventRequest;
import javax.portlet.EventResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletConfig;
import javax.portlet.PortletException;
import javax.portlet.PortletMode;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.StateAwareResponse;
import javax.portlet.WindowState;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.xml.namespace.QName;

import oasis.names.tc.wsrp.v2.intf.WSRP_v2_Markup_PortType;
import oasis.names.tc.wsrp.v2.types.BlockingInteractionResponse;
import oasis.names.tc.wsrp.v2.types.CacheControl;
import oasis.names.tc.wsrp.v2.types.ClientData;
import oasis.names.tc.wsrp.v2.types.Contact;
import oasis.names.tc.wsrp.v2.types.CookieProtocol;
import oasis.names.tc.wsrp.v2.types.Event;
import oasis.names.tc.wsrp.v2.types.EventParams;
import oasis.names.tc.wsrp.v2.types.GetMarkup;
import oasis.names.tc.wsrp.v2.types.GetResource;
import oasis.names.tc.wsrp.v2.types.HandleEvents;
import oasis.names.tc.wsrp.v2.types.HandleEventsResponse;
import oasis.names.tc.wsrp.v2.types.InitCookie;
import oasis.names.tc.wsrp.v2.types.InteractionParams;
import oasis.names.tc.wsrp.v2.types.InvalidCookieFault;
import oasis.names.tc.wsrp.v2.types.MarkupContext;
import oasis.names.tc.wsrp.v2.types.MarkupParams;
import oasis.names.tc.wsrp.v2.types.MarkupResponse;
import oasis.names.tc.wsrp.v2.types.MimeRequest;
import oasis.names.tc.wsrp.v2.types.MimeResponse;
import oasis.names.tc.wsrp.v2.types.NamedString;
import oasis.names.tc.wsrp.v2.types.NavigationalContext;
import oasis.names.tc.wsrp.v2.types.Online;
import oasis.names.tc.wsrp.v2.types.PerformBlockingInteraction;
import oasis.names.tc.wsrp.v2.types.PersonName;
import oasis.names.tc.wsrp.v2.types.PortletContext;
import oasis.names.tc.wsrp.v2.types.PortletDescription;
import oasis.names.tc.wsrp.v2.types.Postal;
import oasis.names.tc.wsrp.v2.types.RegistrationContext;
import oasis.names.tc.wsrp.v2.types.ResourceContext;
import oasis.names.tc.wsrp.v2.types.ResourceParams;
import oasis.names.tc.wsrp.v2.types.RuntimeContext;
import oasis.names.tc.wsrp.v2.types.ServiceDescription;
import oasis.names.tc.wsrp.v2.types.SessionContext;
import oasis.names.tc.wsrp.v2.types.SessionParams;
import oasis.names.tc.wsrp.v2.types.StateChange;
import oasis.names.tc.wsrp.v2.types.Telecom;
import oasis.names.tc.wsrp.v2.types.TelephoneNum;
import oasis.names.tc.wsrp.v2.types.Templates;
import oasis.names.tc.wsrp.v2.types.UpdateResponse;
import oasis.names.tc.wsrp.v2.types.UploadContext;
import oasis.names.tc.wsrp.v2.types.UserContext;
import oasis.names.tc.wsrp.v2.types.UserProfile;

import org.apache.axis.message.MessageElement;

/**
 * @author Brian Wing Shun Chan
 * @author Michael Young
 */
public class ConsumerPortlet extends GenericPortlet {

    public static final String PORTLET_NAME_PREFIX = "WSRP_";

    @Override
    public void processAction(ActionRequest actionRequest, ActionResponse actionResponse)
            throws IOException, PortletException {

        try {
            doProcessAction(actionRequest, actionResponse);
        } catch (IOException ioe) {
            throw ioe;
        } catch (PortletException pe) {
            throw pe;
        } catch (Exception e) {
            throw new PortletException(e);
        }
    }

    @Override
    public void processEvent(EventRequest eventRequest, EventResponse eventResponse)
            throws IOException, PortletException {

        try {
            doProcessEvent(eventRequest, eventResponse);
        } catch (IOException ioe) {
            throw ioe;
        } catch (PortletException pe) {
            throw pe;
        } catch (Exception e) {
            throw new PortletException(e);
        }
    }

    @Override
    public void render(RenderRequest renderRequest, RenderResponse renderResponse)
            throws IOException, PortletException {

        try {
            doRender(renderRequest, renderResponse);
        } catch (IOException ioe) {
            throw ioe;
        } catch (PortletException pe) {
            throw pe;
        } catch (Exception e) {
            throw new PortletException(e);
        }
    }

    @Override
    public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse)
            throws IOException, PortletException {

        try {
            doServeResource(resourceRequest, resourceResponse);
        } catch (IOException ioe) {
            throw ioe;
        } catch (PortletException pe) {
            throw pe;
        } catch (Exception e) {
            throw new PortletException(e);
        }
    }

    protected void addFormField(List<NamedString> formParameters, String name, String[] values) {

        for (String value : values) {
            NamedString formParameter = new NamedString();

            formParameter.setName(name);
            formParameter.setValue(value);

            formParameters.add(formParameter);
        }
    }

    protected boolean authorize(ResourceRequest resourceRequest, ResourceResponse resourceResponse)
            throws Exception {

        HttpServletRequest request = PortalUtil.getHttpServletRequest(resourceRequest);
        HttpServletResponse response = PortalUtil.getHttpServletResponse(resourceResponse);

        String resourceID = GetterUtil.getString(resourceRequest.getResourceID());

        String url = GetterUtil.getString(resourceRequest.getParameter("wsrp-url"));
        String wsrpAuth = GetterUtil.getString(resourceRequest.getParameter("wsrp-auth"));

        StringBundler sb = new StringBundler(4);

        sb.append(resourceID);
        sb.append(url);
        sb.append(PortletPropsValues.SECURE_RESOURCE_URLS_SALT);

        String expectedWsrpAuth = encodeWSRPAuth(resourceRequest, sb.toString());

        if (wsrpAuth.equals(expectedWsrpAuth)) {
            return true;
        }

        sb.append(AuthTokenUtil.getToken(request));

        expectedWsrpAuth = encodeWSRPAuth(resourceRequest, sb.toString());

        if (wsrpAuth.equals(expectedWsrpAuth)) {
            return true;
        }

        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

        return false;
    }

    protected void doProcessAction(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {

        WSRPConsumerPortlet wsrpConsumerPortlet = getWSRPConsumerPortlet();

        WSRPConsumer wsrpConsumer = WSRPConsumerLocalServiceUtil
                .getWSRPConsumer(wsrpConsumerPortlet.getWsrpConsumerId());

        WSRPConsumerManager wsrpConsumerManager = WSRPConsumerManagerFactory.getWSRPConsumerManager(wsrpConsumer);

        InteractionParams interactionParams = new InteractionParams();
        MarkupParams markupParams = new MarkupParams();
        PortletContext portletContext = new PortletContext();
        RuntimeContext runtimeContext = new RuntimeContext();
        UserContext userContext = new UserContext();

        initContexts(actionRequest, actionResponse, wsrpConsumer, wsrpConsumerPortlet, wsrpConsumerManager,
                interactionParams, markupParams, portletContext, runtimeContext, userContext);

        PerformBlockingInteraction performBlockingInteraction = new PerformBlockingInteraction();

        performBlockingInteraction.setInteractionParams(interactionParams);
        performBlockingInteraction.setMarkupParams(markupParams);
        performBlockingInteraction.setPortletContext(portletContext);
        performBlockingInteraction.setRegistrationContext(wsrpConsumer.getRegistrationContext());
        performBlockingInteraction.setRuntimeContext(runtimeContext);
        performBlockingInteraction.setUserContext(userContext);

        ServiceHolder serviceHolder = getServiceHolder(actionRequest, wsrpConsumerManager, wsrpConsumer);

        WSRP_v2_Markup_PortType markupService = serviceHolder.getMarkupService();

        BlockingInteractionResponse blockingInteractionResponse = markupService
                .performBlockingInteraction(performBlockingInteraction);

        processBlockingInteractionResponse(actionRequest, actionResponse, wsrpConsumerManager, serviceHolder,
                blockingInteractionResponse);
    }

    protected void doProcessEvent(EventRequest eventRequest, EventResponse eventResponse) throws Exception {

        WSRPConsumerPortlet wsrpConsumerPortlet = getWSRPConsumerPortlet();

        WSRPConsumer wsrpConsumer = WSRPConsumerLocalServiceUtil
                .getWSRPConsumer(wsrpConsumerPortlet.getWsrpConsumerId());

        WSRPConsumerManager wsrpConsumerManager = WSRPConsumerManagerFactory.getWSRPConsumerManager(wsrpConsumer);

        EventParams eventParams = new EventParams();
        MarkupParams markupParams = new MarkupParams();
        PortletContext portletContext = new PortletContext();
        RuntimeContext runtimeContext = new RuntimeContext();
        UserContext userContext = new UserContext();

        initContexts(eventRequest, eventResponse, wsrpConsumer, wsrpConsumerPortlet, wsrpConsumerManager,
                eventParams, markupParams, portletContext, runtimeContext, userContext);

        HandleEvents handleEvents = new HandleEvents();

        handleEvents.setEventParams(eventParams);
        handleEvents.setMarkupParams(markupParams);
        handleEvents.setPortletContext(portletContext);
        handleEvents.setRegistrationContext(wsrpConsumer.getRegistrationContext());
        handleEvents.setRuntimeContext(runtimeContext);
        handleEvents.setUserContext(userContext);

        ServiceHolder serviceHolder = getServiceHolder(eventRequest, wsrpConsumerManager, wsrpConsumer);

        WSRP_v2_Markup_PortType markupService = serviceHolder.getMarkupService();

        HandleEventsResponse handleEventsResponse = markupService.handleEvents(handleEvents);

        processHandleEventsResponse(eventRequest, eventResponse, wsrpConsumerManager, serviceHolder,
                handleEventsResponse);
    }

    protected void doRender(RenderRequest renderRequest, RenderResponse renderResponse) throws Exception {

        PortletSession portletSession = renderRequest.getPortletSession();

        MarkupContext markupContext = (MarkupContext) portletSession.getAttribute(WebKeys.MARKUP_CONTEXT);

        if (markupContext != null) {
            portletSession.removeAttribute(WebKeys.MARKUP_CONTEXT);
        } else {
            MarkupResponse markupResponse = getMarkupResponse(renderRequest, renderResponse);

            markupContext = markupResponse.getMarkupContext();
        }

        processMimeResponse(renderRequest, renderResponse, markupContext);
    }

    protected void doServeResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse)
            throws Exception {

        if (PortletPropsValues.SECURE_RESOURCE_URLS_ENABLED) {
            if (!authorize(resourceRequest, resourceResponse)) {
                return;
            }
        }

        String resourceID = resourceRequest.getResourceID();

        String url = ParamUtil.getString(resourceRequest, "wsrp-url");
        boolean preferOperation = ParamUtil.getBoolean(resourceRequest, "wsrp-preferOperation");

        if (Validator.isNotNull(resourceID) && Validator.isNotNull(url) && preferOperation) {

            getResource(resourceRequest, resourceResponse);
        } else if (Validator.isNotNull(url)) {
            proxyURL(resourceRequest, resourceResponse, url);
        } else if (Validator.isNotNull(resourceID)) {
            getResource(resourceRequest, resourceResponse);
        }
    }

    protected String encodeWSRPAuth(PortletRequest portletRequest, String wsrpAuth) throws Exception {

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

        Company company = themeDisplay.getCompany();

        wsrpAuth = String.valueOf(wsrpAuth.hashCode());
        wsrpAuth = Encryptor.encrypt(company.getKeyObj(), wsrpAuth);
        wsrpAuth = Base64.toURLSafe(wsrpAuth);

        return wsrpAuth;
    }

    protected Calendar getBdate(User user) throws Exception {
        Calendar birthday = Calendar.getInstance();

        birthday.setTime(user.getBirthday());

        return birthday;
    }

    protected String getCharSet(String contentType) {
        if (Validator.isNotNull(contentType)) {
            int x = contentType.lastIndexOf("charset=");

            if (x >= 0) {
                return contentType.substring(x + 8).trim();
            }
        }

        return StringPool.UTF8;
    }

    protected Contact getContact(User user, String listTypeName) throws Exception {

        Contact contact = new Contact();

        Postal postal = getPostal(user, listTypeName);

        if (postal != null) {
            contact.setPostal(postal);
        }

        Online online = getOnline(user, listTypeName);

        contact.setOnline(online);

        Telecom telecom = getTelecom(user, listTypeName);

        contact.setTelecom(telecom);

        return contact;
    }

    protected String getGender(User user) throws Exception {
        if (user.isMale()) {
            return "M";
        } else {
            return "F";
        }
    }

    protected MarkupResponse getMarkupResponse(PortletRequest portletRequest, PortletResponse portletResponse)
            throws Exception {

        PortletSession portletSession = portletRequest.getPortletSession();

        WSRPConsumerPortlet wsrpConsumerPortlet = getWSRPConsumerPortlet();

        WSRPConsumer wsrpConsumer = WSRPConsumerLocalServiceUtil
                .getWSRPConsumer(wsrpConsumerPortlet.getWsrpConsumerId());

        WSRPConsumerManager wsrpConsumerManager = WSRPConsumerManagerFactory.getWSRPConsumerManager(wsrpConsumer);

        MarkupParams markupParams = new MarkupParams();
        PortletContext portletContext = new PortletContext();
        RuntimeContext runtimeContext = new RuntimeContext();
        UserContext userContext = new UserContext();

        initContexts(portletRequest, portletResponse, wsrpConsumer, wsrpConsumerPortlet, wsrpConsumerManager,
                markupParams, portletContext, runtimeContext, userContext);

        GetMarkup getMarkup = new GetMarkup();

        getMarkup.setMarkupParams(markupParams);

        PortletContext existingPortletContext = (PortletContext) portletSession
                .getAttribute(WebKeys.PORTLET_CONTEXT);

        if (existingPortletContext != null) {
            getMarkup.setPortletContext(existingPortletContext);
        } else {
            getMarkup.setPortletContext(portletContext);
        }

        getMarkup.setRegistrationContext(wsrpConsumer.getRegistrationContext());
        getMarkup.setRuntimeContext(runtimeContext);
        getMarkup.setUserContext(userContext);

        ServiceHolder serviceHolder = getServiceHolder(portletRequest, wsrpConsumerManager, wsrpConsumer);

        WSRP_v2_Markup_PortType markupService = serviceHolder.getMarkupService();

        MarkupResponse markupResponse = null;

        try {
            markupResponse = markupService.getMarkup(getMarkup);
        } catch (InvalidCookieFault icf) {
            InitCookie initCookie = new InitCookie();

            markupService.initCookie(initCookie);

            markupResponse = markupService.getMarkup(getMarkup);
        }

        // There is a memory leak in Axis that caches the entire response after
        // each call. See LPS-25067.

        Stub stub = (Stub) markupService;

        stub._createCall();

        processMarkupResponse(portletRequest, portletResponse, serviceHolder, markupResponse);

        return markupResponse;
    }

    protected Online getOnline(User user, String listTypeName) throws Exception {

        Online online = new Online();

        String email = getOnlineEmail(user, "E-mail");

        if (email != null) {
            online.setEmail(email);
        }

        String uri = getOnlineUri(user, listTypeName);

        if (uri != null) {
            online.setUri(uri);
        }

        return online;
    }

    protected String getOnlineEmail(User user, String listTypeName) throws Exception {

        List<EmailAddress> emailAddresses = EmailAddressLocalServiceUtil.getEmailAddresses(user.getCompanyId(),
                com.liferay.portal.model.Contact.class.getName(), user.getContactId());

        for (EmailAddress emailAddress : emailAddresses) {
            ListType listType = emailAddress.getType();

            if (!listTypeName.equals(listType.getName())) {
                continue;
            }

            return emailAddress.getAddress();
        }

        return user.getEmailAddress();
    }

    protected String getOnlineUri(User user, String listTypeName) throws Exception {

        List<Website> websites = WebsiteLocalServiceUtil.getWebsites(user.getCompanyId(),
                com.liferay.portal.model.Contact.class.getName(), user.getContactId());

        for (Website website : websites) {
            ListType listType = website.getType();

            if (!listTypeName.equals(listType.getName())) {
                continue;
            }

            return website.getUrl();
        }

        return null;
    }

    protected PersonName getPersonName(User user) throws Exception {
        PersonName personName = new PersonName();

        personName.setFamily(user.getLastName());
        personName.setGiven(user.getFirstName());
        personName.setMiddle(user.getMiddleName());
        personName.setNickname(user.getScreenName());

        com.liferay.portal.model.Contact contact = user.getContact();

        try {
            ListType listType = ListTypeServiceUtil.getListType(contact.getPrefixId());

            personName.setPrefix(listType.getName());
        } catch (Exception e) {
            if (_log.isDebugEnabled()) {
                _log.debug("Unable to retrieve name prefix", e);
            }
        }

        try {
            ListType listType = ListTypeServiceUtil.getListType(contact.getSuffixId());

            personName.setSuffix(listType.getName());
        } catch (Exception e) {
            if (_log.isDebugEnabled()) {
                _log.debug("Unable to retrieve name suffix", e);
            }
        }

        return personName;
    }

    protected PortletMode getPortletMode(String portletMode) {
        return new PortletMode(portletMode.substring(5));
    }

    protected Postal getPostal(User user, String listTypeName) throws Exception {

        List<Address> addresses = AddressLocalServiceUtil.getAddresses(user.getCompanyId(),
                com.liferay.portal.model.Contact.class.getName(), user.getContactId());

        for (Address address : addresses) {
            ListType listType = address.getType();

            if (!listTypeName.equals(listType.getName())) {
                continue;
            }

            Postal postal = new Postal();

            postal.setCity(address.getCity());
            postal.setCountry(address.getCountry().getName());
            postal.setName(address.getUserName());
            postal.setPostalcode(address.getZip());
            postal.setStateprov(address.getRegion().getName());

            String street = address.getStreet1() + address.getStreet2() + address.getStreet3();

            postal.setStreet(street);

            return postal;
        }

        return null;
    }

    protected void getResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse)
            throws Exception {

        PortletSession portletSession = resourceRequest.getPortletSession();

        WSRPConsumerPortlet wsrpConsumerPortlet = getWSRPConsumerPortlet();

        WSRPConsumer wsrpConsumer = WSRPConsumerLocalServiceUtil
                .getWSRPConsumer(wsrpConsumerPortlet.getWsrpConsumerId());

        WSRPConsumerManager wsrpConsumerManager = WSRPConsumerManagerFactory.getWSRPConsumerManager(wsrpConsumer);

        PortletContext portletContext = new PortletContext();
        ResourceParams resourceParams = new ResourceParams();
        RuntimeContext runtimeContext = new RuntimeContext();
        UserContext userContext = new UserContext();

        initContexts(resourceRequest, resourceResponse, wsrpConsumer, wsrpConsumerPortlet, wsrpConsumerManager,
                portletContext, resourceParams, runtimeContext, userContext);

        GetResource getResource = new GetResource();

        PortletContext existingPortletContext = (PortletContext) portletSession
                .getAttribute(WebKeys.PORTLET_CONTEXT);

        if (existingPortletContext != null) {
            getResource.setPortletContext(existingPortletContext);
        } else {
            getResource.setPortletContext(portletContext);
        }

        getResource.setRegistrationContext(wsrpConsumer.getRegistrationContext());
        getResource.setResourceParams(resourceParams);
        getResource.setRuntimeContext(runtimeContext);
        getResource.setUserContext(userContext);

        ServiceHolder serviceHolder = getServiceHolder(resourceRequest, wsrpConsumerManager, wsrpConsumer);

        WSRP_v2_Markup_PortType markupService = serviceHolder.getMarkupService();

        oasis.names.tc.wsrp.v2.types.ResourceResponse wsrpResourceResponse = markupService.getResource(getResource);

        processResourceResponse(resourceRequest, resourceResponse, wsrpConsumerManager, serviceHolder,
                wsrpResourceResponse);
    }

    protected ServiceHolder getServiceHolder(PortletRequest portletRequest, WSRPConsumerManager wsrpConsumerManager,
            WSRPConsumer wsrpConsumer) throws Exception {

        PortletSession portletSession = portletRequest.getPortletSession();

        String markupServiceKey = getSessionKey(WebKeys.MARKUP_SERVICE, portletRequest, wsrpConsumer);

        TransientValue<ServiceHolder> serviceHolderTransientValue = (TransientValue<ServiceHolder>) portletSession
                .getAttribute(markupServiceKey, PortletSession.APPLICATION_SCOPE);

        if ((serviceHolderTransientValue == null) || serviceHolderTransientValue.isNull()) {

            ServiceHolder serviceHolder = new ServiceHolder();

            WSRP_v2_Markup_PortType markupService = wsrpConsumerManager.getMarkupService();

            serviceHolder.setMarkupService(markupService);

            RegistrationContext registrationContext = wsrpConsumer.getRegistrationContext();

            serviceHolder.setRegistrationContext(registrationContext);

            serviceHolderTransientValue = new TransientValue<ServiceHolder>(serviceHolder);

            portletSession.setAttribute(markupServiceKey, serviceHolderTransientValue,
                    PortletSession.APPLICATION_SCOPE);

            ServiceDescription serviceDescription = wsrpConsumerManager.getServiceDescription();

            String cookieKey = getSessionKey(WebKeys.COOKIE, portletRequest, wsrpConsumer);

            String cookie = (String) portletSession.getAttribute(cookieKey, PortletSession.APPLICATION_SCOPE);

            CookieProtocol cookieProtocol = serviceDescription.getRequiresInitCookie();

            if ((cookie == null) && (cookieProtocol != null)) {
                String cookieProtocolValue = cookieProtocol.getValue();

                if (cookieProtocolValue.equals(CookieProtocol._perGroup)
                        || cookieProtocolValue.equals(CookieProtocol._perUser)) {

                    InitCookie initCookie = new InitCookie();

                    initCookie.setRegistrationContext(registrationContext);

                    markupService.initCookie(initCookie);

                    cookie = WSRPHTTPSender.getCurrentCookie();

                    portletSession.setAttribute(cookieKey, cookie, PortletSession.APPLICATION_SCOPE);
                }
            }
        }

        return serviceHolderTransientValue.getValue();
    }

    protected String getSessionKey(String baseKey, PortletRequest portletRequest, WSRPConsumer wsrpConsumer) {

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

        StringBundler sb = new StringBundler();

        sb.append(baseKey);
        sb.append(StringPool.UNDERLINE);
        sb.append(themeDisplay.getScopeGroupId());
        sb.append(StringPool.UNDERLINE);
        sb.append(wsrpConsumer.getWsrpConsumerId());
        sb.append(StringPool.UNDERLINE);
        sb.append(wsrpConsumer.getUrl());

        return sb.toString();
    }

    protected Telecom getTelecom(User user, String listTypeName) throws Exception {

        Telecom telecom = new Telecom();

        TelephoneNum faxTelephoneNum = getTelephoneNum(user, listTypeName + " Fax");

        if (faxTelephoneNum != null) {
            telecom.setFax(faxTelephoneNum);
        }

        TelephoneNum phoneTelephoneNum = getTelephoneNum(user, listTypeName);

        if (phoneTelephoneNum != null) {
            telecom.setTelephone(phoneTelephoneNum);
        }

        return telecom;
    }

    protected TelephoneNum getTelephoneNum(User user, String listTypeName) throws Exception {

        List<Phone> phones = PhoneLocalServiceUtil.getPhones(user.getCompanyId(),
                com.liferay.portal.model.Contact.class.getName(), user.getContactId());

        for (Phone phone : phones) {
            ListType listType = phone.getType();

            if (!listTypeName.equals(listType.getName())) {
                continue;
            }

            TelephoneNum telephoneNum = new TelephoneNum();

            telephoneNum.setExt(phone.getExtension());
            telephoneNum.setNumber(phone.getNumber());

            return telephoneNum;
        }

        return null;
    }

    protected UserProfile getUserProfile(User user) throws Exception {
        UserProfile userProfile = new UserProfile();

        Calendar bdate = getBdate(user);

        userProfile.setBdate(bdate);

        Contact businessInfoContact = getContact(user, "Business");

        userProfile.setBusinessInfo(businessInfoContact);

        String gender = getGender(user);

        userProfile.setGender(gender);

        Contact homeInfoContact = getContact(user, "Personal");

        userProfile.setHomeInfo(homeInfoContact);

        PersonName personName = getPersonName(user);

        userProfile.setName(personName);

        return userProfile;
    }

    protected WindowState getWindowState(String windowState) {
        return new WindowState(windowState.substring(5));
    }

    protected WSRPConsumerPortlet getWSRPConsumerPortlet() throws Exception {
        PortletConfig portletConfig = getPortletConfig();

        String portletName = portletConfig.getPortletName();

        int pos = portletName.indexOf(StringPool.UNDERLINE);

        String wsrpConsumerPortletUuid = portletName.substring(pos + 1);

        wsrpConsumerPortletUuid = PortalUUIDUtil.fromJsSafeUuid(wsrpConsumerPortletUuid);

        WSRPConsumerPortlet wsrpConsumerPortlet = WSRPConsumerPortletLocalServiceUtil
                .getWSRPConsumerPortlet(wsrpConsumerPortletUuid);

        return wsrpConsumerPortlet;
    }

    protected String getWSRPKey(String key) {
        return "wsrp:".concat(key);
    }

    protected String getWSRPMode(PortletMode portletMode) {
        return getWSRPKey(portletMode.toString());
    }

    protected String getWSRPWindowState(WindowState windowState) {
        return getWSRPKey(windowState.toString());
    }

    protected void initContexts(ActionRequest actionRequest, ActionResponse actionResponse,
            WSRPConsumer wsrpConsumer, WSRPConsumerPortlet wsrpConsumerPortlet,
            WSRPConsumerManager wsrpConsumerManager, InteractionParams interactionParams, MarkupParams markupParams,
            PortletContext portletContext, RuntimeContext runtimeContext, UserContext userContext)
            throws Exception {

        HttpServletRequest request = PortalUtil.getHttpServletRequest(actionRequest);

        initContexts(actionRequest, actionResponse, wsrpConsumer, wsrpConsumerPortlet, wsrpConsumerManager,
                markupParams, portletContext, runtimeContext, userContext);

        interactionParams.setPortletStateChange(StateChange.cloneBeforeWrite);

        String interactionState = actionRequest.getParameter("wsrp-interactionState");

        interactionParams.setInteractionState(interactionState);

        String contentType = request.getContentType();

        if (Validator.isNotNull(contentType) && contentType.startsWith(ContentTypes.MULTIPART_FORM_DATA)) {

            processMultipartForm(actionRequest, actionResponse, interactionParams);
        } else {
            processFormParameters(actionRequest, actionResponse, interactionParams);
        }
    }

    protected void initContexts(EventRequest eventRequest, EventResponse eventResponse, WSRPConsumer wsrpConsumer,
            WSRPConsumerPortlet wsrpConsumerPortlet, WSRPConsumerManager wsrpConsumerManager,
            EventParams eventParams, MarkupParams markupParams, PortletContext portletContext,
            RuntimeContext runtimeContext, UserContext userContext) throws Exception {

        initContexts(eventRequest, eventResponse, wsrpConsumer, wsrpConsumerPortlet, wsrpConsumerManager,
                markupParams, portletContext, runtimeContext, userContext);

        eventParams.setPortletStateChange(StateChange.cloneBeforeWrite);

        javax.portlet.Event jxEvent = eventRequest.getEvent();

        Event event = (Event) jxEvent.getValue();

        eventParams.setEvents(new Event[] { event });
    }

    protected void initContexts(PortletRequest portletRequest, PortletResponse portletResponse,
            WSRPConsumer wsrpConsumer, WSRPConsumerPortlet wsrpConsumerPortlet,
            WSRPConsumerManager wsrpConsumerManager, MimeRequest mimeRequest, PortletContext portletContext,
            RuntimeContext runtimeContext, UserContext userContext) throws Exception {

        PortletSession portletSession = portletRequest.getPortletSession();

        HttpServletRequest request = PortalUtil.getHttpServletRequest(portletRequest);

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

        // Markup params

        ClientData clientData = new ClientData();

        clientData.setRequestVerb(request.getMethod());
        clientData.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));

        User user = themeDisplay.getUser();

        List<MessageElement> clientAttributes = new ArrayList<MessageElement>();

        Enumeration<String> enu = request.getHeaderNames();

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

            String value = request.getHeader(name);

            ExtensionHelperUtil.addMessageElement(clientAttributes, name, value);
        }

        ExtensionHelperUtil.addMessageElement(clientAttributes, HttpHeaders.LIFERAY_EMAIL_ADDRESS,
                user.getEmailAddress());
        ExtensionHelperUtil.addMessageElement(clientAttributes, HttpHeaders.LIFERAY_SCREEN_NAME,
                user.getScreenName());
        ExtensionHelperUtil.addMessageElement(clientAttributes, HttpHeaders.LIFERAY_USER_ID,
                String.valueOf(user.getUserId()));

        ConsumerRequestExtensionsHelper.addClientAttributes(clientAttributes);

        clientData.setExtensions(ExtensionHelperUtil.getExtensions(clientAttributes));

        mimeRequest.setClientData(clientData);

        List<Locale> locales = Collections.list(portletRequest.getLocales());

        String[] localesArray = new String[locales.size()];

        for (int i = 0; i < locales.size(); i++) {
            Locale locale = locales.get(i);

            localesArray[i] = locale.toString();
        }

        Locale locale = themeDisplay.getLocale();

        if (!locales.contains(locale)) {
            localesArray = ArrayUtil.append(new String[] { locale.toString(), locale.getLanguage() }, localesArray);
        }

        mimeRequest.setLocales(localesArray);

        String[] markupCharacterSets = null;

        if (Validator.isNotNull(wsrpConsumer.getMarkupCharacterSets())) {
            String markupCharacterSetsString = wsrpConsumer.getMarkupCharacterSets();

            markupCharacterSetsString = MarkupCharacterSetsUtil
                    .getSupportedMarkupCharacterSets(markupCharacterSetsString);

            markupCharacterSets = StringUtil.split(markupCharacterSetsString);
        } else {
            markupCharacterSets = _CHAR_SETS;
        }

        mimeRequest.setMarkupCharacterSets(markupCharacterSets);

        mimeRequest.setMimeTypes(_MIME_TYPES);
        mimeRequest.setMode(getWSRPMode(portletRequest.getPortletMode()));
        mimeRequest.setWindowState(getWSRPWindowState(portletRequest.getWindowState()));

        String[] modes = { getWSRPMode(PortletMode.EDIT), getWSRPMode(PortletMode.HELP),
                getWSRPMode(PortletMode.VIEW) };

        mimeRequest.setValidNewModes(modes);

        String[] windowStates = { getWSRPWindowState(WindowState.MAXIMIZED),
                getWSRPWindowState(WindowState.MINIMIZED), getWSRPWindowState(WindowState.NORMAL) };

        mimeRequest.setValidNewWindowStates(windowStates);

        // Navigational context

        NavigationalContext navigationalContext = new NavigationalContext();

        String navigationalState = portletRequest.getParameter("wsrp-navigationalState");

        if (Validator.isNotNull(navigationalState)) {
            navigationalState = new String(Base64.decode(Base64.fromURLSafe(navigationalState)), StringPool.UTF8);

            navigationalContext.setOpaqueValue(navigationalState);
        }

        Map<String, String[]> publicParameterMap = portletRequest.getPublicParameterMap();

        List<NamedString> publicValues = new ArrayList<NamedString>();

        for (Map.Entry<String, String[]> entry : publicParameterMap.entrySet()) {

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

            for (String value : values) {
                NamedString publicValue = new NamedString();

                publicValue.setName(name);
                publicValue.setValue(value);

                publicValues.add(publicValue);
            }
        }

        navigationalContext.setPublicValues(publicValues.toArray(new NamedString[publicValues.size()]));

        mimeRequest.setNavigationalContext(navigationalContext);

        if (mimeRequest instanceof MarkupParams) {
            processFormParameters(portletRequest, portletResponse, mimeRequest);
        }

        // Portlet context

        portletContext.setPortletHandle(wsrpConsumerPortlet.getPortletHandle());

        // Runtime context

        runtimeContext.setNamespacePrefix(portletResponse.getNamespace());
        runtimeContext.setPortletInstanceKey(portletResponse.getNamespace());

        SessionContext sessionContext = (SessionContext) portletSession.getAttribute(WebKeys.SESSION_CONTEXT);

        if (sessionContext != null) {
            SessionParams sessionParams = new SessionParams();

            sessionParams.setSessionID(sessionContext.getSessionID());

            runtimeContext.setSessionParams(sessionParams);
        }

        runtimeContext.setUserAuthentication("wsrp:password");

        PortletDescription portletDescription = wsrpConsumerManager
                .getPortletDescription(wsrpConsumerPortlet.getPortletHandle());

        Boolean doesUrlTemplateProcessing = portletDescription.getDoesUrlTemplateProcessing();

        if ((doesUrlTemplateProcessing != null) && doesUrlTemplateProcessing) {
            Templates templates = new Templates();

            templates.setBlockingActionTemplate(_BLOCKING_ACTION_TEMPLATE);
            templates.setRenderTemplate(_RENDER_TEMPLATE);
            templates.setResourceTemplate(_RESOURCE_TEMPLATE);
            templates.setSecureBlockingActionTemplate(_BLOCKING_ACTION_TEMPLATE);
            templates.setSecureRenderTemplate(_RENDER_TEMPLATE);
            templates.setSecureResourceTemplate(_RESOURCE_TEMPLATE);

            runtimeContext.setTemplates(templates);
        }

        // User context

        UserProfile userProfile = getUserProfile(user);

        ConsumerRequestExtensionsHelper.addUserProfileAttributes(userProfile, user);

        userContext.setProfile(userProfile);

        userContext.setUserContextKey(String.valueOf(user.getUserId()));
    }

    protected void initContexts(ResourceRequest resourceRequest, ResourceResponse resourceResponse,
            WSRPConsumer wsrpConsumer, WSRPConsumerPortlet wsrpConsumerPortlet,
            WSRPConsumerManager wsrpConsumerManager, PortletContext portletContext, ResourceParams resourceParams,
            RuntimeContext runtimeContext, UserContext userContext) throws Exception {

        HttpServletRequest request = PortalUtil.getHttpServletRequest(resourceRequest);

        initContexts(resourceRequest, resourceResponse, wsrpConsumer, wsrpConsumerPortlet, wsrpConsumerManager,
                resourceParams, portletContext, runtimeContext, userContext);

        String resourceID = resourceRequest.getResourceID();

        resourceParams.setResourceID(resourceID);

        resourceParams.setPortletStateChange(StateChange.cloneBeforeWrite);

        String resourceState = ParamUtil.getString(resourceRequest, "wsrp-resourceState");

        if (Validator.isNotNull(resourceState)) {
            resourceParams.setResourceState(resourceState);
        }

        String resourceCacheability = ParamUtil.getString(resourceRequest, "wsrp-resourceCacheability");

        if (Validator.isNotNull(resourceCacheability)) {
            resourceParams.setResourceState(resourceCacheability);
        }

        String contentType = request.getContentType();

        if (Validator.isNotNull(contentType) && contentType.startsWith(ContentTypes.MULTIPART_FORM_DATA)) {

            processMultipartForm(resourceRequest, resourceResponse, resourceParams);
        } else {
            processFormParameters(resourceRequest, resourceResponse, resourceParams);
        }
    }

    protected boolean isReservedParameter(String name) {
        if (name.startsWith("wsrp-")) {
            return true;
        } else {
            return false;
        }
    }

    protected void processBlockingInteractionResponse(ActionRequest actionRequest, ActionResponse actionResponse,
            WSRPConsumerManager wsrpConsumerManager, ServiceHolder serviceHolder,
            BlockingInteractionResponse blockingInteractionResponse) throws Exception {

        String redirectURL = blockingInteractionResponse.getRedirectURL();

        if (Validator.isNotNull(redirectURL)) {
            sendRedirect(actionRequest, actionResponse, redirectURL);

            return;
        }

        processUpdateResponse(actionRequest, actionResponse, wsrpConsumerManager, serviceHolder,
                blockingInteractionResponse.getUpdateResponse());
    }

    protected void processFormParameters(ActionRequest actionRequest, ActionResponse actionResponse,
            InteractionParams interactionParams) {

        List<NamedString> formParameters = processFormParameters(actionRequest, actionResponse);

        if (!formParameters.isEmpty()) {
            interactionParams.setFormParameters(formParameters.toArray(new NamedString[formParameters.size()]));
        }
    }

    protected List<NamedString> processFormParameters(PortletRequest portletRequest,
            PortletResponse portletResponse) {

        List<NamedString> formParameters = new ArrayList<NamedString>();

        Enumeration<String> enu = portletRequest.getParameterNames();

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

            if (isReservedParameter(name)) {
                continue;
            }

            String[] values = portletRequest.getParameterValues(name);

            if (values == null) {
                continue;
            }

            addFormField(formParameters, name, values);
        }

        return formParameters;
    }

    protected void processFormParameters(PortletRequest portletRequest, PortletResponse portletResponse,
            MimeRequest mimeRequest) {

        List<MessageElement> formParameters = new ArrayList<MessageElement>();

        Enumeration<String> enu = portletRequest.getParameterNames();

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

            if (isReservedParameter(name)) {
                continue;
            }

            String[] values = portletRequest.getParameterValues(name);

            if (values == null) {
                continue;
            }

            for (String value : values) {
                ExtensionHelperUtil.addMessageElement(formParameters, name, value);
            }
        }

        if (!formParameters.isEmpty()) {
            mimeRequest.setExtensions(ExtensionHelperUtil.getExtensions(formParameters));
        }
    }

    protected void processFormParameters(ResourceRequest resourceRequest, ResourceResponse resourceResponse,
            ResourceParams resourceParams) {

        List<NamedString> formParameters = processFormParameters(resourceRequest, resourceResponse);

        if (!formParameters.isEmpty()) {
            resourceParams.setFormParameters(formParameters.toArray(new NamedString[formParameters.size()]));
        }
    }

    protected void processHandleEventsResponse(EventRequest eventRequest, EventResponse eventResponse,
            WSRPConsumerManager wsrpConsumerManager, ServiceHolder serviceHolder,
            HandleEventsResponse handleEventsResponse) throws Exception {

        processUpdateResponse(eventRequest, eventResponse, wsrpConsumerManager, serviceHolder,
                handleEventsResponse.getUpdateResponse());
    }

    protected void processMarkupResponse(PortletRequest portletRequest, PortletResponse portletResponse,
            ServiceHolder serviceHolder, MarkupResponse markupResponse) {

        PortletSession portletSession = portletRequest.getPortletSession();

        SessionContext sessionContext = markupResponse.getSessionContext();

        updateSessionContext(portletSession, serviceHolder, sessionContext);
    }

    protected void processMimeResponse(PortletRequest portletRequest, javax.portlet.MimeResponse jxMimeResponse,
            MimeResponse mimeResponse) throws Exception {

        String contentType = GetterUtil.get(mimeResponse.getMimeType(), ContentTypes.TEXT_HTML_UTF8);

        jxMimeResponse.setContentType(contentType);

        String charSet = getCharSet(contentType);

        String itemString = mimeResponse.getItemString();
        byte[] itemBinary = mimeResponse.getItemBinary();

        Boolean requiresRewriting = mimeResponse.getRequiresRewriting();

        if (requiresRewriting == null) {
            requiresRewriting = ParamUtil.getBoolean(portletRequest, "wsrp-requiresRewrite");
        }

        if (requiresRewriting && contentType.contains(ContentTypes.TEXT)) {
            if (itemBinary != null) {
                itemString = new String(itemBinary, charSet);
            }

            itemString = rewriteURLs(portletRequest, jxMimeResponse, itemString);
        }

        if (Validator.isNotNull(itemString)) {
            if (jxMimeResponse instanceof ResourceResponse) {
                ResourceResponse resourceResponse = (ResourceResponse) jxMimeResponse;

                resourceResponse.setContentLength(itemString.length());
            }

            PortletResponseUtil.write(jxMimeResponse, itemString);
        } else if (itemBinary != null) {
            if (jxMimeResponse instanceof ResourceResponse) {
                ResourceResponse resourceResponse = (ResourceResponse) jxMimeResponse;

                resourceResponse.setContentLength(itemBinary.length);
            }

            PortletResponseUtil.write(jxMimeResponse, itemBinary);
        }
    }

    protected void processMultipartForm(ActionRequest actionRequest, ActionResponse actionResponse,
            InteractionParams interactionParams) throws Exception {

        Object[] formData = processMultipartForm(actionRequest, actionResponse);

        List<NamedString> formParameters = (List<NamedString>) formData[0];
        List<UploadContext> uploadContexts = (List<UploadContext>) formData[1];

        if (!formParameters.isEmpty()) {
            interactionParams.setFormParameters(formParameters.toArray(new NamedString[formParameters.size()]));
        }

        if (!uploadContexts.isEmpty()) {
            interactionParams.setUploadContexts(uploadContexts.toArray(new UploadContext[uploadContexts.size()]));
        }
    }

    protected Object[] processMultipartForm(PortletRequest portletRequest, PortletResponse portletResponse)
            throws Exception {

        List<NamedString> formParameters = new ArrayList<NamedString>();
        List<UploadContext> uploadContexts = new ArrayList<UploadContext>();

        UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(portletRequest);

        Enumeration<String> enu = uploadPortletRequest.getParameterNames();

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

            if (isReservedParameter(name) || name.startsWith("p_p_")) {
                continue;
            }

            if (uploadPortletRequest.isFormField(name)) {
                String[] values = uploadPortletRequest.getParameterValues(name);

                if (values == null) {
                    continue;
                }

                addFormField(formParameters, name, values);
            } else {
                UploadContext uploadContext = new UploadContext();

                String contentType = uploadPortletRequest.getContentType(name);

                uploadContext.setMimeType(contentType);

                StringBuilder sb = new StringBuilder();

                sb.append("form-data; ");
                sb.append("name=");
                sb.append(name);
                sb.append("; filename=");
                sb.append(uploadPortletRequest.getFileName(name));

                NamedString mimeAttribute = new NamedString();

                mimeAttribute.setName(HttpHeaders.CONTENT_DISPOSITION);
                mimeAttribute.setValue(sb.toString());

                uploadContext.setMimeAttributes(new NamedString[] { mimeAttribute });

                InputStream inputStream = null;

                try {
                    inputStream = uploadPortletRequest.getFileAsStream(name);

                    if (inputStream == null) {
                        continue;
                    }

                    byte[] bytes = FileUtil.getBytes(inputStream);

                    if (bytes == null) {
                        continue;
                    }

                    uploadContext.setUploadData(bytes);
                } finally {
                    StreamUtil.cleanUp(inputStream);
                }

                uploadContexts.add(uploadContext);
            }
        }

        return new Object[] { formParameters, uploadContexts };
    }

    protected void processMultipartForm(ResourceRequest resourceRequest, ResourceResponse resourceResponse,
            ResourceParams resourceParams) throws Exception {

        Object[] formData = processMultipartForm(resourceRequest, resourceResponse);

        List<NamedString> formParameters = (List<NamedString>) formData[0];
        List<UploadContext> uploadContexts = (List<UploadContext>) formData[1];

        if (!formParameters.isEmpty()) {
            resourceParams.setFormParameters(formParameters.toArray(new NamedString[formParameters.size()]));
        }

        if (!uploadContexts.isEmpty()) {
            resourceParams.setUploadContexts(uploadContexts.toArray(new UploadContext[uploadContexts.size()]));
        }
    }

    protected void processResourceResponse(ResourceRequest resourceRequest, ResourceResponse resourceResponse,
            WSRPConsumerManager wsrpConsumerManager, ServiceHolder serviceHolder,
            oasis.names.tc.wsrp.v2.types.ResourceResponse wsrpResourceResponse) throws Exception {

        PortletSession portletSession = resourceRequest.getPortletSession();

        PortletContext portletContext = wsrpResourceResponse.getPortletContext();

        if (portletContext != null) {
            portletSession.setAttribute(WebKeys.PORTLET_CONTEXT, portletContext);
        }

        SessionContext sessionContext = wsrpResourceResponse.getSessionContext();

        updateSessionContext(portletSession, serviceHolder, sessionContext);

        ResourceContext resourceContext = wsrpResourceResponse.getResourceContext();

        CacheControl cacheControl = resourceContext.getCacheControl();

        if (cacheControl != null) {
            if (cacheControl.getExpires() == 0) {
                resourceResponse.setProperty(HttpHeaders.CACHE_CONTROL, HttpHeaders.CACHE_CONTROL_NO_CACHE_VALUE);
            } else if (cacheControl.getExpires() > 0) {
                resourceResponse.setProperty(HttpHeaders.CACHE_CONTROL, "max-age=" + cacheControl.getExpires());
            } else {
                resourceResponse.setProperty(HttpHeaders.CACHE_CONTROL, HttpHeaders.CACHE_CONTROL_DEFAULT_VALUE);
            }
        }

        NamedString[] clientAttributes = resourceContext.getClientAttributes();

        if (clientAttributes != null) {
            for (NamedString clientAttribute : clientAttributes) {
                String name = clientAttribute.getName();
                String value = clientAttribute.getValue();

                if (StringUtil.equalsIgnoreCase(name, HttpHeaders.CONTENT_DISPOSITION)) {

                    resourceResponse.setProperty(HttpHeaders.CONTENT_DISPOSITION, value);

                    break;
                }
            }
        }

        processMimeResponse(resourceRequest, resourceResponse, resourceContext);
    }

    protected void processUpdateResponse(PortletRequest portletRequest, StateAwareResponse stateAwareResponse,
            WSRPConsumerManager wsrpConsumerManager, ServiceHolder serviceHolder, UpdateResponse updateResponse)
            throws Exception {

        PortletSession portletSession = portletRequest.getPortletSession();

        if (updateResponse == null) {
            return;
        }

        portletSession.setAttribute(WebKeys.MARKUP_CONTEXT, updateResponse.getMarkupContext());

        NavigationalContext navigationalContext = updateResponse.getNavigationalContext();

        if (navigationalContext != null) {
            String opaqueValue = navigationalContext.getOpaqueValue();

            if (Validator.isNotNull(opaqueValue)) {
                byte[] opaqueValueBytes = opaqueValue.getBytes(StringPool.UTF8);

                opaqueValue = Base64.toURLSafe(Base64.encode(opaqueValueBytes));

                stateAwareResponse.setRenderParameter("wsrp-navigationalState", opaqueValue);
            }

            NamedString[] publicValues = navigationalContext.getPublicValues();

            if (publicValues != null) {
                for (NamedString publicValue : publicValues) {
                    String name = publicValue.getName();
                    String value = publicValue.getValue();

                    if (Validator.isNotNull(value)) {
                        stateAwareResponse.setRenderParameter(name, value);
                    } else {
                        stateAwareResponse.removePublicRenderParameter(name);
                    }
                }
            }
        }

        PortletContext portletContext = updateResponse.getPortletContext();

        if (portletContext != null) {
            portletSession.setAttribute(WebKeys.PORTLET_CONTEXT, portletContext);
        }

        SessionContext sessionContext = updateResponse.getSessionContext();

        updateSessionContext(portletSession, serviceHolder, sessionContext);

        String portletMode = updateResponse.getNewMode();

        if (Validator.isNotNull(portletMode)) {
            stateAwareResponse.setPortletMode(getPortletMode(portletMode));
        }

        String windowState = updateResponse.getNewWindowState();

        if (Validator.isNotNull(windowState)) {
            stateAwareResponse.setWindowState(getWindowState(windowState));
        }

        Event[] events = updateResponse.getEvents();

        if (events != null) {
            for (Event event : events) {
                QName qName = wsrpConsumerManager.getEventQName(event.getName());

                event.setName(qName);

                stateAwareResponse.setEvent(qName, event);
            }
        }
    }

    protected void proxyURL(ResourceRequest resourceRequest, ResourceResponse resourceResponse, String url)
            throws Exception {

        PortletSession portletSession = resourceRequest.getPortletSession();

        WSRPConsumerPortlet wsrpConsumerPortlet = getWSRPConsumerPortlet();

        WSRPConsumer wsrpConsumer = WSRPConsumerLocalServiceUtil
                .getWSRPConsumer(wsrpConsumerPortlet.getWsrpConsumerId());

        Http.Options options = new Http.Options();

        options.setLocation(url);

        String cookieKey = getSessionKey(WebKeys.COOKIE, resourceRequest, wsrpConsumer);

        String cookie = (String) portletSession.getAttribute(cookieKey, PortletSession.APPLICATION_SCOPE);

        if (Validator.isNotNull(cookie)) {
            Map<String, String> headers = new HashMap<String, String>();

            headers.put(HttpHeaders.COOKIE, cookie);

            options.setHeaders(headers);
        }

        byte[] bytes = HttpUtil.URLtoByteArray(options);

        Http.Response response = options.getResponse();

        String contentDisposition = response.getHeader(HttpHeaders.CONTENT_DISPOSITION);

        if (Validator.isNotNull(contentDisposition)) {
            resourceResponse.setProperty(HttpHeaders.CONTENT_DISPOSITION, contentDisposition);
        }

        int contentLength = response.getContentLength();

        if (contentLength >= 0) {
            resourceResponse.setContentLength(contentLength);
        }

        String contentType = response.getContentType();

        if (Validator.isNotNull(contentType)) {
            resourceResponse.setContentType(contentType);
        }

        String charSet = getCharSet(contentType);

        if (ParamUtil.getBoolean(resourceRequest, "wsrp-requiresRewrite")) {
            String content = rewriteURLs(resourceRequest, resourceResponse, new String(bytes, charSet));

            PortletResponseUtil.write(resourceResponse, content);
        } else {
            PortletResponseUtil.write(resourceResponse, bytes);
        }
    }

    protected String rewriteURL(PortletRequest portletRequest, PortletResponse portletResponse,
            Map<String, String> parameterMap) throws Exception {

        LiferayPortletResponse liferayPortletResponse = (LiferayPortletResponse) portletResponse;

        String lifecycle = parameterMap.get("wsrp-urlType");

        LiferayPortletURL liferayPortletURL = null;

        if (lifecycle.equals("blockingAction")) {
            liferayPortletURL = (LiferayPortletURL) liferayPortletResponse.createActionURL();
        } else if (lifecycle.equals("render")) {
            liferayPortletURL = (LiferayPortletURL) liferayPortletResponse.createRenderURL();
        } else if (lifecycle.equals("resource")) {
            liferayPortletURL = (LiferayPortletURL) liferayPortletResponse.createResourceURL();

            if (PortletPropsValues.SECURE_RESOURCE_URLS_ENABLED) {
                secureResourceURL(portletRequest, liferayPortletURL, parameterMap);
            }
        }

        for (Map.Entry<String, String> parameter : parameterMap.entrySet()) {
            String name = parameter.getKey();
            String value = parameter.getValue();

            if (name.equals("wsrp-mode")) {
                try {
                    liferayPortletURL.setPortletMode(getPortletMode(value));
                } catch (Exception e) {
                    liferayPortletURL.setPortletMode(PortletMode.VIEW);
                }
            } else if (name.equals("wsrp-navigationalState")) {
                if (Validator.isNotNull(value)) {
                    byte[] valueBytes = value.getBytes(StringPool.UTF8);

                    value = Base64.toURLSafe(Base64.encode(valueBytes));

                    liferayPortletURL.setParameter(name, value);
                }
            } else if (name.equals("wsrp-navigationalValues")) {
                Matcher navigationalValuesMatcher = _navigationalValuesPattern.matcher(value);

                while (navigationalValuesMatcher.find()) {
                    String navigationalValuesName = navigationalValuesMatcher.group(1);
                    String navigationalValuesValue = navigationalValuesMatcher.group(2);

                    if (Validator.isNull(navigationalValuesValue)) {
                        liferayPortletURL.removePublicRenderParameter(navigationalValuesName);
                    } else {
                        liferayPortletURL.setParameter(navigationalValuesName, navigationalValuesValue, true);
                    }
                }
            } else if (name.equals("wsrp-resourceID")) {
                liferayPortletURL.setResourceID(value);
            } else if (name.equals("wsrp-urlType")) {
            } else if (name.equals("wsrp-windowState")) {
                try {
                    liferayPortletURL.setWindowState(getWindowState(value));
                } catch (Exception e) {
                    liferayPortletURL.setWindowState(WindowState.NORMAL);
                }
            } else {
                liferayPortletURL.setParameter(name, value);
            }
        }

        String url = liferayPortletURL.toString();

        return url;
    }

    protected String rewriteURLs(PortletRequest portletRequest, PortletResponse portletResponse, String content)
            throws Exception {

        Matcher rewriteMatcher = _rewritePattern.matcher(content);

        StringBuffer sb = new StringBuffer();

        while (rewriteMatcher.find()) {
            String namespace = rewriteMatcher.group(1);
            String url = rewriteMatcher.group(2);
            String extensionURL1 = rewriteMatcher.group(3);
            String extensionURL2 = rewriteMatcher.group(4);

            Map<String, String> parameterMap = new HashMap<String, String>();

            if (Validator.isNotNull(namespace)) {
                rewriteMatcher.appendReplacement(sb, portletResponse.getNamespace());
            } else if (Validator.isNotNull(url)) {
                Matcher parameterMatcher = _parameterPattern.matcher(url);

                while (parameterMatcher.find()) {
                    String name = parameterMatcher.group(1);
                    String value = parameterMatcher.group(2);

                    if (Validator.isNull(value) || value.equals(StringPool.DOUBLE_QUOTE)) {

                        continue;
                    }

                    parameterMap.put(name, HttpUtil.decodeURL(value));
                }

                String rewrittenURL = rewriteURL(portletRequest, portletResponse, parameterMap);

                rewriteMatcher.appendReplacement(sb, rewrittenURL);
            } else if (Validator.isNotNull(extensionURL1)) {
                parameterMap.put("wsrp-urlType", "render");
                parameterMap.put("wsrp-windowState", "wsrp:normal");

                String rewrittenURL = rewriteURL(portletRequest, portletResponse, parameterMap);

                String replacement = "location.href = '" + rewrittenURL + "'";

                rewriteMatcher.appendReplacement(sb, replacement);
            } else if (Validator.isNotNull(extensionURL2)) {
                parameterMap.put("wsrp-urlType", "render");
                parameterMap.put("wsrp-windowState", "wsrp:normal");

                String rewrittenURL = rewriteURL(portletRequest, portletResponse, parameterMap);

                String replacement = "href=\"" + rewrittenURL + "\"";

                rewriteMatcher.appendReplacement(sb, replacement);
            }
        }

        rewriteMatcher.appendTail(sb);

        return sb.toString();
    }

    protected void secureResourceURL(PortletRequest portletRequest, LiferayPortletURL liferayPortletURL,
            Map<String, String> parameterMap) throws Exception {

        HttpServletRequest request = PortalUtil.getHttpServletRequest(portletRequest);

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

        String resourceID = GetterUtil.getString(parameterMap.get("wsrp-resourceID"));

        String url = GetterUtil.getString(parameterMap.get("wsrp-url"));

        StringBundler sb = new StringBundler(4);

        sb.append(resourceID);
        sb.append(url);
        sb.append(PortletPropsValues.SECURE_RESOURCE_URLS_SALT);

        if (themeDisplay.isSignedIn()) {
            sb.append(AuthTokenUtil.getToken(request));
        }

        String wsrpAuth = encodeWSRPAuth(portletRequest, sb.toString());

        parameterMap.put("wsrp-auth", wsrpAuth);
    }

    protected void sendRedirect(ActionRequest actionRequest, ActionResponse actionResponse, String redirectURL)
            throws Exception {

        redirectURL = rewriteURLs(actionRequest, actionResponse, redirectURL);

        actionResponse.sendRedirect(redirectURL);
    }

    protected void updateSessionContext(PortletSession portletSession, ServiceHolder serviceHolder,
            SessionContext sessionContext) {

        if (sessionContext == null) {
            return;
        }

        portletSession.setAttribute(WebKeys.SESSION_CONTEXT, sessionContext);

        serviceHolder.setSessionContext(sessionContext);
    }

    private static final String _BLOCKING_ACTION_TEMPLATE = "wsrp_rewrite?wsrp-urlType=blockingAction&"
            + "wsrp-navigationalState={wsrp-navigationalState}&"
            + "wsrp-navigationalValues={wsrp-navigationalValues}&"
            + "wsrp-interactionState={wsrp-interactionState}&"
            + "wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}"
            + "&wsrp-fragmentID={wsrp-fragmentID}/wsrp_rewrite";

    private static final String[] _CHAR_SETS = { StringPool.UTF8 };

    private static final String[] _MIME_TYPES = { ContentTypes.TEXT_HTML };

    private static final String _RENDER_TEMPLATE = "wsrp_rewrite?wsrp-urlType=render&"
            + "wsrp-navigationalState={wsrp-navigationalState}&"
            + "wsrp-navigationalValues={wsrp-navigationalValues}&"
            + "wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&"
            + "wsrp-fragmentID={wsrp-fragmentID}/wsrp_rewrite";

    private static final String _RESOURCE_TEMPLATE = "wsrp_rewrite?wsrp-urlType=resource&wsrp-url={wsrp-url}&"
            + "wsrp-resourceID={wsrp-resourceID}&" + "wsrp-preferOperation={wsrp-preferOperation}&"
            + "wsrp-resourceState={wsrp-resourceState}&" + "wsrp-requiresRewrite={wsrp-requiresRewrite}&"
            + "wsrp-resourceCacheability={wsrp-resourceCacheability}/wsrp_rewrite";

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

    private static Pattern _navigationalValuesPattern = Pattern.compile("(?:([^&=]+)(?:=([^&=]*))?)&?");
    private static Pattern _parameterPattern = Pattern.compile("(?:([^&]+)=([^&]*))(?:&amp;|&)?");
    private static Pattern _rewritePattern = Pattern
            .compile("(wsrp_rewrite_)|(?:wsrp_rewrite\\?([^\\s/]+)/wsrp_rewrite)|"
                    + "(?:location\\.href\\s*=\\s*'(/widget/c/portal/layout(?:[^']+))')|"
                    + "(?:href\\s*=\\s*\"(/widget/c/portal/layout(?:[^\"]+))\")");

}