/**
   * This overridden updates an existing Rule in the Repository
   *
   * @see
   *     org.kuali.rice.krms.impl.repository.RuleBoService#updateRule(org.kuali.rice.krms.api.repository.rule.RuleDefinition)
   */
  @Override
  public void updateRule(RuleDefinition rule) {
    if (rule == null) {
      throw new IllegalArgumentException("rule is null");
    }

    // must already exist to be able to update
    final String ruleIdKey = rule.getId();
    final RuleBo existing = businessObjectService.findBySinglePrimaryKey(RuleBo.class, ruleIdKey);
    if (existing == null) {
      throw new IllegalStateException("the rule does not exist: " + rule);
    }
    final RuleDefinition toUpdate;
    if (!existing.getId().equals(rule.getId())) {
      // if passed in id does not match existing id, correct it
      final RuleDefinition.Builder builder = RuleDefinition.Builder.create(rule);
      builder.setId(existing.getId());
      toUpdate = builder.build();
    } else {
      toUpdate = rule;
    }

    // copy all updateable fields to bo
    RuleBo boToUpdate = RuleBo.from(toUpdate);

    // delete any old, existing attributes
    Map<String, String> fields = new HashMap<String, String>(1);
    fields.put(PropertyNames.Rule.RULE_ID, toUpdate.getId());
    businessObjectService.deleteMatching(RuleAttributeBo.class, fields);

    // update the rule and create new attributes
    businessObjectService.save(boToUpdate);
  }
 /**
  * This overridden creates a KRMS Rule in the repository
  *
  * @see
  *     org.kuali.rice.krms.impl.repository.RuleBoService#createRule(org.kuali.rice.krms.api.repository.rule.RuleDefinition)
  */
 @Override
 public RuleDefinition createRule(RuleDefinition rule) {
   if (rule == null) {
     throw new IllegalArgumentException("rule is null");
   }
   final String nameKey = rule.getName();
   final String namespaceKey = rule.getNamespace();
   final RuleDefinition existing = getRuleByNameAndNamespace(nameKey, namespaceKey);
   if (existing != null) {
     throw new IllegalStateException("the rule to create already exists: " + rule);
   }
   RuleBo ruleBo = RuleBo.from(rule);
   businessObjectService.save(ruleBo);
   return RuleBo.to(ruleBo);
 }
 /**
  * This method retrieves a rule from the repository given the rule id.
  *
  * @see org.kuali.rice.krms.impl.repository.RuleBoService#getRuleByRuleId(java.lang.String)
  */
 @Override
 public RuleDefinition getRuleByRuleId(String ruleId) {
   if (StringUtils.isBlank(ruleId)) {
     throw new IllegalArgumentException("rule id is null");
   }
   RuleBo bo = businessObjectService.findBySinglePrimaryKey(RuleBo.class, ruleId);
   return RuleBo.to(bo);
 }
 /**
  * Converts a List<RuleBo> to an Unmodifiable List<Rule>
  *
  * @param RuleBos a mutable List<RuleBo> to made completely immutable.
  * @return An unmodifiable List<Rule>
  */
 public List<RuleDefinition> convertListOfBosToImmutables(final Collection<RuleBo> ruleBos) {
   ArrayList<RuleDefinition> rules = new ArrayList<RuleDefinition>();
   for (RuleBo bo : ruleBos) {
     RuleDefinition rule = RuleBo.to(bo);
     rules.add(rule);
   }
   return Collections.unmodifiableList(rules);
 }
  /**
   * This method retrieves a rule from the repository given the name of the rule and namespace.
   *
   * @see org.kuali.rice.krms.impl.repository.RuleBoService#getRuleByRuleId(java.lang.String)
   */
  @Override
  public RuleDefinition getRuleByNameAndNamespace(String name, String namespace) {
    if (StringUtils.isBlank(name)) {
      throw new IllegalArgumentException("name is blank");
    }
    if (StringUtils.isBlank(namespace)) {
      throw new IllegalArgumentException("namespace is blank");
    }

    final Map<String, Object> map = new HashMap<String, Object>();
    map.put("name", name);
    map.put("namespace", namespace);

    RuleBo myRule =
        businessObjectService.findByPrimaryKey(RuleBo.class, Collections.unmodifiableMap(map));
    return RuleBo.to(myRule);
  }