Java Client SDK 4.0

Workflow

Updated: July 18, 2024

This section is about how handling workflows and tasks with Nuxeo Java Client.

There's no dedicated manager for workflows. We can handle them through repository manager, document or user manager.

Let's get our repository manager:

Repository repository = client.repository();

Let's create a Note too:

Document note = Document.createWithName("note", "Note");
note = repository.createDocumentByPath("/", note);

Model Retrieval

APIs below are available on repository manager to fetch workflow model:

  • fetchWorkflowModels which takes nothing
  • fetchWorkflowModel which takes the workflow model name
  • fetchWorkflowModelGraph which takes the workflow model name

Let's retrieve all workflow models on Nuxeo Server:

Workflows workflows = repository.fetchWorkflowModels();

Next examples will use the SerialDocumentReview workflow which is present on a bare Nuxeo Server, let's retrieve it:

Workflow serialWorkflow = repository.fetchWorkflowModel("SerialDocumentReview");
String name = serialWorkflow.getName(); // equals to SerialDocumentReview
String title = serialWorkflow.getTitle(); // equals to wf.serialDocumentReview.SerialDocumentReview
String modelName = serialWorkflow.getWorkflowModelName(); // equals to SerialDocumentReview

Create - Start

APIs below are available on repository manager to create/start a workflow instance:

  • startWorkflowInstanceWithDocId which takes a document id and a workflow model
  • startWorkflowInstanceWithDocPath which takes a document path and a workflow model

Let's start serial workflow on our note:

Workflow serialWorkflowInstance = repository.startWorkflowInstanceWithDocPath("/note", serialWorkflow);
String name = serialWorkflow.getName(); // equals to SerialDocumentReview
String title = serialWorkflow.getTitle(); // equals to wf.serialDocumentReview.SerialDocumentReview
String modelName = serialWorkflow.getWorkflowModelName(); // equals to SerialDocumentReview
String state = serialWorkflowInstance.getState(); // equals to running
String initiator = serialWorkflowInstance.getInitiator(); // equals to username who started it
List<String> attachedDocIds = serialWorkflowInstance.getAttachedDocumentIds(); // contains note id

As Document is a connectable entity and we get note from client we can do the following:

Workflow serialWorkflowInstance = note.startWorkflowInstance(serialWorkflow);

Fetch

APIs below are available on repository manager to fetch workflow instance:

  • fetchWorkflowInstance which takes a workflow instance id
  • fetchWorkflowInstancesByDocId which takes a document id
  • fetchWorkflowInstancesByDocPath which takes a document path

Let's retrieve workflow instances on our note:

// contains the previous started workflow
Workflows workflows = repository.fetchWorkflowInstancesByDocPath("/note");

As Document is a connectable entity and we get note from client we can do the following:

Workflows workflows = note.fetchWorkflowInstances();

You can also retrieve tasks on a document:

Tasks tasks = note.fetchTasks();

Update - Work with Task

There's task manager to handle tasks for a workflow.

APIs below are available on task manager to handle tasks:

  • fetchTasks which take a user id, a workflow instance id and a workflow model name
  • fetchTask which takes a task id
  • reassign which takes a task id, a list of actors and a comment
  • reassign which takes a task id, a list of actors serialized in string and a comment
  • delegate which takes a task id, a list of actors and a comment
  • delegate which takes a task id, a list of actors serialized in string and a comment
  • complete which takes a task id, an action and a task completion request object

Let's get our task manager:

TaskManager taskManager = client.taskManager();

Assuming our current user is Administrator, let's retrieve its tasks for our workflow:

Tasks tasks = taskManager.fetchTasks("Administrator", serialWorkflowInstance.getId(),
                                     serialWorkflowInstance.getWorkflowModelName());
Task task = tasks.getEntry(0);
String name = task.getName(); // equals to wf.serialDocumentReview.chooseParticipants
List<String> actors = task.getActors(); // contains Administrator
List<String> targetDocIds = task.getTargetDocumentIds(); // contains note id
TaskInfo taskInfo = task.getTaskInfo();
List<TaskInfoItem> taskActions = taskInfo.getTaskActions(); // contains two actions
String actionName = taskActions.get(0).getName(); // equals to cancel or start_review

Let's start the review now:

TaskCompletionRequest taskCompletionRequest = new TaskCompletionRequest();
Map<String, Object> variables = new HashMap<>();
variables.put("comment", "Please review");
variables.put("participants", List.of("user:Administrator"));
taskCompletionRequest.setVariables(variables);
task = nuxeoClient.taskManager().complete(task.getId(), "start_review", taskCompletionRequest);

Let's approve the review:

TaskCompletionRequest taskCompletionRequest = new TaskCompletionRequest();
taskCompletionRequest.setComment("Looks good!");
task = nuxeoClient.taskManager().complete(task.getId(), "approve", taskCompletionRequest);

Now we can end the workflow by validating it:

TaskCompletionRequest taskCompletionRequest = new TaskCompletionRequest();
taskCompletionRequest.setComment("Looks good!");
task = nuxeoClient.taskManager().complete(task.getId(), "validate", taskCompletionRequest);

Delete - Cancel Workflow

At each step we can cancel the workflow:

repository.cancelWorkflowInstance(serialWorkflowInstance.getId());