/**
  * Creaets an OpenMRS Obs instance
  *
  * @param formField the form field that specifies the concept associated with the Obs
  * @param value value associated with the Obs
  * @param datetime date/time associated with the Obs (may be null)
  * @param accessionNumber accession number associatd with the Obs (may be null)
  * @return the created Obs instance
  */
 public static Obs createObs(
     FormField formField, Object value, Date datetime, String accessionNumber) {
   Concept concept = formField.getField().getConcept();
   if (concept == null)
     throw new FormEntryException(
         "Can't create an Obs for a formField that doesn't represent a Concept");
   return createObs(concept, value, datetime, accessionNumber);
 }
  /**
   * The onSubmit function receives the form/command object that was modified by the input form and
   * saves it to the db
   *
   * @see
   *     org.springframework.web.servlet.mvc.SimpleFormController#onSubmit(javax.servlet.http.HttpServletRequest,
   *     javax.servlet.http.HttpServletResponse, java.lang.Object,
   *     org.springframework.validation.BindException)
   */
  @Override
  protected ModelAndView onSubmit(
      HttpServletRequest request, HttpServletResponse response, Object obj, BindException errors)
      throws Exception {

    HttpSession httpSession = request.getSession();
    String view = getFormView();

    if (Context.isAuthenticated()) {
      Form form = (Form) obj;
      MessageSourceAccessor msa = getMessageSourceAccessor();
      String action = request.getParameter("action");
      if (action == null) {
        httpSession.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "Form.not.saved");
      } else {
        if (action.equals(msa.getMessage("Form.save"))) {
          try {
            // save form
            form = Context.getFormService().saveForm(form);
            httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "Form.saved");
          } catch (Exception e) {
            log.error("Error while saving form " + form.getFormId(), e);
            errors.reject(e.getMessage());
            httpSession.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "Form.not.saved");
            return showForm(request, response, errors);
          }
        } else if (action.equals(msa.getMessage("Form.delete"))) {
          try {
            Context.getFormService().purgeForm(form);
            httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "Form.deleted");
          } catch (DataIntegrityViolationException e) {
            httpSession.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "Form.cannot.delete");
            return new ModelAndView(new RedirectView("formEdit.form?formId=" + form.getFormId()));
          } catch (Exception e) {
            log.error("Error while deleting form " + form.getFormId(), e);
            errors.reject(e.getMessage());
            httpSession.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "Form.cannot.delete");
            return showForm(request, response, errors);
            // return new ModelAndView(new RedirectView(getSuccessView()));
          }
        } else if (action.equals(msa.getMessage("Form.updateSortOrder"))) {

          FormService fs = Context.getFormService();

          TreeMap<Integer, TreeSet<FormField>> treeMap = FormUtil.getFormStructure(form);
          for (Map.Entry<Integer, TreeSet<FormField>> entry : treeMap.entrySet()) {
            Integer parentFormFieldId = entry.getKey();
            float sortWeight = 0;
            for (FormField formField : entry.getValue()) {
              formField.setSortWeight(sortWeight);
              fs.saveFormField(formField);
              sortWeight += 50;
            }
          }

        } else {
          try {
            Context.getFormService().duplicateForm(form);
            httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "Form.duplicated");
          } catch (Exception e) {
            log.error("Error while duplicating form " + form.getFormId(), e);
            errors.reject(e.getMessage());
            httpSession.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "Form.cannot.duplicate");
            return showForm(request, response, errors);
          }
        }

        view = getSuccessView();
      }
    }

    return new ModelAndView(new RedirectView(view));
  }
 /** @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */
 public int compare(FormField formField, FormField other) {
   int temp =
       OpenmrsUtil.compareWithNullAsGreatest(formField.getPageNumber(), other.getPageNumber());
   if (temp == 0) {
     temp =
         OpenmrsUtil.compareWithNullAsGreatest(
             formField.getFieldNumber(), other.getFieldNumber());
   }
   if (temp == 0) {
     temp =
         OpenmrsUtil.compareWithNullAsGreatest(formField.getFieldPart(), other.getFieldPart());
   }
   if (temp == 0
       && formField.getPageNumber() == null
       && formField.getFieldNumber() == null
       && formField.getFieldPart() == null) {
     temp =
         OpenmrsUtil.compareWithNullAsGreatest(formField.getSortWeight(), other.getSortWeight());
   }
   if (temp == 0) {
     // to prevent ties
     temp =
         OpenmrsUtil.compareWithNullAsGreatest(
             formField.getFormFieldId(), other.getFormFieldId());
   }
   return temp;
 }