mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Rules/Actions REST API - Latest cut with updates to Web Scripts and Unit Tests since last drop
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@11382 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1,40 +1,48 @@
|
||||
<#import "condition.lib.ftl" as conditionLib/>
|
||||
|
||||
<#macro actionJSON action>
|
||||
<#escape x as jsonUtils.encodeJSONString(x)>
|
||||
<#macro actionJSON action rule>
|
||||
{
|
||||
"id" : "${action.id}",
|
||||
"actionDefinitionName" : "${action.actionDefinitionName}",
|
||||
<#if action.title?exists>
|
||||
"title" : "${action.title}",
|
||||
</#if>
|
||||
<#if action.description?exists>
|
||||
"description" : "${action.description}",
|
||||
</#if>
|
||||
"executeAsync" : "${action.executeAsychronously?string("true", "false")}",
|
||||
<#if action.parameterValues?exists>
|
||||
"parameterValues" :
|
||||
{
|
||||
<#list action.parameterValues?keys as parameterKey>
|
||||
"${parameterKey}" : "${action.parameterValues[parameterKey]}"
|
||||
<#if parameterKey_has_next>,</#if>
|
||||
</#list>
|
||||
},
|
||||
</#if>
|
||||
<#if action.actions?exists>
|
||||
"actions" :
|
||||
{
|
||||
"id" : "${action.id}",
|
||||
"actionDefinitionName" : "${action.actionDefinitionName}",
|
||||
"title" : "${action.title}",
|
||||
"description" : "${action.description}",
|
||||
"executeAsync" : "${action.executeAsychronously?string("true", "false")}",
|
||||
"parameterValues" :
|
||||
{
|
||||
<#list action.parameterValues.keySet() as parameterKey>
|
||||
"${parameterKey}" : "${action.getParameterValue(parameterKey)}"
|
||||
<#if parameterKey_has_next>,</#if>
|
||||
</#list>
|
||||
},
|
||||
"actions" :
|
||||
{
|
||||
<#list action.actions as nestedAction>
|
||||
"${nestedAction.id}" : <@actionJSON action=nestedAction/>
|
||||
"${nestedAction.id}" : <@actionJSON action=nestedAction rule=rule/>
|
||||
<#if nestedAction_has_next>,</#if>
|
||||
</#list>
|
||||
},
|
||||
"conditions" :
|
||||
{
|
||||
<#list action.actionConditions as condition>
|
||||
"${condition.id}" : <@conditionLib.conditionJSON condition=condition/>
|
||||
<#if condition_has_next>,</#if>
|
||||
</#list>
|
||||
},
|
||||
<#if action.compensatingAction?exists>
|
||||
"compensatingAction" : <@actionJSON action=action.compensatingAction/>,
|
||||
</#if>,
|
||||
"url" : "${url.serviceContext + "/api/rule/" + rule.nodeRef.storeRef.protocol + "/"
|
||||
+ rule.nodeRef.storeRef.identifier + "/" + rule.nodeRef.id + "/actions/"
|
||||
+ action.id}"
|
||||
}
|
||||
</#escape>
|
||||
},
|
||||
</#if>
|
||||
<#if action.actionConditions?exists>
|
||||
"conditions" :
|
||||
{
|
||||
<#list action.actionConditions as condition>
|
||||
"${condition.id}" : <@conditionLib.conditionJSON condition=condition rule=rule/>
|
||||
<#if condition_has_next>,</#if>
|
||||
</#list>
|
||||
},
|
||||
</#if>
|
||||
<#if action.compensatingAction?exists>
|
||||
"compensatingAction" : <@actionJSON action=action.compensatingAction/>,
|
||||
</#if>
|
||||
"url" : "${url.serviceContext + "/api/rules/" + rule.nodeRef.storeRef.protocol + "/"
|
||||
+ rule.nodeRef.storeRef.identifier + "/" + rule.nodeRef.id + "/actions/"
|
||||
+ action.id}"
|
||||
}
|
||||
</#macro>
|
||||
|
@@ -4,8 +4,12 @@
|
||||
<#escape x as jsonUtils.encodeJSONString(x)>
|
||||
{
|
||||
"name" : "${actiondef.name}",
|
||||
"title" : "${actiondef.title},
|
||||
"description" : "${actiondef.description}",
|
||||
<#if actiondef.title?exists>
|
||||
"title" : "${actiondef.title}",
|
||||
</#if>
|
||||
<#if actiondef.description?exists>
|
||||
"description" : "${actiondef.description}",
|
||||
</#if>
|
||||
"adhocPropertiesAllowed" : "${actiondef.adhocPropertiesAllowed?string("true", "false")}",
|
||||
"applicableTypes" :
|
||||
[
|
||||
@@ -14,13 +18,15 @@
|
||||
<#if applicableType_has_next>,</#if>
|
||||
</#list>
|
||||
],
|
||||
"parameterDefinitions" :
|
||||
[
|
||||
<#list actiondef.parameterDefinitions as paramDef>
|
||||
<@paramDefLib.paramDefJSON paramDef=paramDef/>
|
||||
<#if paramDef_has_next>,</#if>
|
||||
</#list>
|
||||
],
|
||||
<#if actiondef.parameterDefinitions?exists>
|
||||
"parameterDefinitions" :
|
||||
[
|
||||
<#list actiondef.parameterDefinitions as paramDef>
|
||||
<@paramDefLib.paramDefJSON paramDef=paramDef/>
|
||||
<#if paramDef_has_next>,</#if>
|
||||
</#list>
|
||||
],
|
||||
</#if>
|
||||
"url" : "${url.serviceContext + "/api/rules/actiondefs/" + actiondef.name}"
|
||||
}
|
||||
</#escape>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
<#macro conditionJSON condition>
|
||||
<#escape x as jsonUtils.encodeJSONString(x)>
|
||||
{
|
||||
"id" : "${condition.id}",
|
||||
"conditionDefinitionName" : "${condition.actionConditionDefinitionName}",
|
||||
"invertCondition" : "${condition.invertCondition?string("true", "false")}",
|
||||
"parameterValues" :
|
||||
{
|
||||
<#list condition.parameterValues.keySet() as parameterKey>
|
||||
"${parameterKey}" : "${condition.getParameterValue(parameterKey)}"
|
||||
<#if parameterKey_has_next>,</#if>
|
||||
</#list>
|
||||
},
|
||||
"url" : "${url.serviceContext + "/api/rule/" + rule.nodeRef.storeRef.protocol + "/"
|
||||
+ rule.nodeRef.storeRef.identifier + "/" + rule.nodeRef.id + "/conditions/"
|
||||
+ condition.id}"
|
||||
}
|
||||
</#escape>
|
||||
<#macro conditionJSON condition rule>
|
||||
{
|
||||
"id" : "${condition.id}",
|
||||
"conditionDefinitionName" : "${condition.actionConditionDefinitionName}",
|
||||
"invertCondition" : "${condition.invertCondition?string("true", "false")}",
|
||||
"parameterValues" :
|
||||
{
|
||||
<#list condition.parameterValues?keys as parameterKey>
|
||||
"${parameterKey}" : "${condition.parameterValues[parameterKey]}"
|
||||
<#if parameterKey_has_next>,</#if>
|
||||
</#list>
|
||||
},
|
||||
"url" : "${url.serviceContext + "/api/rules/" + rule.nodeRef.storeRef.protocol + "/"
|
||||
+ rule.nodeRef.storeRef.identifier + "/" + rule.nodeRef.id + "/conditions/"
|
||||
+ condition.id}"
|
||||
}
|
||||
</#macro>
|
||||
|
@@ -4,16 +4,22 @@
|
||||
<#escape x as jsonUtils.encodeJSONString(x)>
|
||||
{
|
||||
"name" : "${conditiondef.name}",
|
||||
"title" : "${conditiondef.title},
|
||||
"description" : "${conditiondef.description}",
|
||||
<#if conditiondef.title?exists>
|
||||
"title" : "${conditiondef.title}",
|
||||
</#if>
|
||||
<#if conditiondef.description?exists>
|
||||
"description" : "${conditiondef.description}",
|
||||
</#if>
|
||||
"adhocPropertiesAllowed" : "${conditiondef.adhocPropertiesAllowed?string("true", "false")}",
|
||||
"parameterDefinitions" :
|
||||
[
|
||||
<#list conditiondef.parameterDefinitions as paramDef>
|
||||
<@paramDefLib.paramDefJSON paramDef=paramDef/>
|
||||
<#if paramDef_has_next>,</#if>
|
||||
</#list>
|
||||
],
|
||||
<#if conditiondef.parameterDefinitions?exists>
|
||||
"parameterDefinitions" :
|
||||
[
|
||||
<#list conditiondef.parameterDefinitions as paramDef>
|
||||
<@paramDefLib.paramDefJSON paramDef=paramDef/>
|
||||
<#if paramDef_has_next>,</#if>
|
||||
</#list>
|
||||
],
|
||||
</#if>
|
||||
"url" : "${url.serviceContext + "/api/rules/conditiondefs/" + conditiondef.name}"
|
||||
}
|
||||
</#escape>
|
||||
|
@@ -1,12 +1,12 @@
|
||||
<#macro paramDefJSON paramDef>
|
||||
<#escape x as jsonUtils.encodeJSONString(x)>
|
||||
{
|
||||
"name" : "${paramDef.name}",
|
||||
"displayLabel" : "${paramDef.displayLabel}",
|
||||
"type" : "${paramDef.type}",
|
||||
"multiValued" : ${paramDef.multiValued?string("true", "false")},
|
||||
"mandatory" : "${paramDef.mandatory}",
|
||||
"url" : "${url.serviceContext + "/api/rules/parameterdefs/" + paramDef.name}"
|
||||
}
|
||||
</#escape>
|
||||
{
|
||||
"name" : "${paramDef.name}",
|
||||
<#if paramDef.displayLabel?exists>
|
||||
"displayLabel" : "${paramDef.displayLabel}",
|
||||
</#if>
|
||||
"type" : "${paramDef.type}",
|
||||
"multiValued" : ${paramDef.multiValued?string("true", "false")},
|
||||
"mandatory" : "${paramDef.mandatory?string("true", "false")}",
|
||||
"url" : "${url.serviceContext + "/api/rules/parameterdefs/" + paramDef.name}"
|
||||
}
|
||||
</#macro>
|
@@ -1,2 +1,2 @@
|
||||
<#import "rule.lib.ftl" as ruleLib/>
|
||||
<@ruleLib.ruleJSON rule=rule/>
|
||||
<@ruleLib.ruleJSON rule=rule owningNodeRef=owningNodeRef/>
|
@@ -1,10 +1,8 @@
|
||||
<#import "action.lib.ftl" as actionLib/>
|
||||
|
||||
<#macro ruleJSON rule>
|
||||
<#macro ruleJSON rule owningNodeRef>
|
||||
<#escape x as jsonUtils.encodeJSONString(x)>
|
||||
{
|
||||
"url" : "${url.serviceContext + "/api/rules/" + rule.nodeRef.storeRef.protocol + "/"
|
||||
+ rule.nodeRef.storeRef.identifier + "/" + rule.nodeRef.id}",
|
||||
"ruleNodeRef" : "${rule.nodeRef}",
|
||||
"title" : "${rule.title}",
|
||||
"description" : "${rule.description}",
|
||||
@@ -15,11 +13,13 @@
|
||||
<#if ruleType_has_next>,</#if>
|
||||
</#list>
|
||||
],
|
||||
"action" : <@actionLib.actionJSON action=rule.action/>,
|
||||
"actionableNodeRef" : "${actionableNodeRef}",
|
||||
"executeAsynchronously" : ${rule.executeAsynchronously?string("true", "false")},
|
||||
"action" : <@actionLib.actionJSON action=rule.action rule=rule/>,
|
||||
"owningNodeRef" : "${owningNodeRef}",
|
||||
"executeAsync" : ${rule.executeAsynchronously?string("true", "false")},
|
||||
"ruleDisabled" : ${rule.ruleDisabled?string("true", "false")},
|
||||
"appliedToChildren" : ${rule.appliedToChildren?string("true", "false")}
|
||||
"appliedToChildren" : ${rule.appliedToChildren?string("true", "false")},
|
||||
"url" : "${url.serviceContext + "/api/rules/" + rule.nodeRef.storeRef.protocol + "/"
|
||||
+ rule.nodeRef.storeRef.identifier + "/" + rule.nodeRef.id}"
|
||||
}
|
||||
</#escape>
|
||||
</#macro>
|
@@ -1,9 +1,9 @@
|
||||
<webscript>
|
||||
<shortname>Get Rules</shortname>
|
||||
<description>Get the collection of rules which have been applied to the given (actionable) node. If the optional 'includeInherited' parameter is not provided, then rules inherited from the given node's parents are included by default. If the optional 'ruleTypeName' parameter is provided, then only rules of that specific given rule type are returned</description>
|
||||
<url>/api/node/{store_type}/{store_id}/{id}/rules?includeInherited={includeInherited?}&ruleTypeName={ruleTypeName?}</url>
|
||||
<url>/api/path/{store_type}/{store_id}/{id}/rules?includeInherited={includeInherited?}&ruleTypeName={ruleTypeName?}</url>
|
||||
<url>/api/rules/appliedtonode/{store_type}/{store_id}/{id}?includeInherited={includeInherited?}&ruleTypeName={ruleTypeName?}</url>
|
||||
<url>/api/node/{store_type}/{store_id}/{id}/rules?includeInherited={includeInherited?}&ruleTypeName={ruleTypeName?}</url>
|
||||
<url>/api/path/{store_type}/{store_id}/{id}/rules?includeInherited={includeInherited?}&ruleTypeName={ruleTypeName?}</url>
|
||||
<url>/api/rules/appliedtonode/{store_type}/{store_id}/{id}?includeInherited={includeInherited?}&ruleTypeName={ruleTypeName?}</url>
|
||||
<format default="json"/>
|
||||
<authentication>user</authentication>
|
||||
<transaction>required</transaction>
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
[
|
||||
<#list rules as rule>
|
||||
<@ruleLib.ruleJSON rule=rule/>
|
||||
<@ruleLib.ruleJSON rule=rule owningNodeRef=owningNodeRef/>
|
||||
<#if rule_has_next>,</#if>
|
||||
</#list>
|
||||
]
|
||||
]
|
||||
|
@@ -1,2 +1,2 @@
|
||||
<#import "rule.lib.ftl" as ruleLib/>
|
||||
<@ruleLib.ruleJSON rule=rule/>
|
||||
<@ruleLib.ruleJSON rule=rule owningNodeRef=owningNodeRef/>
|
@@ -454,4 +454,99 @@
|
||||
|
||||
<bean id="webscript.org.alfresco.cmis.test.post" class="org.alfresco.repo.cmis.rest.test.CMISTestRunnerWebScript" parent="webscript" />
|
||||
|
||||
<!-- -->
|
||||
<!-- Rules Service REST API -->
|
||||
<!-- -->
|
||||
|
||||
<!-- GET Action Definition -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.actiondef.get"
|
||||
class="org.alfresco.repo.web.scripts.rule.ActionDefGet"
|
||||
parent="webscript">
|
||||
<property name="actionService" ref="ActionService"/>
|
||||
</bean>
|
||||
|
||||
<!-- GET Action Definitions -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.actiondefs.get"
|
||||
class="org.alfresco.repo.web.scripts.rule.ActionDefsGet"
|
||||
parent="webscript">
|
||||
<property name="actionService" ref="ActionService"/>
|
||||
<property name="rulesHelper" ref="rulesWebScriptHelper"/>
|
||||
</bean>
|
||||
|
||||
<!-- GET Condition Definition -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.conditiondef.get"
|
||||
class="org.alfresco.repo.web.scripts.rule.ConditionDefGet"
|
||||
parent="webscript">
|
||||
<property name="actionService" ref="ActionService"/>
|
||||
</bean>
|
||||
|
||||
<!-- GET Condition Definitions -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.conditiondefs.get"
|
||||
class="org.alfresco.repo.web.scripts.rule.ConditionDefsGet"
|
||||
parent="webscript">
|
||||
<property name="actionService" ref="ActionService"/>
|
||||
</bean>
|
||||
|
||||
<!-- GET Rules -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.rules.get"
|
||||
class="org.alfresco.repo.web.scripts.rule.RulesGet"
|
||||
parent="webscript">
|
||||
<property name="ruleService" ref="RuleService"/>
|
||||
<property name="rulesHelper" ref="rulesWebScriptHelper"/>
|
||||
</bean>
|
||||
|
||||
<!-- GET Rule -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.rule.get"
|
||||
class="org.alfresco.repo.web.scripts.rule.RuleGet"
|
||||
parent="webscript">
|
||||
<property name="ruleService" ref="RuleService"/>
|
||||
<property name="rulesHelper" ref="rulesWebScriptHelper"/>
|
||||
</bean>
|
||||
|
||||
<!-- POST Rules -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.rules.post"
|
||||
class="org.alfresco.repo.web.scripts.rule.RulesPost"
|
||||
parent="webscript">
|
||||
<property name="ruleService" ref="RuleService"/>
|
||||
<property name="rulesHelper" ref="rulesWebScriptHelper"/>
|
||||
</bean>
|
||||
|
||||
<!-- DELETE Rules -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.rules.delete"
|
||||
class="org.alfresco.repo.web.scripts.rule.RulesDelete"
|
||||
parent="webscript">
|
||||
<property name="ruleService" ref="RuleService"/>
|
||||
<property name="rulesHelper" ref="rulesWebScriptHelper"/>
|
||||
</bean>
|
||||
|
||||
<!-- DELETE Rule -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.rule.delete"
|
||||
class="org.alfresco.repo.web.scripts.rule.RuleDelete"
|
||||
parent="webscript">
|
||||
<property name="ruleService" ref="RuleService"/>
|
||||
<property name="rulesHelper" ref="rulesWebScriptHelper"/>
|
||||
</bean>
|
||||
|
||||
<!-- PUT Rule -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.rule.put"
|
||||
class="org.alfresco.repo.web.scripts.rule.RulePut"
|
||||
parent="webscript">
|
||||
<property name="ruleService" ref="RuleService"/>
|
||||
<property name="rulesHelper" ref="rulesWebScriptHelper"/>
|
||||
</bean>
|
||||
|
||||
<!-- POST ActionQueue -->
|
||||
<bean id="webscript.org.alfresco.repository.rule.actionqueue.post"
|
||||
class="org.alfresco.repo.web.scripts.rule.ActionQueuePost"
|
||||
parent="webscript">
|
||||
<property name="actionService" ref="ActionService"/>
|
||||
<property name="rulesHelper" ref="rulesWebScriptHelper"/>
|
||||
</bean>
|
||||
|
||||
<!-- Rules Service Web Script Helper Class -->
|
||||
<bean id="rulesWebScriptHelper" class="org.alfresco.repo.web.scripts.rule.RulesHelper" init-method="init">
|
||||
<property name="repositoryContext" ref="repositoryHelper" />
|
||||
<property name="serviceRegistry" ref="ServiceRegistry" />
|
||||
</bean>
|
||||
|
||||
</beans>
|
@@ -74,8 +74,8 @@ public class ActionDefGet extends DeclarativeWebScript
|
||||
// initialise model to pass on for template to render
|
||||
Map<String, Object> model = new HashMap<String, Object>();
|
||||
|
||||
// get URL parameter
|
||||
String actionDefName = req.getParameter(REQ_PARAM_ACTION_DEF_NAME);
|
||||
// get actionDefinitionName URL template variable
|
||||
String actionDefName = req.getServiceMatch().getTemplateVars().get(REQ_PARAM_ACTION_DEF_NAME);
|
||||
if ((actionDefName == null) || (actionDefName.length() == 0))
|
||||
{
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
|
||||
|
@@ -108,12 +108,12 @@ public class ActionQueuePost extends DeclarativeWebScript
|
||||
actionJson = actionQueueItemJson.getJSONObject("action");
|
||||
|
||||
// get the action from the action JSON object
|
||||
action = this.rulesHelper.getActionFromJson(actionJson);
|
||||
action = this.rulesHelper.getActionFromJson(actionJson, null);
|
||||
|
||||
// Get 'checkConditions' and 'executeAsynchronously' properties off action queue item
|
||||
checkConditions = actionQueueItemJson.optBoolean("checkConditions", true);
|
||||
executeAsynchronously = actionQueueItemJson.optBoolean(
|
||||
"executeAsynchronously", action.getExecuteAsychronously());
|
||||
"executeAsync", action.getExecuteAsychronously());
|
||||
|
||||
// get the actioned-upon node reference
|
||||
String nodeRefStr = actionQueueItemJson.getString("nodeRef");
|
||||
@@ -145,7 +145,14 @@ public class ActionQueuePost extends DeclarativeWebScript
|
||||
actionQItemStatus.setActionId(actionId);
|
||||
|
||||
// set the status on the action queue item status bean
|
||||
actionQItemStatus.setStatus(RulesHelper.ACTION_QUEUE_ITEM_STATUS_COMPLETE);
|
||||
if (executeAsynchronously == true)
|
||||
{
|
||||
actionQItemStatus.setStatus(RulesHelper.ACTION_QUEUE_ITEM_STATUS_PENDING);
|
||||
}
|
||||
else
|
||||
{
|
||||
actionQItemStatus.setStatus(RulesHelper.ACTION_QUEUE_ITEM_STATUS_COMPLETE);
|
||||
}
|
||||
|
||||
// add objects to model for the template to render
|
||||
model.put(MODEL_PROP_KEY_ACTION_Q_ITEM_STATUS, actionQItemStatus);
|
||||
|
@@ -74,8 +74,8 @@ public class ConditionDefGet extends DeclarativeWebScript
|
||||
// initialise model to pass on for template to render
|
||||
Map<String, Object> model = new HashMap<String, Object>();
|
||||
|
||||
// get URL parameter
|
||||
String conditionDefName = req.getParameter(REQ_PARAM_CONDITION_DEF_NAME);
|
||||
// get conditionDefinitionName URL template variable
|
||||
String conditionDefName = req.getServiceMatch().getTemplateVars().get(REQ_PARAM_CONDITION_DEF_NAME);
|
||||
if ((conditionDefName == null) || (conditionDefName.length() == 0))
|
||||
{
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
|
||||
|
@@ -45,7 +45,6 @@ public class RuleDelete extends DeclarativeWebScript
|
||||
private static final String REQ_TEMPL_VAR_STORE_TYPE = "store_type";
|
||||
private static final String REQ_TEMPL_VAR_STORE_ID = "store_id";
|
||||
private static final String REQ_TEMPL_VAR_RULE_NODE_ID = "rule_id";
|
||||
private static final String REQ_TEMPL_VAR_RULE_OWNING_NODE_ID = "id";
|
||||
|
||||
// properties for services
|
||||
private RuleService ruleService;
|
||||
@@ -106,26 +105,25 @@ public class RuleDelete extends DeclarativeWebScript
|
||||
{
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
|
||||
"The 'rule_id' URL template token has not been provided in URL");
|
||||
}
|
||||
}
|
||||
|
||||
String owningNodeId = req.getServiceMatch().getTemplateVars().get(REQ_TEMPL_VAR_RULE_OWNING_NODE_ID);
|
||||
// Handle if 'owningNodeId' URL template token not provided
|
||||
if ((owningNodeId == null) || (owningNodeId.length() == 0))
|
||||
{
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
|
||||
"The 'id' URL template token has not been provided in URL");
|
||||
}
|
||||
// NOTE -
|
||||
// that if a value is provided for the 'id' URL template variable {id},
|
||||
// i.e. either of the following URL patterns have been used
|
||||
// <url>/api/node/{store_type}/{store_id}/{id}/rules/{rule_id}</url> or
|
||||
// <url>/api/path/{store_type}/{store_id}/{id}/rules/{rule_id}</url>
|
||||
// then the rule owning node ref supplied therein will be ignored,
|
||||
// as these URL templates are just provided for convenience and the
|
||||
// rule owning node ref is retrieved by using the rule's identifying node
|
||||
// ref (supplied in {rule_id})
|
||||
|
||||
// create the rule's identifying node reference from the given
|
||||
// URL template tokens
|
||||
NodeRef ruleNodeRef = this.rulesHelper.getNodeRefFromWebScriptUrl(req, storeType, storeId, ruleNodeId);
|
||||
|
||||
// create the rule owning node reference from the given
|
||||
// URL template tokens
|
||||
NodeRef ruleOwningNodeRef = this.rulesHelper.getNodeRefFromWebScriptUrl(req, storeType, storeId, owningNodeId);
|
||||
|
||||
|
||||
// get the rule using it's unique identifying node reference
|
||||
Rule rule = this.ruleService.getRule(ruleNodeRef);
|
||||
NodeRef ruleOwningNodeRef = this.ruleService.getOwningNodeRef(rule);
|
||||
|
||||
// delete rule
|
||||
this.ruleService.removeRule(ruleOwningNodeRef, rule);
|
||||
|
@@ -49,6 +49,7 @@ public class RuleGet extends DeclarativeWebScript
|
||||
|
||||
// model property keys
|
||||
private static final String MODEL_PROP_KEY_RULE = "rule";
|
||||
private static final String MODEL_PROP_KEY_OWNING_NODE_REF = "owningNodeRef";
|
||||
|
||||
// properties for services
|
||||
private RuleService ruleService;
|
||||
@@ -118,12 +119,24 @@ public class RuleGet extends DeclarativeWebScript
|
||||
// URL template tokens
|
||||
NodeRef ruleNodeRef = this.rulesHelper.getNodeRefFromWebScriptUrl(req, storeType, storeId, ruleNodeId);
|
||||
|
||||
// if ruleNodeRef referred to by {store_type} {store_id} {id} is 'null' then the rule identified by that
|
||||
// given node id or node path no longer exists
|
||||
if (ruleNodeRef == null)
|
||||
{
|
||||
throw new WebScriptException(Status.STATUS_NOT_FOUND, "Rule identified by rule node/path - 'store_type': "
|
||||
+ storeType + " 'store_id': " + storeId + " and 'id': " + ruleNodeId + " could not be found");
|
||||
}
|
||||
|
||||
// get rule identified by the given rule node reference
|
||||
Rule rule = this.ruleService.getRule(ruleNodeRef);
|
||||
|
||||
// get rule's owning node
|
||||
NodeRef ruleOwningNodeRef = this.ruleService.getOwningNodeRef(rule);
|
||||
|
||||
// add objects to model for the template to render
|
||||
model.put(MODEL_PROP_KEY_RULE, rule);
|
||||
|
||||
model.put(MODEL_PROP_KEY_OWNING_NODE_REF, ruleOwningNodeRef);
|
||||
|
||||
return model;
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,865 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
* As a special exception to the terms and conditions of version 2.0 of
|
||||
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||
* FLOSS exception. You should have received a copy of the text describing
|
||||
* the FLOSS exception, and it is also available here:
|
||||
* http://www.alfresco.com/legal/licensing"
|
||||
*/
|
||||
package org.alfresco.repo.web.scripts.rule;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator;
|
||||
import org.alfresco.repo.action.executer.CompositeActionExecuter;
|
||||
import org.alfresco.repo.action.executer.CopyActionExecuter;
|
||||
import org.alfresco.repo.action.executer.MoveActionExecuter;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
||||
import org.alfresco.service.cmr.action.ActionService;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.rule.RuleType;
|
||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||
import org.alfresco.service.cmr.security.PersonService;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.PropertyMap;
|
||||
import org.alfresco.web.scripts.Status;
|
||||
import org.alfresco.web.scripts.TestWebScriptServer.DeleteRequest;
|
||||
import org.alfresco.web.scripts.TestWebScriptServer.GetRequest;
|
||||
import org.alfresco.web.scripts.TestWebScriptServer.PostRequest;
|
||||
import org.alfresco.web.scripts.TestWebScriptServer.Response;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
|
||||
/**
|
||||
* Test Case class with unit tests for Rule REST API
|
||||
*
|
||||
* @author Glen Johnson at Alfresco dot com
|
||||
*/
|
||||
public class RuleServiceTest extends BaseWebScriptTest
|
||||
{
|
||||
// member variables for service instances
|
||||
private AuthenticationService authenticationService;
|
||||
private AuthenticationComponent authenticationComponent;
|
||||
private NodeService nodeService;
|
||||
private PersonService personService;
|
||||
private ActionService actionService;
|
||||
|
||||
private NodeRef owningNodeRef1;
|
||||
private NodeRef testDestFolder1;
|
||||
|
||||
// private constants
|
||||
private static final String RULES_USER = "Rules.User";
|
||||
private static final String RULES_USER_PASSWORD = "password";
|
||||
private static final String RULES_TEST_OWNING_FOLDER_1 = "rulesTestOwningFolder1";
|
||||
private static final String RULES_TEST_DEST_FOLDER_1 = "rulesTestDestinationFolder1";
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception
|
||||
{
|
||||
super.setUp();
|
||||
|
||||
// get references to services
|
||||
this.authenticationService = (AuthenticationService) getServer().getApplicationContext().getBean(
|
||||
"AuthenticationService");
|
||||
this.authenticationComponent = (AuthenticationComponent) getServer().getApplicationContext().getBean(
|
||||
"AuthenticationComponent");
|
||||
this.nodeService = (NodeService) getServer().getApplicationContext().getBean("NodeService");
|
||||
this.personService = (PersonService) getServer().getApplicationContext().getBean("PersonService");
|
||||
this.actionService = (ActionService) getServer().getApplicationContext().getBean("ActionService");
|
||||
|
||||
//
|
||||
// various setup operations which need to be run as system user
|
||||
//
|
||||
AuthenticationUtil.runAs(new RunAsWork<Object>()
|
||||
{
|
||||
public Object doWork() throws Exception
|
||||
{
|
||||
createUserAndAssocPerson(RULES_USER);
|
||||
|
||||
return null;
|
||||
}
|
||||
}, AuthenticationUtil.getSystemUserName());
|
||||
|
||||
// Do tests as inviter user
|
||||
this.authenticationComponent.setCurrentUser(RULES_USER);
|
||||
|
||||
// create a folder (as the rule owning node) under the current user's home space
|
||||
NodeRef personRef = this.personService.getPerson(RULES_USER);
|
||||
NodeRef userHomeRef = (NodeRef)nodeService.getProperty(personRef, ContentModel.PROP_HOMEFOLDER);
|
||||
this.owningNodeRef1 = this.nodeService.createNode(userHomeRef, ContentModel.ASSOC_CONTAINS,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, RULES_TEST_OWNING_FOLDER_1),
|
||||
ContentModel.TYPE_FOLDER).getChildRef();
|
||||
|
||||
// create other folders for testing purposes
|
||||
this.testDestFolder1 = this.nodeService.createNode(userHomeRef, ContentModel.ASSOC_CONTAINS,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, RULES_TEST_DEST_FOLDER_1),
|
||||
ContentModel.TYPE_FOLDER).getChildRef();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception
|
||||
{
|
||||
super.tearDown();
|
||||
|
||||
// delete the actionable node created in setUp()
|
||||
// TODO uncomment this when I am no longer comparing
|
||||
// insync with JSF Web Client
|
||||
//
|
||||
// this.nodeService.deleteNode(this.actionableNodeRef);
|
||||
|
||||
//
|
||||
// run various teardown operations which need to be run as 'admin'
|
||||
//
|
||||
// TODO uncomment this when I am no longer comparing
|
||||
// insync with JSF Web Client
|
||||
//
|
||||
// RunAsWork<Object> runAsWork = new RunAsWork<Object>()
|
||||
// {
|
||||
// public Object doWork() throws Exception
|
||||
// {
|
||||
// deleteUserAndAssocPerson(RULES_USER);
|
||||
//
|
||||
// return null;
|
||||
// }
|
||||
// ;
|
||||
// AuthenticationUtil.runAs(runAsWork, AuthenticationUtil.getSystemUserName());
|
||||
}
|
||||
|
||||
private void deleteUserAndAssocPerson(String userName)
|
||||
{
|
||||
// delete authentication if authentication exists for given user name
|
||||
if (this.authenticationService.authenticationExists(userName))
|
||||
{
|
||||
this.authenticationService.deleteAuthentication(userName);
|
||||
}
|
||||
|
||||
// delete person node associated with given user name
|
||||
// if one exists
|
||||
if (this.personService.personExists(userName))
|
||||
{
|
||||
this.personService.deletePerson(userName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a URL to the Rule Collection associated with the given rule owning
|
||||
* node
|
||||
*
|
||||
* @param ruleOwningNodeRef
|
||||
* the rule owning node reference
|
||||
* @return the URL to the rule collection associated with the given
|
||||
* rule owning node
|
||||
*/
|
||||
private String getRulesNodeBasedUrl(NodeRef ruleOwningNodeRef,
|
||||
Boolean includeInherited, String ruleTypeName)
|
||||
{
|
||||
boolean includeInheritedParamGiven = includeInherited != null;
|
||||
boolean ruleTypeNameParamGiven = (ruleTypeName != null) && (ruleTypeName.length() > 0);
|
||||
boolean parameterGiven = (includeInheritedParamGiven || ruleTypeNameParamGiven);
|
||||
|
||||
String url = "/api/node/"
|
||||
+ ruleOwningNodeRef.getStoreRef().getProtocol() + "/"
|
||||
+ ruleOwningNodeRef.getStoreRef().getIdentifier() + "/"
|
||||
+ ruleOwningNodeRef.getId() + "/rules";
|
||||
|
||||
if (parameterGiven)
|
||||
{
|
||||
url += "?";
|
||||
}
|
||||
|
||||
if (includeInheritedParamGiven)
|
||||
{
|
||||
url += "includeInherited=" + includeInherited.toString();
|
||||
|
||||
if (ruleTypeNameParamGiven)
|
||||
{
|
||||
url += "&";
|
||||
}
|
||||
}
|
||||
|
||||
if (ruleTypeNameParamGiven)
|
||||
{
|
||||
url += "ruleTypeName=" + ruleTypeName;
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a URL to the Rule Collection associated with the given rule owning
|
||||
* node (without adding any parameters)
|
||||
*
|
||||
* @param ruleOwningNodeRef
|
||||
* the rule owning node reference
|
||||
* @return the URL to the rule collection associated with the given
|
||||
* rule owning node
|
||||
*/
|
||||
private String getRulesNodeBasedUrl(NodeRef ruleOwningNodeRef)
|
||||
{
|
||||
return getRulesNodeBasedUrl(ruleOwningNodeRef, null, null);
|
||||
}
|
||||
|
||||
private void createUserAndAssocPerson(String userName)
|
||||
{
|
||||
// if user with given user name doesn't already exist then create user
|
||||
if (this.authenticationService.authenticationExists(userName) == false)
|
||||
{
|
||||
// create user
|
||||
this.authenticationService.createAuthentication(userName,
|
||||
RULES_USER_PASSWORD.toCharArray());
|
||||
}
|
||||
|
||||
// if person node with given user name doesn't already exist then create
|
||||
// person
|
||||
if (this.personService.personExists(userName) == false)
|
||||
{
|
||||
// create person properties
|
||||
PropertyMap personProps = new PropertyMap();
|
||||
personProps.put(ContentModel.PROP_USERNAME, userName);
|
||||
personProps.put(ContentModel.PROP_FIRSTNAME, "FirstName123");
|
||||
personProps.put(ContentModel.PROP_LASTNAME, "LastName123");
|
||||
personProps.put(ContentModel.PROP_EMAIL, "Test.RulesUser@alfresco.com");
|
||||
personProps.put(ContentModel.PROP_JOBTITLE, "JobTitle123");
|
||||
personProps.put(ContentModel.PROP_ORGANIZATION, "Organisation123");
|
||||
|
||||
// create person node for user
|
||||
this.personService.createPerson(personProps);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create and return a Condition JSON object
|
||||
*
|
||||
* @param id ID of the condition
|
||||
* @param parameterValues An associative array (map) of parameter values for the condition.
|
||||
* Pass in <code>null</code> if there are no parameter values associated with this condition.
|
||||
* @param conditionDefName The definition name for this condition.
|
||||
* @param invertCondition Indicates whether the condition result should be inverted/negated.
|
||||
* @param conditionUrl URL to the condition resource
|
||||
*
|
||||
* @return the constructed condition
|
||||
*/
|
||||
private JSONObject getConditionJsonObject(String id, JSONObject parameterValues,
|
||||
String conditionDefName, boolean invertCondition, String conditionUrl)
|
||||
throws Exception
|
||||
{
|
||||
// Construct condition JSON object
|
||||
JSONObject condition = new JSONObject();
|
||||
|
||||
condition.put("id", id);
|
||||
condition.put("parameterValues", parameterValues);
|
||||
condition.put("conditionDefinitionName", conditionDefName);
|
||||
condition.put("invertCondition", invertCondition);
|
||||
condition.put("url", conditionUrl);
|
||||
|
||||
return condition;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create and return an Action JSON object
|
||||
*
|
||||
* @param id ID of the action
|
||||
* @param actionDefName The name of the action definition that relates to this action.
|
||||
* @param title The title of the action.
|
||||
* @param description The description of the action.
|
||||
* @param executeAsync Indicates whether to run the action asynchronously or not.
|
||||
* @param parameterValues Associative array (map) of parameter values associated with this action.
|
||||
* Pass in <code>null</code> if there are no parameter values associated with the action.
|
||||
* @param conditions Associative array of Condition Details for the condition resources associated with this action.
|
||||
* Pass in <code>null</code> if there are no conditions associated with the action.
|
||||
* @param actions Associative array of Action Details for the action resources associated with this action.
|
||||
* Pass in <code>null</code> if this action is not a composite action (and thus no actions
|
||||
* are associated with it).
|
||||
* @param compensatingAction Action Details for the compensating action.
|
||||
* Pass in <code>null</code> if this action does not have a compensating action
|
||||
* @param actionUrl URL to the action resource
|
||||
*
|
||||
* @return the constructed action
|
||||
*/
|
||||
private JSONObject getActionJsonObject (String id, String actionDefName, String title, String description,
|
||||
boolean executeAsync, JSONObject parameterValues, JSONArray conditions,
|
||||
JSONArray actions, JSONObject compensatingAction, String actionUrl)
|
||||
throws Exception
|
||||
{
|
||||
// Construct action JSON object
|
||||
JSONObject action = new JSONObject();
|
||||
|
||||
action.put("id", id);
|
||||
action.put("actionDefinitionName", actionDefName);
|
||||
action.put("title", title);
|
||||
action.put("description", description);
|
||||
action.put("executeAsync", executeAsync);
|
||||
action.put("parameterValues", parameterValues);
|
||||
action.put("conditions", conditions);
|
||||
action.put("actions", actions);
|
||||
action.put("compensatingAction", compensatingAction);
|
||||
action.put("url", actionUrl);
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create and return a Rule JSON object
|
||||
*
|
||||
* @param owningNodeRef The owning (actionable) node reference to which this rule applies
|
||||
* @param ruleNodeRef The node that uniquely represents this rule
|
||||
* @param title The title of the rule
|
||||
* @param description The description of the rule
|
||||
* @param ruleTypes The rule types associated with this rule
|
||||
* @param action The action associated with this rule
|
||||
* @param executeAsync Indicates whether the rule should execute the action asynchronously or not
|
||||
* @param ruleDisabled Indicates whether or not this rule is marked as disabled or not
|
||||
* @param appliedToChildren Indicates whether the rule is applied to all the children of the associated actionable node
|
||||
* @param ruleUrl URL to the rule resource
|
||||
*
|
||||
* @return the constructed rule
|
||||
*/
|
||||
private JSONObject getRuleJsonObject (NodeRef owningNodeRef, NodeRef ruleNodeRef, String title,
|
||||
String description, List<String> ruleTypes, JSONObject action, boolean executeAsync,
|
||||
boolean ruleDisabled, boolean appliedToChildren, String ruleUrl)
|
||||
throws Exception
|
||||
{
|
||||
// Construct rule JSON object
|
||||
JSONObject rule = new JSONObject();
|
||||
|
||||
rule.put("owningNodeRef", owningNodeRef);
|
||||
rule.put("ruleNodeRef", ruleNodeRef);
|
||||
rule.put("title", title);
|
||||
rule.put("description", description);
|
||||
rule.put("ruleTypes", new JSONArray(ruleTypes));
|
||||
rule.put("action", action);
|
||||
rule.put("executeAsync", executeAsync);
|
||||
rule.put("ruleDisabled", ruleDisabled);
|
||||
rule.put("appliedToChildren", appliedToChildren);
|
||||
rule.put("url", ruleUrl);
|
||||
|
||||
return rule;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a rule in the rule collection associated with the given rule owning node
|
||||
*
|
||||
* @param ruleOwningNodeRef the rule owning node with which the rule collection is associated
|
||||
* @param ruleJson The rule JSON object to POST to the collection
|
||||
*
|
||||
* @return the created rule returned as a JSON object
|
||||
* @throws Exception
|
||||
*/
|
||||
private JSONObject postRules(NodeRef ruleOwningNodeRef, JSONObject ruleJson) throws Exception
|
||||
{
|
||||
// Construct rule collection URL for POST rules
|
||||
String rulesURL = getRulesNodeBasedUrl(ruleOwningNodeRef);
|
||||
|
||||
Response response = sendRequest(new PostRequest(rulesURL, ruleJson.toString(), "application/json"),
|
||||
Status.STATUS_OK);
|
||||
JSONObject result = new JSONObject(response.getContentAsString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check that getting the rule collection resource associated with the given actionable node
|
||||
* returns with the expected HTTP status code
|
||||
*
|
||||
* @param ruleOwningNodeRef the actionable node for which we want to retrieve rules associated with
|
||||
* it i.e. the rules applied to it
|
||||
* @param expectedStatus the HTTP status that we expect to be returned by this operation
|
||||
* @return the rules collection returned as an array of Rule Details encapsulated in a JSON object
|
||||
* @throws Exception
|
||||
*/
|
||||
private JSONArray getRules(NodeRef ruleOwningNodeRef, Boolean includeInherited, String ruleTypeName, int expectedStatus)
|
||||
throws Exception
|
||||
{
|
||||
// Construct rule collection URL for GET rules
|
||||
String rulesUrl = getRulesNodeBasedUrl(ruleOwningNodeRef, includeInherited, ruleTypeName);
|
||||
|
||||
Response response = sendRequest(new GetRequest(rulesUrl), expectedStatus);
|
||||
|
||||
JSONArray result = new JSONArray(response.getContentAsString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void testDeleteRules() throws Exception
|
||||
{
|
||||
//
|
||||
// First POST a Rule to the Rule Collection associated with rule owning NodeRef - owningNodeRef1
|
||||
//
|
||||
|
||||
// create condition parameters
|
||||
JSONObject condCompMimeTypeParams = new JSONObject();
|
||||
condCompMimeTypeParams.put(ComparePropertyValueEvaluator.PARAM_VALUE, "image/png");
|
||||
|
||||
// create conditions
|
||||
JSONObject conditionCompMimeType = getConditionJsonObject(null, condCompMimeTypeParams, "compare-mime-type", false, null);
|
||||
JSONArray conditions = new JSONArray();
|
||||
conditions.put(conditionCompMimeType);
|
||||
|
||||
// create nested action parameters
|
||||
JSONObject actionCopyParamsJson = new JSONObject();
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_QNAME,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "copy"));
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_DESTINATION_FOLDER, this.testDestFolder1);
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_TYPE_QNAME, ContentModel.ASSOC_CONTAINS);
|
||||
|
||||
// create nested actions
|
||||
JSONObject actionCopyJson = getActionJsonObject(null, CopyActionExecuter.NAME, "CopyTitle", "CopyDesc", false,
|
||||
actionCopyParamsJson, null, null, null, null);
|
||||
JSONArray nestedActions = new JSONArray();
|
||||
nestedActions.put(actionCopyJson);
|
||||
|
||||
// create rule's composite action
|
||||
JSONObject compoActionJson = getActionJsonObject(null, CompositeActionExecuter.NAME, "Rule1Action", "Rule1ActionDesc",
|
||||
false, null, conditions, nestedActions, null, null);
|
||||
|
||||
// create rule to POST
|
||||
List<String> ruleTypes = new ArrayList<String>();
|
||||
ruleTypes.add(RuleType.UPDATE);
|
||||
JSONObject ruleJson = getRuleJsonObject(this.owningNodeRef1, null, "Rule1", "Rule1Desc", ruleTypes,
|
||||
compoActionJson, false, false, false, null);
|
||||
|
||||
// POST rule JSON to rules collection resource associated with rule owning node ref owningNodeRef1
|
||||
postRules(this.owningNodeRef1, ruleJson);
|
||||
|
||||
//
|
||||
// DELETE all Rules owned by NodeRef - owningNodeRef1
|
||||
// and validate that owningNodeRef1 does not have any
|
||||
// rules left applied against it thereafter
|
||||
//
|
||||
|
||||
// construct url to the Rule Collection resource that we wish to delete (associated with rule owning node
|
||||
// NodeRef owningNodeRef1)
|
||||
String url = "/api/node/" + this.owningNodeRef1.getStoreRef().getProtocol() + "/"
|
||||
+ this.owningNodeRef1.getStoreRef().getIdentifier() + "/" + this.owningNodeRef1.getId() + "/rules";
|
||||
|
||||
// DELETE all rules owned by NodeRef owningNodeRef1
|
||||
sendRequest(new DeleteRequest(url), Status.STATUS_OK);
|
||||
|
||||
// make sure that there are no rules associated with
|
||||
// rule owning NodeRef owningNodeRef1 anymore
|
||||
Response responseGetRules = sendRequest(new GetRequest(url), Status.STATUS_OK);
|
||||
JSONArray getRulesJson = new JSONArray(responseGetRules.getContentAsString());
|
||||
|
||||
assertTrue(getRulesJson.length() == 0);
|
||||
}
|
||||
|
||||
public void testDeleteRule() throws Exception
|
||||
{
|
||||
//
|
||||
// First POST a Rule and get the identifying rule node ref
|
||||
// from the Rule Details returned
|
||||
//
|
||||
|
||||
// create condition parameters
|
||||
JSONObject condCompMimeTypeParams = new JSONObject();
|
||||
condCompMimeTypeParams.put(ComparePropertyValueEvaluator.PARAM_VALUE, "image/png");
|
||||
|
||||
// create conditions
|
||||
JSONObject conditionCompMimeType = getConditionJsonObject(null, condCompMimeTypeParams, "compare-mime-type", false, null);
|
||||
JSONArray conditions = new JSONArray();
|
||||
conditions.put(conditionCompMimeType);
|
||||
|
||||
// create nested action parameters
|
||||
JSONObject actionCopyParamsJson = new JSONObject();
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_QNAME,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "copy"));
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_DESTINATION_FOLDER, this.testDestFolder1);
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_TYPE_QNAME, ContentModel.ASSOC_CONTAINS);
|
||||
|
||||
// create nested action
|
||||
JSONObject actionCopyJson = getActionJsonObject(null, CopyActionExecuter.NAME, "CopyTitle", "CopyDesc", false,
|
||||
actionCopyParamsJson, null, null, null, null);
|
||||
JSONArray nestedActions = new JSONArray();
|
||||
nestedActions.put(actionCopyJson);
|
||||
|
||||
// create rule's composite action
|
||||
JSONObject compoActionJson = getActionJsonObject(null, CompositeActionExecuter.NAME, "Rule1Action", "Rule1ActionDesc",
|
||||
false, null, conditions, nestedActions, null, null);
|
||||
|
||||
// create rule to POST
|
||||
List<String> ruleTypes = new ArrayList<String>();
|
||||
ruleTypes.add(RuleType.UPDATE);
|
||||
JSONObject ruleJson = getRuleJsonObject(this.owningNodeRef1, null, "Rule1", "Rule1Desc", ruleTypes,
|
||||
compoActionJson, false, false, false, null);
|
||||
|
||||
// POST rule JSON to rules collection resource
|
||||
JSONObject resultPostRule = postRules(this.owningNodeRef1, ruleJson);
|
||||
|
||||
String ruleNodeRefStr = resultPostRule.getString("ruleNodeRef");
|
||||
NodeRef ruleNodeRef = new NodeRef(ruleNodeRefStr);
|
||||
|
||||
//
|
||||
// DELETE Rule with rule node ref of Rule just POSTed
|
||||
// and validate that the Rule has been deleted
|
||||
//
|
||||
|
||||
// construct url to Rule resource we wish to delete
|
||||
String url = "/api/rules/" + ruleNodeRef.getStoreRef().getProtocol() + "/"
|
||||
+ ruleNodeRef.getStoreRef().getIdentifier() + "/" + ruleNodeRef.getId();
|
||||
|
||||
// delete the rule just POSTed
|
||||
sendRequest(new DeleteRequest(url), Status.STATUS_OK);
|
||||
|
||||
// make sure that the rule just deleted no longer exists
|
||||
sendRequest(new GetRequest(url), Status.STATUS_NOT_FOUND);
|
||||
}
|
||||
|
||||
public void testGetRule() throws Exception
|
||||
{
|
||||
//
|
||||
// First POST a Rule and get the identifying rule node ref
|
||||
// from the Rule Details returned
|
||||
//
|
||||
|
||||
// create condition parameters
|
||||
JSONObject condCompMimeTypeParams = new JSONObject();
|
||||
condCompMimeTypeParams.put(ComparePropertyValueEvaluator.PARAM_VALUE, "image/png");
|
||||
|
||||
// create conditions
|
||||
JSONObject conditionCompMimeType = getConditionJsonObject(null, condCompMimeTypeParams, "compare-mime-type", false, null);
|
||||
JSONArray conditions = new JSONArray();
|
||||
conditions.put(conditionCompMimeType);
|
||||
|
||||
// create parameters for nested actions
|
||||
JSONObject actionCopyParamsJson = new JSONObject();
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_QNAME,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "copy"));
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_DESTINATION_FOLDER, this.testDestFolder1);
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_TYPE_QNAME, ContentModel.ASSOC_CONTAINS);
|
||||
|
||||
// create nested actions
|
||||
JSONObject actionCopyJson = getActionJsonObject(null, CopyActionExecuter.NAME, "CopyTitle", "CopyDesc", false,
|
||||
actionCopyParamsJson, null, null, null, null);
|
||||
JSONArray nestedActions = new JSONArray();
|
||||
nestedActions.put(actionCopyJson);
|
||||
|
||||
// create rule's composite action
|
||||
JSONObject compoActionJson = getActionJsonObject(null, CompositeActionExecuter.NAME, "Rule1Action", "Rule1ActionDesc",
|
||||
false, null, conditions, nestedActions, null, null);
|
||||
|
||||
// create rule to POST
|
||||
List<String> ruleTypes = new ArrayList<String>();
|
||||
ruleTypes.add(RuleType.UPDATE);
|
||||
JSONObject ruleJson = getRuleJsonObject(this.owningNodeRef1, null, "Rule1", "Rule1Desc", ruleTypes,
|
||||
compoActionJson, false, false, false, null);
|
||||
|
||||
// POST rule JSON to rules collection resource
|
||||
JSONObject resultPostRule = postRules(this.owningNodeRef1, ruleJson);
|
||||
|
||||
String ruleNodeRefStr = resultPostRule.getString("ruleNodeRef");
|
||||
NodeRef ruleNodeRef = new NodeRef(ruleNodeRefStr);
|
||||
|
||||
//
|
||||
// GET Rule with rule node ref of Rule just POSTed
|
||||
// and validate that the Rule returned by GET Rule
|
||||
// is the same as that for the rule just POSTed
|
||||
//
|
||||
String getRuleRulesBasedUrl = "/api/rules/" + ruleNodeRef.getStoreRef().getProtocol() + "/"
|
||||
+ ruleNodeRef.getStoreRef().getIdentifier() + "/" + ruleNodeRef.getId();
|
||||
|
||||
Response response = sendRequest(new GetRequest(getRuleRulesBasedUrl), Status.STATUS_OK);
|
||||
JSONObject resultGetRule = new JSONObject(response.getContentAsString());
|
||||
|
||||
String resultRuleNodeRefStr = resultGetRule.getString("ruleNodeRef");
|
||||
|
||||
assertEquals(ruleNodeRefStr, resultRuleNodeRefStr);
|
||||
}
|
||||
|
||||
public void testGetRules() throws Exception
|
||||
{
|
||||
//
|
||||
// First POST a Rule
|
||||
//
|
||||
|
||||
// create condition parameters
|
||||
JSONObject condCompMimeTypeParams = new JSONObject();
|
||||
condCompMimeTypeParams.put(ComparePropertyValueEvaluator.PARAM_VALUE, "image/png");
|
||||
|
||||
// create conditions
|
||||
JSONObject conditionCompMimeType = getConditionJsonObject(null, condCompMimeTypeParams, "compare-mime-type", false, null);
|
||||
JSONArray conditions = new JSONArray();
|
||||
conditions.put(conditionCompMimeType);
|
||||
|
||||
// create parameters for nested actions
|
||||
JSONObject actionCopyParamsJson = new JSONObject();
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_QNAME,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "copy"));
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_DESTINATION_FOLDER, this.testDestFolder1);
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_TYPE_QNAME, ContentModel.ASSOC_CONTAINS);
|
||||
|
||||
// create nested actions
|
||||
JSONObject actionCopyJson = getActionJsonObject(null, CopyActionExecuter.NAME, "CopyTitle", "CopyDesc", false,
|
||||
actionCopyParamsJson, null, null, null, null);
|
||||
JSONArray nestedActions = new JSONArray();
|
||||
nestedActions.put(actionCopyJson);
|
||||
|
||||
// create rule's composite action
|
||||
JSONObject compoActionJson = getActionJsonObject(null, CompositeActionExecuter.NAME, "Rule1Action", "Rule1ActionDesc",
|
||||
false, null, conditions, nestedActions, null, null);
|
||||
|
||||
// create rule to POST
|
||||
List<String> ruleTypes = new ArrayList<String>();
|
||||
ruleTypes.add(RuleType.UPDATE);
|
||||
JSONObject ruleJson = getRuleJsonObject(this.owningNodeRef1, null, "Rule1", "Rule1Desc", ruleTypes,
|
||||
compoActionJson, false, false, false, null);
|
||||
|
||||
// POST rule JSON to rules collection resource
|
||||
postRules(this.owningNodeRef1, ruleJson);
|
||||
|
||||
//
|
||||
// GET Rules and test to make sure that POSTed rule is in return Rules collection
|
||||
//
|
||||
|
||||
JSONArray result = getRules(this.owningNodeRef1, null, null, Status.STATUS_OK);
|
||||
|
||||
boolean postedRuleFound = false;
|
||||
for (int i=0; i < result.length(); i++)
|
||||
{
|
||||
JSONObject resultRuleJson = result.getJSONObject(i);
|
||||
String ruleTitle = resultRuleJson.getString("title");
|
||||
|
||||
if (ruleTitle.equals("Rule1"))
|
||||
{
|
||||
postedRuleFound = true;
|
||||
}
|
||||
}
|
||||
|
||||
assertTrue(postedRuleFound == true);
|
||||
}
|
||||
|
||||
public void testPostRules()
|
||||
throws Exception
|
||||
{
|
||||
// create condition parameters for compare MIME type condition
|
||||
JSONObject condCompMimeTypeParams = new JSONObject();
|
||||
condCompMimeTypeParams.put(ComparePropertyValueEvaluator.PARAM_VALUE, "image/png");
|
||||
|
||||
// create compare MIME type condition
|
||||
JSONObject conditionCompMimeType = getConditionJsonObject(null, condCompMimeTypeParams, "compare-mime-type", false, null);
|
||||
JSONArray conditions = new JSONArray();
|
||||
conditions.put(conditionCompMimeType);
|
||||
|
||||
// create action parameters for copy action
|
||||
JSONObject actionCopyParamsJson = new JSONObject();
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_QNAME,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "copy").toString());
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_DESTINATION_FOLDER, this.testDestFolder1.toString());
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_TYPE_QNAME, ContentModel.ASSOC_CONTAINS.toString());
|
||||
|
||||
// create copy action and add to nested actions
|
||||
JSONObject actionCopyJson = getActionJsonObject(null, CopyActionExecuter.NAME, "CopyActionTitle", "CopyActionDesc", false,
|
||||
actionCopyParamsJson, null, null, null, null);
|
||||
JSONArray nestedActions = new JSONArray();
|
||||
nestedActions.put(actionCopyJson);
|
||||
|
||||
// create rule's composite action
|
||||
JSONObject compoActionJson = getActionJsonObject(null, CompositeActionExecuter.NAME, "Rule1Action", "Rule1ActionDesc",
|
||||
false, null, conditions, nestedActions, null, null);
|
||||
|
||||
// create rule to POST
|
||||
List<String> ruleTypes = new ArrayList<String>();
|
||||
ruleTypes.add(RuleType.UPDATE);
|
||||
JSONObject ruleJson = getRuleJsonObject(this.owningNodeRef1, null, "Rule1", "Rule1Desc", ruleTypes,
|
||||
compoActionJson, false, false, false, null);
|
||||
|
||||
// POST RuleJson to Rules Collection
|
||||
JSONObject resultRule = postRules(this.owningNodeRef1, ruleJson);
|
||||
|
||||
//
|
||||
// validate rule result
|
||||
//
|
||||
|
||||
NodeRef resultRuleNodeRef = new NodeRef(resultRule.getString("ruleNodeRef"));
|
||||
|
||||
assertEquals(this.owningNodeRef1.toString(), resultRule.getString("owningNodeRef"));
|
||||
assertEquals("Rule1", resultRule.getString("title"));
|
||||
assertEquals("Rule1Desc", resultRule.getString("description"));
|
||||
|
||||
// validate that rule types sent in rule JSON are the same as that returned
|
||||
// there should only be one, namely "update"
|
||||
JSONArray resultRuleTypes = resultRule.getJSONArray("ruleTypes");
|
||||
assertTrue(resultRuleTypes.length() == 1);
|
||||
assertEquals(RuleType.UPDATE, resultRuleTypes.getString(0));
|
||||
|
||||
assertEquals(false, resultRule.getBoolean("executeAsync"));
|
||||
assertEquals(false, resultRule.getBoolean("ruleDisabled"));
|
||||
assertEquals(false, resultRule.getBoolean("appliedToChildren"));
|
||||
|
||||
// validate rule's composite action from rule in result JSON
|
||||
JSONObject resultCompoAction = resultRule.getJSONObject("action");
|
||||
|
||||
assertEquals(CompositeActionExecuter.NAME, resultCompoAction.getString("actionDefinitionName"));
|
||||
assertEquals("Rule1Action", resultCompoAction.getString("title"));
|
||||
assertEquals("Rule1ActionDesc", resultCompoAction.getString("description"));
|
||||
assertEquals(false, resultCompoAction.getBoolean("executeAsync"));
|
||||
|
||||
// validate condition in rule's composite action from the result JSON
|
||||
// there should only be one, namely the compare MIME type condition
|
||||
JSONObject resultConditions = resultCompoAction.getJSONObject("conditions");
|
||||
String resultcondCompMimeTypeKey = resultConditions.names().getString(0);
|
||||
JSONObject resultcondCompMimeType = resultConditions.getJSONObject(resultcondCompMimeTypeKey);
|
||||
|
||||
assertEquals("compare-mime-type", resultcondCompMimeType.getString("conditionDefinitionName"));
|
||||
assertEquals(false, resultcondCompMimeType.getBoolean("invertCondition"));
|
||||
|
||||
// validate parameter values in compare MIME type condition
|
||||
JSONObject resultCondParamVals = resultcondCompMimeType.getJSONObject("parameterValues");
|
||||
assertEquals("image/png", resultCondParamVals.getString(ComparePropertyValueEvaluator.PARAM_VALUE));
|
||||
|
||||
// validate nested action in rule's composite action from the result JSON
|
||||
// there should only be one nested action, namely the copy action
|
||||
JSONObject resultNestedActions = resultCompoAction.getJSONObject("actions");
|
||||
String resultActionCopyKey = resultNestedActions.names().getString(0);
|
||||
JSONObject resultCopyAction = resultNestedActions.getJSONObject(resultActionCopyKey);
|
||||
|
||||
assertEquals(CopyActionExecuter.NAME, resultCopyAction.getString("actionDefinitionName"));
|
||||
assertEquals("CopyActionTitle", resultCopyAction.getString("title"));
|
||||
assertEquals("CopyActionDesc", resultCopyAction.getString("description"));
|
||||
assertEquals(false, resultCopyAction.getBoolean("executeAsync"));
|
||||
|
||||
// validate parameter values in copy action
|
||||
JSONObject resultActionParamVals = resultCopyAction.getJSONObject("parameterValues");
|
||||
assertEquals(QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "copy").toString(),
|
||||
resultActionParamVals.getString(MoveActionExecuter.PARAM_ASSOC_QNAME));
|
||||
assertEquals(this.testDestFolder1.toString(),
|
||||
resultActionParamVals.getString(MoveActionExecuter.PARAM_DESTINATION_FOLDER));
|
||||
assertEquals(ContentModel.ASSOC_CONTAINS.toString(),
|
||||
resultActionParamVals.getString(MoveActionExecuter.PARAM_ASSOC_TYPE_QNAME));
|
||||
}
|
||||
|
||||
public void testPostActionQueue() throws Exception
|
||||
{
|
||||
// construct ActionQueue resource URL
|
||||
String url = "/api/actionqueue";
|
||||
|
||||
//
|
||||
// construct action JSON to put into action queue item
|
||||
// (which will, in turn, be posted to the action queue)
|
||||
//
|
||||
|
||||
// create action parameters for copy action
|
||||
JSONObject actionCopyParamsJson = new JSONObject();
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_QNAME,
|
||||
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "copy").toString());
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_DESTINATION_FOLDER, this.testDestFolder1.toString());
|
||||
actionCopyParamsJson.put(MoveActionExecuter.PARAM_ASSOC_TYPE_QNAME, ContentModel.ASSOC_CONTAINS.toString());
|
||||
|
||||
// create copy action
|
||||
JSONObject actionCopyJson = getActionJsonObject(null, CopyActionExecuter.NAME, "CopyActionTitle",
|
||||
"CopyActionDesc", false, actionCopyParamsJson, null, null, null, null);
|
||||
|
||||
//
|
||||
// create action queue item json
|
||||
//
|
||||
|
||||
JSONObject actionQueueItemJson = new JSONObject();
|
||||
actionQueueItemJson.put("action", actionCopyJson);
|
||||
actionQueueItemJson.put("nodeRef", this.testDestFolder1.toString());
|
||||
actionQueueItemJson.put("checkConditions", true);
|
||||
actionQueueItemJson.put("executeAsync", false);
|
||||
|
||||
Response response = sendRequest(new PostRequest(url, actionQueueItemJson.toString(), "application/json"),
|
||||
Status.STATUS_OK);
|
||||
JSONObject result = new JSONObject(response.getContentAsString());
|
||||
|
||||
assertNotNull(result);
|
||||
|
||||
assertEquals("COMPLETE", result.getString("status"));
|
||||
}
|
||||
|
||||
public void testGetConditionDefs() throws Exception
|
||||
{
|
||||
// construct condition definition collection resource URL
|
||||
String url = "/api/rules/conditiondefs";
|
||||
|
||||
Response response = sendRequest(new GetRequest(url),
|
||||
Status.STATUS_OK);
|
||||
JSONArray result = new JSONArray(response.getContentAsString());
|
||||
|
||||
assertTrue(result.length() > 0);
|
||||
|
||||
System.out.println(result);
|
||||
}
|
||||
|
||||
public void testGetConditionDef() throws Exception
|
||||
{
|
||||
String conditionDefName = "compare-property-value";
|
||||
// construct condition definition resource URL
|
||||
String url = "/api/rules/conditiondefs/" + conditionDefName;
|
||||
|
||||
Response response = sendRequest(new GetRequest(url),
|
||||
Status.STATUS_OK);
|
||||
JSONObject result = new JSONObject(response.getContentAsString());
|
||||
|
||||
assertNotNull(result);
|
||||
|
||||
assertEquals("compare-property-value", result.getString("name"));
|
||||
|
||||
assertEquals(false, result.getBoolean("adhocPropertiesAllowed"));
|
||||
}
|
||||
|
||||
public void testGetActionDefs() throws Exception
|
||||
{
|
||||
// construct action definition collection resource URL
|
||||
String url = "/api/rules/actiondefs";
|
||||
|
||||
Response response = sendRequest(new GetRequest(url),
|
||||
Status.STATUS_OK);
|
||||
JSONArray result = new JSONArray(response.getContentAsString());
|
||||
|
||||
assertTrue(result.length() > 0);
|
||||
}
|
||||
|
||||
public void testGetActionDef() throws Exception
|
||||
{
|
||||
String actionDefName = "transform";
|
||||
// construct action definition resource URL
|
||||
String url = "/api/rules/actiondefs/" + actionDefName;
|
||||
|
||||
Response response = sendRequest(new GetRequest(url),
|
||||
Status.STATUS_OK);
|
||||
JSONObject result = new JSONObject(response.getContentAsString());
|
||||
|
||||
assertNotNull(result);
|
||||
|
||||
// validate applicable types in returned action definition
|
||||
boolean applicableTypeContentFound = false;
|
||||
JSONArray applicableTypes = result.getJSONArray("applicableTypes");
|
||||
for (int i=0; i < applicableTypes.length(); i++)
|
||||
{
|
||||
String applicableType = applicableTypes.getString(i);
|
||||
if (applicableType.equals("content"))
|
||||
{
|
||||
applicableTypeContentFound = true;
|
||||
}
|
||||
}
|
||||
assertTrue(applicableTypeContentFound == true);
|
||||
|
||||
assertEquals("transform", result.getString("name"));
|
||||
|
||||
assertEquals(false, result.getBoolean("adhocPropertiesAllowed"));
|
||||
}
|
||||
}
|
@@ -37,14 +37,15 @@ import org.alfresco.web.scripts.WebScriptException;
|
||||
import org.alfresco.web.scripts.WebScriptRequest;
|
||||
|
||||
/**
|
||||
* Web Script to GET the rule collection associated with the given actionable node.
|
||||
* Web Script to GET the rule collection associated with the given rule owning node.
|
||||
* The following optional parameters can be provided:
|
||||
*
|
||||
* - includeInherited: if provided, then this parameter indicates whether or not to include rules
|
||||
* inherited from the actionable node's parents. If this parameter is not provided , then rules
|
||||
* inherited from the owning node's parents. If this parameter is not provided , then rules
|
||||
* inherited from the node's parents are included by default.
|
||||
*
|
||||
* - ruleTypeName: if this parameter is provided, then only rules of this given rule type are returned.
|
||||
* - ruleTypeName: if this parameter is provided, then only rules of this given rule type are returned.
|
||||
* If this parameter is not provided then rules of all types will be returned.
|
||||
*
|
||||
* @author glen johnson at alfresco dot com
|
||||
*/
|
||||
@@ -60,6 +61,7 @@ public class RulesGet extends DeclarativeWebScript
|
||||
|
||||
// model property keys
|
||||
private static final String MODEL_PROP_KEY_RULES = "rules";
|
||||
private static final String MODEL_PROP_KEY_OWNING_NODE_REF = "owningNodeRef";
|
||||
|
||||
// properties for services
|
||||
private RuleService ruleService;
|
||||
@@ -123,39 +125,37 @@ public class RulesGet extends DeclarativeWebScript
|
||||
"The 'nodeId' URL template token has not been provided in URL");
|
||||
}
|
||||
|
||||
//
|
||||
// get URL parameters
|
||||
String includeInherited = req.getParameter(REQ_PARAM_INCLUDE_INHERITED);
|
||||
boolean includeInheritedParamGiven = ((includeInherited != null) && (includeInherited.length() > 0));
|
||||
//
|
||||
|
||||
String ruleTypeName = req.getParameter(REQ_PARAM_RULE_TYPE_NAME);
|
||||
boolean ruleTypeNameParamGiven = ((ruleTypeName != null) && (ruleTypeName.length() > 0));
|
||||
// get the 'includeInherited' parameter. The value defaults to 'true' if
|
||||
// the parameter has not been provided
|
||||
boolean includeInherited = true;
|
||||
String includeInheritedParam = req.getParameter(REQ_PARAM_INCLUDE_INHERITED);
|
||||
if ((includeInheritedParam != null) && (includeInheritedParam.length() > 0))
|
||||
{
|
||||
includeInherited = Boolean.parseBoolean(includeInheritedParam);
|
||||
}
|
||||
|
||||
// create the actionable node reference from the given
|
||||
// URL template tokens
|
||||
NodeRef actionableNodeRef = this.rulesHelper.getNodeRefFromWebScriptUrl(req, storeType, storeId, nodeId);
|
||||
// get the 'ruleTypeName' parameter. The value defaults to 'null' if
|
||||
// the parameter has not been provided
|
||||
String ruleTypeName = null;
|
||||
String ruleTypeNameParam = req.getParameter(REQ_PARAM_RULE_TYPE_NAME);
|
||||
if ((ruleTypeNameParam != null) && (ruleTypeNameParam.length() > 0))
|
||||
{
|
||||
ruleTypeName = ruleTypeNameParam;
|
||||
}
|
||||
|
||||
// get rule collection associated with the actionable node
|
||||
List<Rule> rules = null;
|
||||
if ((includeInheritedParamGiven == false) && (ruleTypeNameParamGiven == false))
|
||||
{
|
||||
rules = this.ruleService.getRules(actionableNodeRef);
|
||||
}
|
||||
else if ((includeInheritedParamGiven == true) && (ruleTypeNameParamGiven == false))
|
||||
{
|
||||
rules = this.ruleService.getRules(actionableNodeRef, Boolean.parseBoolean(includeInherited));
|
||||
}
|
||||
else if ((includeInheritedParamGiven == false) && (ruleTypeNameParamGiven == true))
|
||||
{
|
||||
rules = this.ruleService.getRules(actionableNodeRef, true, ruleTypeName);
|
||||
}
|
||||
else
|
||||
// both 'includeInherited' and 'ruleTypeName' parameter values have been given
|
||||
{
|
||||
rules = this.ruleService.getRules(actionableNodeRef, Boolean.parseBoolean(includeInherited), ruleTypeName);
|
||||
}
|
||||
// create the rule owning node reference from the given URL template tokens
|
||||
NodeRef owningNodeRef = this.rulesHelper.getNodeRefFromWebScriptUrl(req, storeType, storeId, nodeId);
|
||||
|
||||
// get rule collection associated with the rule owning node
|
||||
List<Rule> rules = this.ruleService.getRules(owningNodeRef, includeInherited, ruleTypeName);
|
||||
|
||||
// add objects to model for the template to render
|
||||
model.put(MODEL_PROP_KEY_RULES, rules);
|
||||
model.put(MODEL_PROP_KEY_OWNING_NODE_REF, owningNodeRef);
|
||||
|
||||
return model;
|
||||
}
|
||||
|
@@ -26,8 +26,10 @@ package org.alfresco.repo.web.scripts.rule;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.alfresco.repo.model.Repository;
|
||||
import org.alfresco.service.ServiceRegistry;
|
||||
@@ -69,6 +71,7 @@ public class RulesHelper
|
||||
private static final String COMPOSITE_ACTION_DEF_NAME = "composite-action";
|
||||
private static final String REQ_URL_PART_NODE_REF = "/api/node";
|
||||
private static final String REQ_URL_PART_NODE_PATH = "/api/path";
|
||||
private static final String REQ_URL_PART_RULE_NODE_REF = "/api/rules";
|
||||
|
||||
// service dependencies
|
||||
private ServiceRegistry serviceRegistry;
|
||||
@@ -128,7 +131,7 @@ public class RulesHelper
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a Rule object created/updated from a given rule JSON object.
|
||||
* Return a Rule object created/updated from a given rule JSON object (Rule Details sent).
|
||||
*
|
||||
* If a node reference is passed into the <pre>ruleNodeRefToUpdate</pre> parameter,
|
||||
* then this indicates that an existing rule (identified by that node
|
||||
@@ -174,55 +177,42 @@ public class RulesHelper
|
||||
// set rule properties
|
||||
//
|
||||
|
||||
if ((ruleJson.isNull("title") == true) && (update == true))
|
||||
if ((ruleJson.isNull("title") == true) && (update == false))
|
||||
{
|
||||
// this field is 'null' and we are doing an update
|
||||
// so don't do anything
|
||||
// the "title" field is mandatory, it is missing in the rule details,
|
||||
// and we are creating a new rule, so throw an exception
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "A new rule is being created but the 'title' "
|
||||
+ "field, which is mandatory, has not been included in the rule details");
|
||||
}
|
||||
else
|
||||
// otherwise go ahead and set the value if the field is present
|
||||
else if (ruleJson.isNull("title") == false)
|
||||
{
|
||||
String ruleTitle = ruleJson.getString("title");
|
||||
rule.setTitle(ruleTitle);
|
||||
}
|
||||
|
||||
if ((ruleJson.isNull("description") == true) && (update == true))
|
||||
if (ruleJson.isNull("description") == false)
|
||||
{
|
||||
// this field is 'null' and we are doing an update
|
||||
// so don't do anything
|
||||
}
|
||||
else
|
||||
{
|
||||
rule.setDescription(ruleJson.optString("description", ""));
|
||||
rule.setDescription(ruleJson.getString("description"));
|
||||
}
|
||||
|
||||
if ((ruleJson.isNull("executeAsync") == true) && (update == true))
|
||||
{
|
||||
// this field is 'null' and we are doing an update
|
||||
// so don't do anything
|
||||
}
|
||||
else
|
||||
// set values from the respective Boolean fields below, but if the
|
||||
// if the value given for a field does not equate to either
|
||||
// 'true' or 'false', then set it to a default value of false
|
||||
|
||||
if (ruleJson.isNull("executeAsync") == false)
|
||||
{
|
||||
rule.setExecuteAsynchronously(ruleJson.optBoolean("executeAsync", false));
|
||||
}
|
||||
|
||||
|
||||
if ((ruleJson.isNull("ruleDisabled") == true) && (update == true))
|
||||
{
|
||||
// this field is 'null' and we are doing an update
|
||||
// so don't do anything
|
||||
}
|
||||
else
|
||||
if (ruleJson.isNull("ruleDisabled") == false)
|
||||
{
|
||||
rule.setRuleDisabled(ruleJson.optBoolean("ruleDisabled", false));
|
||||
}
|
||||
|
||||
|
||||
if ((ruleJson.isNull("appliedToChildren") == true) && (update == true))
|
||||
{
|
||||
// this field is 'null' and we are doing an update
|
||||
// so don't do anything
|
||||
}
|
||||
else
|
||||
if (ruleJson.isNull("appliedToChildren") == false)
|
||||
{
|
||||
rule.applyToChildren(ruleJson.optBoolean("appliedToChildren", false));
|
||||
}
|
||||
@@ -231,12 +221,14 @@ public class RulesHelper
|
||||
// set rule types present in the rule details onto the rule
|
||||
//
|
||||
|
||||
if ((ruleJson.isNull("ruleTypes") == true) && (update == true))
|
||||
if ((ruleJson.isNull("ruleTypes") == true) && (update == false))
|
||||
{
|
||||
// this field is 'null' and we are doing an update
|
||||
// so don't do anything
|
||||
// the "ruleTypes" field is mandatory, it is missing in the rule details,
|
||||
// and we are creating a new rule so throw an exception
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "A new rule is being created but the 'ruleTypes' "
|
||||
+ "field, which is mandatory, has not been included in the rule details");
|
||||
}
|
||||
else
|
||||
else if (ruleJson.isNull("ruleTypes") == false)
|
||||
{
|
||||
List<String> ruleTypes = new ArrayList<String>();
|
||||
JSONArray ruleTypesJson = ruleJson.getJSONArray("ruleTypes");
|
||||
@@ -267,16 +259,44 @@ public class RulesHelper
|
||||
rule.setRuleTypes(ruleTypes);
|
||||
}
|
||||
|
||||
if ((ruleJson.isNull("action") == true) && (update == true))
|
||||
if ((ruleJson.isNull("action") == true) && (update == false))
|
||||
{
|
||||
// this field is 'null' and we are doing an update
|
||||
// so don't do anything
|
||||
// the "action" field is mandatory, it is missing in the rule details,
|
||||
// and we are creating a new rule so throw an exception
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "A new rule is being created but the 'action' "
|
||||
+ "field, which is mandatory, has not been included in the rule details");
|
||||
}
|
||||
else
|
||||
{
|
||||
// set the action supplied in the rule details onto the rule
|
||||
JSONObject actionJson = ruleJson.getJSONObject("action");
|
||||
Action action = getActionFromJson(actionJson);
|
||||
JSONObject ruleActionJson = ruleJson.getJSONObject("action");
|
||||
|
||||
// if we're doing an update then the rule should already have
|
||||
// this action set on it, so get the action object already on
|
||||
// the rule
|
||||
Action ruleActionToUpdate = null;
|
||||
if (update == true)
|
||||
{
|
||||
String ruleActionJsonId = ruleActionJson.getString("id");
|
||||
ruleActionToUpdate = rule.getAction();
|
||||
|
||||
// throw a web script exception if the ID of the rule's action,
|
||||
// already persisted to the repository, is not the same as the one
|
||||
// given for the rule action's ID in the rule details that we
|
||||
// wish to perform the rule update with
|
||||
if (ruleActionToUpdate.getId().equals(ruleActionJsonId) == false)
|
||||
{
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "The ID sent in the rule details "
|
||||
+ "of the action directly associated with the rule we wish to update does not match "
|
||||
+ " the rule's action already persisted in the repository. The rule's nodeRef is: '"
|
||||
+ ruleNodeRefToUpdate + "', the action ID provided in the rule details is '"
|
||||
+ ruleActionJsonId + "', and the ID for the rule's action already persisted in the"
|
||||
+ " repository is '" + ruleActionToUpdate.getId() + "'");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Action action = getActionFromJson(ruleActionJson, ruleActionToUpdate);
|
||||
rule.setAction(action);
|
||||
}
|
||||
}
|
||||
@@ -290,18 +310,37 @@ public class RulesHelper
|
||||
}
|
||||
|
||||
/**
|
||||
* Create and return an Action object from a given action JSON object
|
||||
* Return an Action object created/updated from a given action JSON object (Action Details sent).
|
||||
*
|
||||
* @param actionJson the action JSON object to create the action from
|
||||
* If an action object is passed into the <pre>actionToUpdate</pre> parameter,
|
||||
* then this indicates that this action is to be updated from the action details
|
||||
* provided in the given JSON object and then returned.
|
||||
* If a 'null' is passed into this parameter, then this indicates that a new action is to
|
||||
* be created from scratch and returned.
|
||||
*
|
||||
* @return The action object created from the given action JSON object
|
||||
* @param actionJson the action JSON object used to create/update the action with
|
||||
* @param actionToUpdate The action to be updated.
|
||||
* Set to <pre>null</pre> if a new action is to be created from scratch.
|
||||
*
|
||||
* @return The action created/updated from the given action JSON object
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public Action getActionFromJson(JSONObject actionJson)
|
||||
public Action getActionFromJson(JSONObject actionJson, Action actionToUpdate)
|
||||
{
|
||||
Action action = null;
|
||||
ActionService actionService = this.serviceRegistry.getActionService();
|
||||
|
||||
//
|
||||
// if we are doing an update then set the action, to be returned, to
|
||||
// the given actionToUpdate (which will then be updated by the action
|
||||
// details provided in the action JSON - containing the action details sent)
|
||||
//
|
||||
|
||||
Action action = null;
|
||||
if (actionToUpdate != null)
|
||||
{
|
||||
action = actionToUpdate;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
//
|
||||
@@ -309,26 +348,80 @@ public class RulesHelper
|
||||
//
|
||||
|
||||
String actionDefinitionName = actionJson.getString("actionDefinitionName");
|
||||
JSONObject nestedActionsJson = actionJson.optJSONObject("actions");
|
||||
JSONArray nestedActionsJson = actionJson.optJSONArray("actions");
|
||||
|
||||
// if action's definition name denotes that it is a composite action and the
|
||||
// action JSON object has nested actions, then treat it as a composite action
|
||||
if ((actionDefinitionName.equals(COMPOSITE_ACTION_DEF_NAME)) == true && (nestedActionsJson != null))
|
||||
{
|
||||
// create composite action object
|
||||
action = actionService.createCompositeAction();
|
||||
// if we are updating an existing action and the given
|
||||
// actionToUpdate is not a composite action, then throw a
|
||||
// web script exception
|
||||
if ((actionToUpdate != null) && ((actionToUpdate instanceof CompositeAction) == false))
|
||||
{
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "The action directly associated with the "
|
||||
+ "rule you wish to update is not a composite action. Thus this action could not be updated with "
|
||||
+ "the given action JSON - the action details sent");
|
||||
}
|
||||
|
||||
// TODO remove this look-up map when the back-end provides an easy way to lookup actions
|
||||
// on a composite action by ID
|
||||
|
||||
// if we are updating an existing composite action then create a map to easily look up the
|
||||
// nested action objects for each nested action details provided in the action JSON object
|
||||
Map<String, Action> nestedActionsMap = new HashMap<String, Action>();
|
||||
if ((actionToUpdate != null) && ((actionToUpdate instanceof CompositeAction) == true))
|
||||
{
|
||||
List<Action> nestedActions = ((CompositeAction)action).getActions();
|
||||
for (Action nestedAction: nestedActions)
|
||||
{
|
||||
nestedActionsMap.put(nestedAction.getId(), nestedAction);
|
||||
}
|
||||
}
|
||||
// else if we are not updating then create composite action object
|
||||
// for scratch
|
||||
else if (actionToUpdate == null)
|
||||
{
|
||||
action = actionService.createCompositeAction();
|
||||
}
|
||||
|
||||
// recursively add nested actions to this composite action
|
||||
// as some of those nested actions could also be composite actions
|
||||
Iterator<String> nestedActionsIteractor = nestedActionsJson.keys();
|
||||
while (nestedActionsIteractor.hasNext())
|
||||
int numNestedActionsJson = nestedActionsJson.length();
|
||||
for (int i=0; i < numNestedActionsJson; i++)
|
||||
{
|
||||
String nestedActionKey = nestedActionsIteractor.next();
|
||||
JSONObject nestedActionJson = nestedActionsJson.optJSONObject(nestedActionKey);
|
||||
JSONObject nestedActionJson = nestedActionsJson.optJSONObject(i);
|
||||
|
||||
if (nestedActionJson != null)
|
||||
{
|
||||
Action nestedAction = getActionFromJson(nestedActionJson);
|
||||
Action nestedAction = null;
|
||||
|
||||
// if we are doing an action update, then update the nested actions from
|
||||
// the nested action JSON
|
||||
if (actionToUpdate != null)
|
||||
{
|
||||
String nestedActionJsonID = nestedActionJson.getString("id");
|
||||
|
||||
// lookup to see if nested action from nested action JSON
|
||||
// already exists on composite action, in which case, update
|
||||
// the nested action with the nested action details provided in the
|
||||
// nested action JSON
|
||||
Action nestedActionToUpdate = nestedActionsMap.get(nestedActionJsonID);
|
||||
if (nestedActionToUpdate != null)
|
||||
{
|
||||
// remove the existing nested action to then be updated below with the
|
||||
// updated one
|
||||
|
||||
nestedAction = getActionFromJson(nestedActionJson, nestedActionToUpdate);
|
||||
}
|
||||
}
|
||||
// else we are not doing an action update so just pass in the
|
||||
// actionToUpdate as 'null'
|
||||
else
|
||||
{
|
||||
nestedAction = getActionFromJson(nestedActionJson, null);
|
||||
}
|
||||
|
||||
((CompositeAction)action).addAction(nestedAction);
|
||||
}
|
||||
}
|
||||
@@ -356,19 +449,48 @@ public class RulesHelper
|
||||
// set action properties
|
||||
//
|
||||
|
||||
action.setTitle(actionJson.getString("title"));
|
||||
|
||||
String descriptionDefault = actionJson.getString("title");
|
||||
action.setDescription(actionJson.optString("description", descriptionDefault));
|
||||
if ((actionJson.isNull("title") == true) && (actionToUpdate == null))
|
||||
{
|
||||
// the "title" field is mandatory, it is missing in the rule details,
|
||||
// and we are creating a new rule, so throw an exception
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "A new rule is being created but the 'title' "
|
||||
+ "field, which is mandatory, has not been included in the rule details");
|
||||
}
|
||||
// otherwise go ahead and set the value if the field is present
|
||||
else if (actionJson.isNull("title") == false)
|
||||
{
|
||||
action.setTitle(actionJson.getString("title"));
|
||||
}
|
||||
|
||||
action.setExecuteAsynchronously(actionJson.optBoolean("executeAsync", false));
|
||||
if (actionJson.isNull("description") == false)
|
||||
{
|
||||
action.setDescription(actionJson.optString("description"));
|
||||
}
|
||||
|
||||
// If a value has been provided in the action details for the "executeAsync" field
|
||||
// then set it to the action object.
|
||||
// If the value given for a field does not equate to either
|
||||
// 'true' or 'false', then set it to a default value of false
|
||||
|
||||
if (actionJson.isNull("executeAsync") == false)
|
||||
{
|
||||
action.setExecuteAsynchronously(actionJson.optBoolean("executeAsync", false));
|
||||
}
|
||||
|
||||
// set compensating action on current action if a compensating action is present
|
||||
// in the action JSON Object
|
||||
JSONObject compActionJson = actionJson.optJSONObject("compensatingAction");
|
||||
if (compActionJson != null)
|
||||
if (actionJson.isNull("compensatingAction") == false)
|
||||
{
|
||||
Action compAction = getActionFromJson(compActionJson);
|
||||
JSONObject compActionJson = actionJson.getJSONObject("compensatingAction");
|
||||
Action compActionToUpdate = null;
|
||||
|
||||
if (actionToUpdate != null)
|
||||
{
|
||||
compActionToUpdate = action.getCompensatingAction();
|
||||
}
|
||||
Action compAction = getActionFromJson(compActionJson, compActionToUpdate);
|
||||
|
||||
action.setCompensatingAction(compAction);
|
||||
}
|
||||
|
||||
@@ -388,44 +510,101 @@ public class RulesHelper
|
||||
// set conditions on the current action
|
||||
//
|
||||
|
||||
JSONObject conditionsJson = actionJson.optJSONObject("conditions");
|
||||
Iterator<String> conditionIterator = conditionsJson.keys();
|
||||
|
||||
// get each condition and add it to the action
|
||||
while (conditionIterator.hasNext())
|
||||
if (actionJson.isNull("conditions") == false)
|
||||
{
|
||||
String conditionKey = conditionIterator.next();
|
||||
JSONObject conditionJson = conditionsJson.getJSONObject(conditionKey);
|
||||
JSONArray conditionsJson = actionJson.getJSONArray("conditions");
|
||||
|
||||
// create the condition using the given condition definition name
|
||||
String conditionDefName = conditionJson.getString("conditionDefinitionName");
|
||||
ActionCondition condition = actionService.createActionCondition(conditionDefName);
|
||||
// if we are doing an update then build up a condition map
|
||||
// do be able to do a condition look-up by ID for each condition included
|
||||
// in the condition JSON - the condition details
|
||||
|
||||
// get the condition definition
|
||||
ParameterizedItemDefinition conditionDef = actionService.getActionConditionDefinition(conditionDefName);
|
||||
|
||||
//
|
||||
// set the condition's properties
|
||||
//
|
||||
|
||||
condition.setInvertCondition(conditionJson.optBoolean("invertCondition", false));
|
||||
|
||||
//
|
||||
// if there are parameter values on the condition JSON object
|
||||
// then apply them to the condition object
|
||||
//
|
||||
JSONObject condParamValuesJson = conditionJson.optJSONObject("parameterValues");
|
||||
if (condParamValuesJson != null)
|
||||
Map<String, ActionCondition> conditionsMap = new HashMap<String, ActionCondition>();
|
||||
if (actionToUpdate != null)
|
||||
{
|
||||
setParameterValuesOnParameterizedItemFromJson(condition, conditionDef, condParamValuesJson);
|
||||
List<ActionCondition> actionConditions = actionToUpdate.getActionConditions();
|
||||
for (ActionCondition actionCondition : actionConditions)
|
||||
{
|
||||
conditionsMap.put(actionCondition.getId(), actionCondition);
|
||||
}
|
||||
}
|
||||
|
||||
// add condition to action object
|
||||
action.addActionCondition(condition);
|
||||
// get each condition and add it to the action
|
||||
|
||||
int numConditionsJson = conditionsJson.length();
|
||||
for (int conditionJsonIndex = 0; conditionJsonIndex < numConditionsJson; conditionJsonIndex++)
|
||||
{
|
||||
ActionCondition condition = null;
|
||||
JSONObject conditionJson = conditionsJson.getJSONObject(conditionJsonIndex);
|
||||
String conditionDefName = null;
|
||||
|
||||
// if we are doing an update, then get the existing condition matching
|
||||
// the condition ID given in the condition JSON, and update that with
|
||||
// the condition fields given therein
|
||||
if (actionToUpdate != null)
|
||||
{
|
||||
String conditionJsonId = conditionJson.getString("id");
|
||||
condition = conditionsMap.get(conditionJsonId);
|
||||
conditionDefName = condition.getActionConditionDefinitionName();
|
||||
}
|
||||
// we are not doing an update, so create the condition using the given condition
|
||||
// definition name and then populate this new condition from the fields given in
|
||||
// the condition JSON
|
||||
else
|
||||
{
|
||||
// we are not doing an update, so if the conditionDefinitionName has not been provided
|
||||
// in the condition JSON then throw a web script exception
|
||||
if (conditionJson.isNull("conditionDefinitionName"))
|
||||
{
|
||||
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "A condition details at index: '"
|
||||
+ conditionJsonIndex + "' for action ID '" + action.getId() + " could not be created "
|
||||
+ "because the 'conditionDefinitionName' field is missing from the condition details sent");
|
||||
}
|
||||
// else condition def name has been provided in the condition details
|
||||
else
|
||||
{
|
||||
conditionDefName = conditionJson.getString("conditionDefinitionName");
|
||||
}
|
||||
|
||||
condition = actionService.createActionCondition(conditionDefName);
|
||||
}
|
||||
|
||||
// get the condition definition object
|
||||
ParameterizedItemDefinition conditionDef = actionService.getActionConditionDefinition(conditionDefName);
|
||||
|
||||
//
|
||||
// set the condition's properties
|
||||
//
|
||||
|
||||
// Set the value for the 'invertCondition' field if that field is sent
|
||||
// in the condition JSON. If the value is sent, but it does not equate to
|
||||
// either 'true' or 'false', then set it to a default value of false
|
||||
if (conditionJson.isNull("invertCondition") == false)
|
||||
{
|
||||
condition.setInvertCondition(conditionJson.getBoolean("invertCondition"));
|
||||
}
|
||||
|
||||
//
|
||||
// if there are parameter values on the condition JSON object
|
||||
// then apply them to the condition object
|
||||
//
|
||||
JSONObject condParamValuesJson = conditionJson.optJSONObject("parameterValues");
|
||||
if (condParamValuesJson != null)
|
||||
{
|
||||
setParameterValuesOnParameterizedItemFromJson(condition, conditionDef, condParamValuesJson);
|
||||
}
|
||||
|
||||
// add condition to action object
|
||||
action.addActionCondition(condition);
|
||||
|
||||
// increment the condition JSON index
|
||||
conditionJsonIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (JSONException je)
|
||||
{
|
||||
|
||||
|
||||
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
|
||||
"Problem creating rule from JSON passed into Web Script.", je);
|
||||
}
|
||||
@@ -620,7 +799,8 @@ public class RulesHelper
|
||||
{
|
||||
// see if given ID is part of either a node reference or a node path
|
||||
String urlTemplateMatch = req.getServiceMatch().getPath();
|
||||
boolean nodeRefGiven = urlTemplateMatch.startsWith(REQ_URL_PART_NODE_REF);
|
||||
boolean nodeRefGiven = urlTemplateMatch.startsWith(REQ_URL_PART_NODE_REF) ||
|
||||
urlTemplateMatch.startsWith(REQ_URL_PART_RULE_NODE_REF);
|
||||
boolean nodePathGiven = urlTemplateMatch.startsWith(REQ_URL_PART_NODE_PATH);
|
||||
|
||||
String referenceType = null;
|
||||
|
@@ -50,7 +50,7 @@ public class RulesPost extends DeclarativeWebScript
|
||||
|
||||
// model property keys
|
||||
private static final String MODEL_PROP_KEY_RULE = "rule";
|
||||
private static final String MODEL_PROP_KEY_ACTIONABLE_NODE_REF = "actionableNodeRef";
|
||||
private static final String MODEL_PROP_KEY_OWNING_NODE_REF = "owningNodeRef";
|
||||
|
||||
// properties for services
|
||||
private RuleService ruleService;
|
||||
@@ -131,14 +131,14 @@ public class RulesPost extends DeclarativeWebScript
|
||||
|
||||
// create the actionable node reference from the given
|
||||
// URL template tokens
|
||||
NodeRef actionableNodeRef = this.rulesHelper.getNodeRefFromWebScriptUrl(req, storeType, storeId, id);
|
||||
NodeRef owningNodeRef = this.rulesHelper.getNodeRefFromWebScriptUrl(req, storeType, storeId, id);
|
||||
|
||||
// apply rule to actionable node
|
||||
this.ruleService.saveRule(actionableNodeRef, rule);
|
||||
this.ruleService.saveRule(owningNodeRef, rule);
|
||||
|
||||
// add objects to model for the template to render
|
||||
model.put(MODEL_PROP_KEY_RULE, rule);
|
||||
model.put(MODEL_PROP_KEY_ACTIONABLE_NODE_REF, actionableNodeRef);
|
||||
model.put(MODEL_PROP_KEY_OWNING_NODE_REF, owningNodeRef.toString());
|
||||
|
||||
return model;
|
||||
}
|
||||
|
Reference in New Issue
Block a user