private SubmissionResults doSubmission(FormEntrySession session, HttpServletRequest request)
      throws Exception {
    SubmissionResults results = new SubmissionResults();
    session.prepareForSubmit();
    List<FormSubmissionError> validationErrors =
        session.getSubmissionController().validateSubmission(session.getContext(), request);
    if (validationErrors != null && validationErrors.size() > 0) {
      results.setValidationErrors(validationErrors);
      return results;
    }
    session.getSubmissionController().handleFormSubmission(session, request);

    if (session.getContext().getMode() == Mode.ENTER
        && session.hasEncouterTag()
        && (session.getSubmissionActions().getEncountersToCreate() == null
            || session.getSubmissionActions().getEncountersToCreate().size() == 0))
      throw new IllegalArgumentException("This form is not going to create an encounter");
    session.applyActions();
    results.setPatient(session.getPatient());
    results.setEncounterCreated(getLastEncounter(session.getPatient()));
    return results;
  }
  @RequestMapping(FORM_PATH)
  public ModelAndView handleRequest(HttpServletRequest request) {

    returnUrl = request.getContextPath() + "/module/patientnarratives/patientNarrativesForm.form";

    HtmlFormEntryPortletController htmlFormEntryPortletController;
    FormEntrySession session = null;
    try {
      htmlFormEntryPortletController = new HtmlFormEntryPortletController();
      session = htmlFormEntryPortletController.getFormEntrySession(request);

      List<FormSubmissionError> validationErrors =
          session.getSubmissionController().validateSubmission(session.getContext(), request);
      if (validationErrors != null && validationErrors.size() > 0) {
        // errors.reject("Fix errors");
      }
    } catch (Exception ex) {
      log.error("Exception during form validation", ex);
      // errors.reject("Exception during form validation, see log for more details: " + ex);
    }

    //        if (errors.hasErrors()) {
    //            return new ModelAndView(FORM_PATH, "command", session);
    //        }

    // no form validation errors, proceed with submission

    try {
      session.prepareForSubmit();

      if (session.getContext().getMode() == FormEntryContext.Mode.ENTER
          && session.hasPatientTag()
          && session.getPatient() == null
          && (session.getSubmissionActions().getPersonsToCreate() == null
              || session.getSubmissionActions().getPersonsToCreate().size() == 0))
        throw new IllegalArgumentException("This form is not going to create an Patient");

      if (session.getContext().getMode() == FormEntryContext.Mode.ENTER
          && session.hasEncouterTag()
          && (session.getSubmissionActions().getEncountersToCreate() == null
              || session.getSubmissionActions().getEncountersToCreate().size() == 0))
        throw new IllegalArgumentException("This form is not going to create an encounter");

      session.getSubmissionController().handleFormSubmission(session, request);
      HtmlFormEntryUtil.getService().applyActions(session);
      String successView = session.getReturnUrlWithParameters();

      request
          .getSession()
          .setAttribute(
              WebConstants.OPENMRS_MSG_ATTR, "patientnarratives.module.narrative.save.success");

      if (successView == null)
        successView =
            request.getContextPath() + "/module/patientnarratives/patientNarrativesForm.form";
      if (StringUtils.hasText(request.getParameter("closeAfterSubmission"))) {
        return new ModelAndView(new RedirectView(returnUrl));
        //                return new ModelAndView(closeDialogView, "dialogToClose",
        // request.getParameter("closeAfterSubmission"));
      } else {
        return new ModelAndView(new RedirectView(returnUrl));
        //                return new ModelAndView(new RedirectView(successView));
      }
    } catch (ValidationException ex) {
      log.error("Invalid input:", ex);
      //            errors.reject(ex.getMessage());
    } catch (BadFormDesignException ex) {
      log.error("Bad Form Design:", ex);
      //            errors.reject(ex.getMessage());
    } catch (Exception ex) {
      log.error("Exception trying to submit form", ex);
      StringWriter sw = new StringWriter();
      ex.printStackTrace(new PrintWriter(sw));
      //            errors.reject("Exception! " + ex.getMessage() + "<br/>" + sw.toString());
    }

    //        if ((alert != null) && (alert == true)) {
    //        }
    // if we get here it's because we caught an error trying to submit/apply
    //        return new ModelAndView(returnUrl, "command", session);
    return new ModelAndView(new RedirectView(returnUrl));
  }