diff --git a/source/java/org/alfresco/repo/rule/RuleLinkTest.java b/source/java/org/alfresco/repo/rule/RuleLinkTest.java index f902152acc..dee8924938 100644 --- a/source/java/org/alfresco/repo/rule/RuleLinkTest.java +++ b/source/java/org/alfresco/repo/rule/RuleLinkTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -259,6 +259,43 @@ public class RuleLinkTest extends BaseSpringTest assertEquals(2, rules.size()); } + /** + * ALF-11923 + * @since Odin + * @author Neil Mc Erlean. + */ + public void testDeleteFolderWithRulesLinkedTo() + { + // Setup test data + Rule rule = createTestRule(false, "luke"); + this.ruleService.saveRule(folderOne, rule); + + link(folderOne, folderTwo); + link(folderOne, folderThree); + + List rules1 = ruleService.getRules(folderOne); + assertNotNull(rules1); + assertFalse(rules1.isEmpty()); + assertEquals(1, rules1.size()); + + List rules2 = ruleService.getRules(folderTwo); + assertEquals(rules1, rules2); + + List rules3 = ruleService.getRules(folderThree); + assertEquals(rules1, rules3); + + // Now delete folder 1. + nodeService.deleteNode(folderOne); + rules2 = ruleService.getRules(folderTwo); + rules3 = ruleService.getRules(folderThree); + + assertTrue(rules2.isEmpty()); + assertFalse(nodeService.hasAspect(folderTwo, RuleModel.ASPECT_RULES)); + + assertTrue(rules3.isEmpty()); + assertFalse(nodeService.hasAspect(folderThree, RuleModel.ASPECT_RULES)); + } + protected Rule createTestRule(boolean isAppliedToChildren, String title) { // Rule properties diff --git a/source/java/org/alfresco/repo/rule/RulesAspect.java b/source/java/org/alfresco/repo/rule/RulesAspect.java index 88cc458b76..b32701168c 100644 --- a/source/java/org/alfresco/repo/rule/RulesAspect.java +++ b/source/java/org/alfresco/repo/rule/RulesAspect.java @@ -18,6 +18,7 @@ */ package org.alfresco.repo.rule; +import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; @@ -25,6 +26,7 @@ import org.alfresco.repo.copy.CopyBehaviourCallback; import org.alfresco.repo.copy.CopyDetails; import org.alfresco.repo.copy.CopyServicePolicies; import org.alfresco.repo.copy.DefaultCopyBehaviourCallback; +import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.PolicyComponent; @@ -45,7 +47,9 @@ import org.apache.commons.logging.LogFactory; */ public class RulesAspect implements CopyServicePolicies.OnCopyNodePolicy, - CopyServicePolicies.OnCopyCompletePolicy + CopyServicePolicies.OnCopyCompletePolicy, + NodeServicePolicies.OnAddAspectPolicy, + NodeServicePolicies.BeforeDeleteNodePolicy { private PolicyComponent policyComponent; private BehaviourFilter behaviourFilter; @@ -93,6 +97,10 @@ public class RulesAspect implements QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"), RuleModel.ASPECT_RULES, new JavaBehaviour(this, "onAddAspect")); + this.policyComponent.bindClassBehaviour( + QName.createQName(NamespaceService.ALFRESCO_URI, "beforeDeleteNode"), + RuleModel.ASPECT_RULES, + new JavaBehaviour(this, "beforeDeleteNode")); } /** @@ -123,6 +131,39 @@ public class RulesAspect implements } } + /** + * @since Odin + * @author Neil Mc Erlean + */ + @Override public void beforeDeleteNode(NodeRef nodeRef) + { + this.ruleService.disableRules(nodeRef); + + // The rule folder & below will be deleted automatically in the normal way, so we don't + // need to worry about them. + // But we need additional handling for any other folders which have rules linked to this folder's rules. See ALF-11923. + List children = nodeService.getChildAssocs(nodeRef, RuleModel.ASSOC_RULE_FOLDER, RuleModel.ASSOC_RULE_FOLDER); + if ( !children.isEmpty()) + { + final ChildAssociationRef primaryRulesFolderAssoc = children.get(0); + NodeRef rulesSystemFolder = primaryRulesFolderAssoc.getChildRef(); + + List foldersLinkedToThisRuleFolder = nodeService.getParentAssocs(rulesSystemFolder, RuleModel.ASSOC_RULE_FOLDER, RuleModel.ASSOC_RULE_FOLDER); + + for (ChildAssociationRef linkedFolder : foldersLinkedToThisRuleFolder) + { + // But don't delete the primary child-assoc, which is done automatically + if ( !linkedFolder.getParentRef().equals(primaryRulesFolderAssoc.getParentRef())) + { + // Remove the aspect that marks the other folder has having rules (linked ones) + nodeService.removeAspect(linkedFolder.getParentRef(), RuleModel.ASPECT_RULES); + // And remove the child-assoc to the rules folder. + nodeService.removeSecondaryChildAssociation(linkedFolder); + } + } + } + } + /** * @return Returns {@link RulesAspectCopyBehaviourCallback} */