actionParams = ruleAction.getParameterValues();
assertNotNull(actionParams);
assertEquals(1, actionParams.size());
assertTrue(actionParams.containsKey(ACTION_PROP_NAME_1));
diff --git a/source/java/org/alfresco/repo/rule/RuleImpl.java b/source/java/org/alfresco/repo/rule/RuleImpl.java
deleted file mode 100644
index 2bc76da74f..0000000000
--- a/source/java/org/alfresco/repo/rule/RuleImpl.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2005 Alfresco, Inc.
- *
- * Licensed under the Mozilla Public License version 1.1
- * with a permitted attribution clause. You may obtain a
- * copy of the License at
- *
- * http://www.alfresco.org/legal/license.txt
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
- * either express or implied. See the License for the specific
- * language governing permissions and limitations under the
- * License.
- */
-package org.alfresco.repo.rule;
-
-import java.io.Serializable;
-
-import org.alfresco.repo.action.CompositeActionImpl;
-import org.alfresco.service.cmr.repository.NodeRef;
-import org.alfresco.service.cmr.rule.Rule;
-import org.alfresco.util.ParameterCheck;
-
-/**
- * Rule implementation class.
- *
- * Encapsulates all the information about a rule. Can be creted or editied and
- * then passed to the rule service to create/update a rule instance.
- *
- * @author Roy Wetherall
- */
-public class RuleImpl extends CompositeActionImpl implements Serializable, Rule
-{
- /**
- * Serial version UID
- */
- private static final long serialVersionUID = 3544385898889097524L;
-
- /**
- * The rule type name
- */
- private String ruleTypeName;
-
- /**
- * Indicates whether the rule is applied to all the children of the associated node
- * rather than just the node itself.
- */
- private boolean isAppliedToChildren = false;
-
- /**
- * Constructor
- *
- * @param ruleTypeName the rule type name
- */
- public RuleImpl(String id, String ruleTypeName, NodeRef owningNodeRef)
- {
- super(id, owningNodeRef);
- ParameterCheck.mandatory("ruleTypeName", ruleTypeName);
-
- this.ruleTypeName = ruleTypeName;
- }
-
- /**
- * @see org.alfresco.service.cmr.rule.Rule#isAppliedToChildren()
- */
- public boolean isAppliedToChildren()
- {
- return this.isAppliedToChildren;
- }
-
- /**
- *@see org.alfresco.service.cmr.rule.Rule#applyToChildren(boolean)
- */
- public void applyToChildren(boolean isAppliedToChildren)
- {
- this.isAppliedToChildren = isAppliedToChildren;
- }
-
- /**
- * @see org.alfresco.service.cmr.rule.Rule#getRuleTypeName()
- */
- public String getRuleTypeName()
- {
- return this.ruleTypeName;
- }
-}
-
diff --git a/source/java/org/alfresco/repo/rule/RuleModel.java b/source/java/org/alfresco/repo/rule/RuleModel.java
index 6f2da46721..125efcc03e 100644
--- a/source/java/org/alfresco/repo/rule/RuleModel.java
+++ b/source/java/org/alfresco/repo/rule/RuleModel.java
@@ -10,12 +10,15 @@ import org.alfresco.service.namespace.QName;
public interface RuleModel
{
/** Rule model constants */
- static final String RULE_MODEL_URI = "http://www.alfresco.org/model/rule/1.0";
- static final String RULE_MODEL_PREFIX = "rule";
- static final QName TYPE_RULE = QName.createQName(RULE_MODEL_URI, "rule");
- static final QName PROP_RULE_TYPE = QName.createQName(RULE_MODEL_URI, "ruleType");
- static final QName TYPE_RULE_CONTENT = QName.createQName(RULE_MODEL_URI, "rulecontent");
- static final QName PROP_APPLY_TO_CHILDREN = QName.createQName(RULE_MODEL_URI, "applyToChildren");
- static final QName ASPECT_RULES = QName.createQName(RULE_MODEL_URI, "rules");
- static final QName ASSOC_RULE_FOLDER = QName.createQName(RULE_MODEL_URI, "ruleFolder");
+ static final String RULE_MODEL_URI = "http://www.alfresco.org/model/rule/1.0";
+ static final String RULE_MODEL_PREFIX = "rule";
+
+ static final QName TYPE_RULE = QName.createQName(RULE_MODEL_URI, "rule");
+ static final QName PROP_RULE_TYPE = QName.createQName(RULE_MODEL_URI, "ruleType");
+ static final QName PROP_APPLY_TO_CHILDREN = QName.createQName(RULE_MODEL_URI, "applyToChildren");
+ static final QName PROP_EXECUTE_ASYNC = QName.createQName(RULE_MODEL_URI, "executeAsynchronously");
+ static final QName ASSOC_ACTION = QName.createQName(RULE_MODEL_URI, "action");
+
+ static final QName ASPECT_RULES = QName.createQName(RULE_MODEL_URI, "rules");
+ static final QName ASSOC_RULE_FOLDER = QName.createQName(RULE_MODEL_URI, "ruleFolder");
}
\ No newline at end of file
diff --git a/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java b/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java
index 4ad3a46a20..6fe7325ab5 100644
--- a/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java
+++ b/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java
@@ -81,7 +81,7 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StopWatch;
/**
- * @author Roy Wetherall
+ * @author Roy Wetherall
*/
public class RuleServiceCoverageTest extends TestCase
{
@@ -109,6 +109,7 @@ public class RuleServiceCoverageTest extends TestCase
private ActionService actionService;
private ContentTransformerRegistry transformerRegistry;
private CopyService copyService;
+ private AuthenticationComponent authenticationComponent;
/**
* Category related values
@@ -147,9 +148,10 @@ public class RuleServiceCoverageTest extends TestCase
this.actionService = serviceRegistry.getActionService();
this.transactionService = serviceRegistry.getTransactionService();
this.transformerRegistry = (ContentTransformerRegistry)applicationContext.getBean("contentTransformerRegistry");
+ this.authenticationComponent = (AuthenticationComponent)applicationContext.getBean("authenticationComponent");
- AuthenticationComponent authenticationComponent = (AuthenticationComponent)applicationContext.getBean("authenticationComponent");
- authenticationComponent.setCurrentUser(authenticationComponent.getSystemUserName());
+ //authenticationComponent.setCurrentUser(authenticationComponent.getSystemUserName());
+ authenticationComponent.setSystemUserAsCurrentUser();
this.testStoreRef = this.nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "Test_" + System.currentTimeMillis());
this.rootNodeRef = this.nodeService.getRootNode(this.testStoreRef);
@@ -159,11 +161,7 @@ public class RuleServiceCoverageTest extends TestCase
this.rootNodeRef,
ContentModel.ASSOC_CHILDREN,
ContentModel.ASSOC_CHILDREN,
- ContentModel.TYPE_CONTAINER).getChildRef();
-
- // Create and authenticate the user used in the tests
- //TestWithUserUtils.createUser(USER_NAME, PWD, this.rootNodeRef, this.nodeService, this.authenticationService);
- //TestWithUserUtils.authenticateUser(USER_NAME, PWD, this.rootNodeRef, this.authenticationService);
+ ContentModel.TYPE_CONTAINER).getChildRef();
}
private Rule createRule(
@@ -173,11 +171,14 @@ public class RuleServiceCoverageTest extends TestCase
String conditionName,
Map conditionParams)
{
- Rule rule = this.ruleService.createRule(ruleTypeName);
+ Rule rule = new Rule();
+ rule.setRuleType(ruleTypeName);
+
+ Action action = this.actionService.createAction(actionName, actionParams);
ActionCondition condition = this.actionService.createActionCondition(conditionName, conditionParams);
- rule.addActionCondition(condition);
- Action action = this.actionService.createAction(actionName, actionParams);
- rule.addAction(action);
+ action.addActionCondition(condition);
+ rule.setAction(action);
+
return rule;
}
@@ -226,8 +227,8 @@ public class RuleServiceCoverageTest extends TestCase
/**
* Check async rule execution
*/
- public void testAsyncRuleExecution()
- {
+ public void testAsyncRuleExecution()
+ {
final NodeRef newNodeRef = TransactionUtil.executeInUserTransaction(
this.transactionService,
new TransactionUtil.TransactionWork()
@@ -323,9 +324,9 @@ public class RuleServiceCoverageTest extends TestCase
params2.put(ContentModel.PROP_APPROVE_MOVE.toString(), false);
// Test that rule can be updated and execute correctly
- rule.removeAllActions();
+ //rule.removeAllActions();
Action action2 = this.actionService.createAction(AddFeaturesActionExecuter.NAME, params2);
- rule.addAction(action2);
+ rule.setAction(action2);
this.ruleService.saveRule(this.nodeRef, rule);
NodeRef newNodeRef2 = this.nodeService.createNode(
@@ -427,15 +428,15 @@ public class RuleServiceCoverageTest extends TestCase
getContentProperties()).getChildRef();
addContentToNode(contentToCopy);
- // Create the rule and add to folder
Map params = new HashMap(1);
- params.put("aspect-name", ContentModel.ASPECT_TEMPLATABLE);
+ params.put("aspect-name", ContentModel.ASPECT_TEMPLATABLE);
+
Rule rule = createRule(
RuleType.INBOUND,
AddFeaturesActionExecuter.NAME,
params,
NoConditionEvaluator.NAME,
- null);
+ null);
rule.applyToChildren(true);
this.ruleService.saveRule(copyToFolder, rule);
@@ -1232,9 +1233,9 @@ public class RuleServiceCoverageTest extends TestCase
// Test begins with
Map condParamsBegins = new HashMap(1);
condParamsBegins.put(ComparePropertyValueEvaluator.PARAM_VALUE, "bob*");
- rule.removeAllActionConditions();
+ rule.getAction().removeAllActionConditions();
ActionCondition condition1 = this.actionService.createActionCondition(ComparePropertyValueEvaluator.NAME, condParamsBegins);
- rule.addActionCondition(condition1);
+ rule.getAction().addActionCondition(condition1);
this.ruleService.saveRule(this.nodeRef, rule);
Map propsx = new HashMap();
propsx.put(ContentModel.PROP_NAME, "mybobbins.doc");
@@ -1264,9 +1265,9 @@ public class RuleServiceCoverageTest extends TestCase
// Test ends with
Map condParamsEnds = new HashMap(1);
condParamsEnds.put(ComparePropertyValueEvaluator.PARAM_VALUE, "*s.doc");
- rule.removeAllActionConditions();
+ rule.getAction().removeAllActionConditions();
ActionCondition condition2 = this.actionService.createActionCondition(ComparePropertyValueEvaluator.NAME, condParamsEnds);
- rule.addActionCondition(condition2);
+ rule.getAction().addActionCondition(condition2);
this.ruleService.saveRule(this.nodeRef, rule);
Map propsa = new HashMap();
propsa.put(ContentModel.PROP_NAME, "bobbins.document");
diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
index a950e8a62d..8f92e35eb6 100644
--- a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
+++ b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
@@ -18,7 +18,6 @@ package org.alfresco.repo.rule;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -30,6 +29,7 @@ import org.alfresco.repo.action.ActionModel;
import org.alfresco.repo.action.RuntimeActionService;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.transaction.TransactionListener;
+import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ActionService;
import org.alfresco.service.cmr.action.ActionServiceException;
import org.alfresco.service.cmr.dictionary.DictionaryService;
@@ -41,8 +41,6 @@ import org.alfresco.service.cmr.rule.RuleService;
import org.alfresco.service.cmr.rule.RuleServiceException;
import org.alfresco.service.cmr.rule.RuleType;
import org.alfresco.service.cmr.search.SearchService;
-import org.alfresco.service.namespace.DynamicNamespacePrefixResolver;
-import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.GUID;
@@ -125,7 +123,12 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
/**
* The rule transaction listener
*/
- private TransactionListener ruleTransactionListener = new RuleTransactionListener(this);
+ private TransactionListener ruleTransactionListener = new RuleTransactionListener(this);
+
+ /**
+ * Indicates whether the rules are disabled for the curren thread
+ */
+ private ThreadLocal rulesDisabled = new ThreadLocal();
/**
* Set the permission-safe node service
@@ -229,6 +232,30 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
return this.ruleTypes.get(name);
}
+ /**
+ * @see org.alfresco.service.cmr.rule.RuleService#enableRules()
+ */
+ public void enableRules()
+ {
+ this.rulesDisabled.remove();
+ }
+
+ /**
+ * @see org.alfresco.service.cmr.rule.RuleService#disableRules()
+ */
+ public void disableRules()
+ {
+ this.rulesDisabled.set(Boolean.TRUE);
+ }
+
+ /**
+ * @see org.alfresco.service.cmr.rule.RuleService#isEnabled()
+ */
+ public boolean isEnabled()
+ {
+ return (this.rulesDisabled.get() == null);
+ }
+
/**
* @see org.alfresco.service.cmr.rule.RuleService#rulesEnabled(NodeRef)
*/
@@ -331,7 +358,7 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
{
// Create the rule and add to the list
NodeRef ruleNodeRef = ruleChildAssocRef.getChildRef();
- Rule rule = createRule(nodeRef, ruleNodeRef);
+ Rule rule = getRule(ruleNodeRef);
allRules.add(rule);
}
@@ -339,7 +366,7 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
for (Rule rule : allRules)
{
if ((rules.contains(rule) == false) &&
- (ruleTypeName == null || ruleTypeName.equals(rule.getRuleTypeName()) == true))
+ (ruleTypeName == null || rule.getRuleTypes().contains(ruleTypeName) == true))
{
rules.add(rule);
}
@@ -459,7 +486,7 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
// Filter the rule list by rule type
for (Rule rule : allInheritedRules)
{
- if (rule.getRuleTypeName().equals(ruleTypeName) == true)
+ if (rule.getRuleTypes().contains(ruleTypeName) == true)
{
inheritedRules.add(rule);
}
@@ -470,75 +497,31 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
return inheritedRules;
}
- /**
- * @see org.alfresco.repo.rule.RuleService#getRule(String)
- */
- public Rule getRule(NodeRef nodeRef, String ruleId)
- {
- Rule rule = null;
-
- if (this.runtimeNodeService.exists(nodeRef) == true)
- {
- NodeRef ruleNodeRef = getRuleNodeRefFromId(nodeRef, ruleId);
- if (ruleNodeRef != null)
- {
- rule = createRule(nodeRef, ruleNodeRef);
- }
- }
-
- return rule;
- }
-
- /**
- * Gets the rule node ref from the action id
- *
- * @param nodeRef the node reference
- * @param actionId the rule id
- * @return the rule node reference
- */
- private NodeRef getRuleNodeRefFromId(NodeRef nodeRef, String ruleId)
- {
- NodeRef result = null;
- if (this.runtimeNodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES) == true)
- {
- NodeRef ruleFolder = getSavedRuleFolderRef(nodeRef);
- if (ruleFolder != null)
- {
- DynamicNamespacePrefixResolver namespacePrefixResolver = new DynamicNamespacePrefixResolver();
- namespacePrefixResolver.registerNamespace(NamespaceService.SYSTEM_MODEL_PREFIX, NamespaceService.SYSTEM_MODEL_1_0_URI);
-
- List nodeRefs = searchService.selectNodes(
- ruleFolder,
- "*[@sys:" + ContentModel.PROP_NODE_UUID.getLocalName() + "='" + ruleId + "']",
- null,
- namespacePrefixResolver,
- false);
- if (nodeRefs.size() != 0)
- {
- result = nodeRefs.get(0);
- }
- }
- }
-
- return result;
- }
-
/**
* Create the rule object from the rule node reference
*
* @param ruleNodeRef the rule node reference
* @return the rule
*/
- private Rule createRule(NodeRef owningNodeRef, NodeRef ruleNodeRef)
+ public Rule getRule(NodeRef ruleNodeRef)
{
// Get the rule properties
Map props = this.runtimeNodeService.getProperties(ruleNodeRef);
// Create the rule
- String ruleTypeName = (String)props.get(RuleModel.PROP_RULE_TYPE);
- Rule rule = new RuleImpl(ruleNodeRef.getId(), ruleTypeName, owningNodeRef);
-
- // Set the other rule properties
+ Rule rule = new Rule(ruleNodeRef);
+
+ // Set the owning node ref
+ //rule.setOwningNodeRef((NodeRef)props.get(RuleModel.PROP_OWNING_NODEREF));
+
+ // Set the title and description
+ rule.setTitle((String)props.get(ContentModel.PROP_TITLE));
+ rule.setDescription((String)props.get(ContentModel.PROP_DESCRIPTION));
+
+ // Set the rule types
+ rule.setRuleTypes((List)props.get(RuleModel.PROP_RULE_TYPE));
+
+ // Set the applied to children value
boolean isAppliedToChildren = false;
Boolean value = (Boolean)props.get(RuleModel.PROP_APPLY_TO_CHILDREN);
if (value != null)
@@ -546,69 +529,125 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
isAppliedToChildren = value.booleanValue();
}
rule.applyToChildren(isAppliedToChildren);
+
+ // Set the execute asynchronously value
+ boolean executeAsync = false;
+ Boolean value2 = (Boolean)props.get(RuleModel.PROP_EXECUTE_ASYNC);
+ if (value2 != null)
+ {
+ executeAsync = value2.booleanValue();
+ }
+ rule.setExecuteAsynchronously(executeAsync);
- // Populate the composite action details
- runtimeActionService.populateCompositeAction(ruleNodeRef, rule);
+ // Get the action node reference
+ List actions = this.nodeService.getChildAssocs(ruleNodeRef, RuleModel.ASSOC_ACTION, RuleModel.ASSOC_ACTION);
+ if (actions.size() == 0)
+ {
+ throw new RuleServiceException("Rule exists without a specified action");
+ }
+ else if (actions.size() > 1)
+ {
+ throw new RuleServiceException("Rule exists with more than one specified action");
+ }
+ NodeRef actionNodeRef = actions.get(0).getChildRef();
+ // Here we need to create the action from the action node reference
+ Action action = runtimeActionService.createAction(actionNodeRef);
+ rule.setAction(action);
+
return rule;
}
- /**
- * @see org.alfresco.repo.rule.RuleService#createRule(org.alfresco.repo.rule.RuleType)
- */
- public Rule createRule(String ruleTypeName)
- {
- // Create the new rule, giving it a unique rule id
- String id = GUID.generate();
- return new RuleImpl(id, ruleTypeName, null);
- }
-
/**
* @see org.alfresco.repo.rule.RuleService#saveRule(org.alfresco.repo.ref.NodeRef, org.alfresco.repo.rule.Rule)
*/
public void saveRule(NodeRef nodeRef, Rule rule)
{
- if (this.nodeService.exists(nodeRef) == false)
- {
- throw new RuleServiceException("The node does not exist.");
- }
-
- NodeRef ruleNodeRef = getRuleNodeRefFromId(nodeRef, rule.getId());
- if (ruleNodeRef == null)
- {
- if (this.nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES) == false)
- {
- // Add the actionable aspect
- this.nodeService.addAspect(nodeRef, RuleModel.ASPECT_RULES, null);
- }
-
- Map props = new HashMap(3);
- props.put(RuleModel.PROP_RULE_TYPE, rule.getRuleTypeName());
- props.put(ActionModel.PROP_DEFINITION_NAME, rule.getActionDefinitionName());
- props.put(ContentModel.PROP_NODE_UUID, rule.getId());
-
- // Create the action node
- ruleNodeRef = this.nodeService.createNode(
- getSavedRuleFolderRef(nodeRef),
- ContentModel.ASSOC_CONTAINS,
- QName.createQName(RuleModel.RULE_MODEL_URI, ASSOC_NAME_RULES_PREFIX + GUID.generate()),
- RuleModel.TYPE_RULE,
- props).getChildRef();
-
- // Update the created details
- ((RuleImpl)rule).setCreator((String)this.nodeService.getProperty(ruleNodeRef, ContentModel.PROP_CREATOR));
- ((RuleImpl)rule).setCreatedDate((Date)this.nodeService.getProperty(ruleNodeRef, ContentModel.PROP_CREATED));
- }
+ disableRules();
+ try
+ {
+ if (this.nodeService.exists(nodeRef) == false)
+ {
+ throw new RuleServiceException("The node does not exist.");
+ }
+
+ NodeRef ruleNodeRef = rule.getNodeRef();
+ if (ruleNodeRef == null)
+ {
+ if (this.nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES) == false)
+ {
+ // Add the actionable aspect
+ this.nodeService.addAspect(nodeRef, RuleModel.ASPECT_RULES, null);
+ }
+
+ // Create the action node
+ ruleNodeRef = this.nodeService.createNode(
+ getSavedRuleFolderRef(nodeRef),
+ ContentModel.ASSOC_CONTAINS,
+ QName.createQName(RuleModel.RULE_MODEL_URI, ASSOC_NAME_RULES_PREFIX + GUID.generate()),
+ RuleModel.TYPE_RULE).getChildRef();
+
+ // Set the rule node reference and the owning node reference
+ rule.setNodeRef(ruleNodeRef);
+ }
+
+ // Update the properties of the rule
+ this.nodeService.setProperty(ruleNodeRef, ContentModel.PROP_TITLE, rule.getTitle());
+ this.nodeService.setProperty(ruleNodeRef, ContentModel.PROP_DESCRIPTION, rule.getDescription());
+ this.nodeService.setProperty(ruleNodeRef, RuleModel.PROP_RULE_TYPE, (Serializable)rule.getRuleTypes());
+ this.nodeService.setProperty(ruleNodeRef, RuleModel.PROP_APPLY_TO_CHILDREN, rule.isAppliedToChildren());
+ this.nodeService.setProperty(ruleNodeRef, RuleModel.PROP_EXECUTE_ASYNC, rule.getExecuteAsynchronously());
+
+ // Save the rule's action
+ saveAction(ruleNodeRef, rule);
+ }
+ finally
+ {
+ enableRules();
+ }
+ }
+
+ private void saveAction(NodeRef ruleNodeRef, Rule rule)
+ {
+ // Get the action definition from the rule
+ Action action = rule.getAction();
+ if (action == null)
+ {
+ throw new RuleServiceException("An action must be specified when defining a rule.");
+ }
- // Update the properties of the rule
- this.nodeService.setProperty(ruleNodeRef, RuleModel.PROP_APPLY_TO_CHILDREN, rule.isAppliedToChildren());
-
- // Save the remainder of the rule as a composite action
- runtimeActionService.saveActionImpl(nodeRef, ruleNodeRef, rule);
+ // Get the current action node reference
+ NodeRef actionNodeRef = null;
+ List actions = this.nodeService.getChildAssocs(ruleNodeRef, RuleModel.ASSOC_ACTION, RuleModel.ASSOC_ACTION);
+ if (actions.size() == 1)
+ {
+ // We need to check that the action is the same
+ actionNodeRef = actions.get(0).getChildRef();
+ if (actionNodeRef.getId().equals(action.getId()) == false)
+ {
+ // Delete the old action
+ this.nodeService.deleteNode(actionNodeRef);
+ actionNodeRef = null;
+ }
+ }
+ else if (actions.size() > 1)
+ {
+ throw new RuleServiceException("The rule has become corrupt. More than one action is associated with the rule.");
+ }
+
+ // Create the new action node reference
+ if (actionNodeRef == null)
+ {
+ actionNodeRef = this.runtimeActionService.createActionNodeRef(action, ruleNodeRef, RuleModel.ASSOC_ACTION, RuleModel.ASSOC_ACTION);
+ }
+
+ // Update the action node
+ this.runtimeActionService.saveActionImpl(actionNodeRef, action);
+
}
/**
- * @see org.alfresco.repo.rule.RuleService#removeRule(org.alfresco.repo.ref.NodeRef, org.alfresco.repo.rule.RuleImpl)
+ * @see org.alfresco.repo.rule.RuleService#removeRule(org.alfresco.repo.ref.NodeRef, org.alfresco.service.cmr.rule.Rule)
*/
public void removeRule(NodeRef nodeRef, Rule rule)
{
@@ -618,7 +657,7 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
disableRules(nodeRef);
try
{
- NodeRef ruleNodeRef = getRuleNodeRefFromId(nodeRef, rule.getId());
+ NodeRef ruleNodeRef = rule.getNodeRef();
if (ruleNodeRef != null)
{
this.nodeService.removeChild(getSavedRuleFolderRef(nodeRef), ruleNodeRef);
@@ -669,7 +708,8 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
public void addRulePendingExecution(NodeRef actionableNodeRef, NodeRef actionedUponNodeRef, Rule rule, boolean executeAtEnd)
{
// First check to see if the node has been disabled
- if (this.disabledNodeRefs.contains(rule.getOwningNodeRef()) == false &&
+ if (this.rulesDisabled.get() == null &&
+ this.disabledNodeRefs.contains(this.getOwningNodeRef(rule)) == false &&
this.disabledRules.contains(rule) == false)
{
PendingRuleData pendingRuleData = new PendingRuleData(actionableNodeRef, actionedUponNodeRef, rule, executeAtEnd);
@@ -697,7 +737,7 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
{
if (logger.isDebugEnabled() == true)
{
- logger.debug("The rule '" + rule.getTitle() + "' or the node '" + rule.getOwningNodeRef().getId() + "' has been disabled.");
+ logger.debug("The rule '" + rule.getTitle() + "' or the node '" + this.getOwningNodeRef(rule).getId() + "' has been disabled.");
}
}
}
@@ -717,22 +757,12 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
{
AlfrescoTransactionSupport.bindResource(KEY_RULES_EXECUTED, new HashSet());
}
- try
+
+ List executeAtEndRules = new ArrayList();
+ executePendingRulesImpl(executeAtEndRules);
+ for (PendingRuleData data : executeAtEndRules)
{
- List executeAtEndRules = new ArrayList();
- executePendingRulesImpl(executeAtEndRules);
- for (PendingRuleData data : executeAtEndRules)
- {
- executePendingRule(data);
- }
- }
- finally
- {
- //AlfrescoTransactionSupport.unbindResource(KEY_RULES_EXECUTED);
- //if (logger.isDebugEnabled() == true)
- //{
- // logger.debug("Unbinding resource");
- // }
+ executePendingRule(data);
}
}
@@ -785,8 +815,14 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
if (executedRules == null || canExecuteRule(executedRules, actionedUponNodeRef, rule) == true)
{
+ Action action = rule.getAction();
+ if (action == null)
+ {
+ throw new RuleServiceException("Attempting to execute a rule that does not have a rule specified.");
+ }
+
// Evaluate the condition
- if (this.actionService.evaluateAction(rule, actionedUponNodeRef) == true)
+ if (this.actionService.evaluateAction(action, actionedUponNodeRef) == true)
{
// Add the rule to the executed rule list
// (do this before this is executed to prevent rules being added to the pending list)
@@ -797,7 +833,8 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
}
// Execute the rule
- this.actionService.executeAction(rule, actionedUponNodeRef);
+ boolean executeAsync = rule.getExecuteAsynchronously();
+ this.actionService.executeAction(action, actionedUponNodeRef, true, executeAsync);
}
}
}
@@ -1014,4 +1051,70 @@ public class RuleServiceImpl implements RuleService, RuntimeRuleService
}
}
}
+
+ /**
+ * @see org.alfresco.service.cmr.rule.RuleService#getOwningNodeRef(org.alfresco.service.cmr.rule.Rule)
+ */
+ public NodeRef getOwningNodeRef(Rule rule)
+ {
+ NodeRef result = null;
+
+ NodeRef ruleNodeRef = rule.getNodeRef();
+ if (ruleNodeRef != null)
+ {
+ result = getOwningNodeRefRuleImpl(ruleNodeRef);
+ }
+
+ return result;
+ }
+
+ /**
+ * @param ruleNodeRef
+ * @return
+ */
+ private NodeRef getOwningNodeRefRuleImpl(NodeRef ruleNodeRef)
+ {
+ // Get the system folder parent
+ NodeRef systemFolder = this.nodeService.getPrimaryParent(ruleNodeRef).getParentRef();
+
+ // Get the owning node ref
+ return this.nodeService.getPrimaryParent(systemFolder).getParentRef();
+ }
+
+ /**
+ * @see org.alfresco.service.cmr.rule.RuleService#getOwningNodeRef(org.alfresco.service.cmr.action.Action)
+ */
+ public NodeRef getOwningNodeRef(Action action)
+ {
+ NodeRef result = null;
+ NodeRef actionNodeRef = action.getNodeRef();
+ if (actionNodeRef != null)
+ {
+ result = getOwningNodeRefActionImpl(actionNodeRef);
+ }
+
+ return result;
+ }
+
+ /**
+ * @param actionNodeRef
+ */
+ private NodeRef getOwningNodeRefActionImpl(NodeRef actionNodeRef)
+ {
+ NodeRef result = null;
+ NodeRef parentNodeRef = this.nodeService.getPrimaryParent(actionNodeRef).getParentRef();
+ if (parentNodeRef != null)
+ {
+ QName parentType = this.nodeService.getType(parentNodeRef);
+ if (RuleModel.TYPE_RULE.equals(parentType) == true)
+ {
+ result = getOwningNodeRefRuleImpl(parentNodeRef);
+ }
+ else if (ActionModel.TYPE_COMPOSITE_ACTION.equals(parentType) == true)
+ {
+ result = getOwningNodeRefActionImpl(parentNodeRef);
+ }
+ }
+ return result;
+ }
}
diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
index f3216b9d8c..10e8134e00 100644
--- a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
+++ b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
@@ -60,17 +60,6 @@ public class RuleServiceImplTest extends BaseRuleTest
}
}
- /**
- * Test createRule
- */
- public void testCreateRule()
- {
- Rule newRule = this.ruleService.createRule("ruleType1");
- assertNotNull(newRule);
- assertNotNull(newRule.getId());
- assertEquals("ruleType1", newRule.getRuleTypeName());
- }
-
/**
* Test addRule
*
@@ -78,17 +67,21 @@ public class RuleServiceImplTest extends BaseRuleTest
public void testAddRule()
{
Rule newRule = createTestRule();
- String ruleId = newRule.getId();
- this.ruleService.saveRule(this.nodeRef, newRule);
+ this.ruleService.saveRule(this.nodeRef, newRule);
+ assertNotNull(newRule.getNodeRef());
- Rule savedRule = this.ruleService.getRule(this.nodeRef, ruleId);
+ // Check the owning node reference
+ assertNotNull(this.ruleService.getOwningNodeRef(newRule));
+ assertEquals(this.nodeRef, this.ruleService.getOwningNodeRef(newRule));
+
+ Rule savedRule = this.ruleService.getRule(newRule.getNodeRef());
assertNotNull(savedRule);
assertFalse(savedRule.isAppliedToChildren());
savedRule.applyToChildren(true);
this.ruleService.saveRule(this.nodeRef, savedRule);
- Rule savedRule2 = this.ruleService.getRule(this.nodeRef, ruleId);
+ Rule savedRule2 = this.ruleService.getRule(savedRule.getNodeRef());
assertNotNull(savedRule2);
assertTrue(savedRule2.isAppliedToChildren());
}
@@ -100,9 +93,9 @@ public class RuleServiceImplTest extends BaseRuleTest
assertNotNull(rules1);
assertEquals(0, rules1.size());
- Rule newRule = this.ruleService.createRule(ruleType.getName());
+ Rule newRule = createTestRule(); //this.ruleService.createRule(ruleType.getName());
this.ruleService.saveRule(this.nodeRef, newRule);
- Rule newRule2 = this.ruleService.createRule(ruleType.getName());
+ Rule newRule2 = createTestRule(); //this.ruleService.createRule(ruleType.getName());
this.ruleService.saveRule(this.nodeRef, newRule2);
List rules2 = this.ruleService.getRules(this.nodeRef);
@@ -113,8 +106,7 @@ public class RuleServiceImplTest extends BaseRuleTest
List rules3 = this.ruleService.getRules(this.nodeRef);
assertNotNull(rules3);
- assertEquals(0, rules3.size());
-
+ assertEquals(0, rules3.size());
}
/**
@@ -145,16 +137,15 @@ public class RuleServiceImplTest extends BaseRuleTest
Rule rule = rules.get(0);
assertEquals("title", rule.getTitle());
assertEquals("description", rule.getDescription());
- assertNotNull(rule.getCreatedDate());
- assertNotNull(rule.getModifiedDate());
+ assertNotNull(this.nodeService.getProperty(rule.getNodeRef(), ContentModel.PROP_CREATED));
+ assertNotNull(this.nodeService.getProperty(rule.getNodeRef(), ContentModel.PROP_CREATOR));
// Check that the condition action have been retireved correctly
- List conditions = rule.getActionConditions();
+ Action action = rule.getAction();
+ assertNotNull(action);
+ List conditions = action.getActionConditions();
assertNotNull(conditions);
- assertEquals(1, conditions.size());
- List actions = rule.getActions();
- assertNotNull(actions);
- assertEquals(1, actions.size());
+ assertEquals(1, conditions.size());
}
/**
@@ -232,7 +223,9 @@ public class RuleServiceImplTest extends BaseRuleTest
int count = 0;
for (Rule rule : allRules)
{
- if (rule.getOwningNodeRef() == childWithRules)
+ NodeRef owningNodeRef = this.ruleService.getOwningNodeRef(rule);
+ assertNotNull(owningNodeRef);
+ if (owningNodeRef.equals(childWithRules) == true)
{
count++;
}
@@ -547,17 +540,19 @@ public class RuleServiceImplTest extends BaseRuleTest
actionProps.put(ImageTransformActionExecuter.PARAM_ASSOC_TYPE_QNAME, ContentModel.ASSOC_CHILDREN);
actionProps.put(ImageTransformActionExecuter.PARAM_ASSOC_QNAME, ContentModel.ASSOC_CHILDREN);
- Rule rule = this.ruleService.createRule(this.ruleType.getName());
+ Rule rule = new Rule();
+ rule.setRuleType(this.ruleType.getName());
rule.setTitle("Convert from *.jpg to *.gif");
rule.setExecuteAsynchronously(true);
- ActionCondition actionCondition = this.actionService.createActionCondition(ComparePropertyValueEvaluator.NAME);
- actionCondition.setParameterValues(conditionProps);
- rule.addActionCondition(actionCondition);
-
Action action = this.actionService.createAction(ImageTransformActionExecuter.NAME);
action.setParameterValues(actionProps);
- rule.addAction(action);
+
+ ActionCondition actionCondition = this.actionService.createActionCondition(ComparePropertyValueEvaluator.NAME);
+ actionCondition.setParameterValues(conditionProps);
+ action.addActionCondition(actionCondition);
+
+ rule.setAction(action);
// Create the next rule
@@ -569,17 +564,19 @@ public class RuleServiceImplTest extends BaseRuleTest
actionProps2.put(ImageTransformActionExecuter.PARAM_DESTINATION_FOLDER, nodeRef);
actionProps2.put(ImageTransformActionExecuter.PARAM_ASSOC_QNAME, ContentModel.ASSOC_CHILDREN);
- Rule rule2 = this.ruleService.createRule(this.ruleType.getName());
+ Rule rule2 = new Rule();
+ rule2.setRuleType(this.ruleType.getName());
rule2.setTitle("Convert from *.gif to *.jpg");
rule2.setExecuteAsynchronously(true);
- ActionCondition actionCondition2 = this.actionService.createActionCondition(ComparePropertyValueEvaluator.NAME);
- actionCondition2.setParameterValues(conditionProps2);
- rule2.addActionCondition(actionCondition2);
-
Action action2 = this.actionService.createAction(ImageTransformActionExecuter.NAME);
action2.setParameterValues(actionProps2);
- rule2.addAction(action2);
+
+ ActionCondition actionCondition2 = this.actionService.createActionCondition(ComparePropertyValueEvaluator.NAME);
+ actionCondition2.setParameterValues(conditionProps2);
+ action2.addActionCondition(actionCondition2);
+
+ rule2.setAction(action2);
// Save the rules
this.ruleService.saveRule(nodeRef, rule);
diff --git a/source/java/org/alfresco/repo/rule/RuleTypeImpl.java b/source/java/org/alfresco/repo/rule/RuleTypeImpl.java
index 9980872562..015a6fbd4d 100644
--- a/source/java/org/alfresco/repo/rule/RuleTypeImpl.java
+++ b/source/java/org/alfresco/repo/rule/RuleTypeImpl.java
@@ -41,11 +41,6 @@ public class RuleTypeImpl extends CommonResourceAbstractBase implements RuleType
*/
private static Log logger = LogFactory.getLog(RuleTypeImpl.class);
- /**
- * The action service
- */
- private ActionService actionService;
-
/**
* The rule service
*/
@@ -67,16 +62,6 @@ public class RuleTypeImpl extends CommonResourceAbstractBase implements RuleType
}
}
- /**
- * Set the action service
- *
- * @param actionService the action service
- */
- public void setActionService(ActionService actionService)
- {
- this.actionService = actionService;
- }
-
/**
* Set the rule service
*
@@ -116,29 +101,36 @@ public class RuleTypeImpl extends CommonResourceAbstractBase implements RuleType
*/
public void triggerRuleType(NodeRef nodeRef, NodeRef actionedUponNodeRef)
{
- if (this.ruleService.hasRules(nodeRef) == true)
+ if (this.ruleService.isEnabled() == true)
{
- List rules = this.ruleService.getRules(
- nodeRef,
- true,
- this.name);
-
- for (Rule rule : rules)
- {
+ if (this.ruleService.hasRules(nodeRef) == true)
+ {
+ List rules = this.ruleService.getRules(
+ nodeRef,
+ true,
+ this.name);
+
+ for (Rule rule : rules)
+ {
+ if (logger.isDebugEnabled() == true)
+ {
+ NodeRef ruleNodeRef = rule.getNodeRef();
+ if (nodeRef != null)
+ {
+ logger.debug("Triggering rule " + ruleNodeRef.toString());
+ }
+ }
+
+ // Queue the rule to be executed at the end of the transaction (but still in the transaction)
+ ((RuntimeRuleService)this.ruleService).addRulePendingExecution(nodeRef, actionedUponNodeRef, rule);
+ }
+ }
+ else
+ {
if (logger.isDebugEnabled() == true)
{
- logger.debug("Triggering rule " + rule.getId());
+ logger.debug("This node has no rules to trigger.");
}
-
- // Queue the rule to be executed at the end of the transaction (but still in the transaction)
- ((RuntimeRuleService)this.ruleService).addRulePendingExecution(nodeRef, actionedUponNodeRef, rule);
- }
- }
- else
- {
- if (logger.isDebugEnabled() == true)
- {
- logger.debug("This node has no rules to trigger.");
}
}
}
diff --git a/source/java/org/alfresco/repo/rule/ruleModel.xml b/source/java/org/alfresco/repo/rule/ruleModel.xml
index 053472cdaf..cd64387663 100644
--- a/source/java/org/alfresco/repo/rule/ruleModel.xml
+++ b/source/java/org/alfresco/repo/rule/ruleModel.xml
@@ -9,6 +9,7 @@
+
@@ -20,17 +21,35 @@
Rule
- act:compositeaction
-
+ sys:base
+
d:text
true
+ true
d:boolean
true
-
+
+ d:boolean
+ true
+
+
+
+
+
+ act:action
+ true
+ false
+
+
+
+
+ cm:titled
+ cm:auditable
+
diff --git a/source/java/org/alfresco/service/cmr/action/Action.java b/source/java/org/alfresco/service/cmr/action/Action.java
index d926a86bca..cca64b0ee4 100644
--- a/source/java/org/alfresco/service/cmr/action/Action.java
+++ b/source/java/org/alfresco/service/cmr/action/Action.java
@@ -29,6 +29,14 @@ import org.alfresco.service.cmr.repository.NodeRef;
*/
public interface Action extends ParameterizedItem
{
+ /**
+ * Gets the node ref that represents the saved action node.
+ * Returns null id unsaved.
+ *
+ * @return the action node reference
+ */
+ NodeRef getNodeRef();
+
/**
* Get the name of the action definition that relates to this action
*
@@ -63,16 +71,6 @@ public interface Action extends ParameterizedItem
* @param description the description of the action
*/
void setDescription(String description);
-
- /**
- * Get the node reference of the node that 'owns' this action.
- *
- * The node that 'owns' the action is th one that stores it via its
- * actionable aspect association.
- *
- * @return node reference
- */
- NodeRef getOwningNodeRef();
/**
* Gets a value indicating whether the action should be executed asychronously or not.
diff --git a/source/java/org/alfresco/service/cmr/rule/Rule.java b/source/java/org/alfresco/service/cmr/rule/Rule.java
index f358856fa4..9ae30414a2 100644
--- a/source/java/org/alfresco/service/cmr/rule/Rule.java
+++ b/source/java/org/alfresco/service/cmr/rule/Rule.java
@@ -14,43 +14,186 @@
* language governing permissions and limitations under the
* License.
*/
-
package org.alfresco.service.cmr.rule;
-import org.alfresco.service.cmr.action.CompositeAction;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.alfresco.service.cmr.action.Action;
+import org.alfresco.service.cmr.repository.NodeRef;
/**
- * Rule Interface
+ * Rule class.
+ *
+ * Encapsulates all the information about a rule. Can be creted or editied and
+ * then passed to the rule service to create/update a rule instance.
*
* @author Roy Wetherall
*/
-public interface Rule extends CompositeAction
+public class Rule implements Serializable
{
- /**
- * Indicates that the rule is applied to the children of the associated
- * node, not just the node itself.
- *
- * By default this will be set to false.
- *
- * @return true if the rule is applied to the children of the associated node,
- * false otherwise
- */
- boolean isAppliedToChildren();
-
- /**
- * Set whether the rule is applied to all children of the associated node
- * rather than just the node itself.
- *
- * @param isAppliedToChildren true if the rule should be applied to the children, false
- * otherwise
- */
- void applyToChildren(boolean isAppliedToChildren);
+ /**
+ * Serial version UID
+ */
+ private static final long serialVersionUID = 3544385898889097524L;
/**
- * Get the rule type name
- *
- * @return the rule type name
+ * The rule node reference
*/
- String getRuleTypeName();
- }
\ No newline at end of file
+ private NodeRef nodeRef;
+
+ /**
+ * The title of the rule
+ */
+ private String title;
+
+ /**
+ * The description of the rule
+ */
+ private String description;
+
+ /**
+ * The rule types
+ */
+ private List ruleTypes;
+
+ /**
+ * The associated action
+ */
+ private Action action;
+
+ /**
+ * Indicates whether the rule should execute the action asynchronously or not
+ */
+ private boolean executeAsynchronously = false;
+
+ /**
+ * Indicates whether the rule is applied to all the children of the associated node
+ * rather than just the node itself.
+ */
+ private boolean isAppliedToChildren = false;
+
+ public Rule()
+ {
+ }
+
+ public Rule(NodeRef nodeRef)
+ {
+ this.nodeRef = nodeRef;
+ }
+
+ public void setAction(Action action)
+ {
+ this.action = action;
+ }
+
+ public Action getAction()
+ {
+ return action;
+ }
+
+ public void setNodeRef(NodeRef nodeRef)
+ {
+ this.nodeRef = nodeRef;
+ }
+
+ public NodeRef getNodeRef()
+ {
+ return nodeRef;
+ }
+
+ public void setTitle(String title)
+ {
+ this.title = title;
+ }
+
+ public String getTitle()
+ {
+ return title;
+ }
+
+ public void setDescription(String description)
+ {
+ this.description = description;
+ }
+
+ public String getDescription()
+ {
+ return description;
+ }
+
+ /**
+ * @see org.alfresco.service.cmr.rule.Rule#isAppliedToChildren()
+ */
+ public boolean isAppliedToChildren()
+ {
+ return this.isAppliedToChildren;
+ }
+
+ /**
+ *@see org.alfresco.service.cmr.rule.Rule#applyToChildren(boolean)
+ */
+ public void applyToChildren(boolean isAppliedToChildren)
+ {
+ this.isAppliedToChildren = isAppliedToChildren;
+ }
+
+ public void setRuleType(String ruleType)
+ {
+ List ruleTypes = new ArrayList(1);
+ ruleTypes.add(ruleType);
+ this.ruleTypes = ruleTypes;
+ }
+
+ public void setRuleTypes(List ruleTypes)
+ {
+ this.ruleTypes = ruleTypes;
+ }
+
+ public List getRuleTypes()
+ {
+ return ruleTypes;
+ }
+
+ public void setExecuteAsynchronously(boolean executeAsynchronously)
+ {
+ this.executeAsynchronously = executeAsynchronously;
+ }
+
+ public boolean getExecuteAsynchronously()
+ {
+ return this.executeAsynchronously;
+ }
+
+ /**
+ * Hash code implementation
+ */
+ @Override
+ public int hashCode()
+ {
+ return this.nodeRef.hashCode();
+ }
+
+ /**
+ * Equals implementation
+ */
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj instanceof Rule)
+ {
+ Rule that = (Rule) obj;
+ return (this.nodeRef.equals(that.nodeRef));
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+
diff --git a/source/java/org/alfresco/service/cmr/rule/RuleService.java b/source/java/org/alfresco/service/cmr/rule/RuleService.java
index 6117440b98..f14c871ee0 100644
--- a/source/java/org/alfresco/service/cmr/rule/RuleService.java
+++ b/source/java/org/alfresco/service/cmr/rule/RuleService.java
@@ -19,6 +19,7 @@ package org.alfresco.service.cmr.rule;
import java.util.List;
import org.alfresco.service.Auditable;
+import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.repository.NodeRef;
/**
@@ -45,6 +46,26 @@ public interface RuleService
@Auditable(parameters = {"name"})
public RuleType getRuleType(String name);
+ /**
+ * Enable rules for the current thread
+ */
+ @Auditable
+ public void enableRules();
+
+ /**
+ * Diable rules for the current thread
+ */
+ @Auditable
+ public void disableRules();
+
+ /**
+ * Indicates whether rules are currently enabled or not
+ *
+ * @return true if rules are enabled, false otherwise
+ */
+ @Auditable
+ public boolean isEnabled();
+
/**
* Indicates wether the rules for a given node are enabled or not. If the
* rules are not enabled then they will not be executed.
@@ -150,26 +171,13 @@ public interface RuleService
public int countRules(NodeRef nodeRef);
/**
- * Get the rule given its id.
+ * Get the rule given its node reference
*
* @param nodeRef the node reference
- * @param ruleId the rule id
- * @return the rule corresponding ot the id
+ * @return the rule corresponding to the node reference
*/
- @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "ruleId"})
- public Rule getRule(NodeRef nodeRef, String ruleId);
-
- /**
- * Helper method to create a new rule.
- *
- * Call add rule once the details of the rule have been specified in order
- * to associate the rule with a node reference.
- *
- * @param ruleTypeName the name of the rule type
- * @return the created rule
- */
- @Auditable(parameters = {"ruleTypeName"})
- public Rule createRule(String ruleTypeName);
+ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"})
+ public Rule getRule(NodeRef nodeRef);
/**
* Saves the details of the rule to the specified node reference.
@@ -198,4 +206,25 @@ public interface RuleService
*/
@Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"})
public void removeAllRules(NodeRef nodeRef);
+
+ /**
+ * Returns the owning node reference for a rule.
+ *
+ * @param rule the rule
+ * @return the owning node reference
+ */
+ @Auditable(key = Auditable.Key.ARG_0, parameters = {"rule"})
+ public NodeRef getOwningNodeRef(Rule rule);
+
+ /**
+ * Returns the owning node reference for an action. Returns null for an unsaved action or one that is not
+ * parented by a rule.
+ *
+ * NOTE: this method is temporary and will be removed in future versions. It should only be used with good reason.
+ *
+ * @param action the action
+ * @return the owning node reference
+ */
+ @Auditable(key = Auditable.Key.ARG_0, parameters = {"action"})
+ public NodeRef getOwningNodeRef(Action action);
}