/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.services.api.admin;
import java.util.Collection;
import java.util.List;
import org.jbpm.services.api.NodeInstanceNotFoundException;
import org.jbpm.services.api.NodeNotFoundException;
import org.jbpm.services.api.ProcessInstanceNotFoundException;
import org.jbpm.services.api.model.NodeInstanceDesc;
import org.kie.api.runtime.query.QueryContext;
import org.kie.internal.runtime.error.ExecutionError;
/**
* Administrative operations for process instances to allow runtime modifications
* to active process instances.
*
*/
public interface ProcessInstanceAdminService {
/**
* Returns all process nodes found in given process instance.
* @param processInstanceId unique id of process instance
* @return list of process nodes in process instance
* @throws ProcessInstanceNotFoundException in case process instance id with given id was not found
*/
Collection<ProcessNode> getProcessNodes(long processInstanceId) throws ProcessInstanceNotFoundException;
/**
* Cancels node instance with given id within given process instance.
* @param processInstanceId unique id of process instance
* @param nodeInstanceId node instance id within given process instance to be canceled
* @throws NodeInstanceNotFoundException in case node instance with given id is not active
* @throws ProcessInstanceNotFoundException in case process instance id with given id was not found
*/
void cancelNodeInstance(long processInstanceId, long nodeInstanceId) throws NodeInstanceNotFoundException, ProcessInstanceNotFoundException;
/**
* Retriggers (which includes cancel) node instance given with node instance id within process instance.
* @param processInstanceId unique id of process instance
* @param nodeInstanceId node instance id within given process instance to be retriggered
* @throws NodeInstanceNotFoundException in case node instance with given id is not active
* @throws ProcessInstanceNotFoundException in case process instance id with given id was not found
*/
void retriggerNodeInstance(long processInstanceId, long nodeInstanceId) throws NodeInstanceNotFoundException, ProcessInstanceNotFoundException;
/**
* Returns all active node instances in given process instance;
* @param processInstanceId unique id of process instance
* @return found active node instances
* @throws ProcessInstanceNotFoundException in case process instance id with given id was not found
*/
Collection<NodeInstanceDesc> getActiveNodeInstances(long processInstanceId) throws ProcessInstanceNotFoundException;
/**
* Updates active timer identified by timer id with delay that is given in seconds. Delay is absolute meaning it is as it would be set when timer was created. <br/>
* Example:<br/>
* In case timer was initially created with delay of 1 hour and after 30 min we decide to update it to 2 hours it will then expire in 1,5 hour from the time it was updated.
* @param processInstanceId unique id of process instance
* @param timerId timer id that should be updated
* @param delay absolute delay in seconds
* @param period in case of repeatable timer how often it should repeat in milliseconds - if not applicable should be set to -1
* @param repeatLimit in case of repeatable timer how many times it should trigger - if not applicable should be set to -1
* @throws NodeInstanceNotFoundException in case node instance with given id is not active
* @throws ProcessInstanceNotFoundException in case process instance id with given id was not found
*/
void updateTimer(long processInstanceId, long timerId, long delay, long period, int repeatLimit) throws NodeInstanceNotFoundException, ProcessInstanceNotFoundException;
/**
* Updates active timer identified by timer id with delay that is given in seconds and is relative to current time. <br/>
* Example:<br/>
* In case timer was initially created with delay of 1 hour and after 30 min we decide to update it to 2 hours it will then expire in 2 hours from the time it was updated.
* @param processInstanceId unique id of process instance
* @param timerId timer id that should be updated
* @param delay absolute delay in seconds
* @param period in case of repeatable timer how often it should repeat in milliseconds - if not applicable should be set to -1
* @param repeatLimit in case of repeatable timer how many times it should trigger - if not applicable should be set to -1
* @throws NodeInstanceNotFoundException in case node instance with given id is not active
* @throws ProcessInstanceNotFoundException in case process instance id with given id was not found
*/
void updateTimerRelative(long processInstanceId, long timerId, long delay, long period, int repeatLimit) throws NodeInstanceNotFoundException, ProcessInstanceNotFoundException;
/**
* Returns active timers for given process instance.
* @param processInstanceId unique id of process instance
* @return list of timer found for given process instance
* @throws ProcessInstanceNotFoundException in case process instance id with given id was not found
*/
Collection<TimerInstance> getTimerInstances(long processInstanceId) throws ProcessInstanceNotFoundException;
/**
* Triggers node to create new node instance with node id within process instance.
* This results in new instance of a task within process instance.
* @param processInstanceId unique id of process instance
* @param nodeId node id to be triggered (new instance of that node to be created)
* @throws NodeNotFoundException in case node with given id does not exist in process instance
* @throws ProcessInstanceNotFoundException in case process instance id with given id was not found
*/
void triggerNode(long processInstanceId, long nodeId) throws NodeNotFoundException, ProcessInstanceNotFoundException;
/**
* Acknowledge given error that it was reviewed and understood
* @param errorId unique id of the error
* @throws ExecutionErrorNotFoundException thrown when there is no unacknowledged error with that id
*/
void acknowledgeError(String... errorId) throws ExecutionErrorNotFoundException;
/**
* Returns execution error identified by given error id
* @param errorId unique id of the error
* @return returns execution error instance
* @throws ExecutionErrorNotFoundException is thrown in case no error was found for given error id
*/
ExecutionError getError(String errorId) throws ExecutionErrorNotFoundException;
/**
* Returns execution errors for given process id and deployment id
* @param deploymentId deployment id that contains given process
* @param processId process id of the process
* @param includeAcknowledged indicates whether to include acknowledged errors or not
* @param queryContext control parameters for pagination
* @return list of found errors
*/
List<ExecutionError> getErrorsByProcessId(String deploymentId, String processId, boolean includeAcknowledged, QueryContext queryContext);
/**
* Returns execution errors for given process instance id
* @param processInstanceId process instance id of the process
* @param includeAcknowledged indicates whether to include acknowledged errors or not
* @param queryContext control parameters for pagination
* @return list of found errors
*/
List<ExecutionError> getErrorsByProcessInstanceId(long processInstanceId, boolean includeAcknowledged, QueryContext queryContext);
/**
* Returns execution errors for given process instance id and node
* @param processInstanceId process instance id of the process
* @param nodeName name of the node that error should be found for
* @param includeAcknowledged indicates whether to include acknowledged errors or not
* @param queryContext control parameters for pagination
* @return list of found errors
*/
List<ExecutionError> getErrorsByProcessInstanceId(long processInstanceId, String nodeName, boolean includeAcknowledged, QueryContext queryContext);
/**
* Returns all execution errors regardless of their type
* @param includeAcknowledged indicates whether to include acknowledged errors or not
* @param queryContext control parameters for pagination
* @return list of found errors
*/
List<ExecutionError> getErrors(boolean includeAcknowledged, QueryContext queryContext);
}