@Post
  public ProcessInstanceResponse createProcessInstance(ProcessInstanceCreateRequest request) {

    if (request.getProcessDefinitionId() == null
        && request.getProcessDefinitionKey() == null
        && request.getMessage() == null) {
      throw new ActivitiIllegalArgumentException(
          "Either processDefinitionId, processDefinitionKey or message is required.");
    }

    int paramsSet =
        ((request.getProcessDefinitionId() != null) ? 1 : 0)
            + ((request.getProcessDefinitionKey() != null) ? 1 : 0)
            + ((request.getMessage() != null) ? 1 : 0);

    if (paramsSet > 1) {
      throw new ActivitiIllegalArgumentException(
          "Only one of processDefinitionId, processDefinitionKey or message should be set.");
    }

    RestResponseFactory factory =
        getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory();

    Map<String, Object> startVariables = null;
    if (request.getVariables() != null) {
      startVariables = new HashMap<String, Object>();
      for (RestVariable variable : request.getVariables()) {
        startVariables.put(variable.getName(), factory.getVariableValue(variable));
      }
    }

    // Actually start the instance based on key or id
    try {
      ProcessInstance instance = null;
      if (request.getProcessDefinitionId() != null) {
        instance =
            ActivitiUtil.getRuntimeService()
                .startProcessInstanceById(
                    request.getProcessDefinitionId(), request.getBusinessKey(), startVariables);
      } else if (request.getProcessDefinitionKey() != null) {
        instance =
            ActivitiUtil.getRuntimeService()
                .startProcessInstanceByKey(
                    request.getProcessDefinitionKey(), request.getBusinessKey(), startVariables);
      } else {
        instance =
            ActivitiUtil.getRuntimeService()
                .startProcessInstanceByMessage(
                    request.getMessage(), request.getBusinessKey(), startVariables);
      }

      setStatus(Status.SUCCESS_CREATED);
      return factory.createProcessInstanceResponse(this, instance);
    } catch (ActivitiObjectNotFoundException aonfe) {
      throw new ActivitiIllegalArgumentException(aonfe.getMessage(), aonfe);
    }
  }
  @Get
  public List<AttachmentResponse> getAttachments() {
    if (!authenticate()) return null;

    List<AttachmentResponse> result = new ArrayList<AttachmentResponse>();
    RestResponseFactory responseFactory =
        getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory();
    Task task = getTaskFromRequest();

    for (Attachment attachment : ActivitiUtil.getTaskService().getTaskAttachments(task.getId())) {
      result.add(responseFactory.createAttachmentResponse(this, attachment));
    }

    return result;
  }