public NodeInstanceState finishTask(
     final T transaction, final Handle<XmlTask> taskHandle, final Principal user)
     throws SQLException {
   if (user == null) {
     throw new AuthenticationNeededException("There is no user associated with this request");
   }
   final XmlTask task = mTasks.get(transaction, taskHandle);
   task.setState(NodeInstanceState.Complete, user);
   if ((task.getState() == NodeInstanceState.Complete)
       || (task.getState() == NodeInstanceState.Failed)) {
     mTasks.remove(transaction, taskHandle);
   }
   return task.getState();
 }
  public XmlTask updateTask(
      T transaction, Handle<XmlTask> handle, XmlTask partialNewTask, Principal user)
      throws SQLException {
    if (user == null) {
      throw new AuthenticationNeededException("There is no user associated with this request");
    }
    // This needs to be a copy otherwise the cache will interfere with the changes
    XmlTask currentTask;
    {
      final XmlTask t = getTask(transaction, handle);
      if (t == null) {
        return null;
      }
      currentTask = new XmlTask(t);
    }
    for (XmlItem newItem : partialNewTask.getItems()) {
      if (newItem.getName() != null && newItem.getName().length() > 0) {
        XmlItem currentItem = currentTask.getItem(newItem.getName());
        if (currentItem != null) {
          currentItem.setValue(newItem.getValue());
        }
      }
    }
    // Store the data
    getTasks().set(transaction, handle, currentTask);
    transaction.commit(); // the actual state isn't stored anyway.
    // This may update the server.
    currentTask.setState(partialNewTask.getState(), user);

    return currentTask;
  }
 public Collection<XmlTask> getPendingTasks(T transaction, final Principal user) {
   final Iterable<XmlTask> tasks = getTasks().iterable(transaction);
   ArrayList<XmlTask> result = new ArrayList<>();
   for (XmlTask task : tasks) {
     if (!task.getState().isFinal()) {
       result.add(task);
     }
   }
   return result;
 }