Merged HEAD (5.2) to 5.2.N (5.2.1)

126478 jkaabimofrad: 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/BRANCHES/DEV/5.2.N/root@126822 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Ancuta Morarasu
2016-05-11 11:37:23 +00:00
parent 8f1051b408
commit 64afcc134e
13 changed files with 155 additions and 273 deletions

View File

@@ -91,7 +91,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 // 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). // 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); objectMapper.writeValue(generator, wrapped);
} }

View File

@@ -102,7 +102,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 // 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). // 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); entities.add(wrapped);
} }

View File

@@ -30,6 +30,7 @@ import org.alfresco.rest.framework.core.ResourceWithMetadata;
import org.alfresco.rest.framework.resource.content.ContentInfo; import org.alfresco.rest.framework.resource.content.ContentInfo;
import org.alfresco.rest.framework.resource.parameters.Params; import org.alfresco.rest.framework.resource.parameters.Params;
import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptResponse;
/** /**
* Executes an action in the system * Executes an action in the system
@@ -40,22 +41,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 resource ResourceWithMetadata
* @param params Params * @param params Params
* @param executionCallback ExecutionCallback * @param boolean should we use a readonly transaction.
*/ */
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public void execute(ResourceWithMetadata resource, Params params, ExecutionCallback executionCallback); public Object execute(ResourceWithMetadata resource, Params params, WebScriptResponse res, boolean isReadOnly);
/**
* The result of an Action execution.
*
* @author Gethin James
*/
public interface ExecutionCallback<R>
{
public void onSuccess(R result, ContentInfo contentInfo, int statusCode);
}
} }

View File

