/** * 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; }