Fix for ALF-11923. Linked rules can't be deleted if source folder was deleted.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@35737 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Neil McErlean
2012-04-25 22:03:48 +00:00
parent d0fdeafa2c
commit 25d5daf40b
2 changed files with 80 additions and 2 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2010 Alfresco Software Limited. * Copyright (C) 2005-2012 Alfresco Software Limited.
* *
* This file is part of Alfresco * This file is part of Alfresco
* *
@@ -259,6 +259,43 @@ public class RuleLinkTest extends BaseSpringTest
assertEquals(2, rules.size()); 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<Rule> rules1 = ruleService.getRules(folderOne);
assertNotNull(rules1);
assertFalse(rules1.isEmpty());
assertEquals(1, rules1.size());
List<Rule> rules2 = ruleService.getRules(folderTwo);
assertEquals(rules1, rules2);
List<Rule> 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) protected Rule createTestRule(boolean isAppliedToChildren, String title)
{ {
// Rule properties // Rule properties

View File

@@ -18,6 +18,7 @@
*/ */
package org.alfresco.repo.rule; package org.alfresco.repo.rule;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.alfresco.model.ContentModel; 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.CopyDetails;
import org.alfresco.repo.copy.CopyServicePolicies; import org.alfresco.repo.copy.CopyServicePolicies;
import org.alfresco.repo.copy.DefaultCopyBehaviourCallback; import org.alfresco.repo.copy.DefaultCopyBehaviourCallback;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.policy.PolicyComponent;
@@ -45,7 +47,9 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class RulesAspect implements public class RulesAspect implements
CopyServicePolicies.OnCopyNodePolicy, CopyServicePolicies.OnCopyNodePolicy,
CopyServicePolicies.OnCopyCompletePolicy CopyServicePolicies.OnCopyCompletePolicy,
NodeServicePolicies.OnAddAspectPolicy,
NodeServicePolicies.BeforeDeleteNodePolicy
{ {
private PolicyComponent policyComponent; private PolicyComponent policyComponent;
private BehaviourFilter behaviourFilter; private BehaviourFilter behaviourFilter;
@@ -93,6 +97,10 @@ public class RulesAspect implements
QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"), QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"),
RuleModel.ASPECT_RULES, RuleModel.ASPECT_RULES,
new JavaBehaviour(this, "onAddAspect")); 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<ChildAssociationRef> 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<ChildAssociationRef> 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} * @return Returns {@link RulesAspectCopyBehaviourCallback}
*/ */