@@ -30,6 +30,8 @@ import java.util.List;
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException; import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
import org.alfresco.rest.framework.resource.parameters.Parameters; 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 * Permissible actions for an Entity Resource
@@ -71,6 +73,8 @@ public interface EntityResourceAction
public static interface ReadById<E> extends ResourceAction public static interface ReadById<E> 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;
} }
/** /**

View File

@@ -30,10 +30,13 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.alfresco.repo.tenant.TenantUtil; import org.alfresco.repo.tenant.TenantUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.web.scripts.content.ContentStreamer; import org.alfresco.repo.web.scripts.content.ContentStreamer;
import org.alfresco.rest.framework.Api; import org.alfresco.rest.framework.Api;
import org.alfresco.rest.framework.core.HttpMethodSupport; 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.ResourceLocator;
import org.alfresco.rest.framework.core.ResourceOperation;
import org.alfresco.rest.framework.core.ResourceWithMetadata; import org.alfresco.rest.framework.core.ResourceWithMetadata;
import org.alfresco.rest.framework.core.exceptions.ApiException; import org.alfresco.rest.framework.core.exceptions.ApiException;
import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper;
@@ -51,6 +54,7 @@ import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.extensions.surf.util.URLEncoder; import org.springframework.extensions.surf.util.URLEncoder;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Description; import org.springframework.extensions.webscripts.Description;
import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException; import org.springframework.extensions.webscripts.WebScriptException;
@@ -95,42 +99,12 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements
final ResourceWithMetadata resource = locator.locateResource(api,templateVars, httpMethod); final ResourceWithMetadata resource = locator.locateResource(api,templateVars, httpMethod);
final Params params = paramsExtractor.extractParams(resource.getMetaData(),req); final Params params = paramsExtractor.extractParams(resource.getMetaData(),req);
final ActionExecutor executor = findExecutor(httpMethod, params, resource, req.getContentType()); 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) //This execution usually takes place in a Retrying Transaction (see subclasses)
executor.execute(resource, params, new ExecutionCallback() final Object toSerialize = executor.execute(resource, params, res, isReadOnly);
{
@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);
}
});
//Outside the transaction. //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 != null)
{ {
if (toSerialize instanceof BinaryResource) if (toSerialize instanceof BinaryResource)
@@ -176,6 +150,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<Object>()
{
@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 protected void streamResponse(final WebScriptRequest req, final WebScriptResponse res, BinaryResource resource) throws IOException
{ {
if (resource instanceof FileBinaryResource) if (resource instanceof FileBinaryResource)
@@ -186,9 +180,31 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements
else if (resource instanceof NodeBinaryResource) else if (resource instanceof NodeBinaryResource)
{ {
NodeBinaryResource nodeResource = (NodeBinaryResource) resource; 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); 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);
} }
/** /**

View File

@@ -38,7 +38,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.actions.interfaces.RelationshipResourceBinaryAction;
import org.alfresco.rest.framework.resource.parameters.Params; import org.alfresco.rest.framework.resource.parameters.Params;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.extensions.webscripts.WebScriptResponse;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
@@ -113,7 +112,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
* @param params parameters to use * @param params parameters to use
* @return anObject the result of the execute * @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()) switch (resource.getMetaData().getType())
{ {
@@ -125,7 +124,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
EntityResourceAction.Delete entityDeleter = (EntityResourceAction.Delete) resource.getResource(); EntityResourceAction.Delete entityDeleter = (EntityResourceAction.Delete) resource.getResource();
entityDeleter.delete(params.getEntityId(), params); entityDeleter.delete(params.getEntityId(), params);
//Don't pass anything to the callback - its just successful //Don't pass anything to the callback - its just successful
return; return null;
case RELATIONSHIP: case RELATIONSHIP:
if (resource.getMetaData().isDeleted(RelationshipResourceAction.Delete.class)) if (resource.getMetaData().isDeleted(RelationshipResourceAction.Delete.class))
{ {
@@ -134,7 +133,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
RelationshipResourceAction.Delete relationDeleter = (RelationshipResourceAction.Delete) resource.getResource(); RelationshipResourceAction.Delete relationDeleter = (RelationshipResourceAction.Delete) resource.getResource();
relationDeleter.delete(params.getEntityId(), params.getRelationshipId(), params); relationDeleter.delete(params.getEntityId(), params.getRelationshipId(), params);
//Don't pass anything to the callback - its just successful //Don't pass anything to the callback - its just successful
return; return null;
case PROPERTY: case PROPERTY:
if (BinaryResourceAction.Delete.class.isAssignableFrom(resource.getResource().getClass())) if (BinaryResourceAction.Delete.class.isAssignableFrom(resource.getResource().getClass()))
{ {
@@ -145,7 +144,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
BinaryResourceAction.Delete binDeleter = (BinaryResourceAction.Delete) resource.getResource(); BinaryResourceAction.Delete binDeleter = (BinaryResourceAction.Delete) resource.getResource();
binDeleter.deleteProperty(params.getEntityId(), params); binDeleter.deleteProperty(params.getEntityId(), params);
//Don't pass anything to the callback - its just successful //Don't pass anything to the callback - its just successful
return; return null;
} }
if (RelationshipResourceBinaryAction.Delete.class.isAssignableFrom(resource.getResource().getClass())) if (RelationshipResourceBinaryAction.Delete.class.isAssignableFrom(resource.getResource().getClass()))
{ {
@@ -156,7 +155,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
RelationshipResourceBinaryAction.Delete binDeleter = (RelationshipResourceBinaryAction.Delete) resource.getResource(); RelationshipResourceBinaryAction.Delete binDeleter = (RelationshipResourceBinaryAction.Delete) resource.getResource();
binDeleter.deleteProperty(params.getEntityId(), params.getRelationshipId(), params); binDeleter.deleteProperty(params.getEntityId(), params.getRelationshipId(), params);
//Don't pass anything to the callback - its just successful //Don't pass anything to the callback - its just successful
return; return null;
} }
default: default:
throw new UnsupportedResourceOperationException("DELETE not supported for Actions"); throw new UnsupportedResourceOperationException("DELETE not supported for Actions");
@@ -164,7 +163,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
} }
@Override @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( transactionService.getRetryingTransactionHelper().doInTransaction(
new RetryingTransactionCallback<Void>() new RetryingTransactionCallback<Void>()
@@ -173,11 +172,12 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
public Void execute() throws Throwable public Void execute() throws Throwable
{ {
final ResourceOperation operation = resource.getMetaData().getOperation(HttpMethod.DELETE); final ResourceOperation operation = resource.getMetaData().getOperation(HttpMethod.DELETE);
executeInternal(resource, params); //ignore return result executeAction(resource, params); //ignore return result
executionCallback.onSuccess(null, DEFAULT_JSON_CONTENT, operation.getSuccessStatus()); setResponse(res,operation.getSuccessStatus(),ApiWebScript.CACHE_NEVER, DEFAULT_JSON_CONTENT);
return null; return null;
} }
}, false, true); }, false, true);
return null;
} }
} }

View File

@@ -50,6 +50,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
/** /**
@@ -122,7 +123,8 @@ public class ResourceWebScriptGet extends AbstractResourceWebScript implements P
* @param params parameters to use * @param params parameters to use
* @return anObject the result of the execute * @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()) switch (resource.getMetaData().getType())
@@ -226,34 +228,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<Void>()
{
@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
}
} }

View File

@@ -57,7 +57,6 @@ import org.alfresco.rest.framework.jacksonextensions.ExecutionResult;
import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper;
import org.alfresco.rest.framework.resource.SerializablePagedCollection; import org.alfresco.rest.framework.resource.SerializablePagedCollection;
import org.alfresco.rest.framework.resource.actions.ActionExecutor; 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.content.ContentInfo;
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
import org.alfresco.rest.framework.resource.parameters.InvalidSelectException; import org.alfresco.rest.framework.resource.parameters.InvalidSelectException;
@@ -81,6 +80,7 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.JsonMappingException;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
/** /**
@@ -479,20 +479,20 @@ public class ResourceWebScriptHelper
* @param objectToWrap Object * @param objectToWrap Object
* @return Object - Either ExecutionResult or CollectionWithPagingInfo<ExecutionResult> * @return Object - Either ExecutionResult or CollectionWithPagingInfo<ExecutionResult>
*/ */
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); PropertyCheck.mandatory(this, null, params);
if (objectToWrap == null ) return null; if (objectToWrap == null ) return null;
if (objectToWrap instanceof SerializablePagedCollection<?>) if (objectToWrap instanceof SerializablePagedCollection<?>)
{ {
SerializablePagedCollection<?> collectionToWrap = (SerializablePagedCollection<?>) objectToWrap; SerializablePagedCollection<?> collectionToWrap = (SerializablePagedCollection<?>) objectToWrap;
Object sourceEntity = executeIncludedSource(api, params, entityCollectionName); Object sourceEntity = executeIncludedSource(res, api, params, entityCollectionName);
Collection<Object> resultCollection = new ArrayList(collectionToWrap.getCollection().size()); Collection<Object> resultCollection = new ArrayList(collectionToWrap.getCollection().size());
if (!collectionToWrap.getCollection().isEmpty()) if (!collectionToWrap.getCollection().isEmpty())
{ {
for (Object obj : collectionToWrap.getCollection()) 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); return CollectionWithPagingInfo.asPaged(collectionToWrap.getPaging(), resultCollection, collectionToWrap.hasMoreItems(), collectionToWrap.getTotalItems(), sourceEntity);
@@ -510,7 +510,7 @@ public class ResourceWebScriptHelper
Map<String,Pair<String,Method>> embeddded = ResourceInspector.findEmbeddedResources(objectToWrap.getClass()); Map<String,Pair<String,Method>> embeddded = ResourceInspector.findEmbeddedResources(objectToWrap.getClass());
if (embeddded != null && !embeddded.isEmpty()) if (embeddded != null && !embeddded.isEmpty())
{ {
Map<String, Object> results = executeEmbeddedResources(api, params,objectToWrap, embeddded); Map<String, Object> results = executeEmbeddedResources(res, api, params,objectToWrap, embeddded);
execRes.addEmbedded(results); execRes.addEmbedded(results);
} }
@@ -518,7 +518,7 @@ public class ResourceWebScriptHelper
{ {
Map<String, ResourceWithMetadata> relationshipResources = locator.locateRelationResource(api,entityCollectionName, params.getRelationsFilter().keySet(), HttpMethod.GET); Map<String, ResourceWithMetadata> relationshipResources = locator.locateRelationResource(api,entityCollectionName, params.getRelationsFilter().keySet(), HttpMethod.GET);
String uniqueEntityId = ResourceInspector.findUniqueId(objectToWrap); String uniqueEntityId = ResourceInspector.findUniqueId(objectToWrap);
Map<String,Object> relatedResources = executeRelatedResources(api, params, relationshipResources, uniqueEntityId); Map<String,Object> relatedResources = executeRelatedResources(res, api, params, relationshipResources, uniqueEntityId);
execRes.addRelated(relatedResources); execRes.addRelated(relatedResources);
} }
@@ -527,14 +527,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()) if (params.includeSource())
{ {
ResourceWithMetadata res = locator.locateEntityResource(api, entityCollectionName, HttpMethod.GET); ResourceWithMetadata res = locator.locateEntityResource(api, entityCollectionName, HttpMethod.GET);
if (res != null) 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(); if (result!=null && result instanceof ExecutionResult) return ((ExecutionResult) result).getRoot();
} }
} }
@@ -551,7 +551,7 @@ public class ResourceWebScriptHelper
* @param embeddded Map<String, Pair<String, Method>> * @param embeddded Map<String, Pair<String, Method>>
* @return Map * @return Map
*/ */
private Map<String, Object> executeEmbeddedResources(Api api, Params params, Object objectToWrap, Map<String, Pair<String, Method>> embeddded) private Map<String, Object> executeEmbeddedResources(WebScriptResponse response, Api api, Params params, Object objectToWrap, Map<String, Pair<String, Method>> embeddded)
{ {
final Map<String,Object> results = new HashMap<String,Object>(embeddded.size()); final Map<String,Object> results = new HashMap<String,Object>(embeddded.size());
for (Entry<String, Pair<String,Method>> embeddedEntry : embeddded.entrySet()) for (Entry<String, Pair<String,Method>> embeddedEntry : embeddded.entrySet())
@@ -562,7 +562,7 @@ public class ResourceWebScriptHelper
Object id = ResourceInspectorUtil.invokeMethod(embeddedEntry.getValue().getSecond(), objectToWrap); Object id = ResourceInspectorUtil.invokeMethod(embeddedEntry.getValue().getSecond(), objectToWrap);
if (id != null) 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 != null)
{ {
if (execEmbeddedResult instanceof ExecutionResult) if (execEmbeddedResult instanceof ExecutionResult)
@@ -592,14 +592,14 @@ public class ResourceWebScriptHelper
* @param uniqueEntityId String * @param uniqueEntityId String
* @return Map * @return Map
*/ */
private Map<String,Object> executeRelatedResources(final Api api, Params params, private Map<String,Object> executeRelatedResources(final WebScriptResponse res, final Api api, Params params,
Map<String, ResourceWithMetadata> relatedResources, Map<String, ResourceWithMetadata> relatedResources,
String uniqueEntityId) String uniqueEntityId)
{ {
final Map<String,Object> results = new HashMap<String,Object>(relatedResources.size()); final Map<String,Object> results = new HashMap<String,Object>(relatedResources.size());
for (final Entry<String, ResourceWithMetadata> relation : relatedResources.entrySet()) for (final Entry<String, ResourceWithMetadata> 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) if (execResult != null)
{ {
results.put(relation.getKey(), execResult); results.put(relation.getKey(), execResult);
@@ -619,7 +619,7 @@ public class ResourceWebScriptHelper
* @param resource ResourceWithMetadata * @param resource ResourceWithMetadata
* @return Object * @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) final String uniqueEntityId, final String resourceKey, final ResourceWithMetadata resource)
{ {
try try
@@ -632,17 +632,8 @@ public class ResourceWebScriptHelper
paramFilter = filters.get(resourceKey); paramFilter = filters.get(resourceKey);
} }
final Params executionParams = Params.valueOf(paramFilter, uniqueEntityId, params.getRequest()); final Params executionParams = Params.valueOf(paramFilter, uniqueEntityId, params.getRequest());
executor.execute(resource, executionParams, new ExecutionCallback() //Read only because this only occurs for GET requests
{ return executor.execute(resource, executionParams,res, true);
@Override
public void onSuccess(Object result, ContentInfo contentInfo, int statusCode)
{
resultOfExecution[0] = result;
}
});
return resultOfExecution[0];
} }
catch(NotFoundException e) catch(NotFoundException e)
{ {

View File

@@ -216,8 +216,8 @@ public class ResourceWebScriptPost extends AbstractResourceWebScript implements
* @param params parameters to use * @param params parameters to use
* @return anObject the result of the execute * @return anObject the result of the execute
*/ */
@SuppressWarnings("unchecked") @Override
private Object executeInternal(ResourceWithMetadata resource, Params params) throws Throwable public Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable
{ {
final Object resObj = resource.getResource(); final Object resObj = resource.getResource();
@@ -294,24 +294,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<Void>()
{
@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);
}
} }

View File

@@ -52,6 +52,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.springframework.extensions.webscripts.WrappingWebScriptRequest; import org.springframework.extensions.webscripts.WrappingWebScriptRequest;
import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest; import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
@@ -184,8 +185,8 @@ public class ResourceWebScriptPut extends AbstractResourceWebScript implements P
* @param params parameters to use * @param params parameters to use
* @return anObject the result of the execute * @return anObject the result of the execute
*/ */
@SuppressWarnings("unchecked") @Override
private Object executeInternal(ResourceWithMetadata resource, Params params) public Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable
{ {
switch (resource.getMetaData().getType()) switch (resource.getMetaData().getType())
{ {
@@ -229,23 +230,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<Void>()
{
@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);
}
} }

View File

@@ -73,8 +73,7 @@ public abstract class AbstractContextTest
public Object answer(InvocationOnMock invocation) throws Throwable { public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments(); Object[] args = invocation.getArguments();
RetryingTransactionHelper.RetryingTransactionCallback cb = (RetryingTransactionHelper.RetryingTransactionCallback) args[0]; RetryingTransactionHelper.RetryingTransactionCallback cb = (RetryingTransactionHelper.RetryingTransactionCallback) args[0];
cb.execute(); return cb.execute();
return null;
} }
}); });
executor.setTransactionService(transerv); executor.setTransactionService(transerv);

