com.liferay.alloy.mvc.jsonwebservice.BaseAlloyControllerInvokerImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.alloy.mvc.jsonwebservice.BaseAlloyControllerInvokerImpl.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.alloy.mvc.jsonwebservice;

import com.liferay.alloy.mvc.AlloyController;
import com.liferay.alloy.mvc.AlloyPortlet;
import com.liferay.alloy.mvc.BaseAlloyControllerImpl;
import com.liferay.portal.kernel.json.JSONSerializable;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
import com.liferay.portal.kernel.portlet.PortletConfigFactoryUtil;
import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.security.permission.PermissionThreadLocal;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.servlet.DynamicServletRequest;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.JavaConstants;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.WebKeys;

import java.lang.reflect.Constructor;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;

/**
 * @author Ethan Bustad
 */
public abstract class BaseAlloyControllerInvokerImpl implements AlloyControllerInvoker {

    @Override
    public JSONSerializable invokeAlloyController(String lifecycle, Object... parameters) throws Exception {

        Constructor<? extends AlloyController> constructor = _controllerClass.getConstructor();

        AlloyController alloyController = constructor.newInstance();

        HttpServletRequest request = createRequest(lifecycle, parameters);
        HttpServletResponse response = createResponse();

        PageContext pageContext = createPageContext(request, response);

        alloyController.setPageContext(pageContext);

        alloyController.afterPropertiesSet();

        alloyController.execute();

        return getJSONSerializable(alloyController.getResponseContent());
    }

    @Override
    public void setProperties(ThemeDisplay themeDisplay, AlloyPortlet alloyPortlet, Portlet portlet,
            String controller, Class<? extends AlloyController> controllerClass) {

        _alloyPortlet = alloyPortlet;
        _controller = controller;
        _controllerClass = controllerClass;
        _portlet = portlet;
        _themeDisplay = themeDisplay;
    }

    protected ActionRequest createActionRequest() {
        return new AlloyMockUtil.MockActionRequest();
    }

    protected ActionResponse createActionResponse() {
        return new AlloyMockUtil.MockActionResponse();
    }

    protected PageContext createPageContext(final ServletRequest request, final ServletResponse response) {

        return new AlloyMockUtil.MockPageContext() {

            @Override
            public ServletRequest getRequest() {
                return request;
            }

            @Override
            public ServletResponse getResponse() {
                return response;
            }

        };
    }

    protected RenderRequest createRenderRequest() {
        return new AlloyMockUtil.MockRenderRequest();
    }

    protected RenderResponse createRenderResponse(final HttpServletRequest request, final String portletId,
            final long plid, final String lifecycle) {

        return new AlloyMockUtil.MockRenderResponse() {

            @Override
            public PortletURL createRenderURL() {
                return PortletURLFactoryUtil.create(request, portletId, plid, lifecycle);
            }

            @Override
            public String getContentType() {
                return contentType;
            }

            @Override
            public void setContentType(String type) {
                contentType = type;
            }

            protected String contentType = null;

        };
    }

    protected DynamicServletRequest createRequest(String lifecycle, Object... parameters) throws Exception {

        if ((parameters.length % 2) != 0) {
            throw new IllegalArgumentException("Parameters length is not an even number");
        }

        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(
                new AlloyMockUtil.MockHttpServletRequest());

        DynamicServletRequest request = new DynamicServletRequest(requestWrapper, false);

        for (int i = 0; i < parameters.length; i += 2) {
            request.appendParameter(String.valueOf(parameters[i]), String.valueOf(parameters[i + 1]));
        }

        request.appendParameter("controller", _controller);
        request.appendParameter("format", "json");

        ThemeDisplay themeDisplay = (ThemeDisplay) _themeDisplay.clone();

        PermissionChecker permissionChecker = PermissionThreadLocal.getPermissionChecker();

        User user = UserLocalServiceUtil.getUser(permissionChecker.getUserId());

        themeDisplay.setUser(user);

        request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);

        request.setAttribute(WebKeys.LAYOUT, themeDisplay.getLayout());

        LiferayPortletConfig liferayPortletConfig = (LiferayPortletConfig) PortletConfigFactoryUtil.create(_portlet,
                null);

        request.setAttribute(JavaConstants.JAVAX_PORTLET_CONFIG, liferayPortletConfig);

        request.setAttribute(JavaConstants.JAVAX_PORTLET_PORTLET, _alloyPortlet);

        PortletRequest portletRequest = null;
        PortletResponse portletResponse = null;

        if (lifecycle.equals(PortletRequest.ACTION_PHASE)) {
            portletRequest = createActionRequest();
            portletResponse = createActionResponse();
        } else {
            portletRequest = createRenderRequest();
            portletResponse = createRenderResponse(request, _portlet.getRootPortletId(), themeDisplay.getPlid(),
                    lifecycle);
        }

        request.setAttribute(JavaConstants.JAVAX_PORTLET_REQUEST, portletRequest);
        request.setAttribute(JavaConstants.JAVAX_PORTLET_RESPONSE, portletResponse);

        request.setAttribute(PortletRequest.LIFECYCLE_PHASE, lifecycle);

        request.setAttribute(BaseAlloyControllerImpl.VIEW_PATH, StringPool.BLANK);

        return request;
    }

    protected HttpServletResponse createResponse() {
        return new AlloyMockUtil.MockHttpServletResponse() {

            @Override
            public String getContentType() {
                return contentType;
            }

            @Override
            public void setContentType(String type) {
                contentType = type;
            }

            protected String contentType;

        };
    }

    protected JSONSerializable getJSONSerializable(final String content) {
        return new JSONSerializable() {

            @Override
            public String toJSONString() {
                return content;
            }

        };
    }

    private AlloyPortlet _alloyPortlet;
    private String _controller;
    private Class<? extends AlloyController> _controllerClass;
    private Portlet _portlet;
    private ThemeDisplay _themeDisplay;

}