/**
* 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.portal.kernel.portlet.bridges.mvc;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.LayoutTypePortlet;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.model.PortletConstants;
import com.liferay.portal.kernel.portlet.PortletConfigFactoryUtil;
import com.liferay.portal.kernel.security.auth.PrincipalException;
import com.liferay.portal.kernel.service.PortletLocalServiceUtil;
import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.JavaConstants;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import java.io.IOException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.servlet.http.HttpServletRequest;
/**
* @author Brian Wing Shun Chan
* @see com.liferay.portal.struts.PortletAction
*/
public abstract class BaseMVCActionCommand implements MVCActionCommand {
@Override
public boolean processAction(
ActionRequest actionRequest, ActionResponse actionResponse)
throws PortletException {
try {
doProcessAction(actionRequest, actionResponse);
return SessionErrors.isEmpty(actionRequest);
}
catch (PortletException pe) {
throw pe;
}
catch (Exception e) {
throw new PortletException(e);
}
}
protected void addDeleteSuccessData(
PortletRequest portletRequest, Object data) {
SessionMessages.add(
portletRequest,
PortalUtil.getPortletId(portletRequest) +
SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA,
data);
hideDefaultSuccessMessage(portletRequest);
}
protected void addSuccessMessage(
ActionRequest actionRequest, ActionResponse actionResponse) {
PortletConfig portletConfig = (PortletConfig)actionRequest.getAttribute(
JavaConstants.JAVAX_PORTLET_CONFIG);
boolean addProcessActionSuccessMessage = GetterUtil.getBoolean(
portletConfig.getInitParameter("add-process-action-success-action"),
true);
if (!addProcessActionSuccessMessage) {
return;
}
String successMessage = ParamUtil.getString(
actionRequest, "successMessage");
SessionMessages.add(actionRequest, "requestProcessed", successMessage);
}
protected abstract void doProcessAction(
ActionRequest actionRequest, ActionResponse actionResponse)
throws Exception;
protected PortletConfig getPortletConfig(PortletRequest portletRequest) {
String portletId = PortalUtil.getPortletId(portletRequest);
return PortletConfigFactoryUtil.get(
PortletConstants.getRootPortletId(portletId));
}
protected void hideDefaultErrorMessage(PortletRequest portletRequest) {
SessionMessages.add(
portletRequest,
PortalUtil.getPortletId(portletRequest) +
SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
}
protected void hideDefaultSuccessMessage(PortletRequest portletRequest) {
SessionMessages.add(
portletRequest,
PortalUtil.getPortletId(portletRequest) +
SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_SUCCESS_MESSAGE);
}
protected boolean isDisplaySuccessMessage(PortletRequest portletRequest) {
if (!SessionErrors.isEmpty(portletRequest)) {
return false;
}
ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);
Layout layout = themeDisplay.getLayout();
if (layout.isTypeControlPanel()) {
return true;
}
String portletId = (String)portletRequest.getAttribute(
WebKeys.PORTLET_ID);
LayoutTypePortlet layoutTypePortlet =
themeDisplay.getLayoutTypePortlet();
if (layoutTypePortlet.hasPortletId(portletId)) {
return true;
}
Portlet portlet = PortletLocalServiceUtil.getPortletById(
themeDisplay.getCompanyId(), portletId);
if (portlet.isAddDefaultResource()) {
return true;
}
return false;
}
protected boolean redirectToLogin(
ActionRequest actionRequest, ActionResponse actionResponse)
throws IOException {
if (actionRequest.getRemoteUser() == null) {
HttpServletRequest request = PortalUtil.getHttpServletRequest(
actionRequest);
SessionErrors.add(request, PrincipalException.class.getName());
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
sendRedirect(
actionRequest, actionResponse, themeDisplay.getURLSignIn());
return true;
}
else {
return false;
}
}
protected void sendRedirect(
ActionRequest actionRequest, ActionResponse actionResponse)
throws IOException {
sendRedirect(actionRequest, actionResponse, null);
}
protected void sendRedirect(
ActionRequest actionRequest, ActionResponse actionResponse,
String redirect)
throws IOException {
sendRedirect(null, actionRequest, actionResponse, redirect, null);
}
protected void sendRedirect(
PortletConfig portletConfig, ActionRequest actionRequest,
ActionResponse actionResponse, String redirect,
String closeRedirect)
throws IOException {
if (isDisplaySuccessMessage(actionRequest)) {
addSuccessMessage(actionRequest, actionResponse);
}
if (Validator.isNull(redirect)) {
redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
}
if (Validator.isNull(redirect)) {
redirect = ParamUtil.getString(actionRequest, "redirect");
}
if ((portletConfig != null) && Validator.isNotNull(redirect) &&
Validator.isNotNull(closeRedirect)) {
redirect = HttpUtil.setParameter(
redirect, "closeRedirect", closeRedirect);
SessionMessages.add(
actionRequest,
PortalUtil.getPortletId(actionRequest) +
SessionMessages.KEY_SUFFIX_CLOSE_REDIRECT,
closeRedirect);
}
if (Validator.isNull(redirect)) {
return;
}
// LPS-1928
HttpServletRequest request = PortalUtil.getHttpServletRequest(
actionRequest);
if (BrowserSnifferUtil.isIe(request) &&
(BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
redirect.contains(StringPool.POUND)) {
String redirectToken = "";
if (!redirect.contains(StringPool.QUESTION)) {
redirectToken = StringPool.QUESTION + redirectToken;
}
redirect = StringUtil.replace(
redirect, CharPool.POUND, redirectToken);
}
redirect = PortalUtil.escapeRedirect(redirect);
if (Validator.isNotNull(redirect)) {
actionResponse.sendRedirect(redirect);
}
}
}