@RequestMapping(value = "/studies/{study}/validateAndSaveRule", method = RequestMethod.POST)
  public @ResponseBody Response validateAndSave(
      @RequestBody org.openclinica.ns.rules.v31.Rules rules,
      Model model,
      HttpSession session,
      @PathVariable("study") String studyOid,
      @RequestParam("ignoreDuplicates") Boolean ignoreDuplicates)
      throws Exception {
    ResourceBundleProvider.updateLocale(new Locale("en_US"));
    RulesPostImportContainer rpic = mapRulesToRulesPostImportContainer(rules);
    StudyDAO studyDao = new StudyDAO(dataSource);
    StudyBean currentStudy = studyDao.findByOid(studyOid);

    UserAccountBean userAccount = getUserAccount();
    mayProceed(userAccount, currentStudy);

    getRulePostImportContainerService(currentStudy, userAccount);
    rpic = getRulePostImportContainerService(currentStudy, userAccount).validateRuleDefs(rpic);
    rpic = getRulePostImportContainerService(currentStudy, userAccount).validateRuleSetDefs(rpic);
    Response response = new Response();
    response.setValid(Boolean.TRUE);
    if (rpic.getInValidRuleDefs().size() > 0 || rpic.getInValidRuleSetDefs().size() > 0) {
      response.setValid(Boolean.FALSE);
      for (AuditableBeanWrapper<RuleBean> beanWrapper : rpic.getInValidRuleDefs()) {
        for (String error : beanWrapper.getImportErrors()) {
          org.openclinica.ns.response.v31.MessagesType messageType = new MessagesType();
          messageType.setMessage(error);
          response.getMessages().add(messageType);
        }
      }
      for (AuditableBeanWrapper<RuleSetBean> beanWrapper : rpic.getInValidRuleSetDefs()) {
        for (String error : beanWrapper.getImportErrors()) {
          org.openclinica.ns.response.v31.MessagesType messageType = new MessagesType();
          messageType.setMessage(error);
          response.getMessages().add(messageType);
        }
      }
    } else if ((rpic.getDuplicateRuleDefs().size() > 0) && !ignoreDuplicates) {
      response.setValid(Boolean.FALSE);
      for (AuditableBeanWrapper<RuleBean> beanWrapper : rpic.getDuplicateRuleDefs()) {
        org.openclinica.ns.response.v31.MessagesType messageType = new MessagesType();
        messageType.setMessage(DUPLICATE_MESSAGE);
        response.getMessages().add(messageType);
      }
    } else {
      getRuleSetService().saveImportFromDesigner(rpic);
    }
    logger.debug("RPIC READY");
    return response;
  }
  public RulesPostImportContainer validateRuleDefs(RulesPostImportContainer importContainer) {
    for (RuleBean ruleBean : importContainer.getRuleDefs()) {
      AuditableBeanWrapper<RuleBean> ruleBeanWrapper = new AuditableBeanWrapper<RuleBean>(ruleBean);

      if (isRuleOidValid(ruleBeanWrapper) && isRuleExpressionValid(ruleBeanWrapper, null)) {
        RuleBean persistentRuleBean = getRuleDao().findByOid(ruleBeanWrapper.getAuditableBean());
        if (persistentRuleBean != null) {
          String name = ruleBeanWrapper.getAuditableBean().getName();
          String expressionValue = ruleBeanWrapper.getAuditableBean().getExpression().getValue();
          String expressionContextName =
              ruleBeanWrapper.getAuditableBean().getExpression().getContextName();
          Context context =
              expressionContextName != null
                  ? Context.getByName(expressionContextName)
                  : Context.OC_RULES_V1;
          ruleBeanWrapper.setAuditableBean(persistentRuleBean);
          ruleBeanWrapper.getAuditableBean().setName(name);
          ruleBeanWrapper.getAuditableBean().getExpression().setValue(expressionValue);
          ruleBeanWrapper.getAuditableBean().getExpression().setContext(context);
          // ruleBeanWrapper.getAuditableBean().setId(persistentRuleBean.getId());
          // ruleBeanWrapper.getAuditableBean().getExpression().setId(persistentRuleBean.getExpression().getId());
        }
      }
      putRuleInCorrectContainer(ruleBeanWrapper, importContainer);
    }
    logger.info(
        "# of Valid RuleDefs : {} , # of InValid RuleDefs : {} , # of Overwritable RuleDefs : {}",
        new Object[] {
          importContainer.getValidRuleDefs().size(),
          importContainer.getInValidRuleDefs().size(),
          importContainer.getDuplicateRuleDefs().size()
        });
    return importContainer;
  }
 private void putRuleInCorrectContainer(
     AuditableBeanWrapper<RuleBean> ruleBeanWrapper, RulesPostImportContainer importContainer) {
   if (!ruleBeanWrapper.isSavable()) {
     importContainer.getInValidRuleDefs().add(ruleBeanWrapper);
     importContainer
         .getInValidRules()
         .put(ruleBeanWrapper.getAuditableBean().getOid(), ruleBeanWrapper);
   } else if (ruleBeanWrapper.getAuditableBean().getId() == null) {
     importContainer.getValidRuleDefs().add(ruleBeanWrapper);
     importContainer
         .getValidRules()
         .put(ruleBeanWrapper.getAuditableBean().getOid(), ruleBeanWrapper);
   } else if (ruleBeanWrapper.getAuditableBean().getId() != null) {
     importContainer.getDuplicateRuleDefs().add(ruleBeanWrapper);
     importContainer
         .getValidRules()
         .put(ruleBeanWrapper.getAuditableBean().getOid(), ruleBeanWrapper);
   }
 }