/**
* 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.workflow.definition.link.web.internal.display.context;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.NoSuchWorkflowDefinitionLinkException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.WorkflowDefinitionLink;
import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
import com.liferay.portal.kernel.portlet.PortalPreferences;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portal.kernel.security.permission.ResourceActionsUtil;
import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalService;
import com.liferay.portal.kernel.theme.PortletDisplay;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.AggregatePredicateFilter;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.PredicateFilter;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.kernel.workflow.WorkflowDefinition;
import com.liferay.portal.kernel.workflow.WorkflowDefinitionManagerUtil;
import com.liferay.portal.kernel.workflow.WorkflowHandler;
import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil;
import com.liferay.portal.kernel.workflow.comparator.WorkflowComparatorFactoryUtil;
import com.liferay.portal.workflow.definition.link.web.internal.constants.WorkflowDefinitionLinkPortletKeys;
import com.liferay.portal.workflow.definition.link.web.internal.display.context.util.WorkflowDefinitionLinkRequestHelper;
import com.liferay.portal.workflow.definition.link.web.internal.search.WorkflowDefinitionLinkSearch;
import com.liferay.portal.workflow.definition.link.web.internal.search.WorkflowDefinitionLinkSearchEntry;
import com.liferay.portal.workflow.definition.link.web.internal.search.WorkflowDefinitionLinkSearchTerms;
import com.liferay.portal.workflow.definition.link.web.internal.util.WorkflowDefinitionLinkPortletUtil;
import com.liferay.portal.workflow.definition.link.web.internal.util.filter.WorkflowDefinitionLinkSearchEntryLabelPredicateFilter;
import com.liferay.portal.workflow.definition.link.web.internal.util.filter.WorkflowDefinitionLinkSearchEntryResourcePredicateFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.http.HttpServletRequest;
/**
* @author Leonardo Barros
*/
public class WorkflowDefinitionLinkDisplayContext {
public WorkflowDefinitionLinkDisplayContext(
RenderRequest renderRequest, RenderResponse renderResponse,
WorkflowDefinitionLinkLocalService
workflowDefinitionLinkLocalService)
throws PortalException {
_workflowDefinitionLinkLocalService =
workflowDefinitionLinkLocalService;
_liferayPortletRequest = PortalUtil.getLiferayPortletRequest(
renderRequest);
_liferayPortletResponse = PortalUtil.getLiferayPortletResponse(
renderResponse);
_request = PortalUtil.getHttpServletRequest(renderRequest);
_workflowDefinitionLinkRequestHelper =
new WorkflowDefinitionLinkRequestHelper(renderRequest);
_portalPreferences = PortletPreferencesFactoryUtil.getPortalPreferences(
_request);
}
public String getDefaultWorkflowDefinitionLabel(String className)
throws PortalException {
if (isControlPanelPortlet()) {
return LanguageUtil.get(
_workflowDefinitionLinkRequestHelper.getRequest(),
"no-workflow");
}
try {
WorkflowDefinitionLink defaultWorkflowDefinitionLink =
_workflowDefinitionLinkLocalService.
getDefaultWorkflowDefinitionLink(
_workflowDefinitionLinkRequestHelper.getCompanyId(),
className, 0, 0);
return defaultWorkflowDefinitionLink.getWorkflowDefinitionName();
}
catch (NoSuchWorkflowDefinitionLinkException nswdle) {
// LPS-52675
if (_log.isDebugEnabled()) {
_log.debug(nswdle, nswdle);
}
return LanguageUtil.get(
_workflowDefinitionLinkRequestHelper.getRequest(),
"no-workflow");
}
}
public long getGroupId() {
if (isControlPanelPortlet()) {
return WorkflowConstants.DEFAULT_GROUP_ID;
}
ThemeDisplay themeDisplay =
_workflowDefinitionLinkRequestHelper.getThemeDisplay();
return themeDisplay.getSiteGroupIdOrLiveGroupId();
}
public String getOrderByCol() {
if (_orderByCol != null) {
return _orderByCol;
}
_orderByCol = ParamUtil.getString(_request, "orderByCol");
if (Validator.isNull(_orderByCol)) {
_orderByCol = _portalPreferences.getValue(
WorkflowDefinitionLinkPortletKeys.
WORKFLOW_DEFINITION_LINK_CONTROL_PANEL,
"order-by-col", "resource");
}
else {
boolean saveOrderBy = ParamUtil.getBoolean(_request, "saveOrderBy");
if (saveOrderBy) {
_portalPreferences.setValue(
WorkflowDefinitionLinkPortletKeys.
WORKFLOW_DEFINITION_LINK_CONTROL_PANEL,
"order-by-col", _orderByCol);
}
}
return _orderByCol;
}
public String getOrderByType() {
if (_orderByType != null) {
return _orderByType;
}
_orderByType = ParamUtil.getString(_request, "orderByType");
if (Validator.isNull(_orderByType)) {
_orderByType = _portalPreferences.getValue(
WorkflowDefinitionLinkPortletKeys.
WORKFLOW_DEFINITION_LINK_CONTROL_PANEL,
"order-by-type", "asc");
}
else {
boolean saveOrderBy = ParamUtil.getBoolean(_request, "saveOrderBy");
if (saveOrderBy) {
_portalPreferences.setValue(
WorkflowDefinitionLinkPortletKeys.
WORKFLOW_DEFINITION_LINK_CONTROL_PANEL,
"order-by-type", _orderByType);
}
}
return _orderByType;
}
public PortletURL getPortletURL() throws PortalException {
PortletURL portletURL = _liferayPortletResponse.createRenderURL();
portletURL.setParameter("mvcPath", "/view.jsp");
portletURL.setParameter("tabs1", "default-configuration");
String delta = ParamUtil.getString(_request, "delta");
if (Validator.isNotNull(delta)) {
portletURL.setParameter("delta", delta);
}
String keywords = ParamUtil.getString(_request, "keywords");
if (Validator.isNotNull(keywords)) {
portletURL.setParameter("keywords", keywords);
}
return portletURL;
}
public WorkflowDefinitionLinkSearch getSearchContainer()
throws PortalException {
WorkflowDefinitionLinkSearch searchContainer =
new WorkflowDefinitionLinkSearch(
_liferayPortletRequest, getPortletURL());
WorkflowDefinitionLinkSearchTerms searchTerms =
(WorkflowDefinitionLinkSearchTerms)searchContainer.getSearchTerms();
OrderByComparator<WorkflowDefinitionLinkSearchEntry> orderByComparator =
WorkflowDefinitionLinkPortletUtil.
getWorkflowDefinitionLinkOrderByComparator(
getOrderByCol(), getOrderByType());
searchContainer.setOrderByCol(getOrderByCol());
searchContainer.setOrderByComparator(orderByComparator);
searchContainer.setOrderByType(getOrderByType());
List<WorkflowDefinitionLinkSearchEntry>
workflowDefinitionLinkSearchEntries =
createWorkflowDefinitionLinkSearchEntryList();
if (searchTerms.isAdvancedSearch()) {
workflowDefinitionLinkSearchEntries = filter(
workflowDefinitionLinkSearchEntries, searchTerms.getResource(),
searchTerms.getWorkflow(), searchTerms.isAndOperator());
}
else {
workflowDefinitionLinkSearchEntries = filter(
workflowDefinitionLinkSearchEntries, searchTerms.getKeywords(),
searchTerms.getKeywords(), false);
}
int total = workflowDefinitionLinkSearchEntries.size();
searchContainer.setTotal(total);
Collections.sort(
workflowDefinitionLinkSearchEntries,
searchContainer.getOrderByComparator());
List<WorkflowDefinitionLinkSearchEntry> results = ListUtil.subList(
workflowDefinitionLinkSearchEntries, searchContainer.getStart(),
searchContainer.getEnd());
searchContainer.setResults(results);
return searchContainer;
}
public String getWorkflowDefinitionLabel(
WorkflowDefinition workflowDefinition) {
String workflowDefinitionName = HtmlUtil.escape(
workflowDefinition.getName());
String workflowDefinitionVersion = LanguageUtil.format(
_workflowDefinitionLinkRequestHelper.getLocale(), "version-x",
workflowDefinition.getVersion(), false);
return workflowDefinitionName + " (" + workflowDefinitionVersion + ")";
}
public List<WorkflowDefinition> getWorkflowDefinitions()
throws PortalException {
return WorkflowDefinitionManagerUtil.getActiveWorkflowDefinitions(
_workflowDefinitionLinkRequestHelper.getCompanyId(),
QueryUtil.ALL_POS, QueryUtil.ALL_POS,
WorkflowComparatorFactoryUtil.getDefinitionNameComparator(true));
}
public String getWorkflowDefinitionValue(
WorkflowDefinition workflowDefinition) {
return HtmlUtil.escapeAttribute(workflowDefinition.getName()) +
StringPool.AT + workflowDefinition.getVersion();
}
public boolean isWorkflowDefinitionSelected(
WorkflowDefinition workflowDefinition, String className)
throws PortalException {
WorkflowDefinitionLink workflowDefinitionLink =
getWorkflowDefinitionLink(className);
if (workflowDefinitionLink == null) {
return false;
}
if (workflowDefinitionLink.getWorkflowDefinitionName().equals(
workflowDefinition.getName()) &&
(workflowDefinitionLink.getWorkflowDefinitionVersion() ==
workflowDefinition.getVersion())) {
return true;
}
return false;
}
protected PredicateFilter<WorkflowDefinitionLinkSearchEntry>
createPredicateFilter(
String resource, String workflowDefinitionLabel,
boolean andOperator) {
AggregatePredicateFilter<WorkflowDefinitionLinkSearchEntry>
aggregatePredicateFilter = new AggregatePredicateFilter<>(
new WorkflowDefinitionLinkSearchEntryResourcePredicateFilter(
resource));
if (andOperator) {
aggregatePredicateFilter.and(
new WorkflowDefinitionLinkSearchEntryLabelPredicateFilter(
workflowDefinitionLabel));
}
else {
aggregatePredicateFilter.or(
new WorkflowDefinitionLinkSearchEntryLabelPredicateFilter(
workflowDefinitionLabel));
}
return aggregatePredicateFilter;
}
protected WorkflowDefinitionLinkSearchEntry
createWorkflowDefinitionLinkSearchEntry(
WorkflowHandler<?> workflowHandler)
throws PortalException {
String resource = ResourceActionsUtil.getModelResource(
_workflowDefinitionLinkRequestHelper.getLocale(),
workflowHandler.getClassName());
String workflowDefinitionLabel = getWorkflowDefinitionLabel(
workflowHandler);
return new WorkflowDefinitionLinkSearchEntry(
workflowHandler.getClassName(), resource, workflowDefinitionLabel);
}
protected List<WorkflowDefinitionLinkSearchEntry>
createWorkflowDefinitionLinkSearchEntryList()
throws PortalException {
List<WorkflowDefinitionLinkSearchEntry>
workflowDefinitionLinkSearchEntries = new ArrayList<>();
for (WorkflowHandler<?> workflowHandler : getWorkflowHandlers()) {
WorkflowDefinitionLinkSearchEntry
workflowDefinitionLinkSearchEntry =
createWorkflowDefinitionLinkSearchEntry(workflowHandler);
workflowDefinitionLinkSearchEntries.add(
workflowDefinitionLinkSearchEntry);
}
return workflowDefinitionLinkSearchEntries;
}
protected List<WorkflowDefinitionLinkSearchEntry> filter(
List<WorkflowDefinitionLinkSearchEntry>
workflowDefinitionLinkSearchEntries, String resource,
String workflowDefinitionLabel, boolean andOperator) {
if (Validator.isNull(resource) &&
Validator.isNull(workflowDefinitionLabel)) {
return workflowDefinitionLinkSearchEntries;
}
PredicateFilter<WorkflowDefinitionLinkSearchEntry> predicateFilter =
createPredicateFilter(
resource, workflowDefinitionLabel, andOperator);
return ListUtil.filter(
workflowDefinitionLinkSearchEntries, predicateFilter);
}
protected String getPortletName() {
ThemeDisplay themeDisplay =
_workflowDefinitionLinkRequestHelper.getThemeDisplay();
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
return portletDisplay.getPortletName();
}
protected String getWorkflowDefinitionLabel(
WorkflowHandler<?> workflowHandler)
throws PortalException {
List<WorkflowDefinition> workflowDefinitions = getWorkflowDefinitions();
for (WorkflowDefinition workflowDefinition : workflowDefinitions) {
if (isWorkflowDefinitionSelected(
workflowDefinition, workflowHandler.getClassName())) {
return getWorkflowDefinitionLabel(workflowDefinition);
}
}
return getDefaultWorkflowDefinitionLabel(
workflowHandler.getClassName());
}
protected WorkflowDefinitionLink getWorkflowDefinitionLink(String className)
throws PortalException {
try {
if (isControlPanelPortlet()) {
return _workflowDefinitionLinkLocalService.
getDefaultWorkflowDefinitionLink(
_workflowDefinitionLinkRequestHelper.getCompanyId(),
className, 0, 0);
}
else {
return _workflowDefinitionLinkLocalService.
getWorkflowDefinitionLink(
_workflowDefinitionLinkRequestHelper.getCompanyId(),
getGroupId(), className, 0, 0, true);
}
}
catch (NoSuchWorkflowDefinitionLinkException nswdle) {
// LPS-52675
if (_log.isDebugEnabled()) {
_log.debug(nswdle, nswdle);
}
return null;
}
}
protected List<WorkflowHandler<?>> getWorkflowHandlers() {
List<WorkflowHandler<?>> workflowHandlers = null;
if (isControlPanelPortlet()) {
workflowHandlers =
WorkflowHandlerRegistryUtil.getWorkflowHandlers();
}
else {
workflowHandlers =
WorkflowHandlerRegistryUtil.getScopeableWorkflowHandlers();
}
PredicateFilter<WorkflowHandler<?>> predicateFilter =
new PredicateFilter<WorkflowHandler<?>>() {
@Override
public boolean filter(WorkflowHandler<?> workflowHandler) {
return workflowHandler.isVisible();
}
};
return ListUtil.filter(workflowHandlers, predicateFilter);
}
protected boolean isControlPanelPortlet() {
String portletName = getPortletName();
if (portletName.equals(
WorkflowDefinitionLinkPortletKeys.
WORKFLOW_DEFINITION_LINK_CONTROL_PANEL)) {
return true;
}
return false;
}
private static final Log _log = LogFactoryUtil.getLog(
WorkflowDefinitionLinkDisplayContext.class);
private final LiferayPortletRequest _liferayPortletRequest;
private final LiferayPortletResponse _liferayPortletResponse;
private String _orderByCol;
private String _orderByType;
private final PortalPreferences _portalPreferences;
private final HttpServletRequest _request;
private final WorkflowDefinitionLinkLocalService
_workflowDefinitionLinkLocalService;
private final WorkflowDefinitionLinkRequestHelper
_workflowDefinitionLinkRequestHelper;
}