diff --git a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/CreateRulesTests.java b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/CreateRulesTests.java index 926c00e5d5..807c159cff 100644 --- a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/CreateRulesTests.java +++ b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/CreateRulesTests.java @@ -27,6 +27,7 @@ package org.alfresco.rest.rules; import static java.util.stream.Collectors.toList; +import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel; import static org.alfresco.utility.constants.UserRole.SiteCollaborator; import static org.alfresco.utility.model.FileModel.getRandomFileModel; import static org.alfresco.utility.model.FileType.TEXT_PLAIN; @@ -73,14 +74,12 @@ public class CreateRulesTests extends RestTest @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY }) public void createRule() { - RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName("ruleName"); + RestRuleModel ruleModel = createRuleModel("ruleName"); RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet() .createSingleRule(ruleModel); restClient.assertStatusCodeIs(CREATED); - rule.assertThat().field("id").isNotNull() .assertThat().field("name").is("ruleName"); } @@ -133,8 +132,7 @@ public class CreateRulesTests extends RestTest @Test (groups = { TestGroup.REST_API, TestGroup.RULES }) public void duplicateRuleNameIsAcceptable() { - RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName("duplicateRuleName"); + RestRuleModel ruleModel = createRuleModel("duplicateRuleName"); STEP("Create two identical rules"); RestRuleModel ruleA = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel); @@ -205,12 +203,7 @@ public class CreateRulesTests extends RestTest { STEP("Create a list of rules in one POST request"); List ruleNames = List.of("ruleA", "ruleB", "ruleC"); - List ruleModels = ruleNames.stream().map(ruleName -> - { - RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName(ruleName); - return ruleModel; - }).collect(toList()); + List ruleModels = ruleNames.stream().map(RulesTestsUtils::createRuleModel).collect(toList()); RestRuleModelsCollection rules = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet() .createListOfRules(ruleModels); @@ -229,12 +222,10 @@ public class CreateRulesTests extends RestTest public void createRulesWithOneError() { STEP("Try to create a three rules but the middle one has an error."); - RestRuleModel ruleA = new RestRuleModel(); - ruleA.setName("ruleA"); + RestRuleModel ruleA = createRuleModel("ruleA"); RestRuleModel ruleB = new RestRuleModel(); // Don't set a name for Rule B. - RestRuleModel ruleC = new RestRuleModel(); - ruleC.setName("ruleC"); + RestRuleModel ruleC = createRuleModel("ruleC"); List ruleModels = List.of(ruleA, ruleB, ruleC); restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet().createListOfRules(ruleModels); diff --git a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/DeleteRulesTests.java b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/DeleteRulesTests.java index 151e6dea1b..c7a720075d 100644 --- a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/DeleteRulesTests.java +++ b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/DeleteRulesTests.java @@ -27,6 +27,7 @@ package org.alfresco.rest.rules; import static java.util.stream.Collectors.toList; +import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel; import static org.alfresco.utility.constants.UserRole.SiteCollaborator; import static org.alfresco.utility.constants.UserRole.SiteContributor; import static org.alfresco.utility.constants.UserRole.SiteManager; @@ -82,8 +83,7 @@ public class DeleteRulesTests extends RestTest final FolderModel ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder(); final List createdRules = Stream.of("ruleA", "ruleB", "ruleC") .map(ruleName -> { - RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName(ruleName); + RestRuleModel ruleModel = createRuleModel(ruleName); return restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet() .createSingleRule(ruleModel); }) @@ -187,8 +187,7 @@ public class DeleteRulesTests extends RestTest final UserModel privateUser = dataUser.createRandomTestUser(); final SiteModel privateSite = dataSite.usingUser(privateUser).createPrivateRandomSite(); final FolderModel privateFolder = dataContent.usingUser(privateUser).usingSite(privateSite).createFolder(); - final RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName("Private site rule"); + final RestRuleModel ruleModel = createRuleModel("Private site rule"); final RestRuleModel createdRule = restClient.authenticateUser(privateUser).withCoreAPI().usingNode(privateFolder).usingDefaultRuleSet() .createSingleRule(ruleModel); @@ -229,8 +228,7 @@ public class DeleteRulesTests extends RestTest final UserModel privateUser = dataUser.createRandomTestUser(); final SiteModel privateSite = dataSite.usingUser(privateUser).createPrivateRandomSite(); final FolderModel privateFolder = dataContent.usingUser(privateUser).usingSite(privateSite).createFolder(); - final RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName("Private site rule"); + final RestRuleModel ruleModel = createRuleModel("Private site rule"); final RestRuleModel createdRule = restClient.authenticateUser(privateUser).withCoreAPI().usingNode(privateFolder).usingDefaultRuleSet() .createSingleRule(ruleModel); @@ -250,8 +248,7 @@ public class DeleteRulesTests extends RestTest private RestRuleModel createRule(FolderModel ruleFolder) { STEP("Create a rule in the folder"); - final RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName("Test rule"); + final RestRuleModel ruleModel = createRuleModel("Test rule"); return restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel); } } diff --git a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/GetRulesTests.java b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/GetRulesTests.java index b255a36d68..a4bbecac66 100644 --- a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/GetRulesTests.java +++ b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/GetRulesTests.java @@ -27,6 +27,7 @@ package org.alfresco.rest.rules; import static java.util.stream.Collectors.toList; +import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel; import static org.alfresco.utility.constants.UserRole.SiteCollaborator; import static org.alfresco.utility.report.log.Step.STEP; import static org.junit.Assert.assertTrue; @@ -70,8 +71,7 @@ public class GetRulesTests extends RestTest STEP("Create rules in the folder"); createdRules = Stream.of("ruleA", "ruleB").map(ruleName -> { - RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName(ruleName); + RestRuleModel ruleModel = createRuleModel(ruleName); return restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel); }).collect(toList()); createdRuleA = createdRules.get(0); @@ -200,8 +200,7 @@ public class GetRulesTests extends RestTest UserModel privateUser = dataUser.createRandomTestUser(); SiteModel privateSite = dataSite.usingUser(privateUser).createPrivateRandomSite(); FolderModel privateFolder = dataContent.usingUser(privateUser).usingSite(privateSite).createFolder(); - RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName("Private site rule"); + RestRuleModel ruleModel = createRuleModel("Private site rule"); restClient.authenticateUser(privateUser).withCoreAPI().usingNode(privateFolder).usingDefaultRuleSet().createSingleRule(ruleModel); STEP("Create a collaborator in the private site"); diff --git a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/RulesTestsUtils.java b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/RulesTestsUtils.java new file mode 100644 index 0000000000..a4ed08c0d6 --- /dev/null +++ b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/RulesTestsUtils.java @@ -0,0 +1,68 @@ +/* + * #%L + * Alfresco Repository + * %% + * Copyright (C) 2005 - 2022 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.rest.rules; + +import java.util.List; +import java.util.Map; + +import org.alfresco.rest.model.RestActionBodyExecTemplateModel; +import org.alfresco.rest.model.RestRuleModel; + +public class RulesTestsUtils +{ + + public static RestRuleModel createRuleModel(String name) { + return createRuleModel(name, List.of(createActionModel())); + } + + /** + * Create a rule model. + * + * @param name The name for the rule. + * @param restActionModels Rule's actions. + * @return The created rule model. + */ + public static RestRuleModel createRuleModel(String name, List restActionModels) + { + RestRuleModel ruleModel = new RestRuleModel(); + ruleModel.setName(name); + ruleModel.setActions(restActionModels); + return ruleModel; + } + + /** + * Create a rule's action model. + * + * @return The created action model. + */ + public static RestActionBodyExecTemplateModel createActionModel() + { + RestActionBodyExecTemplateModel restActionModel = new RestActionBodyExecTemplateModel(); + restActionModel.setActionDefinitionId("add-features"); + restActionModel.setParams(Map.of("aspect-name", "{http://www.alfresco.org/model/audio/1.0}audio", "actionContext", "rule")); + return restActionModel; + } +} diff --git a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/UpdateRulesTests.java b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/UpdateRulesTests.java index ca7af09363..4392334a26 100644 --- a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/UpdateRulesTests.java +++ b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/rules/UpdateRulesTests.java @@ -25,19 +25,20 @@ */ package org.alfresco.rest.rules; +import static org.alfresco.rest.rules.RulesTestsUtils.createActionModel; +import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel; import static org.alfresco.utility.constants.UserRole.SiteCollaborator; import static org.alfresco.utility.report.log.Step.STEP; -import static org.junit.Assert.fail; import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.CREATED; import static org.springframework.http.HttpStatus.FORBIDDEN; import static org.springframework.http.HttpStatus.NOT_FOUND; import static org.springframework.http.HttpStatus.OK; +import java.util.List; + import org.alfresco.rest.RestTest; +import org.alfresco.rest.model.RestActionBodyExecTemplateModel; import org.alfresco.rest.model.RestRuleModel; -import org.alfresco.rest.model.RestRuleSetModel; -import org.alfresco.utility.constants.UserRole; import org.alfresco.utility.model.FolderModel; import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.TestGroup; @@ -67,11 +68,10 @@ public class UpdateRulesTests extends RestTest @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY }) public void updateRule() { - RestRuleModel rule = createRule("Rule name"); + RestRuleModel rule = createAndSaveRule("Rule name"); STEP("Try to update the rule."); - RestRuleModel updatedRuleModel = new RestRuleModel(); - updatedRuleModel.setName("Updated rule name"); + RestRuleModel updatedRuleModel = createRuleModel("Updated rule name"); RestRuleModel updatedRule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet() .updateRule(rule.getId(), updatedRuleModel); @@ -84,7 +84,7 @@ public class UpdateRulesTests extends RestTest @Test (groups = { TestGroup.REST_API, TestGroup.RULES }) public void updateRuleForNonExistentFolder() { - RestRuleModel rule = createRule("Rule name"); + RestRuleModel rule = createAndSaveRule("Rule name"); STEP("Try to update a rule in a non-existent folder."); FolderModel nonExistentFolder = FolderModel.getRandomFolderModel(); @@ -103,7 +103,7 @@ public class UpdateRulesTests extends RestTest @Test (groups = { TestGroup.REST_API, TestGroup.RULES }) public void updateRuleForNonExistentRuleSet() { - RestRuleModel rule = createRule("Rule name"); + RestRuleModel rule = createAndSaveRule("Rule name"); STEP("Try to update a rule in a non-existent rule set."); RestRuleModel updatedRuleModel = new RestRuleModel(); @@ -153,7 +153,7 @@ public class UpdateRulesTests extends RestTest @Test (groups = { TestGroup.REST_API, TestGroup.RULES }) public void updateRuleToHaveEmptyName() { - RestRuleModel rule = createRule("Rule name"); + RestRuleModel rule = createAndSaveRule("Rule name"); STEP("Try to update the rule to have no name."); RestRuleModel updatedRuleModel = new RestRuleModel(); @@ -168,30 +168,34 @@ public class UpdateRulesTests extends RestTest @Test (groups = { TestGroup.REST_API, TestGroup.RULES }) public void tryToUpdateRuleId() { - RestRuleModel rule = createRule("Rule name"); + RestRuleModel rule = createAndSaveRule("Rule name"); STEP("Try to update the rule id and check it isn't changed."); - RestRuleModel updatedRuleModel = new RestRuleModel(); + RestRuleModel updatedRuleModel = createRuleModel("Rule name"); updatedRuleModel.setId("new-rule-id"); - updatedRuleModel.setName("Rule name"); RestRuleModel updatedRule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet() .updateRule(rule.getId(), updatedRuleModel); updatedRule.assertThat().field("id").is(rule.getId()); } + private RestRuleModel createAndSaveRule(String name) + { + return createAndSaveRule(name, List.of(createActionModel())); + } + /** - * Create a rule. + * Create a rule for folder and store it. * * @param name The name for the rule. + * @param restActionModels Rule's actions. * @return The created rule. */ - private RestRuleModel createRule(String name) + private RestRuleModel createAndSaveRule(String name, List restActionModels) { - STEP("Create a rule called " + name); - RestRuleModel ruleModel = new RestRuleModel(); - ruleModel.setName(name); + STEP("Create a rule called " + name + ", containing actions: " + restActionModels); + RestRuleModel ruleModel = createRuleModel(name, restActionModels); return restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet() - .createSingleRule(ruleModel); + .createSingleRule(ruleModel); } } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/model/rules/Action.java b/remote-api/src/main/java/org/alfresco/rest/api/model/rules/Action.java new file mode 100644 index 0000000000..d7d6ca0e0e --- /dev/null +++ b/remote-api/src/main/java/org/alfresco/rest/api/model/rules/Action.java @@ -0,0 +1,170 @@ +/* + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2022 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.rest.api.model.rules; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.alfresco.repo.action.ActionImpl; +import org.alfresco.repo.action.CompositeActionImpl; +import org.alfresco.repo.action.executer.SetPropertyValueActionExecuter; +import org.alfresco.service.Experimental; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.util.GUID; + +@Experimental +public class Action +{ + private String actionDefinitionId; + private Map params; + + /** + * Converts service POJO action to REST model action. + * + * @param actionModel - {@link org.alfresco.service.cmr.action.Action} service POJO + * @return {@link Action} REST model + */ + public static Action from(final org.alfresco.service.cmr.action.Action actionModel) + { + if (actionModel == null) + { + return null; + } + + final Action.Builder builder = builder().actionDefinitionId(actionModel.getActionDefinitionName()); + if (actionModel.getParameterValues() != null) + { + builder.params(new HashMap<>(actionModel.getParameterValues())); + } + + return builder.create(); + } + + /** + * Convert the REST model object to the equivalent service POJO. + * + * @param nodeRef The node reference. + * @return The action service POJO. + */ + public org.alfresco.service.cmr.action.Action toServiceModel(final NodeRef nodeRef) + { + return new ActionImpl(nodeRef, GUID.generate(), SetPropertyValueActionExecuter.NAME, params); + } + + /** + * Convert the REST model objects to composite action service POJO. + * + * @param actions List of actions. + * @return The composite action service POJO. + */ + public static org.alfresco.service.cmr.action.Action toCompositeAction(final List actions) { + if (actions == null) + { + return null; + } + + final org.alfresco.service.cmr.action.CompositeAction compositeAction = new CompositeActionImpl(null, GUID.generate()); + actions.forEach(action -> compositeAction.addAction(action.toServiceModel(null))); + return compositeAction; + } + + public String getActionDefinitionId() + { + return actionDefinitionId; + } + + public void setActionDefinitionId(String actionDefinitionId) + { + this.actionDefinitionId = actionDefinitionId; + } + + public Map getParams() + { + return params; + } + + public void setParams(Map params) + { + this.params = params; + } + + @Override + public String toString() + { + return "Action{" + "actionDefinitionId='" + actionDefinitionId + '\'' + ", params=" + params + '}'; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Action action = (Action) o; + return Objects.equals(actionDefinitionId, action.actionDefinitionId) && Objects.equals(params, action.params); + } + + @Override + public int hashCode() + { + return Objects.hash(actionDefinitionId, params); + } + + public static Builder builder() + { + return new Builder(); + } + + public static class Builder + { + private String actionDefinitionId; + private Map params; + + public Builder actionDefinitionId(String actionDefinitionId) + { + this.actionDefinitionId = actionDefinitionId; + return this; + } + + public Builder params(Map params) + { + this.params = params; + return this; + } + + public Action create() { + final Action action = new Action(); + action.setActionDefinitionId(actionDefinitionId); + action.setParams(params); + return action; + } + } +} diff --git a/remote-api/src/main/java/org/alfresco/rest/api/model/rules/Rule.java b/remote-api/src/main/java/org/alfresco/rest/api/model/rules/Rule.java index 6f7f2c4ef0..61b4b5bd8c 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/model/rules/Rule.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/model/rules/Rule.java @@ -26,22 +26,16 @@ package org.alfresco.rest.api.model.rules; -import java.io.Serializable; -import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; -import org.alfresco.model.ContentModel; -import org.alfresco.repo.action.ActionImpl; import org.alfresco.repo.action.executer.ScriptActionExecuter; -import org.alfresco.repo.action.executer.SetPropertyValueActionExecuter; import org.alfresco.rest.api.Nodes; import org.alfresco.rest.framework.resource.UniqueId; import org.alfresco.service.Experimental; +import org.alfresco.service.cmr.action.CompositeAction; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.util.GUID; @Experimental public class Rule @@ -55,6 +49,7 @@ public class Rule private boolean shared; private String errorScript; private List triggers; + private List actions; /** * Converts service POJO rule to REST model rule. @@ -84,9 +79,16 @@ public class Rule { builder.triggers(ruleModel.getRuleTypes().stream().map(RuleTrigger::of).collect(Collectors.toList())); } - if (ruleModel.getAction() != null && ruleModel.getAction().getCompensatingAction() != null && ruleModel.getAction().getCompensatingAction().getParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF) != null) + if (ruleModel.getAction() != null) { - builder.errorScript(ruleModel.getAction().getCompensatingAction().getParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF).toString()); + if (ruleModel.getAction().getCompensatingAction() != null && ruleModel.getAction().getCompensatingAction().getParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF) != null) + { + builder.errorScript(ruleModel.getAction().getCompensatingAction().getParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF).toString()); + } + if (ruleModel.getAction() instanceof CompositeAction && ((CompositeAction) ruleModel.getAction()).getActions() != null) + { + builder.actions(((CompositeAction) ruleModel.getAction()).getActions().stream().map(Action::from).collect(Collectors.toList())); + } } return builder.create(); @@ -100,20 +102,12 @@ public class Rule */ public org.alfresco.service.cmr.rule.Rule toServiceModel(Nodes nodes) { - org.alfresco.service.cmr.rule.Rule ruleModel = new org.alfresco.service.cmr.rule.Rule(); - if (id != null) - { - NodeRef nodeRef = nodes.validateOrLookupNode(id, null); - ruleModel.setNodeRef(nodeRef); - } + final org.alfresco.service.cmr.rule.Rule ruleModel = new org.alfresco.service.cmr.rule.Rule(); + final NodeRef nodeRef = (id != null) ? nodes.validateOrLookupNode(id, null) : null; + ruleModel.setNodeRef(nodeRef); ruleModel.setTitle(name); - // TODO: Once we have actions working properly then this needs to be replaced. - Map parameters = Map.of( - SetPropertyValueActionExecuter.PARAM_PROPERTY, ContentModel.PROP_TITLE, - SetPropertyValueActionExecuter.PARAM_VALUE, "UPDATED:" + GUID.generate()); - org.alfresco.service.cmr.action.Action action = new ActionImpl(null, GUID.generate(), SetPropertyValueActionExecuter.NAME, parameters); - ruleModel.setAction(action); + ruleModel.setAction(Action.toCompositeAction(actions)); return ruleModel; } @@ -209,16 +203,21 @@ public class Rule this.triggers = triggers; } - public List getActions() + public List getActions() { - return Collections.emptyList(); + return actions; + } + + public void setActions(List actions) + { + this.actions = actions; } @Override public String toString() { return "Rule{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", description='" + description + '\'' + ", enabled=" + enabled + ", cascade=" + cascade - + ", asynchronous=" + asynchronous + ", shared=" + shared + ", errorScript='" + errorScript + '\'' + ", triggers=" + triggers + '}'; + + ", asynchronous=" + asynchronous + ", shared=" + shared + ", errorScript='" + errorScript + '\'' + ", triggers=" + triggers + ", actions=" + actions + '}'; } @Override @@ -230,13 +229,14 @@ public class Rule return false; Rule rule = (Rule) o; return enabled == rule.enabled && cascade == rule.cascade && asynchronous == rule.asynchronous && shared == rule.shared && Objects.equals(id, rule.id) && Objects.equals( - name, rule.name) && Objects.equals(description, rule.description) && Objects.equals(errorScript, rule.errorScript) && Objects.equals(triggers, rule.triggers); + name, rule.name) && Objects.equals(description, rule.description) && Objects.equals(errorScript, rule.errorScript) && Objects.equals(triggers, rule.triggers) + && Objects.equals(actions, rule.actions); } @Override public int hashCode() { - return Objects.hash(id, name, description, enabled, cascade, asynchronous, shared, errorScript, triggers); + return Objects.hash(id, name, description, enabled, cascade, asynchronous, shared, errorScript, triggers, actions); } public static Builder builder() @@ -256,6 +256,7 @@ public class Rule private boolean shared; private String errorScript; private List triggers; + private List actions; public Builder id(String id) { @@ -311,6 +312,12 @@ public class Rule return this; } + public Builder actions(List actions) + { + this.actions = actions; + return this; + } + public Rule create() { Rule rule = new Rule(); @@ -323,6 +330,7 @@ public class Rule rule.setShared(shared); rule.setErrorScript(errorScript); rule.setTriggers(triggers); + rule.setActions(actions); return rule; } } diff --git a/remote-api/src/test/java/org/alfresco/rest/api/RulesUnitTests.java b/remote-api/src/test/java/org/alfresco/rest/api/RulesUnitTests.java index 3c66ac386b..3b199328d4 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/RulesUnitTests.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/RulesUnitTests.java @@ -27,6 +27,7 @@ package org.alfresco.rest.api; import org.alfresco.rest.api.impl.RulesImplTest; +import org.alfresco.rest.api.model.rules.ActionTest; import org.alfresco.rest.api.model.rules.RuleTest; import org.alfresco.rest.api.nodes.NodeRulesRelationTest; import org.alfresco.service.Experimental; @@ -38,7 +39,8 @@ import org.junit.runners.Suite; @Suite.SuiteClasses({ NodeRulesRelationTest.class, RulesImplTest.class, - RuleTest.class + RuleTest.class, + ActionTest.class }) public class RulesUnitTests { diff --git a/remote-api/src/test/java/org/alfresco/rest/api/model/rules/ActionTest.java b/remote-api/src/test/java/org/alfresco/rest/api/model/rules/ActionTest.java new file mode 100644 index 0000000000..af0b9a9014 --- /dev/null +++ b/remote-api/src/test/java/org/alfresco/rest/api/model/rules/ActionTest.java @@ -0,0 +1,79 @@ +/* + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2022 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.rest.api.model.rules; + +import static org.alfresco.repo.action.executer.SetPropertyValueActionExecuter.PARAM_PROPERTY; +import static org.alfresco.repo.action.executer.SetPropertyValueActionExecuter.PARAM_VALUE; +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.Serializable; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.alfresco.repo.action.ActionImpl; +import org.alfresco.service.Experimental; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.StoreRef; +import org.junit.Test; + +@Experimental +public class ActionTest +{ + + private static final String ACTION_DEFINITION_NAME = "actionDefName"; + private static final Map parameters = new HashMap<>(); + + static + { + parameters.put(PARAM_PROPERTY, "propertyName"); + parameters.put(PARAM_VALUE, "propertyValue"); + } + + @Test + public void testFrom() + { + final NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "ruleId"); + final org.alfresco.service.cmr.action.Action actionModel = new ActionImpl(nodeRef, "actionId", ACTION_DEFINITION_NAME, parameters); + final Action expectedAction = Action.builder().actionDefinitionId(ACTION_DEFINITION_NAME).params(parameters).create(); + + final Action actualAction = Action.from(actionModel); + + assertThat(actualAction).isNotNull().usingRecursiveComparison().isEqualTo(expectedAction); + } + + @Test + public void testFromActionModelWithNullValues() + { + final org.alfresco.service.cmr.action.Action actionModel = new ActionImpl(null, null, null); + final Action expectedAction = Action.builder().params(Collections.emptyMap()).create(); + + final Action actualAction = Action.from(actionModel); + + assertThat(actualAction).isNotNull().usingRecursiveComparison().isEqualTo(expectedAction); + } +} diff --git a/remote-api/src/test/java/org/alfresco/rest/api/model/rules/RuleTest.java b/remote-api/src/test/java/org/alfresco/rest/api/model/rules/RuleTest.java index f282289fd7..98e3c8c5f2 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/model/rules/RuleTest.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/model/rules/RuleTest.java @@ -39,7 +39,6 @@ import org.alfresco.service.cmr.action.ActionCondition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.rule.RuleType; -import org.assertj.core.api.Condition; import org.junit.Test; @Experimental @@ -50,7 +49,7 @@ public class RuleTest private static final String RULE_DESCRIPTION = "rule description"; private static final boolean RULE_ENABLED = true; private static final boolean RULE_CASCADE = true; - private static final boolean RULE_ASYNC = false; + private static final boolean RULE_ASYNC = true; private static final boolean RULE_SHARED = true; private static final String ERROR_SCRIPT = "error-script-ref"; diff --git a/repository/src/main/java/org/alfresco/repo/rule/RuleServiceImpl.java b/repository/src/main/java/org/alfresco/repo/rule/RuleServiceImpl.java index 0ffe7f7732..5b7e6ce461 100644 --- a/repository/src/main/java/org/alfresco/repo/rule/RuleServiceImpl.java +++ b/repository/src/main/java/org/alfresco/repo/rule/RuleServiceImpl.java @@ -862,10 +862,7 @@ public class RuleServiceImpl { // 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."); - } + ParameterCheck.mandatory("Rule action", action); // Get the current action node reference NodeRef actionNodeRef = null; diff --git a/repository/src/test/java/org/alfresco/repo/rule/RuleServiceImplUnitTest.java b/repository/src/test/java/org/alfresco/repo/rule/RuleServiceImplUnitTest.java index 95ad87bbe4..0c660bc4af 100644 --- a/repository/src/test/java/org/alfresco/repo/rule/RuleServiceImplUnitTest.java +++ b/repository/src/test/java/org/alfresco/repo/rule/RuleServiceImplUnitTest.java @@ -136,7 +136,7 @@ public class RuleServiceImplUnitTest when(mockRule.getAction()).thenReturn(null); // Call the method under test. - assertThatExceptionOfType(RuleServiceException.class).isThrownBy(() -> ruleService.saveRule(FOLDER_NODE, mockRule)); + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> ruleService.saveRule(FOLDER_NODE, mockRule)); } @Test