/**
* 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.service.impl;
import com.liferay.exportimport.kernel.staging.StagingUtil;
import com.liferay.portal.kernel.dao.orm.Criterion;
import com.liferay.portal.kernel.dao.orm.Disjunction;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
import com.liferay.portal.kernel.dao.orm.Junction;
import com.liferay.portal.kernel.dao.orm.Property;
import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.workflow.kaleo.exception.NoSuchInstanceException;
import com.liferay.portal.workflow.kaleo.model.KaleoInstance;
import com.liferay.portal.workflow.kaleo.model.KaleoInstanceToken;
import com.liferay.portal.workflow.kaleo.runtime.util.WorkflowContextUtil;
import com.liferay.portal.workflow.kaleo.service.base.KaleoInstanceLocalServiceBaseImpl;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author Brian Wing Shun Chan
* @author Marcellus Tavares
*/
public class KaleoInstanceLocalServiceImpl
extends KaleoInstanceLocalServiceBaseImpl {
@Override
public KaleoInstance addKaleoInstance(
long kaleoDefinitionId, String kaleoDefinitionName,
int kaleoDefinitionVersion,
Map<String, Serializable> workflowContext,
ServiceContext serviceContext)
throws PortalException {
User user = userLocalService.fetchUser(serviceContext.getUserId());
if (user == null) {
user = userLocalService.getDefaultUser(
serviceContext.getCompanyId());
}
Date now = new Date();
long kaleoInstanceId = counterLocalService.increment();
KaleoInstance kaleoInstance = kaleoInstancePersistence.create(
kaleoInstanceId);
long groupId = StagingUtil.getLiveGroupId(
serviceContext.getScopeGroupId());
kaleoInstance.setGroupId(groupId);
kaleoInstance.setCompanyId(user.getCompanyId());
kaleoInstance.setUserId(user.getUserId());
kaleoInstance.setUserName(user.getFullName());
kaleoInstance.setCreateDate(now);
kaleoInstance.setModifiedDate(now);
kaleoInstance.setKaleoDefinitionId(kaleoDefinitionId);
kaleoInstance.setKaleoDefinitionName(kaleoDefinitionName);
kaleoInstance.setKaleoDefinitionVersion(kaleoDefinitionVersion);
kaleoInstance.setClassName(
(String)workflowContext.get(
WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME));
if (workflowContext.containsKey(
WorkflowConstants.CONTEXT_ENTRY_CLASS_PK)) {
kaleoInstance.setClassPK(
GetterUtil.getLong(
(String)workflowContext.get(
WorkflowConstants.CONTEXT_ENTRY_CLASS_PK)));
}
kaleoInstance.setCompleted(false);
kaleoInstance.setWorkflowContext(
WorkflowContextUtil.convert(workflowContext));
kaleoInstancePersistence.update(kaleoInstance);
return kaleoInstance;
}
@Override
public KaleoInstance completeKaleoInstance(long kaleoInstanceId)
throws PortalException {
KaleoInstance kaleoInstance = kaleoInstancePersistence.findByPrimaryKey(
kaleoInstanceId);
kaleoInstance.setCompleted(true);
kaleoInstance.setCompletionDate(new Date());
kaleoInstancePersistence.update(kaleoInstance);
return kaleoInstance;
}
@Override
public void deleteCompanyKaleoInstances(long companyId) {
// Kaleo instances
kaleoInstancePersistence.removeByCompanyId(companyId);
// Kaleo instance tokens
kaleoInstanceTokenLocalService.deleteKaleoDefinitionKaleoInstanceTokens(
companyId);
// Kaleo logs
kaleoLogLocalService.deleteKaleoDefinitionKaleoLogs(companyId);
// Kaleo task instance tokens
kaleoTaskInstanceTokenLocalService.
deleteKaleoDefinitionKaleoTaskInstanceTokens(companyId);
}
@Override
public void deleteKaleoDefinitionKaleoInstances(long kaleoDefinitionId) {
// Kaleo instances
kaleoInstancePersistence.removeByKaleoDefinitionId(kaleoDefinitionId);
// Kaleo instance tokens
kaleoInstanceTokenLocalService.deleteKaleoDefinitionKaleoInstanceTokens(
kaleoDefinitionId);
// Kaleo logs
kaleoLogLocalService.deleteKaleoDefinitionKaleoLogs(kaleoDefinitionId);
// Kaleo task instance tokens
kaleoTaskInstanceTokenLocalService.
deleteKaleoDefinitionKaleoTaskInstanceTokens(kaleoDefinitionId);
}
@Override
public KaleoInstance deleteKaleoInstance(long kaleoInstanceId) {
KaleoInstance kaleoInstance = null;
try {
kaleoInstance = kaleoInstancePersistence.remove(kaleoInstanceId);
}
catch (NoSuchInstanceException nsie) {
return null;
}
// Kaleo instance tokens
kaleoInstanceTokenLocalService.deleteKaleoInstanceKaleoInstanceTokens(
kaleoInstanceId);
// Kaleo logs
kaleoLogLocalService.deleteKaleoInstanceKaleoLogs(kaleoInstanceId);
// Kaleo task instance tokens
kaleoTaskInstanceTokenLocalService.
deleteKaleoInstanceKaleoTaskInstanceTokens(kaleoInstanceId);
// Kaleo timer instance tokens
kaleoTimerInstanceTokenLocalService.deleteKaleoTimerInstanceTokens(
kaleoInstanceId);
return kaleoInstance;
}
@Override
public List<KaleoInstance> getKaleoInstances(
Long userId, String assetClassName, Long assetClassPK,
Boolean completed, int start, int end,
OrderByComparator<KaleoInstance> orderByComparator,
ServiceContext serviceContext) {
DynamicQuery dynamicQuery = buildDynamicQuery(
userId, assetClassName, assetClassPK, completed, serviceContext);
return dynamicQuery(dynamicQuery, start, end, orderByComparator);
}
@Override
public List<KaleoInstance> getKaleoInstances(
Long userId, String[] assetClassNames, Boolean completed, int start,
int end, OrderByComparator<KaleoInstance> orderByComparator,
ServiceContext serviceContext) {
DynamicQuery dynamicQuery = buildDynamicQuery(
userId, assetClassNames, null, completed, serviceContext);
return dynamicQuery(dynamicQuery, start, end, orderByComparator);
}
@Override
public List<KaleoInstance> getKaleoInstances(
String kaleoDefinitionName, int kaleoDefinitionVersion,
boolean completed, int start, int end,
OrderByComparator<KaleoInstance> orderByComparator,
ServiceContext serviceContext) {
DynamicQuery dynamicQuery = buildDynamicQuery(
kaleoDefinitionName, kaleoDefinitionVersion, completed,
serviceContext);
return dynamicQuery(dynamicQuery, start, end, orderByComparator);
}
@Override
public int getKaleoInstancesCount(
long kaleoDefinitionId, boolean completed) {
return kaleoInstancePersistence.countByKDI_C(
kaleoDefinitionId, completed);
}
@Override
public int getKaleoInstancesCount(
Long userId, String assetClassName, Long assetClassPK,
Boolean completed, ServiceContext serviceContext) {
DynamicQuery dynamicQuery = buildDynamicQuery(
userId, assetClassName, assetClassPK, completed, serviceContext);
return (int)dynamicQueryCount(dynamicQuery);
}
@Override
public int getKaleoInstancesCount(
Long userId, String[] assetClassNames, Boolean completed,
ServiceContext serviceContext) {
DynamicQuery dynamicQuery = buildDynamicQuery(
userId, assetClassNames, null, completed, serviceContext);
return (int)dynamicQueryCount(dynamicQuery);
}
@Override
public int getKaleoInstancesCount(
String kaleoDefinitionName, int kaleoDefinitionVersion,
boolean completed, ServiceContext serviceContext) {
DynamicQuery dynamicQuery = buildDynamicQuery(
kaleoDefinitionName, kaleoDefinitionVersion, completed,
serviceContext);
return (int)dynamicQueryCount(dynamicQuery);
}
@Override
public List<KaleoInstance> search(
Long userId, String assetType, String nodeName,
String kaleoDefinitionName, Boolean completed, int start, int end,
OrderByComparator<KaleoInstance> orderByComparator,
ServiceContext serviceContext) {
DynamicQuery dynamicQuery = buildDynamicQuery(
userId, assetType, nodeName, kaleoDefinitionName, completed,
serviceContext);
return dynamicQuery(dynamicQuery, start, end, orderByComparator);
}
@Override
public int searchCount(
Long userId, String assetType, String nodeName,
String kaleoDefinitionName, Boolean completed,
ServiceContext serviceContext) {
DynamicQuery dynamicQuery = buildDynamicQuery(
userId, assetType, nodeName, kaleoDefinitionName, completed,
serviceContext);
return (int)dynamicQueryCount(dynamicQuery);
}
@Override
public KaleoInstance updateKaleoInstance(
long kaleoInstanceId, Map<String, Serializable> workflowContext,
ServiceContext serviceContext)
throws PortalException {
KaleoInstance kaleoInstance = kaleoInstancePersistence.findByPrimaryKey(
kaleoInstanceId);
kaleoInstance.setWorkflowContext(
WorkflowContextUtil.convert(workflowContext));
kaleoInstancePersistence.update(kaleoInstance);
return kaleoInstance;
}
protected DynamicQuery buildDynamicQuery(
Long userId, String assetClassName, Long assetClassPK,
Boolean completed, ServiceContext serviceContext) {
String[] assetClassNames = null;
if (Validator.isNotNull(assetClassName)) {
assetClassNames = new String[] {assetClassName};
}
Long[] assetClassPKs = null;
if (Validator.isNotNull(assetClassPK)) {
assetClassPKs = new Long[] {assetClassPK};
}
return buildDynamicQuery(
userId, assetClassNames, assetClassPKs, completed, serviceContext);
}
protected DynamicQuery buildDynamicQuery(
Long userId, String assetType, String nodeName,
String kaleoDefinitionName, Boolean completed,
ServiceContext serviceContext) {
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
KaleoInstance.class, getClassLoader());
Property companyIdProperty = PropertyFactoryUtil.forName("companyId");
dynamicQuery.add(companyIdProperty.eq(serviceContext.getCompanyId()));
if (Validator.isNotNull(userId)) {
Property userIdProperty = PropertyFactoryUtil.forName("userId");
dynamicQuery.add(userIdProperty.eq(userId));
}
if (completed != null) {
if (completed) {
Property completionDateProperty = PropertyFactoryUtil.forName(
"completionDate");
dynamicQuery.add(completionDateProperty.isNotNull());
}
else {
Property completionDateProperty = PropertyFactoryUtil.forName(
"completionDate");
dynamicQuery.add(completionDateProperty.isNull());
}
}
Junction junction = RestrictionsFactoryUtil.disjunction();
if (Validator.isNotNull(assetType)) {
Property classNameProperty = PropertyFactoryUtil.forName(
"className");
junction.add(classNameProperty.like(assetType));
}
if (Validator.isNotNull(kaleoDefinitionName)) {
Property kaleoDefinitionNameProperty = PropertyFactoryUtil.forName(
"kaleoDefinitionName");
junction.add(kaleoDefinitionNameProperty.eq(kaleoDefinitionName));
}
if (Validator.isNotNull(nodeName)) {
Property kaleoInstanceIdProperty = PropertyFactoryUtil.forName(
"kaleoInstanceId");
DynamicQuery subdynamicQuery = DynamicQueryFactoryUtil.forClass(
KaleoInstanceToken.class,
getClassLoader()).setProjection(kaleoInstanceIdProperty);
Property currentKaleoNodeNameProperty = PropertyFactoryUtil.forName(
"currentKaleoNodeName");
subdynamicQuery.add(currentKaleoNodeNameProperty.like(nodeName));
junction.add(kaleoInstanceIdProperty.in(subdynamicQuery));
}
dynamicQuery.add(junction);
return dynamicQuery;
}
protected DynamicQuery buildDynamicQuery(
Long userId, String[] assetClassNames, Long[] assetClassPKs,
Boolean completed, ServiceContext serviceContext) {
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
KaleoInstance.class, getClassLoader());
Property companyIdProperty = PropertyFactoryUtil.forName("companyId");
dynamicQuery.add(companyIdProperty.eq(serviceContext.getCompanyId()));
if (userId != null) {
Property userIdProperty = PropertyFactoryUtil.forName("userId");
dynamicQuery.add(userIdProperty.eq(userId));
}
if (ArrayUtil.isNotEmpty(assetClassNames)) {
dynamicQuery.add(getAssetClassNames(assetClassNames));
}
if (ArrayUtil.isNotEmpty(assetClassPKs)) {
dynamicQuery.add(getAssetClassPKs(assetClassPKs));
}
if (completed != null) {
if (completed) {
Property completionDateProperty = PropertyFactoryUtil.forName(
"completionDate");
dynamicQuery.add(completionDateProperty.isNotNull());
}
else {
Property completionDateProperty = PropertyFactoryUtil.forName(
"completionDate");
dynamicQuery.add(completionDateProperty.isNull());
}
}
return dynamicQuery;
}
protected DynamicQuery buildDynamicQuery(
String kaleoDefinitionName, int kaleoDefinitionVersion,
boolean completed, ServiceContext serviceContext) {
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
KaleoInstance.class, getClassLoader());
Property companyIdProperty = PropertyFactoryUtil.forName("companyId");
dynamicQuery.add(companyIdProperty.eq(serviceContext.getCompanyId()));
Property kaleoDefinitionNameProperty = PropertyFactoryUtil.forName(
"kaleoDefinitionName");
dynamicQuery.add(kaleoDefinitionNameProperty.eq(kaleoDefinitionName));
Property kaleoDefinitionVersionProperty = PropertyFactoryUtil.forName(
"kaleoDefinitionVersion");
dynamicQuery.add(
kaleoDefinitionVersionProperty.eq(kaleoDefinitionVersion));
if (completed) {
Property completionDateProperty = PropertyFactoryUtil.forName(
"completionDate");
dynamicQuery.add(completionDateProperty.isNotNull());
}
else {
Property completionDateProperty = PropertyFactoryUtil.forName(
"completionDate");
dynamicQuery.add(completionDateProperty.isNull());
}
return dynamicQuery;
}
protected Criterion getAssetClassNames(String[] assetClassNames) {
Disjunction disjunction = RestrictionsFactoryUtil.disjunction();
for (String assetClassName : assetClassNames) {
Property classNameProperty = PropertyFactoryUtil.forName(
"className");
disjunction.add(classNameProperty.like(assetClassName));
}
return disjunction;
}
protected Criterion getAssetClassPKs(Long[] assetClassPKs) {
Disjunction disjunction = RestrictionsFactoryUtil.disjunction();
for (Long assetClassPK : assetClassPKs) {
Property classPKProperty = PropertyFactoryUtil.forName("classPK");
disjunction.add(classPKProperty.eq(assetClassPK));
}
return disjunction;
}
}