private void validateStudy2(FormProcessor fp, Validator v) {

    v.addValidation(INPUT_START_DATE, Validator.IS_A_DATE);
    if (!StringUtil.isBlank(fp.getString(INPUT_END_DATE))) {
      v.addValidation(INPUT_END_DATE, Validator.IS_A_DATE);
    }
    if (!StringUtil.isBlank(fp.getString(INPUT_VER_DATE))) {
      v.addValidation(INPUT_VER_DATE, Validator.IS_A_DATE);
    }

    errors = v.validate();
    logger.info("has validation errors");
    try {
      local_df.parse(fp.getString(INPUT_START_DATE));
      fp.addPresetValue(INPUT_START_DATE, local_df.format(fp.getDate(INPUT_START_DATE)));
    } catch (ParseException pe) {
      fp.addPresetValue(INPUT_START_DATE, fp.getString(INPUT_START_DATE));
    }
    try {
      local_df.parse(fp.getString(INPUT_VER_DATE));
      fp.addPresetValue(INPUT_VER_DATE, local_df.format(fp.getDate(INPUT_VER_DATE)));
    } catch (ParseException pe) {
      fp.addPresetValue(INPUT_VER_DATE, fp.getString(INPUT_VER_DATE));
    }
    try {
      local_df.parse(fp.getString(INPUT_END_DATE));
      fp.addPresetValue(INPUT_END_DATE, local_df.format(fp.getDate(INPUT_END_DATE)));
    } catch (ParseException pe) {
      fp.addPresetValue(INPUT_END_DATE, fp.getString(INPUT_END_DATE));
    }
    updateStudy2(fp);
    setPresetValues(fp.getPresetValues());
  }
  private boolean updateStudy2(FormProcessor fp) {

    study.setOldStatus(study.getStatus());
    study.setStatus(Status.get(fp.getInt("statusId")));

    if (StringUtil.isBlank(fp.getString(INPUT_VER_DATE))) {
      study.setProtocolDateVerification(null);
    } else {
      study.setProtocolDateVerification(fp.getDate(INPUT_VER_DATE));
    }

    study.setDatePlannedStart(fp.getDate(INPUT_START_DATE));

    if (StringUtil.isBlank(fp.getString(INPUT_END_DATE))) {
      study.setDatePlannedEnd(null);
    } else {
      study.setDatePlannedEnd(fp.getDate(INPUT_END_DATE));
    }

    study.setPhase(fp.getString("phase"));

    if (fp.getInt("genetic") == 1) {
      study.setGenetic(true);
    } else {
      study.setGenetic(false);
    }

    String interventional = resadmin.getString("interventional");
    return interventional.equalsIgnoreCase(study.getProtocolType());
  }
  /**
   * Validates the first section of study and save it into study bean
   *
   * @param request
   * @param response
   * @throws Exception
   */
  private void confirmStudy() throws Exception {
    Validator v = new Validator(request);
    FormProcessor fp = new FormProcessor(request);

    v.addValidation("name", Validator.NO_BLANKS);
    v.addValidation("uniqueProId", Validator.NO_BLANKS);
    v.addValidation("description", Validator.NO_BLANKS);
    v.addValidation("prinInvestigator", Validator.NO_BLANKS);
    if (!StringUtil.isBlank(fp.getString(INPUT_START_DATE))) {
      v.addValidation(INPUT_START_DATE, Validator.IS_A_DATE);
    }
    if (!StringUtil.isBlank(fp.getString(INPUT_END_DATE))) {
      v.addValidation(INPUT_END_DATE, Validator.IS_A_DATE);
    }
    if (!StringUtil.isBlank(fp.getString("facConEmail"))) {
      v.addValidation("facConEmail", Validator.IS_A_EMAIL);
    }
    // v.addValidation("statusId", Validator.IS_VALID_TERM);
    v.addValidation(
        "secondProId",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        255);
    v.addValidation(
        "facName",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        255);
    v.addValidation(
        "facCity",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        255);
    v.addValidation(
        "facState",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        20);
    v.addValidation(
        "facZip",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        64);
    v.addValidation(
        "facCountry",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        64);
    v.addValidation(
        "facConName",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        255);
    v.addValidation(
        "facConDegree",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        255);
    v.addValidation(
        "facConPhone",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        255);
    v.addValidation(
        "facConEmail",
        Validator.LENGTH_NUMERIC_COMPARISON,
        NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO,
        255);

    errors = v.validate();
    if (fp.getString("name").trim().length() > 100) {
      Validator.addError(errors, "name", resexception.getString("maximum_lenght_name_100"));
    }
    if (fp.getString("uniqueProId").trim().length() > 30) {
      Validator.addError(
          errors, "uniqueProId", resexception.getString("maximum_lenght_unique_protocol_30"));
    }
    if (fp.getString("description").trim().length() > 255) {
      Validator.addError(
          errors, "description", resexception.getString("maximum_lenght_brief_summary_255"));
    }
    if (fp.getString("prinInvestigator").trim().length() > 255) {
      Validator.addError(
          errors,
          "prinInvestigator",
          resexception.getString("maximum_lenght_principal_investigator_255"));
    }
    if (fp.getInt("expectedTotalEnrollment") <= 0) {
      Validator.addError(
          errors,
          "expectedTotalEnrollment",
          respage.getString("expected_total_enrollment_must_be_a_positive_number"));
    }

    session.setAttribute("newStudy", createStudyBean());

    if (errors.isEmpty()) {
      logger.info("no errors");
      forwardPage(Page.CONFIRM_CREATE_SUB_STUDY);

    } else {
      try {
        local_df.parse(fp.getString(INPUT_START_DATE));
        fp.addPresetValue(INPUT_START_DATE, local_df.format(fp.getDate(INPUT_START_DATE)));
      } catch (ParseException pe) {
        fp.addPresetValue(INPUT_START_DATE, fp.getString(INPUT_START_DATE));
      }
      try {
        local_df.parse(fp.getString(INPUT_END_DATE));
        fp.addPresetValue(INPUT_END_DATE, local_df.format(fp.getDate(INPUT_END_DATE)));
      } catch (ParseException pe) {
        fp.addPresetValue(INPUT_END_DATE, fp.getString(INPUT_END_DATE));
      }
      setPresetValues(fp.getPresetValues());
      logger.info("has validation errors");
      request.setAttribute("formMessages", errors);
      // request.setAttribute("facRecruitStatusMap",
      // CreateStudyServlet.facRecruitStatusMap);
      request.setAttribute("statuses", Status.toActiveArrayList());
      forwardPage(Page.CREATE_SUB_STUDY);
    }
  }
  @Override
  public void processRequest() throws Exception {
    FormProcessor fp = new FormProcessor(request);
    String action = request.getParameter("action");
    session.setAttribute("sdvOptions", this.setSDVOptions());

    if (StringUtil.isBlank(action)) {
      if (currentStudy.getParentStudyId() > 0) {
        addPageMessage(respage.getString("you_cannot_create_site_itself_site"));

        forwardPage(Page.SITE_LIST_SERVLET);
      } else {
        StudyBean newStudy = new StudyBean();
        newStudy.setParentStudyId(currentStudy.getId());
        // get default facility info from property file
        newStudy.setFacilityName(SQLInitServlet.getField(CreateStudyServlet.FAC_NAME));
        newStudy.setFacilityCity(SQLInitServlet.getField(CreateStudyServlet.FAC_CITY));
        newStudy.setFacilityState(SQLInitServlet.getField(CreateStudyServlet.FAC_STATE));
        newStudy.setFacilityCountry(SQLInitServlet.getField(CreateStudyServlet.FAC_COUNTRY));
        newStudy.setFacilityContactDegree(
            SQLInitServlet.getField(CreateStudyServlet.FAC_CONTACT_DEGREE));
        newStudy.setFacilityContactEmail(
            SQLInitServlet.getField(CreateStudyServlet.FAC_CONTACT_EMAIL));
        newStudy.setFacilityContactName(
            SQLInitServlet.getField(CreateStudyServlet.FAC_CONTACT_NAME));
        newStudy.setFacilityContactPhone(
            SQLInitServlet.getField(CreateStudyServlet.FAC_CONTACT_PHONE));
        newStudy.setFacilityZip(SQLInitServlet.getField(CreateStudyServlet.FAC_ZIP));

        List<StudyParamsConfig> parentConfigs = currentStudy.getStudyParameters();
        // logger.info("parentConfigs size:" + parentConfigs.size());
        ArrayList configs = new ArrayList();

        for (StudyParamsConfig scg : parentConfigs) {
          // StudyParamsConfig scg = (StudyParamsConfig)
          // parentConfigs.get(i);
          if (scg != null) {
            // find the one that sub study can change
            if (scg.getValue().getId() > 0 && scg.getParameter().isOverridable()) {
              logger.info("parameter:" + scg.getParameter().getHandle());
              logger.info("value:" + scg.getValue().getValue());
              // YW 10-12-2007, set overridable study parameters
              // for a site
              if (scg.getParameter().getHandle().equalsIgnoreCase("interviewerNameRequired")) {
                scg.getValue().setValue(fp.getString("interviewerNameRequired"));
              } else if (scg.getParameter()
                  .getHandle()
                  .equalsIgnoreCase("interviewerNameDefault")) {
                scg.getValue().setValue(fp.getString("interviewerNameDefault"));
              } else if (scg.getParameter().getHandle().equalsIgnoreCase("interviewDateRequired")) {
                scg.getValue().setValue(fp.getString("interviewDateRequired"));
              } else if (scg.getParameter().getHandle().equalsIgnoreCase("interviewDateDefault")) {
                scg.getValue().setValue(fp.getString("interviewDateDefault"));
              }
              // YW >>
              configs.add(scg);
            }
          }
        }
        newStudy.setStudyParameters(configs);

        // YW 10-12-2007 <<
        newStudy
            .getStudyParameterConfig()
            .setInterviewerNameRequired(fp.getString("interviewerNameRequired"));
        newStudy
            .getStudyParameterConfig()
            .setInterviewerNameDefault(fp.getString("interviewerNameDefault"));
        newStudy
            .getStudyParameterConfig()
            .setInterviewDateRequired(fp.getString("interviewDateRequired"));
        newStudy
            .getStudyParameterConfig()
            .setInterviewDateDefault(fp.getString("interviewDateDefault"));
        // YW >>

        // BWP 3169 1-12-2008 <<
        newStudy
            .getStudyParameterConfig()
            .setInterviewerNameEditable(
                currentStudy.getStudyParameterConfig().getInterviewerNameEditable());
        newStudy
            .getStudyParameterConfig()
            .setInterviewDateEditable(
                currentStudy.getStudyParameterConfig().getInterviewDateEditable());
        // >>

        try {
          local_df.parse(fp.getString(INPUT_START_DATE));
          fp.addPresetValue(INPUT_START_DATE, local_df.format(fp.getDate(INPUT_START_DATE)));
        } catch (ParseException pe) {
          fp.addPresetValue(INPUT_START_DATE, fp.getString(INPUT_START_DATE));
        }
        try {
          local_df.parse(fp.getString(INPUT_END_DATE));
          fp.addPresetValue(INPUT_END_DATE, local_df.format(fp.getDate(INPUT_END_DATE)));
        } catch (ParseException pe) {
          fp.addPresetValue(INPUT_END_DATE, fp.getString(INPUT_END_DATE));
        }
        // tbh 3946 07/2009
        try {
          local_df.parse(fp.getString(INPUT_VER_DATE));
          fp.addPresetValue(INPUT_VER_DATE, local_df.format(fp.getDate(INPUT_VER_DATE)));
        } catch (ParseException pe) {
          fp.addPresetValue(INPUT_VER_DATE, fp.getString(INPUT_VER_DATE));
        }
        // >> tbh
        setPresetValues(fp.getPresetValues());

        session.setAttribute("newStudy", newStudy);
        session.setAttribute("definitions", this.initDefinitions(newStudy));
        request.setAttribute("facRecruitStatusMap", CreateStudyServlet.facRecruitStatusMap);
        request.setAttribute("statuses", Status.toActiveArrayList());

        forwardPage(Page.CREATE_SUB_STUDY);
      }

    } else {
      if ("confirm".equalsIgnoreCase(action)) {
        confirmStudy();

      } else if ("back".equalsIgnoreCase(action)) {
        StudyBean newStudy = (StudyBean) session.getAttribute("newStudy");
        try {
          fp.addPresetValue(INPUT_START_DATE, local_df.format(newStudy.getDatePlannedEnd()));
        } catch (Exception pe) {
          fp.addPresetValue(INPUT_START_DATE, fp.getString(INPUT_START_DATE));
        }
        try {
          fp.addPresetValue(INPUT_END_DATE, local_df.format(newStudy.getDatePlannedStart()));
        } catch (Exception pe) {
          fp.addPresetValue(INPUT_END_DATE, fp.getString(INPUT_END_DATE));
        }
        try {
          fp.addPresetValue(
              INPUT_VER_DATE, local_df.format(newStudy.getProtocolDateVerification()));
        } catch (Exception pe) {
          fp.addPresetValue(INPUT_VER_DATE, fp.getString(INPUT_VER_DATE));
        }
        setPresetValues(fp.getPresetValues());
        request.setAttribute("facRecruitStatusMap", CreateStudyServlet.facRecruitStatusMap);
        request.setAttribute("statuses", Status.toActiveArrayList());

        forwardPage(Page.CREATE_SUB_STUDY);
      } else if ("submit".equalsIgnoreCase(action)) {
        submitStudy();
      }
    }
  }