public FormRequest handle(RequestDetails request, String requestId) throws StatusCodeError {
    FormRequest formRequest = requestRepository.findOne(requestId);

    if (formRequest == null) {
      return null;
    }

    if (request != null) {
      if (request.getRemoteUser() != null
          && formRequest.getRemoteUser() != null
          && !request.getRemoteUser().equals(formRequest.getRemoteUser())) {
        LOG.error(
            "Wrong user viewing or submitting form: "
                + request.getRemoteUser()
                + " not "
                + formRequest.getRemoteUser());
        throw new ForbiddenError(Constants.ExceptionCodes.user_does_not_match);
      }

      if (request.getRemoteHost() != null
          && formRequest.getRemoteHost() != null
          && !request.getRemoteHost().equals(formRequest.getRemoteHost()))
        LOG.warn(
            "This should not happen -- submission remote host ("
                + request.getRemoteHost()
                + ") does not match request ("
                + formRequest.getRemoteHost()
                + ")");

      if (request.getRemoteAddr() != null
          && formRequest.getRemoteAddr() != null
          && !request.getRemoteAddr().equals(formRequest.getRemoteAddr()))
        LOG.warn(
            "This should not happen -- submission remote address ("
                + request.getRemoteAddr()
                + ") does not match request ("
                + formRequest.getRemoteAddr()
                + ")");

      if (formRequest.getCertificateIssuer() != null
          && formRequest.getCertificateSubject() != null) {
        String certificateIssuer = request.getCertificateIssuer();
        String certificateSubject = request.getCertificateSubject();

        if (StringUtils.isEmpty(certificateIssuer)
            || StringUtils.isEmpty(certificateSubject)
            || !certificateIssuer.equals(formRequest.getCertificateIssuer())
            || !certificateSubject.equals(formRequest.getCertificateSubject())) {
          LOG.error(
              "Wrong certificate submitting form: "
                  + certificateIssuer
                  + ":"
                  + certificateSubject
                  + " not "
                  + formRequest.getCertificateIssuer()
                  + ":"
                  + formRequest.getCertificateSubject());
          throw new ForbiddenError(Constants.ExceptionCodes.certificate_does_not_match);
        }
      }

      if (formRequest.getRequestDate() != null) {
        Hours hours =
            Hours.hoursBetween(new DateTime(formRequest.getRequestDate()), new DateTime());
        int h = hours.getHours();
        if (h > 1) {
          throw new ForbiddenError(Constants.ExceptionCodes.request_expired);
        }
      }
    }

    ProcessInstance instance = formRequest.getInstance();

    if (instance == null
        && StringUtils.isNotEmpty(formRequest.getProcessDefinitionKey())
        && StringUtils.isNotEmpty(formRequest.getProcessInstanceId()))
      instance =
          processInstanceService.read(
              formRequest.getProcessDefinitionKey(), formRequest.getProcessInstanceId(), false);

    FormRequest.Builder builder =
        new FormRequest.Builder(formRequest)
            .instance(instance)
            .task(taskService.read(instance, formRequest.getTaskId()));

    return builder.build();
  }