/**
* 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.kaleo.runtime.internal.manager;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Company;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.model.RoleConstants;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.model.WorkflowDefinitionLink;
import com.liferay.portal.kernel.service.CompanyLocalService;
import com.liferay.portal.kernel.service.GroupLocalService;
import com.liferay.portal.kernel.service.RoleLocalService;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalService;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.workflow.WorkflowDefinition;
import com.liferay.portal.kernel.workflow.WorkflowDefinitionManager;
import com.liferay.portal.kernel.workflow.comparator.WorkflowComparatorFactory;
import com.liferay.portal.spring.extender.service.ServiceReference;
import com.liferay.portal.workflow.kaleo.runtime.internal.BaseKaleoBean;
import com.liferay.portal.workflow.kaleo.runtime.manager.PortalKaleoManager;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* @author Michael C. Han
*/
public class DefaultPortalKaleoManager
extends BaseKaleoBean implements PortalKaleoManager {
@Override
public void deleteKaleoData(long companyId) throws Exception {
kaleoDefinitionLocalService.deleteCompanyKaleoDefinitions(companyId);
kaleoLogLocalService.deleteCompanyKaleoLogs(companyId);
}
@Override
public void deployDefaultDefinitionLink(String assetClassName)
throws Exception {
List<Company> companies = companyLocalService.getCompanies();
for (Company company : companies) {
long companyId = company.getCompanyId();
User defaultUser = userLocalService.getDefaultUser(companyId);
Group companyGroup = groupLocalService.getCompanyGroup(companyId);
String definitionName = _defaultDefinitionName;
if (_definitionAssets.containsKey(assetClassName)) {
definitionName = _definitionAssets.get(assetClassName);
}
ServiceContext serviceContext = new ServiceContext();
serviceContext.setCompanyId(companyId);
deployDefaultDefinitionLink(
defaultUser, companyId, companyGroup, assetClassName,
definitionName);
}
}
@Override
public void deployDefaultDefinitionLinks() throws Exception {
List<Company> companies = companyLocalService.getCompanies(false);
for (Company company : companies) {
deployDefaultDefinitionLinks(company.getCompanyId());
}
}
@Override
public void deployDefaultDefinitionLinks(long companyId) throws Exception {
User defaultUser = userLocalService.getDefaultUser(companyId);
Group companyGroup = groupLocalService.getCompanyGroup(companyId);
ServiceContext serviceContext = new ServiceContext();
serviceContext.setCompanyId(companyId);
for (Map.Entry<String, String> entry : _definitionAssets.entrySet()) {
String assetClassName = entry.getKey();
String definitionName = entry.getValue();
deployDefaultDefinitionLink(
defaultUser, companyId, companyGroup, assetClassName,
definitionName);
}
}
@Override
public void deployDefaultDefinitions() throws Exception {
List<Company> companies = companyLocalService.getCompanies();
for (Company company : companies) {
deployDefaultDefinitions(company.getCompanyId());
}
}
@Override
public void deployDefaultDefinitions(long companyId) throws Exception {
for (Map.Entry<String, String> entry : _definitionFiles.entrySet()) {
String definitionName = entry.getKey();
String fileName = entry.getValue();
ServiceContext serviceContext = new ServiceContext();
serviceContext.setCompanyId(companyId);
int kaleoDefinitionsCount =
kaleoDefinitionLocalService.getKaleoDefinitionsCount(
definitionName, serviceContext);
if (kaleoDefinitionsCount > 0) {
return;
}
Class<?> clazz = getClass();
ClassLoader classLoader = clazz.getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(fileName);
if (inputStream == null) {
if (_log.isWarnEnabled()) {
_log.warn(
"Unable to find definition file for " + definitionName +
" with file name " + fileName);
}
return;
}
User defaultUser = userLocalService.getDefaultUser(companyId);
_workflowDefinitionManager.deployWorkflowDefinition(
serviceContext.getCompanyId(), defaultUser.getUserId(),
definitionName, FileUtil.getBytes(inputStream));
}
}
@Override
public void deployDefaultRoles() throws Exception {
List<Company> companies = companyLocalService.getCompanies();
for (Company company : companies) {
deployDefaultRoles(company.getCompanyId());
}
}
@Override
public void deployDefaultRoles(long companyId) throws Exception {
User defaultUser = userLocalService.getDefaultUser(companyId);
for (Map.Entry<String, String> entry : _defaultRoles.entrySet()) {
String name = entry.getKey();
Role role = roleLocalService.fetchRole(companyId, name);
if (role != null) {
continue;
}
Map<Locale, String> descriptionMap = new HashMap<>();
descriptionMap.put(LocaleUtil.getDefault(), entry.getValue());
roleLocalService.addRole(
defaultUser.getUserId(), null, 0, name, null, descriptionMap,
RoleConstants.TYPE_REGULAR, null, null);
}
}
@Override
public void deployKaleoDefaults() throws Exception {
deployDefaultRoles();
deployDefaultDefinitions();
deployDefaultDefinitionLinks();
}
@Override
public void deployKaleoDefaults(long companyId) throws Exception {
deployDefaultRoles(companyId);
deployDefaultDefinitions(companyId);
deployDefaultDefinitionLinks(companyId);
}
public void setDefaultDefinitionName(String defaultDefinitionName) {
_defaultDefinitionName = defaultDefinitionName;
}
public void setDefaultRoles(Map<String, String> defaultRoles) {
_defaultRoles.putAll(defaultRoles);
}
public void setDefinitionAssets(Map<String, String> definitionAssets) {
_definitionAssets.putAll(definitionAssets);
}
public void setDefinitionFiles(Map<String, String> definitionFiles) {
_definitionFiles.putAll(definitionFiles);
}
protected void deployDefaultDefinitionLink(
User defaultUser, long companyId, Group companyGroup,
String assetClassName, String workflowDefinitionName)
throws PortalException {
WorkflowDefinitionLink workflowDefinitionLink =
workflowDefinitionLinkLocalService.
fetchDefaultWorkflowDefinitionLink(
companyId, assetClassName, 0, 0);
if (workflowDefinitionLink != null) {
return;
}
List<WorkflowDefinition> workflowDefinitions =
_workflowDefinitionManager.getActiveWorkflowDefinitions(
companyId, workflowDefinitionName, 0, 20,
workflowComparatorFactory.getDefinitionNameComparator(false));
if (workflowDefinitions.isEmpty()) {
if (_log.isWarnEnabled()) {
_log.warn(
"No workflow definitions found for " +
workflowDefinitionName);
}
return;
}
WorkflowDefinition workflowDefinition = workflowDefinitions.get(0);
workflowDefinitionLinkLocalService.addWorkflowDefinitionLink(
defaultUser.getUserId(), companyId, companyGroup.getGroupId(),
assetClassName, 0, 0, workflowDefinition.getName(),
workflowDefinition.getVersion());
}
@ServiceReference(type = CompanyLocalService.class)
protected CompanyLocalService companyLocalService;
@ServiceReference(type = GroupLocalService.class)
protected GroupLocalService groupLocalService;
@ServiceReference(type = RoleLocalService.class)
protected RoleLocalService roleLocalService;
@ServiceReference(type = UserLocalService.class)
protected UserLocalService userLocalService;
@ServiceReference(
filterString = "(proxy.bean=false)",
type = WorkflowComparatorFactory.class
)
protected WorkflowComparatorFactory workflowComparatorFactory;
@ServiceReference(type = WorkflowDefinitionLinkLocalService.class)
protected WorkflowDefinitionLinkLocalService
workflowDefinitionLinkLocalService;
private static final Log _log = LogFactoryUtil.getLog(
DefaultPortalKaleoManager.class);
private String _defaultDefinitionName;
private final Map<String, String> _defaultRoles = new HashMap<>();
private final Map<String, String> _definitionAssets = new HashMap<>();
private final Map<String, String> _definitionFiles = new HashMap<>();
@ServiceReference(
filterString = "(proxy.bean=false)",
type = WorkflowDefinitionManager.class
)
private WorkflowDefinitionManager _workflowDefinitionManager;
}