/** * 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); }