/**
* 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.exception.PortalException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.scheduler.SchedulerEngineHelper;
import com.liferay.portal.kernel.scheduler.StorageType;
import com.liferay.portal.kernel.scheduler.TimeUnit;
import com.liferay.portal.kernel.scheduler.Trigger;
import com.liferay.portal.kernel.scheduler.TriggerFactory;
import com.liferay.portal.kernel.scheduler.TriggerFactoryUtil;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.spring.extender.service.ServiceReference;
import com.liferay.portal.workflow.kaleo.definition.DelayDuration;
import com.liferay.portal.workflow.kaleo.definition.DurationScale;
import com.liferay.portal.workflow.kaleo.model.KaleoInstanceToken;
import com.liferay.portal.workflow.kaleo.model.KaleoTaskInstanceToken;
import com.liferay.portal.workflow.kaleo.model.KaleoTimer;
import com.liferay.portal.workflow.kaleo.model.KaleoTimerInstanceToken;
import com.liferay.portal.workflow.kaleo.runtime.calendar.DueDateCalculator;
import com.liferay.portal.workflow.kaleo.runtime.constants.KaleoRuntimeDestinationNames;
import com.liferay.portal.workflow.kaleo.runtime.util.SchedulerUtil;
import com.liferay.portal.workflow.kaleo.runtime.util.WorkflowContextUtil;
import com.liferay.portal.workflow.kaleo.service.base.KaleoTimerInstanceTokenLocalServiceBaseImpl;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author Marcellus Tavares
*/
public class KaleoTimerInstanceTokenLocalServiceImpl
extends KaleoTimerInstanceTokenLocalServiceBaseImpl {
@Override
public KaleoTimerInstanceToken addKaleoTimerInstanceToken(
long kaleoInstanceTokenId, long kaleoTaskInstanceTokenId,
long kaleoTimerId, String kaleoTimerName,
Map<String, Serializable> workflowContext,
ServiceContext serviceContext)
throws PortalException {
User user = userLocalService.getUser(serviceContext.getGuestOrUserId());
KaleoInstanceToken kaleoInstanceToken =
kaleoInstanceTokenPersistence.findByPrimaryKey(
kaleoInstanceTokenId);
KaleoTimer kaleoTimer = kaleoTimerPersistence.findByPrimaryKey(
kaleoTimerId);
Date now = new Date();
long kaleoTimerInstanceTokenId = counterLocalService.increment();
KaleoTimerInstanceToken kaleoTimerInstanceToken =
kaleoTimerInstanceTokenPersistence.create(
kaleoTimerInstanceTokenId);
long groupId = StagingUtil.getLiveGroupId(
serviceContext.getScopeGroupId());
kaleoTimerInstanceToken.setGroupId(groupId);
kaleoTimerInstanceToken.setCompanyId(user.getCompanyId());
kaleoTimerInstanceToken.setUserId(user.getUserId());
kaleoTimerInstanceToken.setUserName(user.getFullName());
kaleoTimerInstanceToken.setCreateDate(now);
kaleoTimerInstanceToken.setModifiedDate(now);
kaleoTimerInstanceToken.setKaleoClassName(
kaleoTimer.getKaleoClassName());
kaleoTimerInstanceToken.setKaleoClassPK(kaleoTimer.getKaleoClassPK());
kaleoTimerInstanceToken.setKaleoDefinitionId(
kaleoInstanceToken.getKaleoDefinitionId());
kaleoTimerInstanceToken.setKaleoInstanceId(
kaleoInstanceToken.getKaleoInstanceId());
kaleoTimerInstanceToken.setKaleoInstanceTokenId(kaleoInstanceTokenId);
kaleoTimerInstanceToken.setKaleoTaskInstanceTokenId(
kaleoTaskInstanceTokenId);
kaleoTimerInstanceToken.setKaleoTimerId(kaleoTimerId);
kaleoTimerInstanceToken.setKaleoTimerName(kaleoTimerName);
kaleoTimerInstanceToken.setBlocking(kaleoTimer.isBlocking());
kaleoTimerInstanceToken.setCompleted(false);
kaleoTimerInstanceToken.setWorkflowContext(
WorkflowContextUtil.convert(workflowContext));
kaleoTimerInstanceTokenPersistence.update(kaleoTimerInstanceToken);
scheduleTimer(kaleoTimerInstanceToken, kaleoTimer);
return kaleoTimerInstanceToken;
}
@Override
public List<KaleoTimerInstanceToken> addKaleoTimerInstanceTokens(
KaleoInstanceToken kaleoInstanceToken,
KaleoTaskInstanceToken kaleoTaskInstanceToken,
Collection<KaleoTimer> kaleoTimers,
Map<String, Serializable> workflowContext,
ServiceContext serviceContext)
throws PortalException {
if (kaleoTimers.isEmpty()) {
return Collections.emptyList();
}
List<KaleoTimerInstanceToken> kaleoTimerInstanceTokens =
new ArrayList<>(kaleoTimers.size());
long kaleoTaskInstanceTokenId = 0;
if (kaleoTaskInstanceToken != null) {
kaleoTaskInstanceTokenId =
kaleoTaskInstanceToken.getKaleoTaskInstanceTokenId();
}
for (KaleoTimer kaleoTimer : kaleoTimers) {
KaleoTimerInstanceToken kaleoTimerInstanceToken =
addKaleoTimerInstanceToken(
kaleoInstanceToken.getKaleoInstanceTokenId(),
kaleoTaskInstanceTokenId, kaleoTimer.getKaleoTimerId(),
kaleoTimer.getName(), workflowContext, serviceContext);
kaleoTimerInstanceTokens.add(kaleoTimerInstanceToken);
}
return kaleoTimerInstanceTokens;
}
@Override
public KaleoTimerInstanceToken completeKaleoTimerInstanceToken(
long kaleoTimerInstanceTokenId, ServiceContext serviceContext)
throws PortalException {
KaleoTimerInstanceToken kaleoTimerInstanceToken =
kaleoTimerInstanceTokenPersistence.findByPrimaryKey(
kaleoTimerInstanceTokenId);
kaleoTimerInstanceToken.setCompletionUserId(serviceContext.getUserId());
kaleoTimerInstanceToken.setCompleted(true);
kaleoTimerInstanceToken.setCompletionDate(new Date());
kaleoTimerInstanceTokenPersistence.update(kaleoTimerInstanceToken);
deleteScheduledTimer(kaleoTimerInstanceToken);
return kaleoTimerInstanceToken;
}
@Override
public void completeKaleoTimerInstanceTokens(
List<KaleoTimerInstanceToken> kaleoTimerInstanceTokens,
ServiceContext serviceContext)
throws PortalException {
for (KaleoTimerInstanceToken kaleoTimerInstanceToken :
kaleoTimerInstanceTokens) {
completeKaleoTimerInstanceToken(
kaleoTimerInstanceToken.getKaleoTimerInstanceTokenId(),
serviceContext);
}
}
@Override
public void completeKaleoTimerInstanceTokens(
long kaleoInstanceTokenId, ServiceContext serviceContext)
throws PortalException {
List<KaleoTimerInstanceToken> kaleoTimerInstanceTokens =
kaleoTimerInstanceTokenPersistence.findByKITI_C(
kaleoInstanceTokenId, false);
completeKaleoTimerInstanceTokens(
kaleoTimerInstanceTokens, serviceContext);
}
@Override
public void deleteKaleoTimerInstanceToken(
long kaleoInstanceTokenId, long kaleoTimerId)
throws PortalException {
KaleoTimerInstanceToken kaleoTimerInstanceToken =
getKaleoTimerInstanceToken(kaleoInstanceTokenId, kaleoTimerId);
deleteScheduledTimer(kaleoTimerInstanceToken);
kaleoTimerInstanceTokenPersistence.remove(kaleoTimerInstanceToken);
}
@Override
public void deleteKaleoTimerInstanceTokens(long kaleoInstanceId) {
List<KaleoTimerInstanceToken> kaleoTimerInstanceTokens =
kaleoTimerInstanceTokenPersistence.findByKaleoInstanceId(
kaleoInstanceId);
for (KaleoTimerInstanceToken kaleoTimerInstanceToken :
kaleoTimerInstanceTokens) {
if (kaleoTimerInstanceToken.isCompleted()) {
continue;
}
try {
deleteScheduledTimer(kaleoTimerInstanceToken);
}
catch (PortalException pe) {
if (_log.isWarnEnabled()) {
_log.warn(
"Unable to unschedule " + kaleoTimerInstanceToken, pe);
}
}
kaleoTimerInstanceTokenPersistence.remove(kaleoTimerInstanceToken);
}
}
@Override
public KaleoTimerInstanceToken getKaleoTimerInstanceToken(
long kaleoInstanceTokenId, long kaleoTimerId)
throws PortalException {
return kaleoTimerInstanceTokenPersistence.findByKITI_KTI(
kaleoInstanceTokenId, kaleoTimerId);
}
@Override
public List<KaleoTimerInstanceToken> getKaleoTimerInstanceTokens(
long kaleoInstanceTokenId, boolean blocking, boolean completed,
ServiceContext serviceContext) {
return kaleoTimerInstanceTokenPersistence.findByKITI_B_C(
kaleoInstanceTokenId, blocking, completed);
}
@Override
public int getKaleoTimerInstanceTokensCount(
long kaleoInstanceTokenId, boolean blocking, boolean completed,
ServiceContext serviceContext) {
return kaleoTimerInstanceTokenPersistence.countByKITI_B_C(
kaleoInstanceTokenId, blocking, completed);
}
protected void deleteScheduledTimer(
KaleoTimerInstanceToken kaleoTimerInstanceToken)
throws PortalException {
String groupName = getSchedulerGroupName(kaleoTimerInstanceToken);
_schedulerEngineHelper.delete(groupName, StorageType.PERSISTED);
}
protected String getSchedulerGroupName(
KaleoTimerInstanceToken kaleoTimerInstanceToken) {
return SchedulerUtil.getGroupName(
kaleoTimerInstanceToken.getKaleoTimerInstanceTokenId());
}
protected void scheduleTimer(
KaleoTimerInstanceToken kaleoTimerInstanceToken,
KaleoTimer kaleoTimer)
throws PortalException {
deleteScheduledTimer(kaleoTimerInstanceToken);
String groupName = getSchedulerGroupName(kaleoTimerInstanceToken);
DelayDuration delayDuration = new DelayDuration(
kaleoTimer.getDuration(),
DurationScale.valueOf(
StringUtil.toUpperCase(kaleoTimer.getScale())));
Date dueDate = _dueDateCalculator.getDueDate(new Date(), delayDuration);
int interval = 0;
TimeUnit timeUnit = TimeUnit.SECOND;
if (kaleoTimer.isRecurring()) {
DelayDuration recurrenceDelayDuration = new DelayDuration(
kaleoTimer.getRecurrenceDuration(),
DurationScale.valueOf(
StringUtil.toUpperCase(kaleoTimer.getRecurrenceScale())));
interval = (int)recurrenceDelayDuration.getDuration();
DurationScale durationScale =
recurrenceDelayDuration.getDurationScale();
timeUnit = TimeUnit.valueOf(
StringUtil.toUpperCase(durationScale.getValue()));
}
Trigger trigger = TriggerFactoryUtil.createTrigger(
groupName, groupName, dueDate, interval, timeUnit);
Message message = new Message();
message.put(
"kaleoTimerInstanceTokenId",
kaleoTimerInstanceToken.getKaleoTimerInstanceTokenId());
_schedulerEngineHelper.schedule(
trigger, StorageType.PERSISTED, null,
KaleoRuntimeDestinationNames.WORKFLOW_TIMER, message, 0);
}
private static final Log _log = LogFactoryUtil.getLog(
KaleoTimerInstanceTokenLocalServiceImpl.class);
@ServiceReference(type = DueDateCalculator.class)
private DueDateCalculator _dueDateCalculator;
@ServiceReference(type = SchedulerEngineHelper.class)
private SchedulerEngineHelper _schedulerEngineHelper;
@ServiceReference(type = TriggerFactory.class)
private TriggerFactory _triggerFactory;
}