/**
* 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.portlet;
import com.liferay.portal.kernel.portlet.LiferayPortlet;
import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.struts.PortletRequestProcessor;
import com.liferay.portal.struts.StrutsUtil;
import java.io.IOException;
import java.util.Map;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.EventRequest;
import javax.portlet.EventResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletContext;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.servlet.ServletException;
/**
* @author Brian Wing Shun Chan
* @author Raymond Augé
*/
public class StrutsPortlet extends LiferayPortlet {
@Override
public void doAbout(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, aboutAction);
include(renderRequest, renderResponse);
}
@Override
public void doConfig(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, configAction);
include(renderRequest, renderResponse);
}
@Override
public void doEdit(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
if (renderRequest.getPreferences() == null) {
super.doEdit(renderRequest, renderResponse);
}
else {
renderRequest.setAttribute(
WebKeys.PORTLET_STRUTS_ACTION, editAction);
include(renderRequest, renderResponse);
}
}
@Override
public void doEditDefaults(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
if (renderRequest.getPreferences() == null) {
super.doEdit(renderRequest, renderResponse);
}
else {
renderRequest.setAttribute(
WebKeys.PORTLET_STRUTS_ACTION, editDefaultsAction);
include(renderRequest, renderResponse);
}
}
@Override
public void doEditGuest(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
if (renderRequest.getPreferences() == null) {
super.doEdit(renderRequest, renderResponse);
}
else {
renderRequest.setAttribute(
WebKeys.PORTLET_STRUTS_ACTION, editGuestAction);
include(renderRequest, renderResponse);
}
}
@Override
public void doHelp(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, helpAction);
include(renderRequest, renderResponse);
}
@Override
public void doPreview(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
renderRequest.setAttribute(
WebKeys.PORTLET_STRUTS_ACTION, previewAction);
include(renderRequest, renderResponse);
}
@Override
public void doPrint(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, printAction);
include(renderRequest, renderResponse);
}
@Override
public void doView(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
renderRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, viewAction);
include(renderRequest, renderResponse);
}
@Override
public void init(PortletConfig portletConfig) throws PortletException {
super.init(portletConfig);
templatePath = getInitParameter("template-path");
if (Validator.isNull(templatePath)) {
templatePath = StringPool.SLASH;
}
else if (templatePath.contains(StringPool.BACK_SLASH) ||
templatePath.contains(StringPool.DOUBLE_SLASH) ||
templatePath.contains(StringPool.PERIOD) ||
templatePath.contains(StringPool.SPACE)) {
throw new PortletException(
"template-path " + templatePath + " has invalid characters");
}
else if (!templatePath.startsWith(StringPool.SLASH) ||
!templatePath.endsWith(StringPool.SLASH)) {
throw new PortletException(
"template-path " + templatePath +
" must start and end with a /");
}
aboutAction = getInitParameter("about-action");
configAction = getInitParameter("config-action");
editAction = getInitParameter("edit-action");
editDefaultsAction = getInitParameter("edit-defaults-action");
editGuestAction = getInitParameter("edit-guest-action");
helpAction = getInitParameter("help-action");
previewAction = getInitParameter("preview-action");
printAction = getInitParameter("print-action");
viewAction = getInitParameter("view-action");
copyRequestParameters = GetterUtil.getBoolean(
getInitParameter("copy-request-parameters"), true);
_liferayPortletConfig = (LiferayPortletConfig)portletConfig;
initValidPaths(templatePath, ".jsp");
}
@Override
public void processAction(
ActionRequest actionRequest, ActionResponse actionResponse)
throws IOException, PortletException {
String path = actionRequest.getParameter("struts_action");
if (Validator.isNotNull(path)) {
// Call processAction of com.liferay.portal.struts.PortletAction
try {
PortletRequestProcessor processor =
_getPortletRequestProcessor();
processor.process(actionRequest, actionResponse, path);
}
catch (ServletException se) {
throw new PortletException(se);
}
}
if (copyRequestParameters) {
PortalUtil.copyRequestParameters(actionRequest, actionResponse);
}
}
@Override
public void processEvent(EventRequest request, EventResponse response)
throws IOException, PortletException {
request.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, viewAction);
// Call processEvent of com.liferay.portal.struts.PortletAction
try {
PortletRequestProcessor processor = _getPortletRequestProcessor();
processor.process(request, response);
}
catch (ServletException se) {
throw new PortletException(se);
}
}
@Override
public void serveResource(
ResourceRequest resourceRequest, ResourceResponse resourceResponse)
throws IOException, PortletException {
String resourceID = resourceRequest.getResourceID();
checkPath(resourceID);
resourceRequest.setAttribute(WebKeys.PORTLET_STRUTS_ACTION, viewAction);
// Call serveResource of com.liferay.portal.struts.PortletAction
try {
PortletRequestProcessor processor = _getPortletRequestProcessor();
processor.process(resourceRequest, resourceResponse);
}
catch (ServletException se) {
throw new PortletException(se);
}
}
@Override
protected void checkPath(String path) throws PortletException {
super.checkPath(path);
}
protected void include(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
// Call render of com.liferay.portal.struts.PortletAction
Map<String, Object> strutsAttributes = null;
if (_liferayPortletConfig.isWARFile()) {
strutsAttributes = StrutsUtil.removeStrutsAttributes(
getPortletContext(), renderRequest);
}
try {
PortletRequestProcessor processor = _getPortletRequestProcessor();
processor.process(renderRequest, renderResponse);
}
catch (ServletException se) {
throw new PortletException(se);
}
finally {
if (_liferayPortletConfig.isWARFile()) {
StrutsUtil.setStrutsAttributes(renderRequest, strutsAttributes);
}
}
if (copyRequestParameters) {
PortalUtil.clearRequestParameters(renderRequest);
}
}
protected String aboutAction;
protected String configAction;
protected boolean copyRequestParameters;
protected String editAction;
protected String editDefaultsAction;
protected String editGuestAction;
protected String helpAction;
protected String previewAction;
protected String printAction;
protected String templatePath;
protected String viewAction;
private PortletRequestProcessor _getPortletRequestProcessor() {
PortletContext portletContext = getPortletContext();
return (PortletRequestProcessor)portletContext.getAttribute(
WebKeys.PORTLET_STRUTS_PROCESSOR);
}
private LiferayPortletConfig _liferayPortletConfig;
}