@Get
  public DataResponse getHistoricProcessInstances() {
    if (!authenticate()) {
      return null;
    }
    Form urlQuery = getQuery();

    // Populate query based on request
    HistoricProcessInstanceQueryRequest queryRequest = new HistoricProcessInstanceQueryRequest();

    if (getQueryParameter("processInstanceId", urlQuery) != null) {
      queryRequest.setProcessInstanceId(getQueryParameter("processInstanceId", urlQuery));
    }

    if (getQueryParameter("processDefinitionKey", urlQuery) != null) {
      queryRequest.setProcessDefinitionKey(getQueryParameter("processDefinitionKey", urlQuery));
    }

    if (getQueryParameter("processDefinitionId", urlQuery) != null) {
      queryRequest.setProcessDefinitionId(getQueryParameter("processDefinitionId", urlQuery));
    }

    if (getQueryParameter("businessKey", urlQuery) != null) {
      queryRequest.setProcessBusinessKey(getQueryParameter("businessKey", urlQuery));
    }

    if (getQueryParameter("involvedUser", urlQuery) != null) {
      queryRequest.setInvolvedUser(getQueryParameter("involvedUser", urlQuery));
    }

    if (getQueryParameter("finished", urlQuery) != null) {
      queryRequest.setFinished(getQueryParameterAsBoolean("finished", urlQuery));
    }

    if (getQueryParameter("superProcessInstanceId", urlQuery) != null) {
      queryRequest.setSuperProcessInstanceId(getQueryParameter("superProcessInstanceId", urlQuery));
    }

    if (getQueryParameter("excludeSubprocesses", urlQuery) != null) {
      queryRequest.setExcludeSubprocesses(
          getQueryParameterAsBoolean("excludeSubprocesses", urlQuery));
    }

    if (getQueryParameter("finishedAfter", urlQuery) != null) {
      queryRequest.setFinishedAfter(getQueryParameterAsDate("finishedAfter", urlQuery));
    }

    if (getQueryParameter("finishedBefore", urlQuery) != null) {
      queryRequest.setFinishedBefore(getQueryParameterAsDate("finishedBefore", urlQuery));
    }

    if (getQueryParameter("startedAfter", urlQuery) != null) {
      queryRequest.setStartedAfter(getQueryParameterAsDate("startedAfter", urlQuery));
    }

    if (getQueryParameter("startedBefore", urlQuery) != null) {
      queryRequest.setStartedBefore(getQueryParameterAsDate("startedBefore", urlQuery));
    }

    if (getQueryParameter("startedBy", urlQuery) != null) {
      queryRequest.setStartedBy(getQueryParameter("startedBy", urlQuery));
    }

    if (getQueryParameter("includeProcessVariables", urlQuery) != null) {
      queryRequest.setIncludeProcessVariables(
          getQueryParameterAsBoolean("includeProcessVariables", urlQuery));
    }

    return getQueryResponse(queryRequest, urlQuery);
  }
  protected DataResponse getQueryResponse(
      HistoricProcessInstanceQueryRequest queryRequest, Form urlQuery) {
    HistoricProcessInstanceQuery query =
        ActivitiUtil.getHistoryService().createHistoricProcessInstanceQuery();

    // Populate query based on request
    if (queryRequest.getProcessInstanceId() != null) {
      query.processInstanceId(queryRequest.getProcessInstanceId());
    }
    if (queryRequest.getProcessInstanceIds() != null
        && !queryRequest.getProcessInstanceIds().isEmpty()) {
      query.processInstanceIds(new HashSet<String>(queryRequest.getProcessInstanceIds()));
    }
    if (queryRequest.getProcessDefinitionKey() != null) {
      query.processDefinitionKey(queryRequest.getProcessDefinitionKey());
    }
    if (queryRequest.getProcessDefinitionId() != null) {
      query.processDefinitionId(queryRequest.getProcessDefinitionId());
    }
    if (queryRequest.getProcessBusinessKey() != null) {
      query.processInstanceBusinessKey(queryRequest.getProcessBusinessKey());
    }
    if (queryRequest.getInvolvedUser() != null) {
      query.involvedUser(queryRequest.getInvolvedUser());
    }
    if (queryRequest.getSuperProcessInstanceId() != null) {
      query.superProcessInstanceId(queryRequest.getSuperProcessInstanceId());
    }
    if (queryRequest.getExcludeSubprocesses() != null) {
      query.excludeSubprocesses(queryRequest.getExcludeSubprocesses());
    }
    if (queryRequest.getFinishedAfter() != null) {
      query.finishedAfter(queryRequest.getFinishedAfter());
    }
    if (queryRequest.getFinishedBefore() != null) {
      query.finishedBefore(queryRequest.getFinishedBefore());
    }
    if (queryRequest.getStartedAfter() != null) {
      query.startedAfter(queryRequest.getStartedAfter());
    }
    if (queryRequest.getStartedBefore() != null) {
      query.startedBefore(queryRequest.getStartedBefore());
    }
    if (queryRequest.getStartedBy() != null) {
      query.startedBy(queryRequest.getStartedBy());
    }
    if (queryRequest.getFinished() != null) {
      if (queryRequest.getFinished()) {
        query.finished();
      } else {
        query.unfinished();
      }
    }
    if (queryRequest.getIncludeProcessVariables() != null) {
      if (queryRequest.getIncludeProcessVariables()) {
        query.includeProcessVariables();
      }
    }
    if (queryRequest.getVariables() != null) {
      addVariables(query, queryRequest.getVariables());
    }

    if (queryRequest.getTenantId() != null) {
      query.processInstanceTenantId(queryRequest.getTenantId());
    }

    if (queryRequest.getTenantIdLike() != null) {
      query.processInstanceTenantIdLike(queryRequest.getTenantIdLike());
    }

    if (Boolean.TRUE.equals(queryRequest.getWithoutTenantId())) {
      query.processInstanceWithoutTenantId();
    }

    return new HistoricProcessInstancePaginateList(this)
        .paginateList(urlQuery, queryRequest, query, "processInstanceId", allowedSortProperties);
  }