com.liferay.wsrp.axis.WSRPHTTPSender.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.wsrp.axis.WSRPHTTPSender.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.axis;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.CookieKeys;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.InitialThreadLocal;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.util.axis.SimpleHTTPSender;

import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.transport.http.HTTPConstants;
import org.apache.axis.transport.http.HTTPSender;

/**
 * @author Michael Young
 */
public class WSRPHTTPSender extends HTTPSender {

    public static String getCurrentCookie() {
        return _currentCookie.get();
    }

    public static HttpServletRequest getCurrentRequest() {
        return _currentRequest.get();
    }

    public static void setCurrentRequest(HttpServletRequest request) {
        _currentRequest.set(request);
    }

    public WSRPHTTPSender(String forwardCookies, String forwardHeaders) {
        if (Validator.isNotNull(forwardCookies)) {
            _forwardCookies = StringUtil.split(StringUtil.toLowerCase(forwardCookies));
        }

        if (Validator.isNotNull(forwardHeaders)) {
            _forwardHeaders = StringUtil.split(forwardHeaders);
        }
    }

    @Override
    public void invoke(MessageContext messageContext) throws AxisFault {
        HttpServletRequest request = getCurrentRequest();

        if (request == null) {
            super.invoke(messageContext);

            return;
        }

        addForwardCookies(messageContext, request);

        addForwardHeaders(messageContext, request);

        super.invoke(messageContext);

        registerCurrentCookie(messageContext);
    }

    protected void addForwardCookies(MessageContext messageContext, HttpServletRequest request) {

        if (_forwardCookies.length == 0) {
            return;
        }

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

        Object cookiesObject = messageContext.getProperty(HTTPConstants.HEADER_COOKIE);

        String[] cookies = new String[0];

        if (cookiesObject instanceof String[]) {
            cookies = (String[]) cookiesObject;
        } else if (cookiesObject instanceof String) {
            cookies = new String[] { (String) cookiesObject };
        }

        for (String cookie : cookies) {
            String name = cookie.substring(0, cookie.indexOf(StringPool.EQUAL));

            cookiesMap.put(StringUtil.toLowerCase(name), cookie);
        }

        for (String forwardCookie : _forwardCookies) {
            String value = CookieKeys.getCookie(request, forwardCookie);

            if (Validator.isNull(value)) {
                continue;
            }

            cookiesMap.put(forwardCookie, forwardCookie.concat(StringPool.EQUAL).concat(value));
        }

        Collection<String> cookiesCollection = cookiesMap.values();

        cookiesObject = cookiesCollection.toArray(new String[0]);

        messageContext.setProperty(HTTPConstants.HEADER_COOKIE, cookiesObject);
    }

    protected void addForwardHeaders(MessageContext messageContext, HttpServletRequest request) {

        if (_forwardHeaders.length == 0) {
            return;
        }

        Hashtable<String, Object> requestHeaders = (Hashtable<String, Object>) messageContext
                .getProperty(HTTPConstants.REQUEST_HEADERS);

        if (requestHeaders == null) {
            requestHeaders = new Hashtable<String, Object>();

            messageContext.setProperty(HTTPConstants.REQUEST_HEADERS, requestHeaders);
        }

        for (String headerName : _forwardHeaders) {
            String header = request.getHeader(headerName);

            if (header != null) {
                requestHeaders.put(headerName, header);
            }
        }
    }

    protected void registerCurrentCookie(MessageContext messageContext) {
        String cookie = StringPool.BLANK;

        try {
            cookie = GetterUtil.getString(messageContext.getStrProp(HTTPConstants.HEADER_COOKIE));
        } catch (Throwable t) {
            if (_log.isWarnEnabled()) {
                _log.warn(t, t);
            }
        }

        _currentCookie.set(cookie);
    }

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

    private static ThreadLocal<String> _currentCookie = new InitialThreadLocal<String>(
            SimpleHTTPSender.class + "._currentCookie", StringPool.BLANK);
    private static ThreadLocal<HttpServletRequest> _currentRequest = new InitialThreadLocal<HttpServletRequest>(
            SimpleHTTPSender.class + "._currentRequest", null);

    private String[] _forwardCookies = new String[0];
    private String[] _forwardHeaders = new String[0];

}