Merged FILE-FOLDER-API (5.2.0) to HEAD (5.2)

122596 gjames: RA-211: Post-processing (carefully) embedded/related resources


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@126485 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jamal Kaabi-Mofrad
2016-05-10 11:09:54 +00:00
parent 06fa651c38
commit 63b7a24c69
3 changed files with 20 additions and 35 deletions

View File

@@ -19,9 +19,8 @@ public interface ActionExecutor extends HttpMethodSupport
* Invokes the resource with the Params
* @param resource ResourceWithMetadata
* @param params Params
* @param boolean should we use a readonly transaction.
*/
@SuppressWarnings("rawtypes")
public Object execute(ResourceWithMetadata resource, Params params, WebScriptResponse res, boolean isReadOnly);
public Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable;
}

View File

@@ -91,11 +91,10 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements
final Map<String, String> templateVars = req.getServiceMatch().getTemplateVars();
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)
final Object toSerialize = executor.execute(resource, params, res, isReadOnly);
final Object toSerialize = execute(resource, params, res, isReadOnly);
//Outside the transaction.
if (toSerialize != null)
@@ -143,7 +142,6 @@ 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());
@@ -165,7 +163,7 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements
}, isReadOnly, true);
}
protected abstract Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable;
public abstract Object executeAction(ResourceWithMetadata resource, Params params) throws Throwable;
protected void streamResponse(final WebScriptRequest req, final WebScriptResponse res, BinaryResource resource) throws IOException
{
@@ -225,20 +223,6 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements
});
}
/**
* Finds the action executor to execute actions on.
* @param httpMethod - the http method
* @param params Params
* @param resource ResourceWithMetadata
* @param contentType Request content type
* @return ActionExecutor the action executor
*/
public ActionExecutor findExecutor(HttpMethod httpMethod, Params params, ResourceWithMetadata resource, String contentType)
{
//Ignore all params and return this
return this;
}
public void setLocator(ResourceLocator locator)
{
this.locator = locator;

View File

@@ -47,9 +47,7 @@ import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException;
import org.alfresco.rest.framework.jacksonextensions.BeanPropertiesFilter;
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.content.ContentInfo;
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
import org.alfresco.rest.framework.resource.parameters.InvalidSelectException;
import org.alfresco.rest.framework.resource.parameters.Paging;
@@ -478,7 +476,7 @@ public class ResourceWebScriptHelper
if (objectToWrap instanceof CollectionWithPagingInfo<?>)
{
CollectionWithPagingInfo<?> collectionToWrap = (CollectionWithPagingInfo<?>) objectToWrap;
Object sourceEntity = executeIncludedSource(res, api, params, entityCollectionName, collectionToWrap);
Object sourceEntity = executeIncludedSource(api, params, entityCollectionName, collectionToWrap);
Collection<Object> resultCollection = new ArrayList(collectionToWrap.getCollection().size());
if (!collectionToWrap.getCollection().isEmpty())
{
@@ -502,7 +500,7 @@ public class ResourceWebScriptHelper
Map<String,Pair<String,Method>> embeddded = ResourceInspector.findEmbeddedResources(objectToWrap.getClass());
if (embeddded != null && !embeddded.isEmpty())
{
Map<String, Object> results = executeEmbeddedResources(res, api, params,objectToWrap, embeddded);
Map<String, Object> results = executeEmbeddedResources(api, params,objectToWrap, embeddded);
execRes.addEmbedded(results);
}
@@ -510,7 +508,7 @@ public class ResourceWebScriptHelper
{
Map<String, ResourceWithMetadata> relationshipResources = locator.locateRelationResource(api,entityCollectionName, params.getRelationsFilter().keySet(), HttpMethod.GET);
String uniqueEntityId = ResourceInspector.findUniqueId(objectToWrap);
Map<String,Object> relatedResources = executeRelatedResources(res, api, params, relationshipResources, uniqueEntityId);
Map<String,Object> relatedResources = executeRelatedResources(api, params, relationshipResources, uniqueEntityId);
execRes.addRelated(relatedResources);
}
@@ -519,7 +517,7 @@ public class ResourceWebScriptHelper
}
}
private Object executeIncludedSource(WebScriptResponse response, Api api, Params params, String entityCollectionName, CollectionWithPagingInfo<?> collectionToWrap)
private Object executeIncludedSource(Api api, Params params, String entityCollectionName, CollectionWithPagingInfo<?> collectionToWrap)
{
if (params.includeSource())
{
@@ -532,7 +530,7 @@ public class ResourceWebScriptHelper
ResourceWithMetadata res = locator.locateEntityResource(api, entityCollectionName, HttpMethod.GET);
if (res != null)
{
Object result = executeRelatedResource(response, api, params, params.getEntityId(), null, res);
Object result = executeResource(api, params, params.getEntityId(), null, res);
if (result!=null && result instanceof ExecutionResult) return ((ExecutionResult) result).getRoot();
}
}
@@ -549,7 +547,7 @@ public class ResourceWebScriptHelper
* @param embeddded Map<String, Pair<String, Method>>
* @return Map
*/
private Map<String, Object> executeEmbeddedResources(WebScriptResponse response, Api api, Params params, Object objectToWrap, Map<String, Pair<String, Method>> embeddded)
private Map<String, Object> executeEmbeddedResources(Api api, Params params, Object objectToWrap, Map<String, Pair<String, Method>> embeddded)
{
final Map<String,Object> results = new HashMap<String,Object>(embeddded.size());
for (Entry<String, Pair<String,Method>> embeddedEntry : embeddded.entrySet())
@@ -560,7 +558,7 @@ public class ResourceWebScriptHelper
Object id = ResourceInspectorUtil.invokeMethod(embeddedEntry.getValue().getSecond(), objectToWrap);
if (id != null)
{
Object execEmbeddedResult = executeRelatedResource(response, api, params, String.valueOf(id), embeddedEntry.getKey(), res);
Object execEmbeddedResult = executeResource(api, params, String.valueOf(id), embeddedEntry.getKey(), res);
if (execEmbeddedResult != null)
{
if (execEmbeddedResult instanceof ExecutionResult)
@@ -590,14 +588,14 @@ public class ResourceWebScriptHelper
* @param uniqueEntityId String
* @return Map
*/
private Map<String,Object> executeRelatedResources(final WebScriptResponse res, final Api api, Params params,
private Map<String,Object> executeRelatedResources(final Api api, Params params,
Map<String, ResourceWithMetadata> relatedResources,
String uniqueEntityId)
{
final Map<String,Object> results = new HashMap<String,Object>(relatedResources.size());
for (final Entry<String, ResourceWithMetadata> relation : relatedResources.entrySet())
{
Object execResult = executeRelatedResource(res, api, params, uniqueEntityId, relation.getKey(), relation.getValue());
Object execResult = executeResource(api, params, uniqueEntityId, relation.getKey(), relation.getValue());
if (execResult != null)
{
results.put(relation.getKey(), execResult);
@@ -617,8 +615,8 @@ public class ResourceWebScriptHelper
* @param resource ResourceWithMetadata
* @return Object
*/
private Object executeRelatedResource(final WebScriptResponse res, final Api api, Params params,
final String uniqueEntityId, final String resourceKey, final ResourceWithMetadata resource)
private Object executeResource(final Api api, Params params,
final String uniqueEntityId, final String resourceKey, final ResourceWithMetadata resource)
{
try
{
@@ -631,7 +629,8 @@ public class ResourceWebScriptHelper
}
final Params executionParams = Params.valueOf(paramFilter, uniqueEntityId, params.getRequest());
//Read only because this only occurs for GET requests
return executor.execute(resource, executionParams,res, true);
Object result = executor.executeAction(resource, executionParams);
return processAdditionsToTheResponse(null, api, null, executionParams, result);
}
catch(NotFoundException e)
{
@@ -648,8 +647,11 @@ public class ResourceWebScriptHelper
{
logger.debug("Ignored error, cannot access the object so can't embed it ", e);
}
} catch (Throwable throwable)
{
logger.warn("Failed to execute a RelatedResource for "+resourceKey+" "+throwable.getMessage());
}
return null; //default
}