From 1544887f4eeca95915609fdc2081bfe7a20ede34 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 4 Mar 2010 00:15:09 +0000 Subject: [PATCH] Link rules now automatically re-links - Calling link rules on an already linked folder will automatically unlink from the exisiting folder before linking to the new one. - Unit tests updated git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19049 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repo/rule/LinkRules.java | 39 +++++++--- .../org/alfresco/repo/rule/RuleLinkTest.java | 72 ++++++++++++++++++- 2 files changed, 99 insertions(+), 12 deletions(-) diff --git a/source/java/org/alfresco/repo/rule/LinkRules.java b/source/java/org/alfresco/repo/rule/LinkRules.java index f317a966e2..609c596536 100644 --- a/source/java/org/alfresco/repo/rule/LinkRules.java +++ b/source/java/org/alfresco/repo/rule/LinkRules.java @@ -21,8 +21,6 @@ package org.alfresco.repo.rule; import java.util.List; -import javax.swing.text.html.parser.ContentModel; - import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.action.ParameterDefinitionImpl; import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; @@ -31,6 +29,7 @@ import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.rule.RuleService; /** * Action implementation to link the rules from one folder to another @@ -39,18 +38,27 @@ import org.alfresco.service.cmr.repository.NodeService; */ public class LinkRules extends ActionExecuterAbstractBase { + /** Name and parameter constants */ public static final String NAME = "link-rules"; public static final String PARAM_LINK_FROM_NODE = "link_from_node"; + /** Node service */ private NodeService nodeService; + /** Runtime rule service */ private RuntimeRuleService ruleService; + /** + * @param ruleService rule service + */ public void setRuleService(RuntimeRuleService ruleService) { this.ruleService = ruleService; } + /** + * @param nodeService node service + */ public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; @@ -64,13 +72,6 @@ public class LinkRules extends ActionExecuterAbstractBase { if (nodeService.exists(actionedUponNodeRef) == true) { - // The actioned upon node is the rule folder we are interested in - // this should not already have rules associated with it - if (nodeService.hasAspect(actionedUponNodeRef, RuleModel.ASPECT_RULES) == true) - { - throw new AlfrescoRuntimeException("The link to node already has rules."); - } - // Link to folder is passed as a parameter // this should have rules already specified NodeRef linkedFromNodeRef = (NodeRef)action.getParameterValue(PARAM_LINK_FROM_NODE); @@ -79,6 +80,26 @@ public class LinkRules extends ActionExecuterAbstractBase throw new AlfrescoRuntimeException("The link from node has no rules to link."); } + // Check whether the node already has rules or not + if (nodeService.hasAspect(actionedUponNodeRef, RuleModel.ASPECT_RULES) == true) + { + // Check for a linked to node + NodeRef linkedToNode = ((RuleService)ruleService).getLinkedToRuleNode(actionedUponNodeRef); + if (linkedToNode == null) + { + // Can't link a node if it already has rules + throw new AlfrescoRuntimeException("The current folder has rules and can not be linked to another folder."); + } + else + { + // Unlink the folder, before relinking later to the specified node + NodeRef ruleFolder = ruleService.getSavedRuleFolderAssoc(linkedToNode).getChildRef(); + nodeService.removeChild(actionedUponNodeRef, ruleFolder); + nodeService.removeAspect(actionedUponNodeRef, RuleModel.ASPECT_RULES); + } + + } + // Create the destination folder as a secondary child of the first NodeRef ruleSetNodeRef = ruleService.getSavedRuleFolderAssoc(linkedFromNodeRef).getChildRef(); nodeService.addChild(actionedUponNodeRef, ruleSetNodeRef, RuleModel.ASSOC_RULE_FOLDER, RuleModel.ASSOC_RULE_FOLDER); diff --git a/source/java/org/alfresco/repo/rule/RuleLinkTest.java b/source/java/org/alfresco/repo/rule/RuleLinkTest.java index f59d44227d..6751011bbd 100644 --- a/source/java/org/alfresco/repo/rule/RuleLinkTest.java +++ b/source/java/org/alfresco/repo/rule/RuleLinkTest.java @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator; import org.alfresco.repo.action.executer.AddFeaturesActionExecuter; @@ -57,7 +58,6 @@ public class RuleLinkTest extends BaseSpringTest protected static final String CONDITION_DEF_NAME = ComparePropertyValueEvaluator.NAME; protected static final String COND_PROP_NAME_1 = ComparePropertyValueEvaluator.PARAM_VALUE; protected static final String COND_PROP_VALUE_1 = ".doc"; - private NodeService nodeService; private RuleService ruleService; @@ -69,6 +69,7 @@ public class RuleLinkTest extends BaseSpringTest private NodeRef rootNodeRef; private NodeRef folderOne; private NodeRef folderTwo; + private NodeRef folderThree; @SuppressWarnings("deprecation") @Override @@ -100,6 +101,7 @@ public class RuleLinkTest extends BaseSpringTest folderOne = fileFolderService.create(folder, "folderOne", ContentModel.TYPE_FOLDER).getNodeRef(); folderTwo = fileFolderService.create(folder, "folderTwo", ContentModel.TYPE_FOLDER).getNodeRef(); + folderThree = fileFolderService.create(folder, "folderThree", ContentModel.TYPE_FOLDER).getNodeRef(); } public void testLinkRule() @@ -175,8 +177,7 @@ public class RuleLinkTest extends BaseSpringTest assertEquals(folderTwo, linkedFrom.get(0)); // Unlink - Action unlinkAction = actionService.createAction(UnlinkRules.NAME); - actionService.executeAction(unlinkAction, folderTwo); + unlink(folderTwo); assertTrue(this.ruleService.hasRules(folderOne)); assertEquals(2, ruleService.getRules(folderOne, false).size()); @@ -188,6 +189,71 @@ public class RuleLinkTest extends BaseSpringTest } + private void link(NodeRef folderFrom, NodeRef folderTo) + { + Action linkAction = actionService.createAction(LinkRules.NAME); + linkAction.setParameterValue(LinkRules.PARAM_LINK_FROM_NODE, folderFrom); + actionService.executeAction(linkAction, folderTo); + } + + private void unlink(NodeRef folder) + { + Action unlinkAction = actionService.createAction(UnlinkRules.NAME); + actionService.executeAction(unlinkAction, folder); + } + + public void testRelink() + { + // Setup test data + Rule rule = createTestRule(false, "luke"); + this.ruleService.saveRule(folderOne, rule); + rule = createTestRule(false, "chewy"); + this.ruleService.saveRule(folderTwo, rule); + rule = createTestRule(false, "han"); + this.ruleService.saveRule(folderTwo, rule); + + List rules = ruleService.getRules(folderThree); + assertNotNull(rules); + assertTrue(rules.isEmpty()); + + link(folderOne, folderThree); + + rules = ruleService.getRules(folderThree); + assertNotNull(rules); + assertFalse(rules.isEmpty()); + assertEquals(1, rules.size()); + + link(folderTwo, folderThree); + + rules = ruleService.getRules(folderThree); + assertNotNull(rules); + assertFalse(rules.isEmpty()); + assertEquals(2, rules.size()); + + try + { + link(folderTwo, folderOne); + fail("Shouldn't be able to link a folder that already has rules that it owns."); + } + catch (AlfrescoRuntimeException exception) + { + // excepted + } + + unlink(folderThree); + + rules = ruleService.getRules(folderThree); + assertNotNull(rules); + assertTrue(rules.isEmpty()); + + link(folderTwo, folderThree); + + rules = ruleService.getRules(folderThree); + assertNotNull(rules); + assertFalse(rules.isEmpty()); + assertEquals(2, rules.size()); + } + protected Rule createTestRule(boolean isAppliedToChildren, String title) { // Rule properties