mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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
|
||||||
|
@@ -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}
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user