/**
* 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.definition.internal.deployment;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.workflow.WorkflowDefinition;
import com.liferay.portal.kernel.workflow.WorkflowException;
import com.liferay.portal.workflow.kaleo.KaleoWorkflowModelConverter;
import com.liferay.portal.workflow.kaleo.definition.Condition;
import com.liferay.portal.workflow.kaleo.definition.Definition;
import com.liferay.portal.workflow.kaleo.definition.Node;
import com.liferay.portal.workflow.kaleo.definition.NodeType;
import com.liferay.portal.workflow.kaleo.definition.State;
import com.liferay.portal.workflow.kaleo.definition.Task;
import com.liferay.portal.workflow.kaleo.definition.Transition;
import com.liferay.portal.workflow.kaleo.definition.deployment.WorkflowDeployer;
import com.liferay.portal.workflow.kaleo.model.KaleoDefinition;
import com.liferay.portal.workflow.kaleo.model.KaleoNode;
import com.liferay.portal.workflow.kaleo.service.KaleoConditionLocalService;
import com.liferay.portal.workflow.kaleo.service.KaleoDefinitionLocalService;
import com.liferay.portal.workflow.kaleo.service.KaleoNodeLocalService;
import com.liferay.portal.workflow.kaleo.service.KaleoTaskLocalService;
import com.liferay.portal.workflow.kaleo.service.KaleoTransitionLocalService;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Michael C. Han
*/
@Component(immediate = true, service = WorkflowDeployer.class)
public class DefaultWorkflowDeployer implements WorkflowDeployer {
@Override
public WorkflowDefinition deploy(
String title, Definition definition, ServiceContext serviceContext)
throws PortalException {
KaleoDefinition kaleoDefinition =
_kaleoDefinitionLocalService.fetchLatestKaleoDefinition(
definition.getName(), serviceContext);
if (kaleoDefinition == null) {
kaleoDefinition = _kaleoDefinitionLocalService.addKaleoDefinition(
definition.getName(), title, definition.getDescription(),
definition.getContent(), definition.getVersion(),
serviceContext);
}
else {
kaleoDefinition =
_kaleoDefinitionLocalService.incrementKaleoDefinition(
definition, title, serviceContext);
}
long kaleoDefinitionId = kaleoDefinition.getKaleoDefinitionId();
Collection<Node> nodes = definition.getNodes();
Map<String, KaleoNode> kaleoNodesMap = new HashMap<>();
for (Node node : nodes) {
KaleoNode kaleoNode = _kaleoNodeLocalService.addKaleoNode(
kaleoDefinitionId, node, serviceContext);
kaleoNodesMap.put(node.getName(), kaleoNode);
NodeType nodeType = node.getNodeType();
if (nodeType.equals(NodeType.TASK)) {
Task task = (Task)node;
_kaleoTaskLocalService.addKaleoTask(
kaleoDefinitionId, kaleoNode.getKaleoNodeId(), task,
serviceContext);
}
else if (nodeType.equals(NodeType.CONDITION)) {
Condition condition = (Condition)node;
_kaleoConditionLocalService.addKaleoCondition(
kaleoDefinitionId, kaleoNode.getKaleoNodeId(), condition,
serviceContext);
}
}
for (Node node : nodes) {
KaleoNode kaleoNode = kaleoNodesMap.get(node.getName());
for (Transition transition : node.getOutgoingTransitionsList()) {
KaleoNode sourceKaleoNode = kaleoNodesMap.get(
transition.getSourceNode().getName());
if (sourceKaleoNode == null) {
throw new WorkflowException(
"Unable to find source node " +
transition.getSourceNode());
}
KaleoNode targetKaleoNode = kaleoNodesMap.get(
transition.getTargetNode().getName());
if (targetKaleoNode == null) {
throw new WorkflowException(
"Unable to find target node " +
transition.getTargetNode());
}
_kaleoTransitionLocalService.addKaleoTransition(
kaleoNode.getKaleoDefinitionId(),
kaleoNode.getKaleoNodeId(), transition, sourceKaleoNode,
targetKaleoNode, serviceContext);
}
}
State initialState = definition.getInitialState();
if (initialState == null) {
throw new WorkflowException("No initial state found in definition");
}
String startKaleoNodeName = initialState.getName();
KaleoNode kaleoNode = kaleoNodesMap.get(startKaleoNodeName);
_kaleoDefinitionLocalService.activateKaleoDefinition(
kaleoDefinitionId, kaleoNode.getKaleoNodeId(), serviceContext);
return _kaleoWorkflowModelConverter.toWorkflowDefinition(
kaleoDefinition);
}
@Reference
private KaleoConditionLocalService _kaleoConditionLocalService;
@Reference
private KaleoDefinitionLocalService _kaleoDefinitionLocalService;
@Reference
private KaleoNodeLocalService _kaleoNodeLocalService;
@Reference
private KaleoTaskLocalService _kaleoTaskLocalService;
@Reference
private KaleoTransitionLocalService _kaleoTransitionLocalService;
@Reference
private KaleoWorkflowModelConverter _kaleoWorkflowModelConverter;
}