From 044798da6736a10ee94f5fe3a19e358adbc73ef3 Mon Sep 17 00:00:00 2001 From: CodrinChirica Date: Thu, 18 Jan 2018 10:31:30 +0200 Subject: [PATCH] REPO-1869: Retrieve action details - implementation and tests for retrieve action definition by id --- .../java/org/alfresco/rest/api/Actions.java | 2 + .../ActionDefinitionsEntityResource.java | 9 +++- .../alfresco/rest/api/impl/ActionsImpl.java | 47 +++++++++++++++++++ .../alfresco/rest/api/tests/TestActions.java | 41 ++++++++++++++++ .../api/tests/client/PublicApiClient.java | 17 +++++++ 5 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/alfresco/rest/api/Actions.java b/src/main/java/org/alfresco/rest/api/Actions.java index ec5ab6dd2b..e45fa3ce60 100644 --- a/src/main/java/org/alfresco/rest/api/Actions.java +++ b/src/main/java/org/alfresco/rest/api/Actions.java @@ -38,6 +38,8 @@ public interface Actions CollectionWithPagingInfo getActionDefinitions(NodeRef nodeRef, Parameters params); CollectionWithPagingInfo getActionDefinitions(Parameters params); + + ActionDefinition getActionDefinitionById(String actionDefinitionId); enum SortKey { diff --git a/src/main/java/org/alfresco/rest/api/actions/ActionDefinitionsEntityResource.java b/src/main/java/org/alfresco/rest/api/actions/ActionDefinitionsEntityResource.java index 2039921fea..e8ab760b66 100644 --- a/src/main/java/org/alfresco/rest/api/actions/ActionDefinitionsEntityResource.java +++ b/src/main/java/org/alfresco/rest/api/actions/ActionDefinitionsEntityResource.java @@ -27,13 +27,14 @@ package org.alfresco.rest.api.actions; import org.alfresco.rest.api.Actions; import org.alfresco.rest.api.model.ActionDefinition; +import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException; import org.alfresco.rest.framework.resource.EntityResource; import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.Parameters; @EntityResource(name="action-definitions", title = "Actions") -public class ActionDefinitionsEntityResource implements EntityResourceAction.Read +public class ActionDefinitionsEntityResource implements EntityResourceAction.Read, EntityResourceAction.ReadById { private Actions actions; @@ -47,4 +48,10 @@ public class ActionDefinitionsEntityResource implements EntityResourceAction.Rea { return actions.getActionDefinitions(params); } + + @Override + public ActionDefinition readById(String id, Parameters parameters) throws EntityNotFoundException + { + return actions.getActionDefinitionById(id); + } } diff --git a/src/main/java/org/alfresco/rest/api/impl/ActionsImpl.java b/src/main/java/org/alfresco/rest/api/impl/ActionsImpl.java index 33bf6ba924..8c89fb7a2e 100644 --- a/src/main/java/org/alfresco/rest/api/impl/ActionsImpl.java +++ b/src/main/java/org/alfresco/rest/api/impl/ActionsImpl.java @@ -98,6 +98,53 @@ public class ActionsImpl implements Actions this.prefixResolver = prefixResolver; } + @Override + public ActionDefinition getActionDefinitionById(String actionDefinitionId) + { + if (actionDefinitionId == null) + { + throw new IllegalArgumentException("Missing actionDefinitionId"); + } + + // Non-existing actionDefinitionId -> 404 + ActionDefinition result = null; + try + { + result = getActionDefinition(actionService.getActionDefinition(actionDefinitionId)); + } + catch (NoSuchBeanDefinitionException nsbdx) + { + // Intentionally empty. + } + + if (result == null) + { + throw new EntityNotFoundException(actionDefinitionId); + } + + return result; + } + + private ActionDefinition getActionDefinition( + org.alfresco.service.cmr.action.ActionDefinition actionDefinitionId) + { + List paramDefs = + actionDefinitionId. + getParameterDefinitions(). + stream(). + map(this::toModel). + collect(Collectors.toList()); + return new ActionDefinition( + actionDefinitionId.getName(), // ID is a synonym for name. + actionDefinitionId.getName(), + actionDefinitionId.getTitle(), + actionDefinitionId.getDescription(), + toShortQNames(actionDefinitionId.getApplicableTypes()), + actionDefinitionId.getAdhocPropertiesAllowed(), + actionDefinitionId.getTrackStatus(), + paramDefs); + } + @Override public CollectionWithPagingInfo getActionDefinitions(NodeRef nodeRef, Parameters params) { diff --git a/src/test/java/org/alfresco/rest/api/tests/TestActions.java b/src/test/java/org/alfresco/rest/api/tests/TestActions.java index b5adffcbbf..b072bade6c 100644 --- a/src/test/java/org/alfresco/rest/api/tests/TestActions.java +++ b/src/test/java/org/alfresco/rest/api/tests/TestActions.java @@ -206,6 +206,47 @@ public class TestActions extends AbstractBaseApiTest actions.getActionDefinitions(emptyParams, 401); } } + + @Test + public void canGetActionDefinition() throws PublicApiException + { + final String person1 = account1PersonIt.next(); + publicApiClient.setRequestContext(new RequestContext(account1.getId(), person1)); + + ActionDefinition actionDef = actions.getActionDefinition("add-features",200); + + assertNotNull("Action definition should not be null", actionDef); + + // Check ActionDefinition fields + assertEquals("add-features", actionDef.getId()); + assertEquals("add-features", actionDef.getName()); + assertEquals("Add aspect", actionDef.getTitle()); + assertEquals("This will add an aspect to the matched item.", actionDef.getDescription()); + // Applicable types + assertEquals(0, actionDef.getApplicableTypes().size()); + assertEquals(false, actionDef.isTrackStatus()); + // Parameter definitions + assertEquals(1, actionDef.getParameterDefinitions().size()); + ActionDefinition.ParameterDefinition paramDefs = actionDef.getParameterDefinitions().get(0); + assertEquals(AddFeaturesActionExecuter.PARAM_ASPECT_NAME, paramDefs.getName()); + assertEquals("d:qname", paramDefs.getType()); + assertEquals(true, paramDefs.isMandatory()); + assertEquals("Aspect", paramDefs.getDisplayLabel()); + assertEquals(false, paramDefs.isMultiValued()); + assertEquals("ac-aspects", paramDefs.getParameterConstraintName()); + + // Non-existing actionDefinitionId -> 404 + { + actions.getActionDefinition("some-text",404); + } + + // Unauthorized -> 401 + { + publicApiClient.setRequestContext(new RequestContext(account1.getId(), person1, "invalid-password")); + actions.getActionDefinition(null, 401); + } + + } @Test public void canGetActionDefinitionsForNode() throws Exception diff --git a/src/test/java/org/alfresco/rest/api/tests/client/PublicApiClient.java b/src/test/java/org/alfresco/rest/api/tests/client/PublicApiClient.java index dfe9cfc76d..7b607cc642 100644 --- a/src/test/java/org/alfresco/rest/api/tests/client/PublicApiClient.java +++ b/src/test/java/org/alfresco/rest/api/tests/client/PublicApiClient.java @@ -2795,5 +2795,22 @@ public class PublicApiClient return null; } + + public ActionDefinition getActionDefinition(String actionDefinitionId, int expectedStatus) throws PublicApiException + { + HttpResponse response = getSingle("action-definitions", actionDefinitionId, null, + null, null, "Unexpected response", expectedStatus); + + if (response != null && response.getJsonResponse() != null) + { + JSONObject jsonEntity = (JSONObject) response.getJsonResponse().get("entry"); + if (jsonEntity != null) + { + return parseActionDefinition(jsonEntity); + } + } + + return null; + } } }