From e3068608bc3257ade37eed5a972bef808e7d6751 Mon Sep 17 00:00:00 2001 From: Jamal Kaabi-Mofrad Date: Tue, 10 May 2016 11:08:37 +0000 Subject: [PATCH] Merged FILE-FOLDER-API (5.2.0) to HEAD (5.2) 122543 gjames: RA-211: Moving around execution logic in preparation for more flexible respoonse handling git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@126478 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rest/api/NetworkWebScriptGet.java | 2 +- .../rest/api/NetworksWebScriptGet.java | 2 +- .../resource/actions/ActionExecutor.java | 19 +-- .../interfaces/EntityResourceAction.java | 6 +- .../webscripts/AbstractResourceWebScript.java | 80 +++++++----- .../webscripts/ResourceWebScriptDelete.java | 18 +-- .../webscripts/ResourceWebScriptGet.java | 33 +---- .../webscripts/ResourceWebScriptHelper.java | 39 +++--- .../webscripts/ResourceWebScriptPost.java | 24 +--- .../webscripts/ResourceWebScriptPut.java | 24 +--- .../tests/core/AbstractContextTest.java | 3 +- .../framework/tests/core/ExecutionTests.java | 118 +++++------------- .../framework/tests/core/SerializeTests.java | 60 +++++---- 13 files changed, 155 insertions(+), 273 deletions(-) diff --git a/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java b/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java index 69432d9f4c..a156fb11e0 100644 --- a/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java +++ b/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java @@ -66,7 +66,7 @@ public class NetworkWebScriptGet extends ApiWebScript { // TODO this is not ideal, but the only way to populate the embedded network entities (this would normally be // done automatically by the api framework). - Object wrapped = helper.processAdditionsToTheResponse(Api.ALFRESCO_PUBLIC, NetworksEntityResource.NAME, Params.valueOf(personId, null, req), networkMembership); + Object wrapped = helper.processAdditionsToTheResponse(res, Api.ALFRESCO_PUBLIC, NetworksEntityResource.NAME, Params.valueOf(personId, null, req), networkMembership); objectMapper.writeValue(generator, wrapped); } diff --git a/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java b/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java index efab5932d1..ab510dca7b 100644 --- a/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java +++ b/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java @@ -95,7 +95,7 @@ public class NetworksWebScriptGet extends ApiWebScript { // TODO this is not ideal, but the only way to populate the embedded network entities (this would normally be // done automatically by the api framework). - Object wrapped = helper.processAdditionsToTheResponse(Api.ALFRESCO_PUBLIC, NetworksEntityResource.NAME, Params.valueOf(personId, null, req), networkMember); + Object wrapped = helper.processAdditionsToTheResponse(res, Api.ALFRESCO_PUBLIC, NetworksEntityResource.NAME, Params.valueOf(personId, null, req), networkMember); entities.add(wrapped); } diff --git a/source/java/org/alfresco/rest/framework/resource/actions/ActionExecutor.java b/source/java/org/alfresco/rest/framework/resource/actions/ActionExecutor.java index dff111a4c4..388de39612 100644 --- a/source/java/org/alfresco/rest/framework/resource/actions/ActionExecutor.java +++ b/source/java/org/alfresco/rest/framework/resource/actions/ActionExecutor.java @@ -5,6 +5,7 @@ import org.alfresco.rest.framework.core.ResourceWithMetadata; import org.alfresco.rest.framework.resource.content.ContentInfo; import org.alfresco.rest.framework.resource.parameters.Params; import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptResponse; /** * Executes an action in the system @@ -15,22 +16,12 @@ public interface ActionExecutor extends HttpMethodSupport { /** - * Invokes the resource with the Params calling the callback onSuccess + * Invokes the resource with the Params * @param resource ResourceWithMetadata * @param params Params - * @param executionCallback ExecutionCallback + * @param boolean should we use a readonly transaction. */ @SuppressWarnings("rawtypes") - public void execute(ResourceWithMetadata resource, Params params, ExecutionCallback executionCallback); - - /** - * The result of an Action execution. - * - * @author Gethin James - */ - public interface ExecutionCallback - { - public void onSuccess(R result, ContentInfo contentInfo, int statusCode); - } - + public Object execute(ResourceWithMetadata resource, Params params, WebScriptResponse res, boolean isReadOnly); + } diff --git a/source/java/org/alfresco/rest/framework/resource/actions/interfaces/EntityResourceAction.java b/source/java/org/alfresco/rest/framework/resource/actions/interfaces/EntityResourceAction.java index eabc35fbcc..0cfbbc8234 100644 --- a/source/java/org/alfresco/rest/framework/resource/actions/interfaces/EntityResourceAction.java +++ b/source/java/org/alfresco/rest/framework/resource/actions/interfaces/EntityResourceAction.java @@ -5,6 +5,8 @@ import java.util.List; import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.Parameters; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; /** * Permissible actions for an Entity Resource @@ -45,7 +47,9 @@ public interface EntityResourceAction */ public static interface ReadById extends ResourceAction { - public E readById (String id, Parameters parameters) throws EntityNotFoundException; + public E readById (String id, Parameters parameters) throws EntityNotFoundException; + // public E readById (String id, Parameters parameters, Status status, Cache cache) throws EntityNotFoundException; + } /** diff --git a/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java b/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java index 0840ea6c22..6720151773 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java +++ b/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java @@ -23,10 +23,13 @@ import java.util.HashMap; import java.util.Map; import org.alfresco.repo.tenant.TenantUtil; +import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.web.scripts.content.ContentStreamer; import org.alfresco.rest.framework.Api; import org.alfresco.rest.framework.core.HttpMethodSupport; +import org.alfresco.rest.framework.core.ResourceInspector; import org.alfresco.rest.framework.core.ResourceLocator; +import org.alfresco.rest.framework.core.ResourceOperation; import org.alfresco.rest.framework.core.ResourceWithMetadata; import org.alfresco.rest.framework.core.exceptions.ApiException; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; @@ -44,6 +47,7 @@ import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.springframework.extensions.surf.util.URLEncoder; +import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Description; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptException; @@ -88,42 +92,12 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements final ResourceWithMetadata resource = locator.locateResource(api,templateVars, httpMethod); final Params params = paramsExtractor.extractParams(resource.getMetaData(),req); final ActionExecutor executor = findExecutor(httpMethod, params, resource, req.getContentType()); + final boolean isReadOnly = HttpMethod.GET==httpMethod; //This execution usually takes place in a Retrying Transaction (see subclasses) - executor.execute(resource, params, new ExecutionCallback() - { - @Override - public void onSuccess(Object result, ContentInfo contentInfo, int statusCode) - { - respons.put("toSerialize", result); - respons.put("contentInfo", contentInfo); - - if (result instanceof NodeBinaryResource) - { - String attachFileName = ((NodeBinaryResource)result).getAttachFileName(); - if ((attachFileName != null) && (attachFileName.length() > 0)) - { - String headerValue = "attachment; filename=\"" + attachFileName + "\"; filename*=UTF-8''" + URLEncoder.encode(attachFileName); - res.setHeader(HDR_NAME_CONTENT_DISPOSITION, headerValue); - } - } - - // The response status must be set before the response is written by Jackson (which will by default close and commit the response). - // In a r/w txn, web script buffered responses ensure that it doesn't really matter but for r/o txns this is important. - res.setStatus(statusCode); - } - }); + final Object toSerialize = executor.execute(resource, params, res, isReadOnly); //Outside the transaction. - final Object toSerialize = respons.get("toSerialize"); - ContentInfo contentInfo = (ContentInfo) respons.get("contentInfo"); - - // set caching (MNT-13938) - res.setCache(ApiWebScript.CACHE_NEVER); - - // set content info - setContentInfoOnResponse(res, contentInfo); - if (toSerialize != null) { if (toSerialize instanceof BinaryResource) @@ -169,6 +143,26 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements } } + @Override + public Object execute(final ResourceWithMetadata resource, final Params params, final WebScriptResponse res, boolean isReadOnly) + { + final String entityCollectionName = ResourceInspector.findEntityCollectionNameName(resource.getMetaData()); + return transactionService.getRetryingTransactionHelper().doInTransaction( + new RetryingTransactionHelper.RetryingTransactionCallback() + { + @Override + public Object execute() throws Throwable + { + final ResourceOperation operation = resource.getMetaData().getOperation(getHttpMethod()); + Object result = executeAction(resource, params); + setResponse(res,operation.getSuccessStatus(),ApiWebScript.CACHE_NEVER, DEFAULT_JSON_CONTENT); + return helper.processAdditionsToTheResponse(res, resource.getMetaData().getApi(), entityCollectionName, params, result); + } + }, isReadOnly, true); + } + + protected abstract Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable; + protected void streamResponse(final WebScriptRequest req, final WebScriptResponse res, BinaryResource resource) throws IOException { if (resource instanceof FileBinaryResource) @@ -179,9 +173,31 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements else if (resource instanceof NodeBinaryResource) { NodeBinaryResource nodeResource = (NodeBinaryResource) resource; + ContentInfo contentInfo = nodeResource.getContentInfo(); + setContentInfoOnResponse(res,contentInfo); + String attachFileName = nodeResource.getAttachFileName(); + if ((attachFileName != null) && (attachFileName.length() > 0)) + { + String headerValue = "attachment; filename=\"" + attachFileName + "\"; filename*=UTF-8''" + URLEncoder.encode(attachFileName); + res.setHeader(HDR_NAME_CONTENT_DISPOSITION, headerValue); + } streamer.streamContent(req, res, nodeResource.getNodeRef(), nodeResource.getPropertyQName(), false, null, null); } + } + /** + * The response status must be set before the response is written by Jackson (which will by default close and commit the response). + * In a r/w txn, web script buffered responses ensure that it doesn't really matter but for r/o txns this is important. + * @param res + * @param status + * @param cache + * @param contentInfo + */ + protected void setResponse(final WebScriptResponse res, int status, Cache cache, ContentInfo contentInfo) + { + res.setStatus(status); + res.setCache(cache); + setContentInfoOnResponse(res,contentInfo); } /** diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptDelete.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptDelete.java index d5422d426a..a386fab608 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptDelete.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptDelete.java @@ -13,7 +13,6 @@ import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResou import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceBinaryAction; import org.alfresco.rest.framework.resource.parameters.Params; import org.apache.commons.lang.StringUtils; -import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.http.HttpMethod; @@ -88,7 +87,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement * @param params parameters to use * @return anObject the result of the execute */ - private void executeInternal(ResourceWithMetadata resource, Params params) + public Object executeAction(ResourceWithMetadata resource, Params params) { switch (resource.getMetaData().getType()) { @@ -100,7 +99,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement EntityResourceAction.Delete entityDeleter = (EntityResourceAction.Delete) resource.getResource(); entityDeleter.delete(params.getEntityId(), params); //Don't pass anything to the callback - its just successful - return; + return null; case RELATIONSHIP: if (resource.getMetaData().isDeleted(RelationshipResourceAction.Delete.class)) { @@ -109,7 +108,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement RelationshipResourceAction.Delete relationDeleter = (RelationshipResourceAction.Delete) resource.getResource(); relationDeleter.delete(params.getEntityId(), params.getRelationshipId(), params); //Don't pass anything to the callback - its just successful - return; + return null; case PROPERTY: if (BinaryResourceAction.Delete.class.isAssignableFrom(resource.getResource().getClass())) { @@ -120,7 +119,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement BinaryResourceAction.Delete binDeleter = (BinaryResourceAction.Delete) resource.getResource(); binDeleter.deleteProperty(params.getEntityId(), params); //Don't pass anything to the callback - its just successful - return; + return null; } if (RelationshipResourceBinaryAction.Delete.class.isAssignableFrom(resource.getResource().getClass())) { @@ -131,7 +130,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement RelationshipResourceBinaryAction.Delete binDeleter = (RelationshipResourceBinaryAction.Delete) resource.getResource(); binDeleter.deleteProperty(params.getEntityId(), params.getRelationshipId(), params); //Don't pass anything to the callback - its just successful - return; + return null; } default: throw new UnsupportedResourceOperationException("DELETE not supported for Actions"); @@ -139,7 +138,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement } @Override - public void execute(final ResourceWithMetadata resource, final Params params, final ExecutionCallback executionCallback) + public Void execute(final ResourceWithMetadata resource, final Params params, final WebScriptResponse res, boolean isReadOnly) { transactionService.getRetryingTransactionHelper().doInTransaction( new RetryingTransactionCallback() @@ -148,11 +147,12 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement public Void execute() throws Throwable { final ResourceOperation operation = resource.getMetaData().getOperation(HttpMethod.DELETE); - executeInternal(resource, params); //ignore return result - executionCallback.onSuccess(null, DEFAULT_JSON_CONTENT, operation.getSuccessStatus()); + executeAction(resource, params); //ignore return result + setResponse(res,operation.getSuccessStatus(),ApiWebScript.CACHE_NEVER, DEFAULT_JSON_CONTENT); return null; } }, false, true); + return null; } } diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptGet.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptGet.java index bf9d93fd6a..8eaae5668b 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptGet.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptGet.java @@ -43,6 +43,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.http.HttpMethod; /** @@ -115,7 +116,8 @@ public class ResourceWebScriptGet extends AbstractResourceWebScript implements P * @param params parameters to use * @return anObject the result of the execute */ - private Object executeInternal(ResourceWithMetadata resource, Params params) + @Override + public Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable { switch (resource.getMetaData().getType()) @@ -219,34 +221,5 @@ public class ResourceWebScriptGet extends AbstractResourceWebScript implements P } } - @Override - public void execute(final ResourceWithMetadata resource, final Params params, final ExecutionCallback executionCallback) - { - final String entityCollectionName = ResourceInspector.findEntityCollectionNameName(resource.getMetaData()); - transactionService.getRetryingTransactionHelper().doInTransaction( - new RetryingTransactionCallback() - { - @Override - public Void execute() throws Throwable - { - final ResourceOperation operation = resource.getMetaData().getOperation(HttpMethod.GET); - Object result = executeInternal(resource, params); - if (result instanceof BinaryResource) - { - ContentInfo ci = null; - if (result instanceof NodeBinaryResource) - { - ci = ((NodeBinaryResource)result).getContentInfo(); - } - executionCallback.onSuccess(result, ci, operation.getSuccessStatus()); - } - else - { - executionCallback.onSuccess(helper.processAdditionsToTheResponse(resource.getMetaData().getApi(), entityCollectionName, params, result), DEFAULT_JSON_CONTENT, operation.getSuccessStatus()); - } - return null; - } - }, true, true); //Read only - } } diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptHelper.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptHelper.java index a931e8d294..71acf9c419 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptHelper.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptHelper.java @@ -49,7 +49,6 @@ import org.alfresco.rest.framework.jacksonextensions.ExecutionResult; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.rest.framework.resource.SerializablePagedCollection; import org.alfresco.rest.framework.resource.actions.ActionExecutor; -import org.alfresco.rest.framework.resource.actions.ActionExecutor.ExecutionCallback; import org.alfresco.rest.framework.resource.content.ContentInfo; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.InvalidSelectException; @@ -73,6 +72,7 @@ import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.map.JsonMappingException; import org.springframework.beans.BeanUtils; import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.http.HttpMethod; /** @@ -471,20 +471,20 @@ public class ResourceWebScriptHelper * @param objectToWrap Object * @return Object - Either ExecutionResult or CollectionWithPagingInfo */ - public Object processAdditionsToTheResponse(Api api, String entityCollectionName, Params params, Object objectToWrap) + public Object processAdditionsToTheResponse(WebScriptResponse res, Api api, String entityCollectionName, Params params, Object objectToWrap) { PropertyCheck.mandatory(this, null, params); if (objectToWrap == null ) return null; if (objectToWrap instanceof SerializablePagedCollection) { SerializablePagedCollection collectionToWrap = (SerializablePagedCollection) objectToWrap; - Object sourceEntity = executeIncludedSource(api, params, entityCollectionName); + Object sourceEntity = executeIncludedSource(res, api, params, entityCollectionName); Collection resultCollection = new ArrayList(collectionToWrap.getCollection().size()); if (!collectionToWrap.getCollection().isEmpty()) { for (Object obj : collectionToWrap.getCollection()) { - resultCollection.add(processAdditionsToTheResponse(api,entityCollectionName,params,obj)); + resultCollection.add(processAdditionsToTheResponse(res, api,entityCollectionName,params,obj)); } } return CollectionWithPagingInfo.asPaged(collectionToWrap.getPaging(), resultCollection, collectionToWrap.hasMoreItems(), collectionToWrap.getTotalItems(), sourceEntity); @@ -502,7 +502,7 @@ public class ResourceWebScriptHelper Map> embeddded = ResourceInspector.findEmbeddedResources(objectToWrap.getClass()); if (embeddded != null && !embeddded.isEmpty()) { - Map results = executeEmbeddedResources(api, params,objectToWrap, embeddded); + Map results = executeEmbeddedResources(res, api, params,objectToWrap, embeddded); execRes.addEmbedded(results); } @@ -510,7 +510,7 @@ public class ResourceWebScriptHelper { Map relationshipResources = locator.locateRelationResource(api,entityCollectionName, params.getRelationsFilter().keySet(), HttpMethod.GET); String uniqueEntityId = ResourceInspector.findUniqueId(objectToWrap); - Map relatedResources = executeRelatedResources(api, params, relationshipResources, uniqueEntityId); + Map relatedResources = executeRelatedResources(res, api, params, relationshipResources, uniqueEntityId); execRes.addRelated(relatedResources); } @@ -519,14 +519,14 @@ public class ResourceWebScriptHelper } } - private Object executeIncludedSource(Api api, Params params, String entityCollectionName) + private Object executeIncludedSource(WebScriptResponse response, Api api, Params params, String entityCollectionName) { if (params.includeSource()) { ResourceWithMetadata res = locator.locateEntityResource(api, entityCollectionName, HttpMethod.GET); if (res != null) { - Object result = executeRelatedResource(api, params, params.getEntityId(), null, res); + Object result = executeRelatedResource(response, api, params, params.getEntityId(), null, res); if (result!=null && result instanceof ExecutionResult) return ((ExecutionResult) result).getRoot(); } } @@ -543,7 +543,7 @@ public class ResourceWebScriptHelper * @param embeddded Map> * @return Map */ - private Map executeEmbeddedResources(Api api, Params params, Object objectToWrap, Map> embeddded) + private Map executeEmbeddedResources(WebScriptResponse response, Api api, Params params, Object objectToWrap, Map> embeddded) { final Map results = new HashMap(embeddded.size()); for (Entry> embeddedEntry : embeddded.entrySet()) @@ -554,7 +554,7 @@ public class ResourceWebScriptHelper Object id = ResourceInspectorUtil.invokeMethod(embeddedEntry.getValue().getSecond(), objectToWrap); if (id != null) { - Object execEmbeddedResult = executeRelatedResource(api, params, String.valueOf(id), embeddedEntry.getKey(), res); + Object execEmbeddedResult = executeRelatedResource(response, api, params, String.valueOf(id), embeddedEntry.getKey(), res); if (execEmbeddedResult != null) { if (execEmbeddedResult instanceof ExecutionResult) @@ -584,14 +584,14 @@ public class ResourceWebScriptHelper * @param uniqueEntityId String * @return Map */ - private Map executeRelatedResources(final Api api, Params params, + private Map executeRelatedResources(final WebScriptResponse res, final Api api, Params params, Map relatedResources, String uniqueEntityId) { final Map results = new HashMap(relatedResources.size()); for (final Entry relation : relatedResources.entrySet()) { - Object execResult = executeRelatedResource(api, params, uniqueEntityId, relation.getKey(), relation.getValue()); + Object execResult = executeRelatedResource(res, api, params, uniqueEntityId, relation.getKey(), relation.getValue()); if (execResult != null) { results.put(relation.getKey(), execResult); @@ -611,7 +611,7 @@ public class ResourceWebScriptHelper * @param resource ResourceWithMetadata * @return Object */ - private Object executeRelatedResource(final Api api, Params params, + private Object executeRelatedResource(final WebScriptResponse res, final Api api, Params params, final String uniqueEntityId, final String resourceKey, final ResourceWithMetadata resource) { try @@ -624,17 +624,8 @@ public class ResourceWebScriptHelper paramFilter = filters.get(resourceKey); } final Params executionParams = Params.valueOf(paramFilter, uniqueEntityId, params.getRequest()); - executor.execute(resource, executionParams, new ExecutionCallback() - { - @Override - public void onSuccess(Object result, ContentInfo contentInfo, int statusCode) - { - resultOfExecution[0] = result; - } - - }); - - return resultOfExecution[0]; + //Read only because this only occurs for GET requests + return executor.execute(resource, executionParams,res, true); } catch(NotFoundException e) { diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPost.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPost.java index 697178a007..40da260f73 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPost.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPost.java @@ -210,8 +210,8 @@ public class ResourceWebScriptPost extends AbstractResourceWebScript implements * @param params parameters to use * @return anObject the result of the execute */ - @SuppressWarnings("unchecked") - private Object executeInternal(ResourceWithMetadata resource, Params params) throws Throwable + @Override + public Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable { final Object resObj = resource.getResource(); @@ -288,24 +288,4 @@ public class ResourceWebScriptPost extends AbstractResourceWebScript implements } } - @Override - public void execute(final ResourceWithMetadata resource, final Params params, final ExecutionCallback executionCallback) - { - final String entityCollectionName = ResourceInspector.findEntityCollectionNameName(resource.getMetaData()); - transactionService.getRetryingTransactionHelper().doInTransaction( - new RetryingTransactionCallback() - { - @SuppressWarnings("unchecked") - @Override - public Void execute() throws Throwable - { - final ResourceOperation operation = resource.getMetaData().getOperation(HttpMethod.POST); - Object result = executeInternal(resource, params); - executionCallback.onSuccess(helper.processAdditionsToTheResponse(resource.getMetaData().getApi(), entityCollectionName, params, result), - DEFAULT_JSON_CONTENT, operation.getSuccessStatus()); - return null; - } - }, false, true); - } - } diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPut.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPut.java index 88cd0fab19..c19ab923d9 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPut.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPut.java @@ -46,6 +46,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.extensions.webscripts.WrappingWebScriptRequest; import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest; import org.springframework.http.HttpMethod; @@ -178,8 +179,8 @@ public class ResourceWebScriptPut extends AbstractResourceWebScript implements P * @param params parameters to use * @return anObject the result of the execute */ - @SuppressWarnings("unchecked") - private Object executeInternal(ResourceWithMetadata resource, Params params) + @Override + public Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable { switch (resource.getMetaData().getType()) { @@ -223,23 +224,4 @@ public class ResourceWebScriptPut extends AbstractResourceWebScript implements P } } - - @Override - public void execute(final ResourceWithMetadata resource, final Params params, final ExecutionCallback executionCallback) - { - final String entityCollectionName = ResourceInspector.findEntityCollectionNameName(resource.getMetaData()); - transactionService.getRetryingTransactionHelper().doInTransaction( - new RetryingTransactionCallback() - { - @Override - public Void execute() throws Throwable - { - final ResourceOperation operation = resource.getMetaData().getOperation(HttpMethod.PUT); - Object result = executeInternal(resource, params); - executionCallback.onSuccess(helper.processAdditionsToTheResponse(resource.getMetaData().getApi(), entityCollectionName, params, result), - DEFAULT_JSON_CONTENT, operation.getSuccessStatus()); - return null; - } - }, false, true); - } } diff --git a/source/test-java/org/alfresco/rest/framework/tests/core/AbstractContextTest.java b/source/test-java/org/alfresco/rest/framework/tests/core/AbstractContextTest.java index 619e2ba241..a4229471f9 100644 --- a/source/test-java/org/alfresco/rest/framework/tests/core/AbstractContextTest.java +++ b/source/test-java/org/alfresco/rest/framework/tests/core/AbstractContextTest.java @@ -73,8 +73,7 @@ public abstract class AbstractContextTest public Object answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); RetryingTransactionHelper.RetryingTransactionCallback cb = (RetryingTransactionHelper.RetryingTransactionCallback) args[0]; - cb.execute(); - return null; + return cb.execute(); } }); executor.setTransactionService(transerv); diff --git a/source/test-java/org/alfresco/rest/framework/tests/core/ExecutionTests.java b/source/test-java/org/alfresco/rest/framework/tests/core/ExecutionTests.java index 01003e3867..61faa0a6f0 100644 --- a/source/test-java/org/alfresco/rest/framework/tests/core/ExecutionTests.java +++ b/source/test-java/org/alfresco/rest/framework/tests/core/ExecutionTests.java @@ -21,6 +21,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.http.HttpMethod; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -41,37 +42,19 @@ public class ExecutionTests extends AbstractContextTest { ResourceWithMetadata entityResource = locator.locateEntityResource(api,"sheep", HttpMethod.GET); AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); - executor.execute(entityResource, Params.valueOf((String)null, null, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(CollectionWithPagingInfo result, ContentInfo contentInfo, int statusCode) - { - assertNotNull(result); - }}); + Object result = executor.execute(entityResource, Params.valueOf((String)null, null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true); + assertNotNull(result); ResourceWithMetadata baa = locator.locateRelationResource(api,"sheep", "baaahh", HttpMethod.GET); - executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); - executor.execute(baa, Params.valueOf("4", null, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(CollectionWithPagingInfo result, ContentInfo contentInfo, int statusCode ) - { - assertNotNull(result); - }}); + result = executor.execute(baa, Params.valueOf("4", null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true); + assertNotNull(result); - executor.execute(baa, Params.valueOf("4", "45", mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode ) - { - assertNotNull(result); - }}); + executor.execute(baa, Params.valueOf("4", "45", mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true); + assertNotNull(result); ResourceWithMetadata baaPhoto = locator.locateRelationResource(api,"sheep/{entityId}/baaahh", "photo", HttpMethod.GET); - executor.execute(baaPhoto, Params.valueOf("4", "45", mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(CollectionWithPagingInfo result, ContentInfo contentInfo, int statusCode ) - { - assertNull(result); - }}); - + executor.execute(baaPhoto, Params.valueOf("4", "45", mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true); + assertNotNull(result); } @Test @@ -81,31 +64,19 @@ public class ExecutionTests extends AbstractContextTest ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.POST); final Sheep aSheep = new Sheep("xyz"); - executor.execute(resource, Params.valueOf("654", null, NULL_PARAMS, Arrays.asList(aSheep), mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode ) - { - assertNotNull(result); - assertEquals(aSheep,result.getRoot()); - }}); + + Object result = executor.execute(resource, Params.valueOf("654", null, NULL_PARAMS, Arrays.asList(aSheep), mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertNotNull(result); + assertEquals(aSheep,((ExecutionResult)result).getRoot()); ResourceWithMetadata grassResource = locator.locateEntityResource(api,"grass", HttpMethod.POST); final Grass grr = new Grass("grr"); - executor.execute(grassResource, Params.valueOf("654", null, NULL_PARAMS, Arrays.asList(grr), mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode ) - { - assertEquals(grr,result.getRoot()); - }}); + result = executor.execute(grassResource, Params.valueOf("654", null, NULL_PARAMS, Arrays.asList(grr), mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertEquals(grr,((ExecutionResult)result).getRoot()); ResourceWithMetadata entityResource = locator.locateRelationResource(api,"grass", "grow", HttpMethod.POST); - executor.execute(entityResource, Params.valueOf("654", null, NULL_PARAMS, grr, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(String result, ContentInfo contentInfo, int statusCode ) - { - assertEquals("Growing well",result); - }}); - + result = executor.execute(entityResource, Params.valueOf("654", null, NULL_PARAMS, grr, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertEquals("Growing well",result); } @Test @@ -113,27 +84,16 @@ public class ExecutionTests extends AbstractContextTest { ResourceWithMetadata grassResource = locator.locateEntityResource(api,"grass", HttpMethod.DELETE); AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfDelete"); - executor.execute(grassResource, Params.valueOf("4", null, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(Object result, ContentInfo contentInfo, int statusCode ) - { - assertNull(result); - }}); + Object result = executor.execute(grassResource, Params.valueOf("4", null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertNull(result); + ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.DELETE); - executor.execute(resource, Params.valueOf("4", null, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(Object result, ContentInfo contentInfo, int statusCode ) - { - assertNull(result); - }}); + result = executor.execute(resource, Params.valueOf("4", null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertNull(result); ResourceWithMetadata goatDelete = locator.locateRelationResource(api3,"goat/{entityId}/herd", "content", HttpMethod.DELETE); - executor.execute(goatDelete, Params.valueOf("4", "56", mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(Object result, ContentInfo contentInfo, int statusCode ) - { - assertNull(result); - }}); + result = executor.execute(goatDelete, Params.valueOf("4", "56", mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertNull(result); } @@ -143,28 +103,18 @@ public class ExecutionTests extends AbstractContextTest ResourceWithMetadata entityResource = locator.locateEntityResource(api,"sheep", HttpMethod.PUT); AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfPut"); final Sheep aSheep = new Sheep("xyz"); - executor.execute(entityResource, Params.valueOf("654", null, NULL_PARAMS, aSheep, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode ) - { - assertNotNull(result); - assertEquals(aSheep,result.getRoot()); - }}); + + Object result = executor.execute(entityResource, Params.valueOf("654", null, NULL_PARAMS, aSheep, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertNotNull(result); + assertEquals(aSheep,((ExecutionResult)result).getRoot()); ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.PUT); - executor.execute(resource, Params.valueOf("654", null, NULL_PARAMS, aSheep, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode ) - { - assertNotNull(result); - assertEquals(aSheep,result.getRoot()); - }}); + result = executor.execute(resource, Params.valueOf("654", null, NULL_PARAMS, aSheep, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertNotNull(result); + assertEquals(aSheep,((ExecutionResult)result).getRoot()); + ResourceWithMetadata baaPhoto = locator.locateRelationResource(api,"sheep/{entityId}/baaahh", "photo", HttpMethod.PUT); - executor.execute(baaPhoto, Params.valueOf("4", "56", mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback(){ - @Override - public void onSuccess(Object result, ContentInfo contentInfo, int statusCode ) - { - assertNull(result); - }}); + result = executor.execute(baaPhoto, Params.valueOf("4", "56", mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); + assertNull(result); } } diff --git a/source/test-java/org/alfresco/rest/framework/tests/core/SerializeTests.java b/source/test-java/org/alfresco/rest/framework/tests/core/SerializeTests.java index 245f14d347..c11967be67 100644 --- a/source/test-java/org/alfresco/rest/framework/tests/core/SerializeTests.java +++ b/source/test-java/org/alfresco/rest/framework/tests/core/SerializeTests.java @@ -46,7 +46,6 @@ import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper.Writer; import org.alfresco.rest.framework.resource.EntityResource; import org.alfresco.rest.framework.resource.RelationshipResource; -import org.alfresco.rest.framework.resource.actions.ActionExecutor.ExecutionCallback; import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction; import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction.Read; import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction.ReadById; @@ -87,6 +86,8 @@ import org.mockito.stubbing.Answer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.extensions.webscripts.Format; +import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.extensions.webscripts.servlet.FormData; import org.springframework.http.HttpMethod; import org.springframework.mock.web.MockHttpServletRequest; @@ -116,12 +117,12 @@ public class SerializeTests extends AbstractContextTest assertNotNull(entityResource); EntityResourceAction.ReadById getter = (ReadById) entityResource.getResource(); - String out = writeResponse(helper.processAdditionsToTheResponse(api,null, NOT_USED, getter.readById("1234A3", NOT_USED))); + String out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, NOT_USED, getter.readById("1234A3", NOT_USED))); assertTrue("There must be json output", StringUtils.startsWith(out, "{\"entry\":")); EntityResourceAction.Read getAll = (Read) entityResource.getResource(); CollectionWithPagingInfo resources = getAll.readAll(null); - out = writeResponse(helper.processAdditionsToTheResponse(api,null, Params.valueOf("notUsed", null, null), resources)); + out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, Params.valueOf("notUsed", null, null), resources)); assertTrue("There must be json output as List", StringUtils.startsWith(out, "{\"list\":")); } @@ -145,7 +146,7 @@ public class SerializeTests extends AbstractContextTest mockRequest.setContent(reqBody.getBody()); mockRequest.setContentType(reqBody.getContentType()); - String out = writeResponse(helper.processAdditionsToTheResponse(api,null, NOT_USED, resource.create(new FormData(mockRequest), NOT_USED))); + String out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, NOT_USED, resource.create(new FormData(mockRequest), NOT_USED))); assertTrue("There must be json output", StringUtils.startsWith(out, "{\"entry\":")); } @@ -156,7 +157,7 @@ public class SerializeTests extends AbstractContextTest assertNotNull(relationResource); RelationshipResourceAction.Read getter = (RelationshipResourceAction.Read) relationResource.getResource(); CollectionWithPagingInfo resources = getter.readAll("123",Params.valueOf("", null, null)); - String out = writeResponse(helper.processAdditionsToTheResponse(api,null, Params.valueOf("notUsed", null, null), resources)); + String out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, Params.valueOf("notUsed", null, null), resources)); assertTrue("There must be json output as List", StringUtils.startsWith(out, "{\"list\":")); } @@ -170,13 +171,13 @@ public class SerializeTests extends AbstractContextTest assertNotNull(resources); assertTrue(resources.getTotalItems().intValue() == 3); assertFalse(resources.hasMoreItems()); - String out = writeResponse(helper.processAdditionsToTheResponse(api,null, Params.valueOf("notUsed", null, null), resources)); + String out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, Params.valueOf("notUsed", null, null), resources)); assertTrue("There must be json output as List with pagination", StringUtils.startsWith(out, "{\"list\":{\"pagination\":{\"count\":3,")); resources = getter.readAll("123",ParamsExtender.valueOf(Paging.valueOf(0, 1),"123")); assertTrue(resources.getCollection().size() == 1); assertTrue(resources.hasMoreItems()); - out = writeResponse(helper.processAdditionsToTheResponse(api,null, Params.valueOf("notUsed", null, null), resources)); + out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, Params.valueOf("notUsed", null, null), resources)); assertTrue("There must be json output as List with pagination", StringUtils.startsWith(out, "{\"list\":{\"pagination\":{\"count\":1,")); } @@ -188,7 +189,7 @@ public class SerializeTests extends AbstractContextTest Farmer aFarmer = new Farmer("180"); aFarmer.setGoatId("1111"); aFarmer.setSheepId("2222"); - ExecutionResult res = (ExecutionResult) helper.processAdditionsToTheResponse(api,null,Params.valueOf("notUsed", null, null),aFarmer); + ExecutionResult res = (ExecutionResult) helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null,Params.valueOf("notUsed", null, null),aFarmer); assertNotNull(res); assertTrue(Farmer.class.equals(res.getRoot().getClass())); Map embeds = res.getEmbedded(); @@ -213,14 +214,14 @@ public class SerializeTests extends AbstractContextTest { assertNotNull(helper); Map rFilter = ResourceWebScriptHelper.getRelationFilter("blacksheep,baaahh"); - ExecutionResult res = (ExecutionResult) helper.processAdditionsToTheResponse(api,"sheep",ParamsExtender.valueOf(rFilter,"1"),new Farmer("180")); + ExecutionResult res = (ExecutionResult) helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,"sheep",ParamsExtender.valueOf(rFilter,"1"),new Farmer("180")); assertNotNull(res); String out = writeResponse(res); assertTrue(Farmer.class.equals(res.getRoot().getClass())); assertTrue("There must be json output", StringUtils.isNotBlank(out)); Paging pageRequest = Paging.valueOf(1, 2); - Object resultCollection = helper.processAdditionsToTheResponse(api,"sheep",ParamsExtender.valueOf(rFilter,"1"),CollectionWithPagingInfo.asPaged(pageRequest,Arrays.asList(new Farmer("180"), new Farmer("190"), new Farmer("280")))); + Object resultCollection = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,"sheep",ParamsExtender.valueOf(rFilter,"1"),CollectionWithPagingInfo.asPaged(pageRequest,Arrays.asList(new Farmer("180"), new Farmer("190"), new Farmer("280")))); assertNotNull(resultCollection); out = writeResponse(resultCollection); assertTrue("There must be json output", StringUtils.isNotBlank(out)); @@ -233,12 +234,12 @@ public class SerializeTests extends AbstractContextTest ExecutionResult exec2 = new ExecutionResult(new Farmer("456"), null); CollectionWithPagingInfo coll = CollectionWithPagingInfo.asPaged(null, Arrays.asList(exec1, exec2)); - Object resultCollection = helper.processAdditionsToTheResponse(api,"sheep",ParamsExtender.valueOf(true,"1"),coll); + Object resultCollection = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,"sheep",ParamsExtender.valueOf(true,"1"),coll); assertNotNull(resultCollection); String out = writeResponse(resultCollection); assertTrue("There must 'source' json output", StringUtils.contains(out, "\"source\":{\"name\":\"Dolly\",\"age\":3,\"sheepGuid\":\"1\"}")); - resultCollection = helper.processAdditionsToTheResponse(api,"sheep",ParamsExtender.valueOf(false,"1"),coll); + resultCollection = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,"sheep",ParamsExtender.valueOf(false,"1"),coll); assertNotNull(resultCollection); out = writeResponse(resultCollection); assertFalse("There must not 'source' json output", StringUtils.contains(out, "\"source\":{\"name\":\"Dolly\",\"age\":3,\"sheepGuid\":\"1\"}")); @@ -264,7 +265,7 @@ public class SerializeTests extends AbstractContextTest public void testSerializeExecutionResult() throws IOException { assertNotNull(helper); - Object res = helper.processAdditionsToTheResponse(api,null,Params.valueOf("notUsed", null, null),new Farmer("180")); + Object res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null,Params.valueOf("notUsed", null, null),new Farmer("180")); String out = writeResponse(res); assertTrue("There must be json output", StringUtils.isNotBlank(out)); @@ -276,16 +277,16 @@ public class SerializeTests extends AbstractContextTest { assertNotNull(helper); CollectionWithPagingInfo paged = CollectionWithPagingInfo.asPaged(null,null); - String out = writeResponse(helper.processAdditionsToTheResponse(api,null, Params.valueOf("notUsed", null, null), paged)); + String out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, Params.valueOf("notUsed", null, null), paged)); assertTrue("There must be json output as List with pagination", StringUtils.startsWith(out, "{\"list\":{\"pagination\":{\"count\":0,")); Paging pageRequest = Paging.valueOf(1, 2); paged = CollectionWithPagingInfo.asPaged(pageRequest,Arrays.asList(new Goat(), new Sheep("ABCD"), new Sheep("XYZ"))); - out = writeResponse(helper.processAdditionsToTheResponse(api,null, Params.valueOf("notUsed", null, null), paged)); + out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, Params.valueOf("notUsed", null, null), paged)); assertTrue("There must be json output as List with pagination", StringUtils.startsWith(out, "{\"list\":{\"pagination\":{\"count\":3,")); paged = CollectionWithPagingInfo.asPaged(pageRequest,Arrays.asList(new Goat(), new Sheep("ABCD"), new Sheep("XYZ")),true,5000); - out = writeResponse(helper.processAdditionsToTheResponse(api,null, Params.valueOf("notUsed", null, null), paged)); + out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, Params.valueOf("notUsed", null, null), paged)); assertTrue("There must be json output as List with pagination", StringUtils.startsWith(out, "{\"list\":{\"pagination\":{\"count\":3,\"hasMoreItems\":true,\"totalItems\":5000")); } @@ -298,7 +299,7 @@ public class SerializeTests extends AbstractContextTest aMap.put("goatie", new Goat()); aMap.put("sheepie", new Sheep("ABCD")); aMap.put("sheepy", new Sheep("XYZ")); - Object res = helper.processAdditionsToTheResponse(api,null,Params.valueOf("notUsed", null, null),aMap); + Object res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null,Params.valueOf("notUsed", null, null),aMap); String out = writeResponse(res); assertTrue("There must be json output", StringUtils.isNotBlank(out)); @@ -312,7 +313,7 @@ public class SerializeTests extends AbstractContextTest aSet.add(new Goat()); aSet.add(new Sheep("ABCD")); aSet.add(new Sheep("XYZ")); - Object res = helper.processAdditionsToTheResponse(api,null,Params.valueOf("notUsed", null, null),aSet); + Object res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null,Params.valueOf("notUsed", null, null),aSet); String out = writeResponse(res); assertTrue("There must be json output", StringUtils.isNotBlank(out)); @@ -323,11 +324,11 @@ public class SerializeTests extends AbstractContextTest { assertNotNull(helper); CollectionWithPagingInfo pString = CollectionWithPagingInfo.asPaged(null,Arrays.asList("goat", "sheep", "horse")); - Object res = helper.processAdditionsToTheResponse(api,null,Params.valueOf("notUsed", null, null),pString); + Object res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null,Params.valueOf("notUsed", null, null),pString); String out = writeResponse(res); assertTrue("There must be json output", StringUtils.isNotBlank(out)); CollectionWithPagingInfo pInts = CollectionWithPagingInfo.asPaged(null,Arrays.asList(234, 45, 890, 3456)); - res = helper.processAdditionsToTheResponse(api,null,Params.valueOf("notUsed", null, null),pInts); + res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null,Params.valueOf("notUsed", null, null),pInts); out = writeResponse(res); assertTrue("There must be json output", StringUtils.isNotBlank(out)); } @@ -336,7 +337,7 @@ public class SerializeTests extends AbstractContextTest public void testSerializeList() throws IOException { assertNotNull(helper); - Object res = helper.processAdditionsToTheResponse(api,null,Params.valueOf("notUsed", null, null),Arrays.asList(new Goat(), new Sheep("ABCD"), new Sheep("XYZ"))); + Object res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null,Params.valueOf("notUsed", null, null),Arrays.asList(new Goat(), new Sheep("ABCD"), new Sheep("XYZ"))); String out = writeResponse(res); assertTrue("There must be json output", StringUtils.isNotBlank(out)); @@ -357,7 +358,7 @@ public class SerializeTests extends AbstractContextTest public void testSerializeUniqueId() throws IOException { assertNotNull(helper); - Object res = helper.processAdditionsToTheResponse(api,null,Params.valueOf("notUsed", null, null), new Sheep("ABCD")); + Object res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null,Params.valueOf("notUsed", null, null), new Sheep("ABCD")); String out = writeResponse(res); assertTrue("Id field must be called sheepGuid.", StringUtils.contains(out, "\"sheepGuid\":\"ABCD\"")); } @@ -368,7 +369,7 @@ public class SerializeTests extends AbstractContextTest ResourceWithMetadata relationResource = locator.locateRelationResource(api,"sheep", "baaahh", HttpMethod.GET); assertNotNull(relationResource); RelationshipResourceAction.Read getter = (RelationshipResourceAction.Read) relationResource.getResource(); - String out = writeResponse(helper.processAdditionsToTheResponse(api,null, Params.valueOf("notUsed", null, null), getter.readAll("1234A3", Params.valueOf("notUsed", null, null)))); + String out = writeResponse(helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), api,null, Params.valueOf("notUsed", null, null), getter.readAll("1234A3", Params.valueOf("notUsed", null, null)))); assertTrue("There must be json output", StringUtils.isNotBlank(out)); } @@ -401,13 +402,8 @@ public class SerializeTests extends AbstractContextTest Api api3 = Api.valueOf("alfrescomock", "private", "3"); ResourceWithMetadata propResource = locator.locateRelationResource(api3,"flock", "photo", HttpMethod.GET); AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); - executor.execute(propResource, Params.valueOf("234", null, null), new ExecutionCallback(){ - @Override - public void onSuccess(BinaryResource result, ContentInfo contentInfo, int statusCode) - { - assertNotNull(result); - }}); - + Object result = executor.execute(propResource, Params.valueOf("234", null, null), mock(WebScriptResponse.class), true); + assertNotNull(result); } @Test @@ -479,7 +475,7 @@ public class SerializeTests extends AbstractContextTest Api v3 = Api.valueOf(api.getName(), api.getScope().toString(), "3"); Map relFiler = ResourceWebScriptHelper.getRelationFilter("herd"); - res = helper.processAdditionsToTheResponse(v3,"goat",ParamsExtender.valueOf(relFiler, "notUsed"),new SlimGoat()); + res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), v3,"goat",ParamsExtender.valueOf(relFiler, "notUsed"),new SlimGoat()); out = writeResponse(res); jsonRsp = new JSONObject(new JSONTokener(out)); entry = jsonRsp.getJSONObject("relations") @@ -491,7 +487,7 @@ public class SerializeTests extends AbstractContextTest assertTrue("The quantity should be 56", entry.getInt("quantity") == 56); relFiler = ResourceWebScriptHelper.getRelationFilter("herd(name)"); - res = helper.processAdditionsToTheResponse(v3,"goat",ParamsExtender.valueOf(relFiler, "notUsed"),new SlimGoat()); + res = helper.processAdditionsToTheResponse(mock(WebScriptResponse.class), v3,"goat",ParamsExtender.valueOf(relFiler, "notUsed"),new SlimGoat()); out = writeResponse(res); assertTrue("Must return only the herd name.", StringUtils.contains(out, "{\"name\":\"bigun\"}")); }