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
This commit is contained in:
Roy Wetherall
2010-03-04 00:15:09 +00:00
parent 673add1796
commit 1544887f4e
2 changed files with 99 additions and 12 deletions

View File

@@ -21,8 +21,6 @@ package org.alfresco.repo.rule;
import java.util.List; import java.util.List;
import javax.swing.text.html.parser.ContentModel;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.action.ParameterDefinitionImpl; import org.alfresco.repo.action.ParameterDefinitionImpl;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; 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.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; 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 * 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 public class LinkRules extends ActionExecuterAbstractBase
{ {
/** Name and parameter constants */
public static final String NAME = "link-rules"; public static final String NAME = "link-rules";
public static final String PARAM_LINK_FROM_NODE = "link_from_node"; public static final String PARAM_LINK_FROM_NODE = "link_from_node";
/** Node service */
private NodeService nodeService; private NodeService nodeService;
/** Runtime rule service */
private RuntimeRuleService ruleService; private RuntimeRuleService ruleService;
/**
* @param ruleService rule service
*/
public void setRuleService(RuntimeRuleService ruleService) public void setRuleService(RuntimeRuleService ruleService)
{ {
this.ruleService = ruleService; this.ruleService = ruleService;
} }
/**
* @param nodeService node service
*/
public void setNodeService(NodeService nodeService) public void setNodeService(NodeService nodeService)
{ {
this.nodeService = nodeService; this.nodeService = nodeService;
@@ -64,13 +72,6 @@ public class LinkRules extends ActionExecuterAbstractBase
{ {
if (nodeService.exists(actionedUponNodeRef) == true) 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 // Link to folder is passed as a parameter
// this should have rules already specified // this should have rules already specified
NodeRef linkedFromNodeRef = (NodeRef)action.getParameterValue(PARAM_LINK_FROM_NODE); 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."); 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 // Create the destination folder as a secondary child of the first
NodeRef ruleSetNodeRef = ruleService.getSavedRuleFolderAssoc(linkedFromNodeRef).getChildRef(); NodeRef ruleSetNodeRef = ruleService.getSavedRuleFolderAssoc(linkedFromNodeRef).getChildRef();
nodeService.addChild(actionedUponNodeRef, ruleSetNodeRef, RuleModel.ASSOC_RULE_FOLDER, RuleModel.ASSOC_RULE_FOLDER); nodeService.addChild(actionedUponNodeRef, ruleSetNodeRef, RuleModel.ASSOC_RULE_FOLDER, RuleModel.ASSOC_RULE_FOLDER);

View File

@@ -24,6 +24,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator; import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator;
import org.alfresco.repo.action.executer.AddFeaturesActionExecuter; 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 CONDITION_DEF_NAME = ComparePropertyValueEvaluator.NAME;
protected static final String COND_PROP_NAME_1 = ComparePropertyValueEvaluator.PARAM_VALUE; protected static final String COND_PROP_NAME_1 = ComparePropertyValueEvaluator.PARAM_VALUE;
protected static final String COND_PROP_VALUE_1 = ".doc"; protected static final String COND_PROP_VALUE_1 = ".doc";
private NodeService nodeService; private NodeService nodeService;
private RuleService ruleService; private RuleService ruleService;
@@ -69,6 +69,7 @@ public class RuleLinkTest extends BaseSpringTest
private NodeRef rootNodeRef; private NodeRef rootNodeRef;
private NodeRef folderOne; private NodeRef folderOne;
private NodeRef folderTwo; private NodeRef folderTwo;
private NodeRef folderThree;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
@@ -100,6 +101,7 @@ public class RuleLinkTest extends BaseSpringTest
folderOne = fileFolderService.create(folder, "folderOne", ContentModel.TYPE_FOLDER).getNodeRef(); folderOne = fileFolderService.create(folder, "folderOne", ContentModel.TYPE_FOLDER).getNodeRef();
folderTwo = fileFolderService.create(folder, "folderTwo", 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() public void testLinkRule()
@@ -175,8 +177,7 @@ public class RuleLinkTest extends BaseSpringTest
assertEquals(folderTwo, linkedFrom.get(0)); assertEquals(folderTwo, linkedFrom.get(0));
// Unlink // Unlink
Action unlinkAction = actionService.createAction(UnlinkRules.NAME); unlink(folderTwo);
actionService.executeAction(unlinkAction, folderTwo);
assertTrue(this.ruleService.hasRules(folderOne)); assertTrue(this.ruleService.hasRules(folderOne));
assertEquals(2, ruleService.getRules(folderOne, false).size()); 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<Rule> 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) protected Rule createTestRule(boolean isAppliedToChildren, String title)
{ {
// Rule properties // Rule properties