Hallo Matthias,
ich habe etwas ähnliches implementiert (Steuerung der Arbeitsabläufe über eine REST-API).
Hier die für dich (vielleicht) relevanten Quelltext-Ausschnitte:
/**
* Get all tasks within a project.
*
* @param projectId
* @param connection
* @return task if found, otherwise null
*/
public static Iterable<Task> getProjectTasks(Long projectId,
Connection connection) {
SpecialistsBroker specialistsBroker = connection.getBroker();
ServicesBroker servicesBroker = specialistsBroker.requestSpecialist(ServicesBroker.TYPE);
SearchService searchService = servicesBroker.getService(SearchService.class);
TaskQuery taskQuery = TaskQuery.create();
return searchService.searchTasks(projectId, taskQuery);
}
/**
* Description: Get all active tasks for a specific user.
* Usage: RequestMethod: POST on "/tasks/{projectId}/{userId}"
*
* @param user FirstSpirit Server login
* @param password FirstSpirit Server password
* @return String JSON-String
*/
@RequestMapping(value = "/task/{projectId}/{userId}", method = RequestMethod.POST)
public ResponseEntity<String> getUserTasks(@RequestParam("user") String user,
@RequestParam("password") String password,
@PathVariable Long projectId,
@PathVariable Long userId) {
try (Connection connection = fsConnectionUtils.authenticate(user, password)) {
Iterable<Task> searchResult = WorkflowUtils.getProjectTasks(projectId, connection);
List<Task> userTasks = new ArrayList<>();
for (Task task : searchResult) {
long creatorId = task.getCreator().getId();
if (creatorId == userId) userTasks.add(task);
}
String s = jsonObjectToString(userTasks);
return new ResponseEntity<String>(s, HttpStatus.OK);
} catch (IOException e) {
JsonObject obj = LogUtils.getJSON(Arrays.toString(e.getStackTrace()),
Logger.LogLevel.ERROR,
this.getClass());
return new ResponseEntity<String>(jsonObjectToString(obj), HttpStatus.OK);
}
}
... und noch eine Methode, um einen Arbeitsablauf weiter zu schalten:
/**
* Description: Set a destination for a given transition.
* Usage: RequestMethod: POST on "/transition/{projectId}/{taskId}/{transitionId}/{actionId}"
*
* @param user FirstSpirit Server login
* @param password FirstSpirit Server password
* @return HttpStatus Code
*/
@RequestMapping(value = "/transition/{projectId}/{taskId}/{transitionId}/{actionId}",
method = RequestMethod.POST)
public ResponseEntity<String> setTransition(@RequestParam("user") String user,
@RequestParam("password") String password,
@PathVariable long projectId,
@PathVariable int taskId,
@PathVariable int transitionId,
@PathVariable int actionId) {
try (Connection connection = fsConnectionUtils.authenticate(user, password)) {
TaskQuery taskQuery = TaskQuery.create();
SpecialistsBroker specialistsBroker = connection.getBroker();
ServicesBroker servicesBroker = specialistsBroker.requestSpecialist(ServicesBroker.TYPE);
BrokerAgent brokerAgent = connection.getBroker().requireSpecialist(BrokerAgent.TYPE);
SpecialistsBroker brokerByProjectId = brokerAgent.getBrokerByProjectId(projectId);
WorkflowAgent workflowAgent = brokerByProjectId.requestSpecialist(WorkflowAgent.TYPE);
SearchService searchService = servicesBroker.getService(SearchService.class);
Iterable<Task> searchResult = searchService.searchTasks(projectId, taskQuery);
Task task = WorkflowUtils.findTaskById(taskId, searchResult);
Preconditions.checkNotNull(task);
try {
Iterator<? extends Transition> transitionsIterator
= task.getWorkflow().getWorkflowModel().transitions();
if (transitionsIterator.hasNext()) {
TaskState taskState = task.getTaskState();
List<? extends Transition> targetTransitions
= taskState.getModelState().getTargetTransitions();
Transition transition
= WorkflowUtils.findTransitionById(transitionId, targetTransitions);
Preconditions.checkNotNull(transition);
Activity targetActivity = (Activity) transition.getTarget();
boolean manual = !targetActivity.isAutomatic();
if (manual) {
final WorkflowAgent.WorkflowProcessContext process
= workflowAgent.process(task, transition);
List<? extends Transition> actionTransitions
= targetActivity.getTargetTransitions();
Transition actionTransition
= WorkflowUtils.findTransitionById(actionId, actionTransitions);
if (actionTransition == null) {
JsonObject obj = LogUtils.getJSON("No action with ID: " +
actionId + " found. Aborting.", LogLevel.DEBUG, this.getClass());
return new ResponseEntity<String>(jsonObjectToString(obj),
HttpStatus.NO_CONTENT);
}
process.doTransition(actionTransition);
JsonObject obj = LogUtils.getJSON("Task processed successfully!",
LogLevel.DEBUG, this.getClass());
return new ResponseEntity<String>(jsonObjectToString(obj),
HttpStatus.ACCEPTED);
}
} else {
JsonObject obj = LogUtils.getJSON("Task with ID: " + taskId +
" lacks next transition. Aborting.",
LogLevel.DEBUG, this.getClass());
return new ResponseEntity<String>(jsonObjectToString(obj),
HttpStatus.CONFLICT);
}
} catch (LockException e) {
JsonObject obj = LogUtils.getJSON(Arrays.toString(e.getStackTrace()),
LogLevel.ERROR, this.getClass());
return new ResponseEntity<String>(jsonObjectToString(obj),
HttpStatus.CONFLICT);
}
} catch (IOException e) {
JsonObject obj = LogUtils.getJSON(Arrays.toString(e.getStackTrace()),
LogLevel.ERROR, this.getClass());
return new ResponseEntity<String>(jsonObjectToString(obj),
HttpStatus.FORBIDDEN);
}
JsonObject obj = LogUtils.getJSON("Task with ID: " + taskId + " not found. Aborting.",
LogLevel.DEBUG, this.getClass());
return new ResponseEntity<String>(jsonObjectToString(obj),
HttpStatus.INTERNAL_SERVER_ERROR);
}
Den Code kannst du anschließend über eine Executable aus einem Script ausführen.
Damit es Nutzer-unabhängig ist, kannst du in deinem Code einen technischen Benutzer hinterlegen.
Ich hoffe, dass es dir etwas weiter hilft. 
Viele Grüße,
Sebastian