diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java index 78a4c615b4..de06f0751d 100644 --- a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java +++ b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java @@ -61,9 +61,9 @@ import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.GUID; -import org.springframework.extensions.surf.util.ParameterCheck; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.surf.util.ParameterCheck; /** * Rule service implementation. @@ -781,6 +781,57 @@ public class RuleServiceImpl } } + /** + * @see org.alfresco.service.cmr.rule.RuleService#saveRule(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.rule.Rule, int) + */ + public void saveRule(NodeRef nodeRef, Rule rule, int index) + { + saveRule(nodeRef, rule); + setRulePosition(nodeRef, rule.getNodeRef(), index); + } + + /** + * @see org.alfresco.service.cmr.rule.RuleService#setRulePosition(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef, int) + */ + public void setRulePosition(NodeRef nodeRef, NodeRef ruleNodeRef, int index) + { + NodeRef ruleFolder = getSavedRuleFolderRef(nodeRef); + if (ruleFolder != null) + { + List assocs = this.runtimeNodeService.getChildAssocs(ruleFolder, RegexQNamePattern.MATCH_ALL, ASSOC_NAME_RULES_REGEX); + List orderedAssocs = new ArrayList(assocs.size()); + ChildAssociationRef movedAssoc = null; + for (ChildAssociationRef assoc : assocs) + { + NodeRef childNodeRef = assoc.getChildRef(); + if (childNodeRef.equals(ruleNodeRef) == true) + { + movedAssoc = assoc; + } + else + { + orderedAssocs.add(assoc); + } + } + orderedAssocs.add(index, movedAssoc); + + index = 0; + for (ChildAssociationRef orderedAssoc : orderedAssocs) + { + nodeService.setChildAssociationIndex(orderedAssoc, index); + index++; + } + } + } + + /** + * @see org.alfresco.service.cmr.rule.RuleService#setRulePosition(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.rule.Rule, int) + */ + public void setRulePosition(NodeRef nodeRef, Rule rule, int index) + { + setRulePosition(nodeRef, rule.getNodeRef(), index); + } + /** * Save the action related to the rule. * diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java index 5abda7628e..a530db1a28 100644 --- a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java +++ b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java @@ -38,6 +38,7 @@ import org.alfresco.repo.content.transform.AbstractContentTransformerTest; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ActionCondition; +import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.CyclicChildRelationshipException; import org.alfresco.service.cmr.repository.NodeRef; @@ -46,6 +47,7 @@ import org.alfresco.service.cmr.rule.RuleType; import org.alfresco.service.cmr.security.MutableAuthenticationService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.QName; +import org.alfresco.service.namespace.RegexQNamePattern; /** @@ -55,6 +57,9 @@ import org.alfresco.service.namespace.QName; */ public class RuleServiceImplTest extends BaseRuleTest { + private String ASSOC_NAME_RULES_PREFIX = "rules"; + private RegexQNamePattern ASSOC_NAME_RULES_REGEX = new RegexQNamePattern(RuleModel.RULE_MODEL_URI, "^" + ASSOC_NAME_RULES_PREFIX + ".*"); + MutableAuthenticationService authenticationService; PermissionService permissionService; @@ -241,6 +246,37 @@ public class RuleServiceImplTest extends BaseRuleTest assertEquals(Integer.toString(index4), rule.getTitle()); index4++; } + + // Lets have a look at the assoc index and see if the are set correctly + NodeRef ruleFolder = ((RuntimeRuleService)ruleService).getSavedRuleFolderAssoc(nodeRef).getChildRef(); + if (ruleFolder != null) + { + // Get the rules for this node + List ruleChildAssocRefs = nodeService.getChildAssocs(ruleFolder, RegexQNamePattern.MATCH_ALL, ASSOC_NAME_RULES_REGEX); + System.out.println("Association Nth Sibling values ..."); + for (ChildAssociationRef ruleChildAssocRef : ruleChildAssocRefs) + { + System.out.println(" - Assoc index = " + ruleChildAssocRef.getNthSibling() + ", name = " + + nodeService.getProperty(ruleChildAssocRef.getChildRef(), ContentModel.PROP_TITLE)); + } + } + + rules = ruleService.getRules(nodeRef); + + Rule rule = rules.get(3); + ruleService.setRulePosition(nodeRef, rule, 1); + + if (ruleFolder != null) + { + // Get the rules for this node + List ruleChildAssocRefs = nodeService.getChildAssocs(ruleFolder, RegexQNamePattern.MATCH_ALL, ASSOC_NAME_RULES_REGEX); + System.out.println("After change of index ..."); + for (ChildAssociationRef ruleChildAssocRef : ruleChildAssocRefs) + { + System.out.println(" - Assoc index = " + ruleChildAssocRef.getNthSibling() + ", name = " + + nodeService.getProperty(ruleChildAssocRef.getChildRef(), ContentModel.PROP_TITLE)); +} + } } public void testIgnoreInheritedRules() diff --git a/source/java/org/alfresco/service/cmr/rule/RuleService.java b/source/java/org/alfresco/service/cmr/rule/RuleService.java index cc893767f9..e79a1b2202 100644 --- a/source/java/org/alfresco/service/cmr/rule/RuleService.java +++ b/source/java/org/alfresco/service/cmr/rule/RuleService.java @@ -200,7 +200,34 @@ public interface RuleService */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "rule"}) public void saveRule(NodeRef nodeRef, Rule rule); - + + /** + * + * @param nodeRef + * @param rule + * @param index + */ + @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "rule", "index"}) + public void saveRule(NodeRef nodeRef, Rule rule, int index); + + /** + * + * @param nodeRef + * @param ruleNodeRef + * @param index + */ + @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "ruleNodeRef", "index"}) + public void setRulePosition(NodeRef nodeRef, NodeRef ruleNodeRef, int index); + + /** + * + * @param nodeRef + * @param rule + * @param index + */ + @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "rule", "index"}) + public void setRulePosition(NodeRef nodeRef, Rule rule, int index); + /** * Removes a rule from the given rule actionable node *