/**
* 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.wiki.web.internal.portlet.action;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.module.configuration.ConfigurationProviderUtil;
import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
import com.liferay.portal.kernel.security.auth.PrincipalException;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.ServiceContextFactory;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.settings.PortletInstanceSettingsLocator;
import com.liferay.portal.kernel.theme.PortletDisplay;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.kernel.workflow.WorkflowThreadLocal;
import com.liferay.wiki.configuration.WikiGroupServiceConfiguration;
import com.liferay.wiki.constants.WikiWebKeys;
import com.liferay.wiki.engine.impl.WikiEngineRenderer;
import com.liferay.wiki.exception.NoSuchNodeException;
import com.liferay.wiki.exception.NoSuchPageException;
import com.liferay.wiki.model.WikiNode;
import com.liferay.wiki.model.WikiPage;
import com.liferay.wiki.model.WikiPageConstants;
import com.liferay.wiki.service.WikiNodeLocalServiceUtil;
import com.liferay.wiki.service.WikiNodeServiceUtil;
import com.liferay.wiki.service.WikiPageLocalServiceUtil;
import com.liferay.wiki.service.WikiPageServiceUtil;
import com.liferay.wiki.service.permission.WikiNodePermissionChecker;
import com.liferay.wiki.util.WikiUtil;
import com.liferay.wiki.web.configuration.WikiPortletInstanceOverriddenConfiguration;
import com.liferay.wiki.web.util.WikiWebComponentProvider;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.http.HttpServletRequest;
/**
* @author Brian Wing Shun Chan
* @author Jorge Ferrer
*/
public class ActionUtil {
public static void compareVersions(
RenderRequest renderRequest, RenderResponse renderResponse,
WikiEngineRenderer wikiEngineRenderer)
throws Exception {
long nodeId = ParamUtil.getLong(renderRequest, "nodeId");
String title = ParamUtil.getString(renderRequest, "title");
double sourceVersion = ParamUtil.getDouble(
renderRequest, "sourceVersion");
double targetVersion = ParamUtil.getDouble(
renderRequest, "targetVersion");
String htmlDiffResult = getHtmlDiffResult(
sourceVersion, targetVersion, renderRequest, renderResponse,
wikiEngineRenderer);
renderRequest.setAttribute(WebKeys.DIFF_HTML_RESULTS, htmlDiffResult);
renderRequest.setAttribute(WebKeys.SOURCE_VERSION, sourceVersion);
renderRequest.setAttribute(WebKeys.TARGET_VERSION, targetVersion);
renderRequest.setAttribute(WebKeys.TITLE, title);
renderRequest.setAttribute(WikiWebKeys.WIKI_NODE_ID, nodeId);
}
public static WikiNode getFirstNode(PortletRequest portletRequest)
throws PortalException {
ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);
long groupId = themeDisplay.getScopeGroupId();
PermissionChecker permissionChecker =
themeDisplay.getPermissionChecker();
List<WikiNode> nodes = WikiNodeLocalServiceUtil.getNodes(groupId);
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
WikiPortletInstanceOverriddenConfiguration
wikiPortletInstanceOverriddenConfiguration =
ConfigurationProviderUtil.getConfiguration(
WikiPortletInstanceOverriddenConfiguration.class,
new PortletInstanceSettingsLocator(
themeDisplay.getLayout(), portletDisplay.getId()));
String[] visibleNodeNames =
wikiPortletInstanceOverriddenConfiguration.visibleNodes();
nodes = WikiUtil.orderNodes(nodes, visibleNodeNames);
String[] hiddenNodes =
wikiPortletInstanceOverriddenConfiguration.hiddenNodes();
Arrays.sort(hiddenNodes);
for (WikiNode node : nodes) {
if ((Arrays.binarySearch(hiddenNodes, node.getName()) < 0) &&
WikiNodePermissionChecker.contains(
permissionChecker, node, ActionKeys.VIEW)) {
return node;
}
}
return null;
}
public static WikiNode getFirstVisibleNode(PortletRequest portletRequest)
throws PortalException {
ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);
WikiNode node = null;
int nodesCount = WikiNodeLocalServiceUtil.getNodesCount(
themeDisplay.getScopeGroupId());
if (nodesCount == 0) {
Layout layout = themeDisplay.getLayout();
ServiceContext serviceContext = ServiceContextFactory.getInstance(
WikiNode.class.getName(), portletRequest);
serviceContext.setAddGroupPermissions(true);
if (layout.isPublicLayout() || layout.isTypeControlPanel()) {
serviceContext.setAddGuestPermissions(true);
}
else {
serviceContext.setAddGuestPermissions(false);
}
node = WikiNodeLocalServiceUtil.addDefaultNode(
themeDisplay.getDefaultUserId(), serviceContext);
}
else {
node = getFirstNode(portletRequest);
if (node == null) {
throw new PrincipalException();
}
return node;
}
return node;
}
public static WikiPage getFirstVisiblePage(
long nodeId, PortletRequest portletRequest)
throws PortalException {
ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);
WikiWebComponentProvider wikiWebComponentProvider =
WikiWebComponentProvider.getWikiWebComponentProvider();
WikiGroupServiceConfiguration wikiGroupServiceConfiguration =
wikiWebComponentProvider.getWikiGroupServiceConfiguration();
WikiPage page = WikiPageLocalServiceUtil.fetchPage(
nodeId, wikiGroupServiceConfiguration.frontPageName(), 0);
if (page == null) {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
WikiPage.class.getName(), portletRequest);
serviceContext.setAddGuestPermissions(true);
serviceContext.setAddGroupPermissions(true);
boolean workflowEnabled = WorkflowThreadLocal.isEnabled();
try {
WorkflowThreadLocal.setEnabled(false);
page = WikiPageLocalServiceUtil.addPage(
themeDisplay.getDefaultUserId(), nodeId,
wikiGroupServiceConfiguration.frontPageName(), null,
WikiPageConstants.NEW, true, serviceContext);
}
finally {
WorkflowThreadLocal.setEnabled(workflowEnabled);
}
}
return page;
}
public static String getHtmlDiffResult(
double sourceVersion, double targetVersion,
PortletRequest portletRequest, PortletResponse portletResponse,
WikiEngineRenderer wikiEngineRenderer)
throws Exception {
ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);
long nodeId = ParamUtil.getLong(portletRequest, "nodeId");
String title = ParamUtil.getString(portletRequest, "title");
WikiPage sourcePage = WikiPageServiceUtil.getPage(
nodeId, title, sourceVersion);
WikiPage targetPage = WikiPageServiceUtil.getPage(
nodeId, title, targetVersion);
LiferayPortletResponse liferayPortletResponse =
PortalUtil.getLiferayPortletResponse(portletResponse);
PortletURL viewPageURL = liferayPortletResponse.createRenderURL();
viewPageURL.setParameter("mvcRenderCommandName", "wiki/view");
WikiNode sourceNode = sourcePage.getNode();
viewPageURL.setParameter("nodeName", sourceNode.getName());
PortletURL editPageURL = liferayPortletResponse.createRenderURL();
editPageURL.setParameter("mvcRenderCommandName", "wiki/edit_page");
editPageURL.setParameter("nodeId", String.valueOf(nodeId));
editPageURL.setParameter("title", title);
String attachmentURLPrefix = WikiUtil.getAttachmentURLPrefix(
themeDisplay.getPathMain(), themeDisplay.getPlid(), nodeId, title);
return wikiEngineRenderer.diffHtml(
sourcePage, targetPage, viewPageURL, editPageURL,
attachmentURLPrefix);
}
public static WikiNode getNode(PortletRequest portletRequest)
throws Exception {
HttpServletRequest request = PortalUtil.getHttpServletRequest(
portletRequest);
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
long nodeId = ParamUtil.getLong(portletRequest, "nodeId");
String nodeName = ParamUtil.getString(portletRequest, "nodeName");
WikiNode node = null;
try {
if (nodeId > 0) {
node = WikiNodeServiceUtil.getNode(nodeId);
}
else if (Validator.isNotNull(nodeName)) {
node = WikiNodeServiceUtil.getNode(
themeDisplay.getScopeGroupId(), nodeName);
}
else {
throw new NoSuchNodeException();
}
}
catch (NoSuchNodeException nsne) {
node = getFirstVisibleNode(portletRequest);
}
return node;
}
public static List<WikiNode> getNodes(PortletRequest portletRequest)
throws PortalException {
long[] nodeIds = ParamUtil.getLongValues(
portletRequest, "rowIdsWikiNode");
if (nodeIds.length == 0) {
return Collections.emptyList();
}
List<WikiNode> nodes = new ArrayList<>();
for (long nodeId : nodeIds) {
if (nodeId != 0) {
nodes.add(WikiNodeServiceUtil.getNode(nodeId));
}
}
return nodes;
}
public static WikiPage getPage(PortletRequest portletRequest)
throws Exception {
HttpServletRequest request = PortalUtil.getHttpServletRequest(
portletRequest);
long nodeId = ParamUtil.getLong(request, "nodeId");
String title = ParamUtil.getString(request, "title");
double version = ParamUtil.getDouble(request, "version");
WikiNode node = null;
try {
if (nodeId > 0) {
node = WikiNodeServiceUtil.getNode(nodeId);
}
}
catch (NoSuchNodeException nsne) {
}
if (node == null) {
node = (WikiNode)request.getAttribute(WikiWebKeys.WIKI_NODE);
if (node != null) {
nodeId = node.getNodeId();
}
}
WikiWebComponentProvider wikiWebComponentProvider =
WikiWebComponentProvider.getWikiWebComponentProvider();
WikiGroupServiceConfiguration wikiGroupServiceConfiguration =
wikiWebComponentProvider.getWikiGroupServiceConfiguration();
if (Validator.isNull(title)) {
title = wikiGroupServiceConfiguration.frontPageName();
}
try {
return WikiPageServiceUtil.getPage(nodeId, title, version);
}
catch (NoSuchPageException nspe) {
if (title.equals(wikiGroupServiceConfiguration.frontPageName()) &&
(version == 0)) {
return getFirstVisiblePage(nodeId, portletRequest);
}
else {
throw nspe;
}
}
}
public static List<WikiPage> getPages(PortletRequest portletRequest)
throws PortalException {
long nodeId = ParamUtil.getLong(portletRequest, "nodeId");
String[] titles = ParamUtil.getStringValues(
portletRequest, "rowIdsWikiPage");
if (titles.length == 0) {
return Collections.emptyList();
}
List<WikiPage> pages = new ArrayList<>();
for (String title : titles) {
if (Validator.isNotNull(title)) {
pages.add(WikiPageServiceUtil.getPage(nodeId, title));
}
}
return pages;
}
public static String viewNode(
RenderRequest renderRequest, String defaultForward)
throws PortletException {
try {
WikiNode node = getNode(renderRequest);
renderRequest.setAttribute(WikiWebKeys.WIKI_NODE, node);
getFirstVisiblePage(node.getNodeId(), renderRequest);
}
catch (Exception e) {
if (e instanceof NoSuchNodeException ||
e instanceof PrincipalException) {
SessionErrors.add(renderRequest, e.getClass());
return "/wiki/error.jsp";
}
else {
throw new PortletException(e);
}
}
long categoryId = ParamUtil.getLong(renderRequest, "categoryId");
String tag = ParamUtil.getString(renderRequest, "tag");
if ((categoryId > 0) || Validator.isNotNull(tag)) {
return "/wiki/view_categorized_pages.jsp";
}
else {
return defaultForward;
}
}
}