/** * 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.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.OrderByComparator; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.workflow.kaleo.definition.LogType; import com.liferay.portal.workflow.kaleo.definition.util.KaleoLogUtil; import com.liferay.portal.workflow.kaleo.exception.NoSuchLogException; import com.liferay.portal.workflow.kaleo.model.KaleoAction; import com.liferay.portal.workflow.kaleo.model.KaleoInstance; import com.liferay.portal.workflow.kaleo.model.KaleoInstanceToken; import com.liferay.portal.workflow.kaleo.model.KaleoLog; import com.liferay.portal.workflow.kaleo.model.KaleoNode; import com.liferay.portal.workflow.kaleo.model.KaleoTaskAssignmentInstance; import com.liferay.portal.workflow.kaleo.model.KaleoTaskInstanceToken; import com.liferay.portal.workflow.kaleo.runtime.util.WorkflowContextUtil; import com.liferay.portal.workflow.kaleo.service.base.KaleoLogLocalServiceBaseImpl; import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Map; /** * @author Brian Wing Shun Chan */ public class KaleoLogLocalServiceImpl extends KaleoLogLocalServiceBaseImpl { @Override public KaleoLog addActionExecutionKaleoLog( KaleoInstanceToken kaleoInstanceToken, KaleoAction kaleoAction, long startTime, long endTime, String comment, ServiceContext serviceContext) throws PortalException { KaleoLog kaleoLog = createKaleoLog( kaleoInstanceToken, LogType.ACTION_EXECUTION, serviceContext); kaleoLog.setKaleoClassName(kaleoAction.getKaleoClassName()); kaleoLog.setKaleoClassPK(kaleoAction.getKaleoClassPK()); kaleoLog.setKaleoDefinitionId(kaleoAction.getKaleoDefinitionId()); kaleoLog.setKaleoNodeName(kaleoAction.getKaleoNodeName()); kaleoLog.setComment(comment); kaleoLog.setStartDate(new Date(startTime)); kaleoLog.setEndDate(new Date(endTime)); kaleoLog.setDuration(endTime - startTime); kaleoLogPersistence.update(kaleoLog); return kaleoLog; } @Override public KaleoLog addNodeEntryKaleoLog( KaleoInstanceToken kaleoInstanceToken, KaleoNode sourceKaleoNode, KaleoNode targetKaleoNode, ServiceContext serviceContext) throws PortalException { KaleoLog kaleoLog = createKaleoLog( kaleoInstanceToken, LogType.NODE_ENTRY, serviceContext); kaleoLog.setKaleoClassName(KaleoNode.class.getName()); kaleoLog.setKaleoClassPK(targetKaleoNode.getKaleoNodeId()); kaleoLog.setKaleoDefinitionId(targetKaleoNode.getKaleoDefinitionId()); kaleoLog.setKaleoNodeName(targetKaleoNode.getName()); kaleoLog.setTerminalKaleoNode(targetKaleoNode.isTerminal()); if (sourceKaleoNode != null) { kaleoLog.setPreviousKaleoNodeId(sourceKaleoNode.getKaleoNodeId()); kaleoLog.setPreviousKaleoNodeName(sourceKaleoNode.getName()); } kaleoLog.setStartDate(kaleoLog.getCreateDate()); kaleoLogPersistence.update(kaleoLog); return kaleoLog; } @Override public KaleoLog addNodeExitKaleoLog( KaleoInstanceToken kaleoInstanceToken, KaleoNode departingKaleoNode, ServiceContext serviceContext) throws PortalException { KaleoLog kaleoLog = createKaleoLog( kaleoInstanceToken, LogType.NODE_EXIT, serviceContext); kaleoLog.setKaleoClassName(KaleoNode.class.getName()); kaleoLog.setKaleoClassPK(departingKaleoNode.getKaleoNodeId()); kaleoLog.setKaleoDefinitionId( departingKaleoNode.getKaleoDefinitionId()); kaleoLog.setKaleoNodeName(departingKaleoNode.getName()); kaleoLog.setEndDate(kaleoLog.getCreateDate()); try { KaleoLog previousKaleoLog = getPreviousLog( kaleoLog.getKaleoInstanceTokenId(), kaleoLog.getKaleoClassPK(), LogType.WORKFLOW_INSTANCE_START); Date startDate = previousKaleoLog.getStartDate(); Date endDate = kaleoLog.getEndDate(); kaleoLog.setDuration(endDate.getTime() - startDate.getTime()); } catch (NoSuchLogException nsle) { } kaleoLogPersistence.update(kaleoLog); return kaleoLog; } @Override public KaleoLog addTaskAssignmentKaleoLog( List<KaleoTaskAssignmentInstance> previousKaleoTaskAssignmentInstances, KaleoTaskInstanceToken kaleoTaskInstanceToken, String comment, Map<String, Serializable> workflowContext, ServiceContext serviceContext) throws PortalException { KaleoInstanceToken kaleoInstanceToken = kaleoTaskInstanceToken.getKaleoInstanceToken(); KaleoLog kaleoLog = createKaleoLog( kaleoInstanceToken, LogType.TASK_ASSIGNMENT, serviceContext); kaleoLog.setKaleoTaskInstanceTokenId( kaleoTaskInstanceToken.getKaleoTaskInstanceTokenId()); KaleoNode currentKaleoNode = kaleoInstanceToken.getCurrentKaleoNode(); kaleoLog.setKaleoClassName(KaleoNode.class.getName()); kaleoLog.setKaleoClassPK(currentKaleoNode.getKaleoNodeId()); kaleoLog.setKaleoDefinitionId(currentKaleoNode.getKaleoDefinitionId()); kaleoLog.setKaleoNodeName(currentKaleoNode.getName()); if (previousKaleoTaskAssignmentInstances != null) { if (previousKaleoTaskAssignmentInstances.size() == 1) { KaleoTaskAssignmentInstance kaleoTaskAssignmentInstance = previousKaleoTaskAssignmentInstances.get(0); kaleoLog.setPreviousAssigneeClassName( kaleoTaskAssignmentInstance.getAssigneeClassName()); kaleoLog.setPreviousAssigneeClassPK( kaleoTaskAssignmentInstance.getAssigneeClassPK()); } } List<KaleoTaskAssignmentInstance> kaleoTaskAssignmentInstances = kaleoTaskInstanceToken.getKaleoTaskAssignmentInstances(); if (!kaleoTaskAssignmentInstances.isEmpty()) { KaleoTaskAssignmentInstance kaleoTaskAssignmentInstance = kaleoTaskAssignmentInstances.get(0); kaleoLog.setCurrentAssigneeClassName( kaleoTaskAssignmentInstance.getAssigneeClassName()); kaleoLog.setCurrentAssigneeClassPK( kaleoTaskAssignmentInstance.getAssigneeClassPK()); } kaleoLog.setComment(comment); kaleoLog.setWorkflowContext( WorkflowContextUtil.convert(workflowContext)); kaleoLogPersistence.update(kaleoLog); return kaleoLog; } @Override public KaleoLog addTaskCompletionKaleoLog( KaleoTaskInstanceToken kaleoTaskInstanceToken, String comment, Map<String, Serializable> workflowContext, ServiceContext serviceContext) throws PortalException { KaleoInstanceToken kaleoInstanceToken = kaleoTaskInstanceToken.getKaleoInstanceToken(); KaleoLog kaleoLog = createKaleoLog( kaleoInstanceToken, LogType.TASK_COMPLETION, serviceContext); kaleoLog.setKaleoTaskInstanceTokenId( kaleoTaskInstanceToken.getKaleoTaskInstanceTokenId()); KaleoNode currentKaleoNode = kaleoInstanceToken.getCurrentKaleoNode(); kaleoLog.setKaleoClassName(KaleoNode.class.getName()); kaleoLog.setKaleoClassPK(currentKaleoNode.getKaleoNodeId()); kaleoLog.setKaleoDefinitionId(currentKaleoNode.getKaleoDefinitionId()); kaleoLog.setKaleoNodeName(currentKaleoNode.getName()); List<KaleoTaskAssignmentInstance> kaleoTaskAssignmentInstances = kaleoTaskInstanceToken.getKaleoTaskAssignmentInstances(); if (!kaleoTaskAssignmentInstances.isEmpty()) { KaleoTaskAssignmentInstance kaleoTaskAssignmentInstance = kaleoTaskAssignmentInstances.get(0); kaleoLog.setCurrentAssigneeClassName( kaleoTaskAssignmentInstance.getAssigneeClassName()); kaleoLog.setCurrentAssigneeClassPK( kaleoTaskAssignmentInstance.getAssigneeClassPK()); } kaleoLog.setComment(comment); kaleoLog.setWorkflowContext( WorkflowContextUtil.convert(workflowContext)); kaleoLogPersistence.update(kaleoLog); return kaleoLog; } @Override public KaleoLog addTaskUpdateKaleoLog( KaleoTaskInstanceToken kaleoTaskInstanceToken, String comment, Map<String, Serializable> workflowContext, ServiceContext serviceContext) throws PortalException { KaleoInstanceToken kaleoInstanceToken = kaleoTaskInstanceToken.getKaleoInstanceToken(); KaleoLog kaleoLog = createKaleoLog( kaleoInstanceToken, LogType.TASK_UPDATE, serviceContext); List<KaleoTaskAssignmentInstance> kaleoTaskAssignmentInstances = kaleoTaskInstanceToken.getKaleoTaskAssignmentInstances(); if (!kaleoTaskAssignmentInstances.isEmpty()) { KaleoTaskAssignmentInstance kaleoTaskAssignmentInstance = kaleoTaskAssignmentInstances.get(0); kaleoLog.setCurrentAssigneeClassPK( kaleoTaskAssignmentInstance.getAssigneeClassPK()); kaleoLog.setCurrentAssigneeClassName( kaleoTaskAssignmentInstance.getAssigneeClassName()); } kaleoLog.setComment(comment); kaleoLog.setWorkflowContext( WorkflowContextUtil.convert(workflowContext)); kaleoLogPersistence.update(kaleoLog); return kaleoLog; } @Override public KaleoLog addWorkflowInstanceEndKaleoLog( KaleoInstanceToken kaleoInstanceToken, ServiceContext serviceContext) throws PortalException { KaleoLog kaleoLog = createKaleoLog( kaleoInstanceToken, LogType.WORKFLOW_INSTANCE_END, serviceContext); kaleoLog.setEndDate(kaleoLog.getCreateDate()); try { KaleoLog previousKaleoLog = getPreviousLog( kaleoLog.getKaleoInstanceTokenId(), 0, LogType.WORKFLOW_INSTANCE_START); Date startDate = previousKaleoLog.getStartDate(); Date endDate = kaleoLog.getEndDate(); kaleoLog.setDuration(endDate.getTime() - startDate.getTime()); } catch (NoSuchLogException nsle) { } kaleoLogPersistence.update(kaleoLog); return kaleoLog; } @Override public KaleoLog addWorkflowInstanceStartKaleoLog( KaleoInstanceToken kaleoInstanceToken, ServiceContext serviceContext) throws PortalException { KaleoLog kaleoLog = createKaleoLog( kaleoInstanceToken, LogType.WORKFLOW_INSTANCE_START, serviceContext); kaleoLog.setStartDate(kaleoLog.getCreateDate()); KaleoInstance kaleoInstance = kaleoInstanceToken.getKaleoInstance(); kaleoLog.setWorkflowContext(kaleoInstance.getWorkflowContext()); kaleoLogPersistence.update(kaleoLog); return kaleoLog; } @Override public void deleteCompanyKaleoLogs(long companyId) { kaleoLogPersistence.removeByCompanyId(companyId); } @Override public void deleteKaleoDefinitionKaleoLogs(long kaleoDefinitionId) { kaleoLogPersistence.removeByKaleoDefinitionId(kaleoDefinitionId); } @Override public void deleteKaleoInstanceKaleoLogs(long kaleoInstanceId) { kaleoLogPersistence.removeByKaleoInstanceId(kaleoInstanceId); } @Override public List<KaleoLog> getKaleoInstanceKaleoLogs( long kaleoInstanceId, List<Integer> logTypes, int start, int end, OrderByComparator<KaleoLog> orderByComparator) { if ((logTypes == null) || logTypes.isEmpty()) { return kaleoLogPersistence.findByKaleoInstanceId( kaleoInstanceId, start, end, orderByComparator); } else { DynamicQuery dynamicQuery = buildKaleoInstanceDynamicQuery( kaleoInstanceId, logTypes); return dynamicQuery(dynamicQuery, start, end, orderByComparator); } } @Override public int getKaleoInstanceKaleoLogsCount( long kaleoInstanceId, List<Integer> logTypes) { if ((logTypes == null) || logTypes.isEmpty()) { return kaleoLogPersistence.countByKaleoInstanceId(kaleoInstanceId); } DynamicQuery dynamicQuery = buildKaleoInstanceDynamicQuery( kaleoInstanceId, logTypes); return (int)dynamicQueryCount(dynamicQuery); } @Override public List<KaleoLog> getKaleoTaskInstanceTokenKaleoLogs( long kaleoTaskInstanceTokenId, List<Integer> logTypes, int start, int end, OrderByComparator<KaleoLog> orderByComparator) { if ((logTypes == null) || logTypes.isEmpty()) { return kaleoLogPersistence.findByKaleoTaskInstanceTokenId( kaleoTaskInstanceTokenId, start, end, orderByComparator); } else { DynamicQuery dynamicQuery = buildKaleoTaskInstanceTokenDynamicQuery( kaleoTaskInstanceTokenId, logTypes); return dynamicQuery(dynamicQuery, start, end, orderByComparator); } } @Override public int getKaleoTaskInstanceTokenKaleoLogsCount( long kaleoTaskInstanceTokenId, List<Integer> logTypes) { if ((logTypes == null) || logTypes.isEmpty()) { return kaleoLogPersistence.countByKaleoTaskInstanceTokenId( kaleoTaskInstanceTokenId); } else { DynamicQuery dynamicQuery = buildKaleoTaskInstanceTokenDynamicQuery( kaleoTaskInstanceTokenId, logTypes); return (int)dynamicQueryCount(dynamicQuery); } } protected void addLogTypesJunction( DynamicQuery dynamicQuery, List<Integer> logTypes) { Junction junction = RestrictionsFactoryUtil.disjunction(); for (Integer logType : logTypes) { String logTypeString = KaleoLogUtil.convert(logType); if (Validator.isNull(logTypeString)) { continue; } Property property = PropertyFactoryUtil.forName("type"); junction.add(property.eq(logTypeString)); } dynamicQuery.add(junction); } protected DynamicQuery buildKaleoInstanceDynamicQuery( long kaleoInstanceId, List<Integer> logTypes) { DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass( KaleoLog.class, getClassLoader()); Property property = PropertyFactoryUtil.forName("kaleoInstanceId"); dynamicQuery.add(property.eq(kaleoInstanceId)); addLogTypesJunction(dynamicQuery, logTypes); return dynamicQuery; } protected DynamicQuery buildKaleoTaskInstanceTokenDynamicQuery( long kaleoTaskId, List<Integer> logTypes) { DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass( KaleoLog.class, getClassLoader()); Property property = PropertyFactoryUtil.forName( "kaleoTaskInstanceTokenId"); dynamicQuery.add(property.eq(kaleoTaskId)); addLogTypesJunction(dynamicQuery, logTypes); return dynamicQuery; } protected KaleoLog createKaleoLog( KaleoInstanceToken kaleoInstanceToken, LogType logType, ServiceContext serviceContext) throws PortalException { User user = userLocalService.getUser(serviceContext.getGuestOrUserId()); Date now = new Date(); long kaleoLogId = counterLocalService.increment(); KaleoLog kaleoLog = kaleoLogPersistence.create(kaleoLogId); kaleoLog.setCompanyId(user.getCompanyId()); kaleoLog.setUserId(user.getUserId()); kaleoLog.setUserName(user.getFullName()); kaleoLog.setCreateDate(now); kaleoLog.setModifiedDate(now); kaleoLog.setKaleoDefinitionId( kaleoInstanceToken.getKaleoDefinitionId()); kaleoLog.setKaleoInstanceId(kaleoInstanceToken.getKaleoInstanceId()); kaleoLog.setKaleoInstanceTokenId( kaleoInstanceToken.getKaleoInstanceTokenId()); kaleoLog.setType(logType.name()); return kaleoLog; } protected KaleoLog getPreviousLog( long kaleoInstanceTokenId, long kaleoNodeId, LogType logType) throws PortalException { List<KaleoLog> kaleoLogEntries = null; if (kaleoNodeId > 0) { kaleoLogEntries = kaleoLogPersistence.findByKCN_KCPK_KITI_T( KaleoNode.class.getName(), kaleoNodeId, kaleoInstanceTokenId, logType.name()); } else { kaleoLogEntries = kaleoLogPersistence.findByKITI_T( kaleoInstanceTokenId, logType.name()); } if (!kaleoLogEntries.isEmpty()) { return kaleoLogEntries.get(0); } throw new NoSuchLogException(); } }