View File

@@ -21,6 +21,7 @@ import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -41,37 +42,19 @@ public class ExecutionTests extends AbstractContextTest
{ {
ResourceWithMetadata entityResource = locator.locateEntityResource(api,"sheep", HttpMethod.GET); ResourceWithMetadata entityResource = locator.locateEntityResource(api,"sheep", HttpMethod.GET);
AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets");
executor.execute(entityResource, Params.valueOf((String)null, null, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<CollectionWithPagingInfo>(){ Object result = executor.execute(entityResource, Params.valueOf((String)null, null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true);
@Override
public void onSuccess(CollectionWithPagingInfo result, ContentInfo contentInfo, int statusCode)
{
assertNotNull(result); assertNotNull(result);
}});
ResourceWithMetadata baa = locator.locateRelationResource(api,"sheep", "baaahh", HttpMethod.GET); ResourceWithMetadata baa = locator.locateRelationResource(api,"sheep", "baaahh", HttpMethod.GET);
executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); result = executor.execute(baa, Params.valueOf("4", null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true);
executor.execute(baa, Params.valueOf("4", null, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<CollectionWithPagingInfo>(){
@Override
public void onSuccess(CollectionWithPagingInfo result, ContentInfo contentInfo, int statusCode )
{
assertNotNull(result); assertNotNull(result);
}});
executor.execute(baa, Params.valueOf("4", "45", mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<ExecutionResult>(){ executor.execute(baa, Params.valueOf("4", "45", mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true);
@Override
public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode )
{
assertNotNull(result); assertNotNull(result);
}});
ResourceWithMetadata baaPhoto = locator.locateRelationResource(api,"sheep/{entityId}/baaahh", "photo", HttpMethod.GET); ResourceWithMetadata baaPhoto = locator.locateRelationResource(api,"sheep/{entityId}/baaahh", "photo", HttpMethod.GET);
executor.execute(baaPhoto, Params.valueOf("4", "45", mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<CollectionWithPagingInfo>(){ executor.execute(baaPhoto, Params.valueOf("4", "45", mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true);
@Override assertNotNull(result);
public void onSuccess(CollectionWithPagingInfo result, ContentInfo contentInfo, int statusCode )
{
assertNull(result);
}});
} }
@Test @Test
@@ -81,31 +64,19 @@ public class ExecutionTests extends AbstractContextTest
ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.POST); ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.POST);
final Sheep aSheep = new Sheep("xyz"); final Sheep aSheep = new Sheep("xyz");
executor.execute(resource, Params.valueOf("654", null, NULL_PARAMS, Arrays.asList(aSheep), mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<ExecutionResult>(){
@Override Object result = executor.execute(resource, Params.valueOf("654", null, NULL_PARAMS, Arrays.asList(aSheep), mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode )
{
assertNotNull(result); assertNotNull(result);
assertEquals(aSheep,result.getRoot()); assertEquals(aSheep,((ExecutionResult)result).getRoot());
}});
ResourceWithMetadata grassResource = locator.locateEntityResource(api,"grass", HttpMethod.POST); ResourceWithMetadata grassResource = locator.locateEntityResource(api,"grass", HttpMethod.POST);
final Grass grr = new Grass("grr"); final Grass grr = new Grass("grr");
executor.execute(grassResource, Params.valueOf("654", null, NULL_PARAMS, Arrays.asList(grr), mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<ExecutionResult>(){ result = executor.execute(grassResource, Params.valueOf("654", null, NULL_PARAMS, Arrays.asList(grr), mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
@Override assertEquals(grr,((ExecutionResult)result).getRoot());
public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode )
{
assertEquals(grr,result.getRoot());
}});
ResourceWithMetadata entityResource = locator.locateRelationResource(api,"grass", "grow", HttpMethod.POST); 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<String>(){ result = executor.execute(entityResource, Params.valueOf("654", null, NULL_PARAMS, grr, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
@Override
public void onSuccess(String result, ContentInfo contentInfo, int statusCode )
{
assertEquals("Growing well",result); assertEquals("Growing well",result);
}});
} }
@Test @Test
@@ -113,27 +84,16 @@ public class ExecutionTests extends AbstractContextTest
{ {
ResourceWithMetadata grassResource = locator.locateEntityResource(api,"grass", HttpMethod.DELETE); ResourceWithMetadata grassResource = locator.locateEntityResource(api,"grass", HttpMethod.DELETE);
AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfDelete"); AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfDelete");
executor.execute(grassResource, Params.valueOf("4", null, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<Object>(){ Object result = executor.execute(grassResource, Params.valueOf("4", null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
@Override
public void onSuccess(Object result, ContentInfo contentInfo, int statusCode )
{
assertNull(result); assertNull(result);
}});
ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.DELETE); ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.DELETE);
executor.execute(resource, Params.valueOf("4", null, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<Object>(){ result = executor.execute(resource, Params.valueOf("4", null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
@Override
public void onSuccess(Object result, ContentInfo contentInfo, int statusCode )
{
assertNull(result); assertNull(result);
}});
ResourceWithMetadata goatDelete = locator.locateRelationResource(api3,"goat/{entityId}/herd", "content", HttpMethod.DELETE); ResourceWithMetadata goatDelete = locator.locateRelationResource(api3,"goat/{entityId}/herd", "content", HttpMethod.DELETE);
executor.execute(goatDelete, Params.valueOf("4", "56", mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<Object>(){ result = executor.execute(goatDelete, Params.valueOf("4", "56", mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
@Override
public void onSuccess(Object result, ContentInfo contentInfo, int statusCode )
{
assertNull(result); assertNull(result);
}});
} }
@@ -143,28 +103,18 @@ public class ExecutionTests extends AbstractContextTest
ResourceWithMetadata entityResource = locator.locateEntityResource(api,"sheep", HttpMethod.PUT); ResourceWithMetadata entityResource = locator.locateEntityResource(api,"sheep", HttpMethod.PUT);
AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfPut"); AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfPut");
final Sheep aSheep = new Sheep("xyz"); final Sheep aSheep = new Sheep("xyz");
executor.execute(entityResource, Params.valueOf("654", null, NULL_PARAMS, aSheep, mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<ExecutionResult>(){
@Override Object result = executor.execute(entityResource, Params.valueOf("654", null, NULL_PARAMS, aSheep, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode )
{
assertNotNull(result); assertNotNull(result);
assertEquals(aSheep,result.getRoot()); assertEquals(aSheep,((ExecutionResult)result).getRoot());
}});
ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.PUT); 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<ExecutionResult>(){ result = executor.execute(resource, Params.valueOf("654", null, NULL_PARAMS, aSheep, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
@Override
public void onSuccess(ExecutionResult result, ContentInfo contentInfo, int statusCode )
{
assertNotNull(result); assertNotNull(result);
assertEquals(aSheep,result.getRoot()); assertEquals(aSheep,((ExecutionResult)result).getRoot());
}});
ResourceWithMetadata baaPhoto = locator.locateRelationResource(api,"sheep/{entityId}/baaahh", "photo", HttpMethod.PUT); ResourceWithMetadata baaPhoto = locator.locateRelationResource(api,"sheep/{entityId}/baaahh", "photo", HttpMethod.PUT);
executor.execute(baaPhoto, Params.valueOf("4", "56", mock(WebScriptRequest.class)), new ActionExecutor.ExecutionCallback<Object>(){ result = executor.execute(baaPhoto, Params.valueOf("4", "56", mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false);
@Override
public void onSuccess(Object result, ContentInfo contentInfo, int statusCode )
{
assertNull(result); assertNull(result);
}});
} }
} }

View File

@@ -53,7 +53,6 @@ import org.alfresco.rest.framework.jacksonextensions.JacksonHelper;
import org.alfresco.rest.framework.jacksonextensions.JacksonHelper.Writer; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper.Writer;
import org.alfresco.rest.framework.resource.EntityResource; import org.alfresco.rest.framework.resource.EntityResource;
import org.alfresco.rest.framework.resource.RelationshipResource; 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;
import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction.Read; import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction.Read;
import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction.ReadById; import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction.ReadById;
@@ -94,6 +93,8 @@ import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.extensions.webscripts.Format; 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.extensions.webscripts.servlet.FormData;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletRequest;
@@ -123,12 +124,12 @@ public class SerializeTests extends AbstractContextTest
assertNotNull(entityResource); assertNotNull(entityResource);
EntityResourceAction.ReadById<?> getter = (ReadById<?>) entityResource.getResource(); 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\":")); assertTrue("There must be json output", StringUtils.startsWith(out, "{\"entry\":"));
EntityResourceAction.Read<?> getAll = (Read<?>) entityResource.getResource(); EntityResourceAction.Read<?> getAll = (Read<?>) entityResource.getResource();
CollectionWithPagingInfo<?> resources = getAll.readAll(null); 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\":")); assertTrue("There must be json output as List", StringUtils.startsWith(out, "{\"list\":"));
} }
@@ -152,7 +153,7 @@ public class SerializeTests extends AbstractContextTest
mockRequest.setContent(reqBody.getBody()); mockRequest.setContent(reqBody.getBody());
mockRequest.setContentType(reqBody.getContentType()); 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\":")); assertTrue("There must be json output", StringUtils.startsWith(out, "{\"entry\":"));
} }
@@ -163,7 +164,7 @@ public class SerializeTests extends AbstractContextTest
assertNotNull(relationResource); assertNotNull(relationResource);
RelationshipResourceAction.Read<?> getter = (RelationshipResourceAction.Read<?>) relationResource.getResource(); RelationshipResourceAction.Read<?> getter = (RelationshipResourceAction.Read<?>) relationResource.getResource();
CollectionWithPagingInfo<?> resources = getter.readAll("123",Params.valueOf("", null, null)); 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\":")); assertTrue("There must be json output as List", StringUtils.startsWith(out, "{\"list\":"));
} }
@@ -177,13 +178,13 @@ public class SerializeTests extends AbstractContextTest
assertNotNull(resources); assertNotNull(resources);
assertTrue(resources.getTotalItems().intValue() == 3); assertTrue(resources.getTotalItems().intValue() == 3);
assertFalse(resources.hasMoreItems()); 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,")); 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")); resources = getter.readAll("123",ParamsExtender.valueOf(Paging.valueOf(0, 1),"123"));
assertTrue(resources.getCollection().size() == 1); assertTrue(resources.getCollection().size() == 1);
assertTrue(resources.hasMoreItems()); 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,")); assertTrue("There must be json output as List with pagination", StringUtils.startsWith(out, "{\"list\":{\"pagination\":{\"count\":1,"));
} }
@@ -195,7 +196,7 @@ public class SerializeTests extends AbstractContextTest
Farmer aFarmer = new Farmer("180"); Farmer aFarmer = new Farmer("180");
aFarmer.setGoatId("1111"); aFarmer.setGoatId("1111");
aFarmer.setSheepId("2222"); 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); assertNotNull(res);
assertTrue(Farmer.class.equals(res.getRoot().getClass())); assertTrue(Farmer.class.equals(res.getRoot().getClass()));
Map<String,Object> embeds = res.getEmbedded(); Map<String,Object> embeds = res.getEmbedded();
@@ -220,14 +221,14 @@ public class SerializeTests extends AbstractContextTest
{ {
assertNotNull(helper); assertNotNull(helper);
Map<String, BeanPropertiesFilter> rFilter = ResourceWebScriptHelper.getRelationFilter("blacksheep,baaahh"); Map<String, BeanPropertiesFilter> 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); assertNotNull(res);
String out = writeResponse(res); String out = writeResponse(res);
assertTrue(Farmer.class.equals(res.getRoot().getClass())); assertTrue(Farmer.class.equals(res.getRoot().getClass()));
assertTrue("There must be json output", StringUtils.isNotBlank(out)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
Paging pageRequest = Paging.valueOf(1, 2); 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); assertNotNull(resultCollection);
out = writeResponse(resultCollection); out = writeResponse(resultCollection);
assertTrue("There must be json output", StringUtils.isNotBlank(out)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
@@ -240,12 +241,12 @@ public class SerializeTests extends AbstractContextTest
ExecutionResult exec2 = new ExecutionResult(new Farmer("456"), null); ExecutionResult exec2 = new ExecutionResult(new Farmer("456"), null);
CollectionWithPagingInfo<ExecutionResult> coll = CollectionWithPagingInfo.asPaged(null, Arrays.asList(exec1, exec2)); CollectionWithPagingInfo<ExecutionResult> 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); assertNotNull(resultCollection);
String out = writeResponse(resultCollection); String out = writeResponse(resultCollection);
assertTrue("There must 'source' json output", StringUtils.contains(out, "\"source\":{\"name\":\"Dolly\",\"age\":3,\"sheepGuid\":\"1\"}")); 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); assertNotNull(resultCollection);
out = writeResponse(resultCollection); out = writeResponse(resultCollection);
assertFalse("There must not 'source' json output", StringUtils.contains(out, "\"source\":{\"name\":\"Dolly\",\"age\":3,\"sheepGuid\":\"1\"}")); assertFalse("There must not 'source' json output", StringUtils.contains(out, "\"source\":{\"name\":\"Dolly\",\"age\":3,\"sheepGuid\":\"1\"}"));
@@ -271,7 +272,7 @@ public class SerializeTests extends AbstractContextTest
public void testSerializeExecutionResult() throws IOException public void testSerializeExecutionResult() throws IOException
{ {
assertNotNull(helper); 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); String out = writeResponse(res);
assertTrue("There must be json output", StringUtils.isNotBlank(out)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
@@ -283,16 +284,16 @@ public class SerializeTests extends AbstractContextTest
{ {
assertNotNull(helper); assertNotNull(helper);
CollectionWithPagingInfo paged = CollectionWithPagingInfo.asPaged(null,null); 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,")); assertTrue("There must be json output as List with pagination", StringUtils.startsWith(out, "{\"list\":{\"pagination\":{\"count\":0,"));
Paging pageRequest = Paging.valueOf(1, 2); Paging pageRequest = Paging.valueOf(1, 2);
paged = CollectionWithPagingInfo.asPaged(pageRequest,Arrays.asList(new Goat(), new Sheep("ABCD"), new Sheep("XYZ"))); 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,")); 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); 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")); assertTrue("There must be json output as List with pagination", StringUtils.startsWith(out, "{\"list\":{\"pagination\":{\"count\":3,\"hasMoreItems\":true,\"totalItems\":5000"));
} }
@@ -305,7 +306,7 @@ public class SerializeTests extends AbstractContextTest
aMap.put("goatie", new Goat()); aMap.put("goatie", new Goat());
aMap.put("sheepie", new Sheep("ABCD")); aMap.put("sheepie", new Sheep("ABCD"));
aMap.put("sheepy", new Sheep("XYZ")); 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); String out = writeResponse(res);
assertTrue("There must be json output", StringUtils.isNotBlank(out)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
@@ -319,7 +320,7 @@ public class SerializeTests extends AbstractContextTest
aSet.add(new Goat()); aSet.add(new Goat());
aSet.add(new Sheep("ABCD")); aSet.add(new Sheep("ABCD"));
aSet.add(new Sheep("XYZ")); 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); String out = writeResponse(res);
assertTrue("There must be json output", StringUtils.isNotBlank(out)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
@@ -330,11 +331,11 @@ public class SerializeTests extends AbstractContextTest
{ {
assertNotNull(helper); assertNotNull(helper);
CollectionWithPagingInfo<String> pString = CollectionWithPagingInfo.asPaged(null,Arrays.asList("goat", "sheep", "horse")); CollectionWithPagingInfo<String> 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); String out = writeResponse(res);
assertTrue("There must be json output", StringUtils.isNotBlank(out)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
CollectionWithPagingInfo<Integer> pInts = CollectionWithPagingInfo.asPaged(null,Arrays.asList(234, 45, 890, 3456)); CollectionWithPagingInfo<Integer> 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); out = writeResponse(res);
assertTrue("There must be json output", StringUtils.isNotBlank(out)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
} }
@@ -343,7 +344,7 @@ public class SerializeTests extends AbstractContextTest
public void testSerializeList() throws IOException public void testSerializeList() throws IOException
{ {
assertNotNull(helper); 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); String out = writeResponse(res);
assertTrue("There must be json output", StringUtils.isNotBlank(out)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
@@ -364,7 +365,7 @@ public class SerializeTests extends AbstractContextTest
public void testSerializeUniqueId() throws IOException public void testSerializeUniqueId() throws IOException
{ {
assertNotNull(helper); 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); String out = writeResponse(res);
assertTrue("Id field must be called sheepGuid.", StringUtils.contains(out, "\"sheepGuid\":\"ABCD\"")); assertTrue("Id field must be called sheepGuid.", StringUtils.contains(out, "\"sheepGuid\":\"ABCD\""));
} }
@@ -375,7 +376,7 @@ public class SerializeTests extends AbstractContextTest
ResourceWithMetadata relationResource = locator.locateRelationResource(api,"sheep", "baaahh", HttpMethod.GET); ResourceWithMetadata relationResource = locator.locateRelationResource(api,"sheep", "baaahh", HttpMethod.GET);
assertNotNull(relationResource); assertNotNull(relationResource);
RelationshipResourceAction.Read<?> getter = (RelationshipResourceAction.Read<?>) relationResource.getResource(); 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)); assertTrue("There must be json output", StringUtils.isNotBlank(out));
} }
@@ -408,13 +409,8 @@ public class SerializeTests extends AbstractContextTest
Api api3 = Api.valueOf("alfrescomock", "private", "3"); Api api3 = Api.valueOf("alfrescomock", "private", "3");
ResourceWithMetadata propResource = locator.locateRelationResource(api3,"flock", "photo", HttpMethod.GET); ResourceWithMetadata propResource = locator.locateRelationResource(api3,"flock", "photo", HttpMethod.GET);
AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets");
executor.execute(propResource, Params.valueOf("234", null, null), new ExecutionCallback<BinaryResource>(){ Object result = executor.execute(propResource, Params.valueOf("234", null, null), mock(WebScriptResponse.class), true);
@Override
public void onSuccess(BinaryResource result, ContentInfo contentInfo, int statusCode)
{
assertNotNull(result); assertNotNull(result);
}});
} }
@Test @Test
@@ -486,7 +482,7 @@ public class SerializeTests extends AbstractContextTest
Api v3 = Api.valueOf(api.getName(), api.getScope().toString(), "3"); Api v3 = Api.valueOf(api.getName(), api.getScope().toString(), "3");
Map<String, BeanPropertiesFilter> relFiler = ResourceWebScriptHelper.getRelationFilter("herd"); Map<String, BeanPropertiesFilter> 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); out = writeResponse(res);
jsonRsp = new JSONObject(new JSONTokener(out)); jsonRsp = new JSONObject(new JSONTokener(out));
entry = jsonRsp.getJSONObject("relations") entry = jsonRsp.getJSONObject("relations")
@@ -498,7 +494,7 @@ public class SerializeTests extends AbstractContextTest
assertTrue("The quantity should be 56", entry.getInt("quantity") == 56); assertTrue("The quantity should be 56", entry.getInt("quantity") == 56);
relFiler = ResourceWebScriptHelper.getRelationFilter("herd(name)"); 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); out = writeResponse(res);
assertTrue("Must return only the herd name.", StringUtils.contains(out, "{\"name\":\"bigun\"}")); assertTrue("Must return only the herd name.", StringUtils.contains(out, "{\"name\":\"bigun\"}"));
} }