diff --git a/config/alfresco/public-rest-context.xml b/config/alfresco/public-rest-context.xml index bc4fa2a283..1b0a4aba4d 100644 --- a/config/alfresco/public-rest-context.xml +++ b/config/alfresco/public-rest-context.xml @@ -150,6 +150,10 @@ + + + + @@ -160,8 +164,7 @@ - - + diff --git a/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java b/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java index a156fb11e0..f00ef9a304 100644 --- a/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java +++ b/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java @@ -51,8 +51,8 @@ public class NetworkWebScriptGet extends ApiWebScript { // apply content type res.setContentType(Format.JSON.mimetype() + ";charset=UTF-8"); - - jsonHelper.withWriter(res.getOutputStream(), new Writer() + + assistant.getJsonHelper().withWriter(res.getOutputStream(), new Writer() { @Override public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) @@ -81,17 +81,13 @@ public class NetworkWebScriptGet extends ApiWebScript } }, true, true); } - catch (ApiException apiException) + catch (ApiException | WebScriptException apiException) { - renderErrorResponse(resolveException(apiException), res); - } - catch (WebScriptException webException) - { - renderErrorResponse(resolveException(webException), res); + assistant.renderException(apiException, res); } catch (RuntimeException runtimeException) { - renderErrorResponse(resolveException(runtimeException), res); + assistant.renderException(runtimeException, res); } } } diff --git a/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java b/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java index ab510dca7b..5d6ee615d4 100644 --- a/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java +++ b/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java @@ -79,8 +79,8 @@ public class NetworksWebScriptGet extends ApiWebScript // apply content type res.setContentType(Format.JSON.mimetype() + ";charset=UTF-8"); - - jsonHelper.withWriter(res.getOutputStream(), new Writer() + + assistant.getJsonHelper().withWriter(res.getOutputStream(), new Writer() { @Override public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) @@ -107,17 +107,13 @@ public class NetworksWebScriptGet extends ApiWebScript } }, true, true); } - catch (ApiException apiException) + catch (ApiException | WebScriptException apiException) { - renderErrorResponse(resolveException(apiException), res); - } - catch (WebScriptException webException) - { - renderErrorResponse(resolveException(webException), res); + assistant.renderException(apiException, res); } catch (RuntimeException runtimeException) { - renderErrorResponse(resolveException(runtimeException), res); + assistant.renderException(runtimeException, res); } } } \ No newline at end of file diff --git a/source/java/org/alfresco/rest/api/PublicApiDeclarativeRegistry.java b/source/java/org/alfresco/rest/api/PublicApiDeclarativeRegistry.java index 3c9616859a..f6d4d1ca64 100644 --- a/source/java/org/alfresco/rest/api/PublicApiDeclarativeRegistry.java +++ b/source/java/org/alfresco/rest/api/PublicApiDeclarativeRegistry.java @@ -34,6 +34,7 @@ import org.alfresco.rest.framework.resource.actions.interfaces.BinaryResourceAct import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction; import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceBinaryAction; import org.alfresco.rest.framework.resource.actions.interfaces.ResourceAction; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.apache.commons.lang.StringUtils; import org.springframework.extensions.webscripts.ArgumentTypeDescription; import org.springframework.extensions.webscripts.Container; @@ -209,7 +210,7 @@ public class PublicApiDeclarativeRegistry extends DeclarativeRegistry if (templateVars.get("apiName") != null) { // NOTE: noAuth currently only exposed for GET or Create Ticket (login) - Api api = determineApi(templateVars); + Api api = ApiAssistant.determineApi(templateVars); // TODO can we avoid locating resource more than once (or at least provide a common code to determine the GET resourceAction) ? return locator.locateResource(api, templateVars, method); @@ -421,15 +422,6 @@ public class PublicApiDeclarativeRegistry extends DeclarativeRegistry return new Match(match.getTemplate(), match.getTemplateVars(), match.getPath(), noAuthWebScriptWrapper); } - // note: same as ApiWebscript (apiName must not be null) - private Api determineApi(Map templateVars) - { - String apiScope = templateVars.get("apiScope"); - String apiVersion = templateVars.get("apiVersion"); - String apiName = templateVars.get("apiName"); - return Api.valueOf(apiName,apiScope,apiVersion); - } - private void initWebScript(WebScript webScript, String name) { DescriptionImpl serviceDesc = new DescriptionImpl(name, name, name, name); diff --git a/source/java/org/alfresco/rest/api/PublicApiTenantWebScriptServletRuntime.java b/source/java/org/alfresco/rest/api/PublicApiTenantWebScriptServletRuntime.java index b1a3acc50d..53e36d5863 100644 --- a/source/java/org/alfresco/rest/api/PublicApiTenantWebScriptServletRuntime.java +++ b/source/java/org/alfresco/rest/api/PublicApiTenantWebScriptServletRuntime.java @@ -18,27 +18,29 @@ */ package org.alfresco.rest.api; +import java.io.IOException; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.alfresco.repo.web.scripts.TenantWebScriptServletRuntime; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.springframework.extensions.config.ServerProperties; import org.springframework.extensions.surf.util.URLDecoder; -import org.springframework.extensions.webscripts.Match; -import org.springframework.extensions.webscripts.RuntimeContainer; -import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.*; import org.springframework.extensions.webscripts.servlet.ServletAuthenticatorFactory; public class PublicApiTenantWebScriptServletRuntime extends TenantWebScriptServletRuntime { private static final Pattern CMIS_URI_PATTERN = Pattern.compile(".*/cmis/versions/[0-9]+\\.[0-9]+/.*"); - + private ApiAssistant apiAssistant; + public PublicApiTenantWebScriptServletRuntime(RuntimeContainer container, ServletAuthenticatorFactory authFactory, HttpServletRequest req, - HttpServletResponse res, ServerProperties serverProperties) + HttpServletResponse res, ServerProperties serverProperties, ApiAssistant apiAssistant) { super(container, authFactory, req, res, serverProperties); + this.apiAssistant = apiAssistant; } /* (non-Javadoc) @@ -121,4 +123,24 @@ public class PublicApiTenantWebScriptServletRuntime extends TenantWebScriptServl { return "PublicApiTenantServletRuntime"; } + + @Override + protected void renderErrorResponse(Match match, Throwable exception, WebScriptRequest request, WebScriptResponse response) { + + //If its cmis or not an exception then use the default behaviour + if (CMIS_URI_PATTERN.matcher(req.getRequestURI()).matches() || !(exception instanceof Exception)) + { + super.renderErrorResponse(match, exception, request, response); + } + else + { + try { + apiAssistant.renderException((Exception)exception, response); + } catch (IOException e) { + logger.error("Internal error", e); + throw new WebScriptException("Internal error", e); + } + } + + } } diff --git a/source/java/org/alfresco/rest/api/PublicApiWebScriptServlet.java b/source/java/org/alfresco/rest/api/PublicApiWebScriptServlet.java index 7d08c6bbcc..a1fe9e6a39 100644 --- a/source/java/org/alfresco/rest/api/PublicApiWebScriptServlet.java +++ b/source/java/org/alfresco/rest/api/PublicApiWebScriptServlet.java @@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.alfresco.repo.web.scripts.TenantWebScriptServlet; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.springframework.context.ApplicationContext; import org.springframework.extensions.webscripts.RuntimeContainer; import org.springframework.extensions.webscripts.servlet.WebScriptServletRuntime; @@ -33,7 +34,7 @@ import org.springframework.web.context.support.WebApplicationContextUtils; public class PublicApiWebScriptServlet extends TenantWebScriptServlet { private static final long serialVersionUID = 726730674397482039L; - + private ApiAssistant apiAssistant; @Override public void init() throws ServletException { @@ -41,6 +42,7 @@ public class PublicApiWebScriptServlet extends TenantWebScriptServlet ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); container = (RuntimeContainer)context.getBean("publicapi.container"); + apiAssistant = (ApiAssistant) context.getBean("apiAssistant"); } /* (non-Javadoc) @@ -55,7 +57,7 @@ public class PublicApiWebScriptServlet extends TenantWebScriptServlet protected WebScriptServletRuntime getRuntime(HttpServletRequest req, HttpServletResponse res) { - WebScriptServletRuntime runtime = new PublicApiTenantWebScriptServletRuntime(container, authenticatorFactory, req, res, serverProperties); + WebScriptServletRuntime runtime = new PublicApiTenantWebScriptServletRuntime(container, authenticatorFactory, req, res, serverProperties, apiAssistant); return runtime; } } diff --git a/source/java/org/alfresco/rest/framework/tools/ApiAssistant.java b/source/java/org/alfresco/rest/framework/tools/ApiAssistant.java new file mode 100644 index 0000000000..7818c75e4c --- /dev/null +++ b/source/java/org/alfresco/rest/framework/tools/ApiAssistant.java @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.rest.framework.tools; + +import org.alfresco.rest.framework.Api; +import org.alfresco.rest.framework.core.exceptions.DefaultExceptionResolver; +import org.alfresco.rest.framework.core.exceptions.ErrorResponse; +import org.alfresco.rest.framework.core.exceptions.ExceptionResolver; +import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; +import org.alfresco.rest.framework.resource.content.ContentInfo; +import org.alfresco.rest.framework.resource.content.ContentInfoImpl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.codehaus.jackson.JsonGenerationException; +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.ObjectMapper; +import org.json.simple.JSONObject; +import org.springframework.extensions.surf.util.I18NUtil; +import org.springframework.extensions.webscripts.*; +import org.springframework.extensions.webscripts.Description.RequiredCache; +import org.springframework.extensions.webscripts.servlet.WebScriptServletResponse; + +import java.io.IOException; +import java.util.Map; + +/** + * Assists you in creating a great Rest API. + * + * @author Gethin James + */ +public class ApiAssistant { + + private static Log logger = LogFactory.getLog(ApiAssistant.class); + + public final static String UTF8 = "UTF-8"; + public final static ContentInfo DEFAULT_JSON_CONTENT = new ContentInfoImpl(Format.JSON.mimetype(),UTF8, 0, null); + public final static Cache CACHE_NEVER = new Cache(new RequiredCache() + { + @Override + public boolean getNeverCache() + { + return true; + } + + @Override + public boolean getIsPublic() + { + return false; + } + + @Override + public boolean getMustRevalidate() + { + return true; + } + }); + + private ExceptionResolver defaultResolver = new DefaultExceptionResolver(); + private ExceptionResolver resolver; + private JacksonHelper jsonHelper; + + public static Api determineApi(Map templateVars) + { + String apiScope = templateVars.get("apiScope"); + String apiVersion = templateVars.get("apiVersion"); + String apiName = templateVars.get("apiName"); + return Api.valueOf(apiName,apiScope,apiVersion); + } + + public ErrorResponse resolveException(Exception ex) + { + ErrorResponse error = resolver.resolveException(ex); + if (error == null) + { + error = defaultResolver.resolveException(ex); + } + return error; + } + + /** + * Sets the response headers with any information we know about the content + * @param res WebScriptResponse + * @param contentInfo Content Information + */ + public void setContentInfoOnResponse(WebScriptResponse res, ContentInfo contentInfo) + { + if (contentInfo != null) + { + //Set content info on the response + res.setContentType(contentInfo.getMimeType()); + res.setContentEncoding(contentInfo.getEncoding()); + + if (res instanceof WrappingWebScriptResponse) + { + WrappingWebScriptResponse wrappedRes = ((WrappingWebScriptResponse) res); + res = wrappedRes.getNext(); + } + + if (res instanceof WebScriptServletResponse) + { + WebScriptServletResponse servletResponse = (WebScriptServletResponse) res; + if (contentInfo.getLength() > 0) + { + if (contentInfo.getLength() > 0 && contentInfo.getLength() < Integer.MAX_VALUE) + { + servletResponse.getHttpServletResponse().setContentLength((int) contentInfo.getLength()); + } + } + if (contentInfo.getLocale() != null) + { + servletResponse.getHttpServletResponse().setLocale(contentInfo.getLocale()); + } + } + } + } + + /** + * Renders an exception to the output stream as Json. + * @param exception + * @param response + * @throws IOException + */ + public void renderException(Exception exception, final WebScriptResponse response) throws IOException { + renderErrorResponse(resolveException(exception), response); + } + + /** + * Renders a JSON error response + * @param errorResponse The error + * @param res web script response + * @throws IOException + */ + public void renderErrorResponse(ErrorResponse errorResponse, final WebScriptResponse res) throws IOException { + + String logId = ""; + + if (Status.STATUS_INTERNAL_SERVER_ERROR == errorResponse.getStatusCode() || logger.isDebugEnabled()) + { + logId = org.alfresco.util.GUID.generate(); + logger.error(logId+" : "+errorResponse.getStackTrace()); + } + + String stackMessage = I18NUtil.getMessage(DefaultExceptionResolver.STACK_MESSAGE_ID); + + final ErrorResponse errorToWrite = new ErrorResponse(errorResponse.getErrorKey(), + errorResponse.getStatusCode(), + errorResponse.getBriefSummary(), + stackMessage, + logId, + errorResponse.getAdditionalState(), + DefaultExceptionResolver.ERROR_URL); + + setContentInfoOnResponse(res, DEFAULT_JSON_CONTENT); + + // 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(errorToWrite.getStatusCode()); + + jsonHelper.withWriter(res.getOutputStream(), new JacksonHelper.Writer() + { + @SuppressWarnings("unchecked") + @Override + public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) + throws JsonGenerationException, JsonMappingException, IOException + { + JSONObject obj = new JSONObject(); + obj.put("error", errorToWrite); + objectMapper.writeValue(generator, obj); + } + }); + } + + public JacksonHelper getJsonHelper() { + return jsonHelper; + } + + public void setDefaultResolver(ExceptionResolver defaultResolver) { + this.defaultResolver = defaultResolver; + } + + public void setResolver(ExceptionResolver resolver) { + this.resolver = resolver; + } + + public void setJsonHelper(JacksonHelper jsonHelper) { + this.jsonHelper = jsonHelper; + } +} diff --git a/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java b/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java index 55aa49795d..464c59d1b6 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java +++ b/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java @@ -45,6 +45,7 @@ import org.alfresco.rest.framework.resource.content.ContentInfo; import org.alfresco.rest.framework.resource.content.FileBinaryResource; import org.alfresco.rest.framework.resource.content.NodeBinaryResource; import org.alfresco.rest.framework.resource.parameters.Params; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -145,11 +146,11 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements } catch (AlfrescoRuntimeException | ApiException | WebScriptException xception ) { - renderErrorResponse(resolveException(xception), res); + assistant.renderException(xception, res); } catch (RuntimeException runtimeException) { - renderErrorResponse(resolveException(runtimeException), res); + assistant.renderException(runtimeException, res); } } @@ -157,7 +158,7 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements { final String entityCollectionName = ResourceInspector.findEntityCollectionNameName(resource.getMetaData()); final ResourceOperation operation = resource.getMetaData().getOperation(getHttpMethod()); - final WithResponse callBack = new WithResponse(operation.getSuccessStatus(),DEFAULT_JSON_CONTENT,ApiWebScript.CACHE_NEVER); + final WithResponse callBack = new WithResponse(operation.getSuccessStatus(), ApiAssistant.DEFAULT_JSON_CONTENT,ApiAssistant.CACHE_NEVER); Object toReturn = transactionService.getRetryingTransactionHelper().doInTransaction( new RetryingTransactionHelper.RetryingTransactionCallback() { @@ -191,7 +192,7 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements { NodeBinaryResource nodeResource = (NodeBinaryResource) resource; ContentInfo contentInfo = nodeResource.getContentInfo(); - setContentInfoOnResponse(res, contentInfo); + assistant.setContentInfoOnResponse(res, contentInfo); // if requested, set attachment boolean attach = StringUtils.isNotEmpty(nodeResource.getAttachFileName()); Map model = getModelForCacheDirective(nodeResource.getCacheDirective()); @@ -226,7 +227,7 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements { res.setStatus(status); if (cache != null) res.setCache(cache); - setContentInfoOnResponse(res,contentInfo); + assistant.setContentInfoOnResponse(res,contentInfo); if (headers != null && !headers.isEmpty()) { for (Map.Entry> header:headers.entrySet()) @@ -262,7 +263,7 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements protected void renderJsonResponse(final WebScriptResponse res, final Object toSerialize) throws IOException { - jsonHelper.withWriter(res.getOutputStream(), new JacksonHelper.Writer() + assistant.getJsonHelper().withWriter(res.getOutputStream(), new JacksonHelper.Writer() { @Override public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) diff --git a/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java b/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java index a98a7fcc38..b371734ee8 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java @@ -32,6 +32,7 @@ import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper.Writer; import org.alfresco.rest.framework.resource.content.ContentInfo; import org.alfresco.rest.framework.resource.content.ContentInfoImpl; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.GUID; import org.alfresco.util.TempFileProvider; @@ -57,10 +58,7 @@ import org.springframework.extensions.webscripts.servlet.WebScriptServletRespons public abstract class ApiWebScript extends AbstractWebScript { private static Log logger = LogFactory.getLog(ApiWebScript.class); - protected JacksonHelper jsonHelper; - ExceptionResolver defaultResolver = new DefaultExceptionResolver(); - ExceptionResolver resolver; - + protected ApiAssistant assistant; protected boolean encryptTempFiles = false; protected String tempDirectoryName = null; protected int memoryThreshold = 4 * 1024 * 1024; // 4mb @@ -73,9 +71,8 @@ public abstract class ApiWebScript extends AbstractWebScript this.transactionService = transactionService; } - public void setDefaultResolver(ExceptionResolver defaultResolver) - { - this.defaultResolver = defaultResolver; + public void setAssistant(ApiAssistant assistant) { + this.assistant = assistant; } public void setTempDirectoryName(String tempDirectoryName) @@ -102,41 +99,18 @@ public abstract class ApiWebScript extends AbstractWebScript { this.streamFactory = streamFactory; } - + public void init() { File tempDirectory = TempFileProvider.getTempDir(tempDirectoryName); this.streamFactory = ThresholdOutputStreamFactory.newInstance(tempDirectory, memoryThreshold, maxContentSize, encryptTempFiles); } - public final static String UTF8 = "UTF-8"; - public final static Cache CACHE_NEVER = new Cache(new RequiredCache() - { - @Override - public boolean getNeverCache() - { - return true; - } - - @Override - public boolean getIsPublic() - { - return false; - } - - @Override - public boolean getMustRevalidate() - { - return true; - } - }); - public final static ContentInfo DEFAULT_JSON_CONTENT = new ContentInfoImpl(Format.JSON.mimetype(),UTF8, 0, null); - @Override public void execute(final WebScriptRequest req, final WebScriptResponse res) throws IOException { Map templateVars = req.getServiceMatch().getTemplateVars(); - Api api = determineApi(templateVars); + Api api = assistant.determineApi(templateVars); final BufferedRequest bufferedReq = getRequest(req); final BufferedResponse bufferedRes = getResponse(res); @@ -161,24 +135,6 @@ public abstract class ApiWebScript extends AbstractWebScript } } - public Api determineApi(Map templateVars) - { - String apiScope = templateVars.get("apiScope"); - String apiVersion = templateVars.get("apiVersion"); - String apiName = templateVars.get("apiName"); - return Api.valueOf(apiName,apiScope,apiVersion); - } - - protected ErrorResponse resolveException(Exception ex) - { - ErrorResponse error = resolver.resolveException(ex); - if (error == null) - { - error = defaultResolver.resolveException(ex); - } - return error; - } - protected BufferedRequest getRequest(final WebScriptRequest req) { // create buffered request and response that allow transaction retrying @@ -195,97 +151,4 @@ public abstract class ApiWebScript extends AbstractWebScript public abstract void execute(final Api api, WebScriptRequest req, WebScriptResponse res) throws IOException; - /** - * Renders a JSON error response - * @param errorResponse The error - * @param res web script response - * @throws IOException - */ - public void renderErrorResponse(ErrorResponse errorResponse, final WebScriptResponse res) throws IOException { - - String logId = ""; - - if (Status.STATUS_INTERNAL_SERVER_ERROR == errorResponse.getStatusCode() || logger.isDebugEnabled()) - { - logId = GUID.generate(); - logger.error(logId+" : "+errorResponse.getStackTrace()); - } - - String stackMessage = I18NUtil.getMessage(DefaultExceptionResolver.STACK_MESSAGE_ID); - - final ErrorResponse errorToWrite = new ErrorResponse(errorResponse.getErrorKey(), - errorResponse.getStatusCode(), - errorResponse.getBriefSummary(), - stackMessage, - logId, - errorResponse.getAdditionalState(), - DefaultExceptionResolver.ERROR_URL); - - setContentInfoOnResponse(res, DEFAULT_JSON_CONTENT); - - // 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(errorToWrite.getStatusCode()); - - jsonHelper.withWriter(res.getOutputStream(), new Writer() - { - @SuppressWarnings("unchecked") - @Override - public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) - throws JsonGenerationException, JsonMappingException, IOException - { - JSONObject obj = new JSONObject(); - obj.put("error", errorToWrite); - objectMapper.writeValue(generator, obj); - } - }); - } - - - /** - * Sets the response headers with any information we know about the content - * @param res WebScriptResponse - * @param contentInfo Content Information - */ - protected void setContentInfoOnResponse(WebScriptResponse res, ContentInfo contentInfo) - { - if (contentInfo != null) - { - //Set content info on the response - res.setContentType(contentInfo.getMimeType()); - res.setContentEncoding(contentInfo.getEncoding()); - - if (res instanceof WrappingWebScriptResponse) - { - WrappingWebScriptResponse wrappedRes = ((WrappingWebScriptResponse) res); - res = wrappedRes.getNext(); - } - - if (res instanceof WebScriptServletResponse) - { - WebScriptServletResponse servletResponse = (WebScriptServletResponse) res; - if (contentInfo.getLength() > 0) - { - if (contentInfo.getLength() > 0 && contentInfo.getLength() < Integer.MAX_VALUE) - { - servletResponse.getHttpServletResponse().setContentLength((int) contentInfo.getLength()); - } - } - if (contentInfo.getLocale() != null) - { - servletResponse.getHttpServletResponse().setLocale(contentInfo.getLocale()); - } - } - } - } - - public void setResolver(ExceptionResolver resolver) - { - this.resolver = resolver; - } - - public void setJsonHelper(JacksonHelper jsonHelper) - { - this.jsonHelper = jsonHelper; - } } diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptDelete.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptDelete.java index 03e8868d53..880f9c1f72 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptDelete.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptDelete.java @@ -12,6 +12,7 @@ import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAct import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction; import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceBinaryAction; import org.alfresco.rest.framework.resource.parameters.Params; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.apache.commons.lang.StringUtils; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; @@ -189,7 +190,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement public Void execute(final ResourceWithMetadata resource, final Params params, final WebScriptResponse res, boolean isReadOnly) { final ResourceOperation operation = resource.getMetaData().getOperation(HttpMethod.DELETE); - final WithResponse callBack = new WithResponse(operation.getSuccessStatus(),DEFAULT_JSON_CONTENT,ApiWebScript.CACHE_NEVER); + final WithResponse callBack = new WithResponse(operation.getSuccessStatus(), ApiAssistant.DEFAULT_JSON_CONTENT,ApiAssistant.CACHE_NEVER); transactionService.getRetryingTransactionHelper().doInTransaction( new RetryingTransactionCallback() { diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptHelper.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptHelper.java index 45fbe841b8..5db409d6d1 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptHelper.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptHelper.java @@ -58,6 +58,7 @@ import org.alfresco.rest.framework.resource.parameters.where.InvalidQueryExcepti import org.alfresco.rest.framework.resource.parameters.where.Query; import org.alfresco.rest.framework.resource.parameters.where.QueryImpl; import org.alfresco.rest.framework.resource.parameters.where.WhereCompiler; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.alfresco.util.Pair; import org.alfresco.util.PropertyCheck; import org.antlr.runtime.RecognitionException; @@ -668,7 +669,7 @@ public class ResourceWebScriptHelper paramFilter = filters.get(resourceKey); } final Params executionParams = Params.valueOf(paramFilter, uniqueEntityId, params.getRequest()); - final WithResponse callBack = new WithResponse(Status.STATUS_OK,ApiWebScript.DEFAULT_JSON_CONTENT,ApiWebScript.CACHE_NEVER); + final WithResponse callBack = new WithResponse(Status.STATUS_OK, ApiAssistant.DEFAULT_JSON_CONTENT,ApiAssistant.CACHE_NEVER); //Read only because this only occurs for GET requests Object result = executor.executeAction(resource, executionParams, callBack); return processAdditionsToTheResponse(null, api, null, executionParams, result); diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPost.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPost.java index 16dc03e0ee..203a6d4106 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPost.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPost.java @@ -102,7 +102,7 @@ public class ResourceWebScriptPost extends AbstractResourceWebScript implements if (objectType!= null) { //Operations don't support a List as json body - postedObj = ResourceWebScriptHelper.extractJsonContent(req, jsonHelper, objectType); + postedObj = ResourceWebScriptHelper.extractJsonContent(req, assistant.getJsonHelper(), objectType); } if (StringUtils.isNotBlank(propertyName)) @@ -156,7 +156,7 @@ public class ResourceWebScriptPost extends AbstractResourceWebScript implements // Only allow 1 value. try { - Object content = ResourceWebScriptHelper.extractJsonContent(req,jsonHelper, objType); + Object content = ResourceWebScriptHelper.extractJsonContent(req,assistant.getJsonHelper(), objType); return Arrays.asList(content); } catch (InvalidArgumentException iae) @@ -173,7 +173,7 @@ public class ResourceWebScriptPost extends AbstractResourceWebScript implements } } } - return ResourceWebScriptHelper.extractJsonContentAsList(req, jsonHelper, objType); + return ResourceWebScriptHelper.extractJsonContentAsList(req, assistant.getJsonHelper(), objType); } diff --git a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPut.java b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPut.java index e4740daa35..040ab4e8c6 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPut.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ResourceWebScriptPut.java @@ -81,7 +81,7 @@ public class ResourceWebScriptPut extends AbstractResourceWebScript implements P } else { - Object putEnt = ResourceWebScriptHelper.extractJsonContent(req, jsonHelper, resourceMeta.getObjectType(operation)); + Object putEnt = ResourceWebScriptHelper.extractJsonContent(req, assistant.getJsonHelper(), resourceMeta.getObjectType(operation)); return Params.valueOf(entityId,params,putEnt, req); } case RELATIONSHIP: @@ -90,7 +90,7 @@ public class ResourceWebScriptPut extends AbstractResourceWebScript implements P throw new UnsupportedResourceOperationException("PUT is executed against the instance URL"); } else { - Object putRel = ResourceWebScriptHelper.extractJsonContent(req, jsonHelper, resourceMeta.getObjectType(operation)); + Object putRel = ResourceWebScriptHelper.extractJsonContent(req, assistant.getJsonHelper(), resourceMeta.getObjectType(operation)); ResourceWebScriptHelper.setUniqueId(putRel,relationshipId); return Params.valueOf(entityId, params, putRel, req); } diff --git a/source/java/org/alfresco/rest/framework/webscripts/metadata/InfoWebScriptGet.java b/source/java/org/alfresco/rest/framework/webscripts/metadata/InfoWebScriptGet.java index 613f41870b..3f9adc4d19 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/metadata/InfoWebScriptGet.java +++ b/source/java/org/alfresco/rest/framework/webscripts/metadata/InfoWebScriptGet.java @@ -52,8 +52,8 @@ public class InfoWebScriptGet extends ApiWebScript { throw new InvalidArgumentException(InvalidArgumentException.DEFAULT_INVALID_API); } - - jsonHelper.withWriter(res.getOutputStream(), new Writer() + + assistant.getJsonHelper().withWriter(res.getOutputStream(), new Writer() { @Override public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) diff --git a/source/java/org/alfresco/rest/framework/webscripts/metadata/WebScriptOptionsMetaData.java b/source/java/org/alfresco/rest/framework/webscripts/metadata/WebScriptOptionsMetaData.java index ed3c6b1c85..f39ba3b229 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/metadata/WebScriptOptionsMetaData.java +++ b/source/java/org/alfresco/rest/framework/webscripts/metadata/WebScriptOptionsMetaData.java @@ -130,8 +130,8 @@ public class WebScriptOptionsMetaData extends ApiWebScript implements ResourceMe { final Object result = processResult(resource,allApiResources); - - jsonHelper.withWriter(out, new Writer() + + assistant.getJsonHelper().withWriter(out, new Writer() { @Override public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) diff --git a/source/test-java/org/alfresco/rest/AbstractSingleNetworkSiteTest.java b/source/test-java/org/alfresco/rest/AbstractSingleNetworkSiteTest.java index c8e2375b10..eb4bafb51a 100644 --- a/source/test-java/org/alfresco/rest/AbstractSingleNetworkSiteTest.java +++ b/source/test-java/org/alfresco/rest/AbstractSingleNetworkSiteTest.java @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2005-2016 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ package org.alfresco.rest; import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsStringNonNull; @@ -21,7 +39,7 @@ import org.junit.After; import org.junit.Before; /** - * Created by gethin on 31/03/16. + * @author Gethin James */ public class AbstractSingleNetworkSiteTest extends AbstractBaseApiTest { diff --git a/source/test-java/org/alfresco/rest/api/tests/ModulePackagesApiTest.java b/source/test-java/org/alfresco/rest/api/tests/ModulePackagesApiTest.java index 96b4d94fe2..37485b4665 100644 --- a/source/test-java/org/alfresco/rest/api/tests/ModulePackagesApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/ModulePackagesApiTest.java @@ -29,11 +29,14 @@ import static org.junit.Assert.assertTrue; import org.alfresco.rest.api.model.ModulePackage; import org.alfresco.rest.api.tests.client.HttpResponse; import org.alfresco.rest.api.tests.client.PublicApiClient; +import org.alfresco.rest.api.tests.client.RequestContext; +import org.alfresco.rest.api.tests.util.RestApiUtil; import org.apache.commons.httpclient.HttpStatus; import org.junit.Before; import org.junit.Test; import java.util.List; +import java.util.Map; /** * Basic modulepackages api calls @@ -82,6 +85,26 @@ public class ModulePackagesApiTest extends AbstractBaseApiTest assertTrue("Simple module must be the correct version","1.0.0-SNAPSHOT".equals(simpleModule.getVersion().toString())); } + + @Test + public void testErrorUrls() throws Exception + { + publicApiClient.setRequestContext(new RequestContext(null)); + Map params = createParams(null, null); + + //Call an endpoint that doesn't exist + HttpResponse response = publicApiClient.get(getScope(), MODULEPACKAGES+"/fred/blogs/king/kong/got/if/wrong", null, null, null, params); + assertNotNull(response); + assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatusCode()); + assertEquals("no-cache", response.getHeaders().get("Cache-Control")); + assertEquals("application/json;charset=UTF-8", response.getHeaders().get("Content-Type")); + + PublicApiClient.ExpectedErrorResponse errorResponse = RestApiUtil.parseErrorResponse(response.getJsonResponse()); + assertNotNull(errorResponse); + assertNotNull(errorResponse.getErrorKey()); + assertNotNull(errorResponse.getBriefSummary()); + } + @Override public String getScope() { 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 71ae1f8755..4ce7d751c6 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 @@ -31,6 +31,7 @@ import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.rest.framework.resource.EntityResource; import org.alfresco.rest.framework.resource.RelationshipResource; import org.alfresco.rest.framework.resource.parameters.Params; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.alfresco.rest.framework.webscripts.AbstractResourceWebScript; import org.alfresco.rest.framework.webscripts.ApiWebScript; import org.alfresco.rest.framework.webscripts.ResourceWebScriptHelper; @@ -68,9 +69,12 @@ public abstract class AbstractContextTest @Autowired JacksonHelper jsonHelper; + @Autowired + ApiAssistant apiAssistant; + static Params NOT_USED = Params.valueOf("notUsed", null, mock(WebScriptRequest.class)); static final Params.RecognizedParams NULL_PARAMS = new Params.RecognizedParams(null, null, null, null, null, null, null, null, false); - static final WithResponse callBack = new WithResponse(Status.STATUS_OK, ApiWebScript.DEFAULT_JSON_CONTENT,ApiWebScript.CACHE_NEVER); + static final WithResponse callBack = new WithResponse(Status.STATUS_OK, ApiAssistant.DEFAULT_JSON_CONTENT,ApiAssistant.CACHE_NEVER); static Api api = Api.valueOf("alfrescomock", "private", "1"); @SuppressWarnings("unchecked") @@ -103,4 +107,18 @@ public abstract class AbstractContextTest putExecutor.setTransactionService(transerv); deleteExecutor.setTransactionService(transerv); } + + protected AbstractResourceWebScript getExecutor() + { + return getExecutor("executorOfGets"); + } + + protected AbstractResourceWebScript getExecutor(String beanName) + { + AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean(beanName); + executor.setLocator(locator); + executor.setAssistant(apiAssistant); + return executor; + } + } 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 0503e6f419..20728b78e7 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 @@ -24,6 +24,7 @@ import org.alfresco.rest.framework.tests.api.mocks.Goat; import org.alfresco.rest.framework.tests.api.mocks.Grass; import org.alfresco.rest.framework.tests.api.mocks.Sheep; import org.alfresco.rest.framework.tests.api.mocks3.FlockEntityResource; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.alfresco.rest.framework.webscripts.AbstractResourceWebScript; import org.alfresco.rest.framework.webscripts.ApiWebScript; import org.junit.Test; @@ -64,7 +65,7 @@ public class ExecutionTests extends AbstractContextTest public void testInvokeGet() throws IOException { ResourceWithMetadata entityResource = locator.locateEntityResource(api,"sheep", HttpMethod.GET); - AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); + AbstractResourceWebScript executor = getExecutor(); Object result = executor.execute(entityResource, Params.valueOf((String)null, null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), true); assertNotNull(result); @@ -72,7 +73,7 @@ public class ExecutionTests extends AbstractContextTest entityResource = locator.locateEntityResource(api,"cow", HttpMethod.GET); result = executor.execute(entityResource, Params.valueOf((String)null, null, mock(WebScriptRequest.class)), response, true); assertNotNull(result); - verify(response, times(1)).setCache((Cache) ApiWebScript.CACHE_NEVER); + verify(response, times(1)).setCache((Cache) ApiAssistant.CACHE_NEVER); response = mock(WebScriptResponse.class); result = executor.execute(entityResource, Params.valueOf("543", null, mock(WebScriptRequest.class)), response, true); @@ -109,7 +110,7 @@ public class ExecutionTests extends AbstractContextTest @Test public void testInvokePost() throws IOException { - AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfPost"); + AbstractResourceWebScript executor = getExecutor("executorOfPost"); ResourceWithMetadata resource = locator.locateRelationResource(api, "sheep", "blacksheep", HttpMethod.POST); final Sheep aSheep = new Sheep("xyz"); @@ -152,7 +153,7 @@ public class ExecutionTests extends AbstractContextTest public void testInvokeDelete() throws IOException { ResourceWithMetadata grassResource = locator.locateEntityResource(api,"grass", HttpMethod.DELETE); - AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfDelete"); + AbstractResourceWebScript executor = getExecutor("executorOfDelete"); Object result = executor.execute(grassResource, Params.valueOf("4", null, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); assertNull(result); @@ -190,7 +191,7 @@ public class ExecutionTests extends AbstractContextTest public void testInvokePut() throws IOException { ResourceWithMetadata entityResource = locator.locateEntityResource(api,"sheep", HttpMethod.PUT); - AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfPut"); + AbstractResourceWebScript executor = getExecutor("executorOfPut"); final Sheep aSheep = new Sheep("xyz"); Object result = executor.execute(entityResource, Params.valueOf("654", null, NULL_PARAMS, aSheep, mock(WebScriptRequest.class)), mock(WebScriptResponse.class), false); assertNotNull(result); @@ -232,16 +233,13 @@ public class ExecutionTests extends AbstractContextTest @Test public void testInvokeAbstract() throws IOException { - AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); - executor.setLocator(locator); - executor.setResolver(simpleMappingExceptionResolver); - executor.setJsonHelper(jsonHelper); + AbstractResourceWebScript executor = getExecutor(); Map templateVars = new HashMap(); templateVars.put("apiScope", "private"); templateVars.put("apiVersion", "1"); templateVars.put("apiName", "alfrescomock"); templateVars.put(ResourceLocator.COLLECTION_RESOURCE, "sheep"); - executor.execute(executor.determineApi(templateVars), mockRequest(templateVars,new HashMap>(1)), mock(WebScriptResponse.class)); + executor.execute(ApiAssistant.determineApi(templateVars), mockRequest(templateVars,new HashMap>(1)), mock(WebScriptResponse.class)); WebScriptResponse response = mockResponse(); templateVars.put(ResourceLocator.COLLECTION_RESOURCE, "bad"); @@ -260,10 +258,8 @@ public class ExecutionTests extends AbstractContextTest @Test public void testInvalidUrls() throws IOException { - AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); - executor.setLocator(locator); - executor.setResolver(simpleMappingExceptionResolver); - executor.setJsonHelper(jsonHelper); + AbstractResourceWebScript executor = getExecutor(); + Map templateVars = new HashMap(); templateVars.put("apiScope", "private"); templateVars.put("apiVersion", "1"); @@ -279,13 +275,11 @@ public class ExecutionTests extends AbstractContextTest @Test public void testRenderError() throws IOException { - AbstractResourceWebScript executor = (AbstractResourceWebScript) applicationContext.getBean("executorOfGets"); - executor.setResolver(simpleMappingExceptionResolver); - executor.setJsonHelper(jsonHelper); + AbstractResourceWebScript executor = getExecutor(); ErrorResponse defaultError = new DefaultExceptionResolver().resolveException(new NullPointerException()); ByteArrayOutputStream out = new ByteArrayOutputStream(); - executor.renderErrorResponse(defaultError, mockResponse(out)); + apiAssistant.renderErrorResponse(defaultError, mockResponse(out)); String errorMessage = out.toString(); // System.out.println(errorMessage); assertTrue(errorMessage.contains("\"errorKey\":\"framework.exception.ApiDefault\"")); @@ -296,7 +290,7 @@ public class ExecutionTests extends AbstractContextTest ErrorResponse anError = simpleMappingExceptionResolver.resolveException(new ApiException("nothing")); out = new ByteArrayOutputStream(); - executor.renderErrorResponse(anError, mockResponse(out)); + apiAssistant.renderErrorResponse(anError, mockResponse(out)); errorMessage = out.toString(); // System.out.println(errorMessage); assertTrue(errorMessage.contains("\"errorKey\":\"nothing\"")); @@ -306,7 +300,7 @@ public class ExecutionTests extends AbstractContextTest anError = simpleMappingExceptionResolver.resolveException(new EntityNotFoundException("2")); out = new ByteArrayOutputStream(); - executor.renderErrorResponse(anError, mockResponse(out)); + apiAssistant.renderErrorResponse(anError, mockResponse(out)); errorMessage = out.toString(); System.out.println(errorMessage); assertTrue(errorMessage.contains("\"errorKey\":\"framework.exception.EntityNotFound\"")); diff --git a/source/test-java/org/alfresco/rest/framework/tests/core/InspectorTests.java b/source/test-java/org/alfresco/rest/framework/tests/core/InspectorTests.java index 1d58c8ab1c..a32019ca47 100644 --- a/source/test-java/org/alfresco/rest/framework/tests/core/InspectorTests.java +++ b/source/test-java/org/alfresco/rest/framework/tests/core/InspectorTests.java @@ -51,6 +51,7 @@ import org.alfresco.rest.framework.tests.api.mocks3.GrassEntityResourceNowDelete import org.alfresco.rest.framework.tests.api.mocks3.SheepBlackSheepResourceIsNoMore; import org.alfresco.rest.framework.tests.api.mocks3.SheepEntityResourceWithDeletedMethods; import org.alfresco.rest.framework.tests.api.mocks3.SlimGoat; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.alfresco.rest.framework.webscripts.ApiWebScript; import org.alfresco.rest.framework.webscripts.WithResponse; import org.alfresco.util.Pair; @@ -440,7 +441,7 @@ public class InspectorTests OperationResourceMetaData operationResourceMetaData = (OperationResourceMetaData) resourceMetadata; Method actionMethod = operationResourceMetaData.getOperationMethod(); String result = null; - final WithResponse wr = new WithResponse(Status.STATUS_OK, ApiWebScript.DEFAULT_JSON_CONTENT, ApiWebScript.CACHE_NEVER); + final WithResponse wr = new WithResponse(Status.STATUS_OK, ApiAssistant.DEFAULT_JSON_CONTENT, ApiAssistant.CACHE_NEVER); switch (resourceMetadata.getUniqueId()) { diff --git a/source/test-java/org/alfresco/rest/framework/tests/core/ParamsExtractorTests.java b/source/test-java/org/alfresco/rest/framework/tests/core/ParamsExtractorTests.java index 613449dcb7..2c6cd05ac4 100644 --- a/source/test-java/org/alfresco/rest/framework/tests/core/ParamsExtractorTests.java +++ b/source/test-java/org/alfresco/rest/framework/tests/core/ParamsExtractorTests.java @@ -33,6 +33,7 @@ import org.alfresco.rest.framework.jacksonextensions.RestJsonModule; import org.alfresco.rest.framework.resource.parameters.Paging; import org.alfresco.rest.framework.resource.parameters.Params; import org.alfresco.rest.framework.tests.api.mocks.Farmer; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.alfresco.rest.framework.webscripts.ParamsExtractor; import org.alfresco.rest.framework.webscripts.ResourceWebScriptDelete; import org.alfresco.rest.framework.webscripts.ResourceWebScriptGet; @@ -57,7 +58,8 @@ import org.springframework.mock.web.MockHttpServletRequest; public class ParamsExtractorTests { static JacksonHelper jsonHelper = null; - + static ApiAssistant assistant = null; + @BeforeClass public static void setupTests() throws Exception { @@ -65,6 +67,9 @@ public class ParamsExtractorTests RestJsonModule module = new RestJsonModule(); jsonHelper.setModule(module); jsonHelper.afterPropertiesSet(); + + assistant = new ApiAssistant(); + assistant.setJsonHelper(jsonHelper); } @Test @@ -132,7 +137,7 @@ public class ParamsExtractorTests { //Put together the stubs ResourceWebScriptPost extractor = new ResourceWebScriptPost(); - extractor.setJsonHelper(jsonHelper); + extractor.setAssistant(assistant); Map templateVars = new HashMap(); Content content = mock(Content.class); @@ -228,7 +233,7 @@ public class ParamsExtractorTests public void testMultiPartPostExtractor() throws Exception { ResourceWebScriptPost extractor = new ResourceWebScriptPost(); - extractor.setJsonHelper(jsonHelper); + extractor.setAssistant(assistant); Map templateVars = new HashMap(); WebScriptRequest request = mock(WebScriptRequest.class); @@ -285,7 +290,7 @@ public class ParamsExtractorTests { //Put together the stubs ResourceWebScriptPut extractor = new ResourceWebScriptPut(); - extractor.setJsonHelper(jsonHelper); + extractor.setAssistant(assistant); Map templateVars = new HashMap(); Content content = mock(Content.class); @@ -405,7 +410,7 @@ public class ParamsExtractorTests { String specialChars = new String(new char[] { (char) '香' }) + " 香蕉"; ResourceWebScriptPost extractor = new ResourceWebScriptPost(); - extractor.setJsonHelper(jsonHelper); + extractor.setAssistant(assistant); Map templateVars = new HashMap(); String mockMe = "{\"name\":\""+specialChars+"\",\"created\":\"2012-03-23T15:56:18.552+0000\",\"age\":54,\"id\":\"1234A3\",\"farm\":\"LARGE\"}"; Content content = mock(Content.class); @@ -427,7 +432,7 @@ public class ParamsExtractorTests //Test passing in special characters as a param. ResourceWebScriptGet getExtractor = new ResourceWebScriptGet(); - getExtractor.setJsonHelper(jsonHelper); + getExtractor.setAssistant(assistant); Map getTemplateVars = new HashMap(); WebScriptRequest getRequest = mock(WebScriptRequest.class); when(getRequest.getServiceMatch()).thenReturn(new Match(null, getTemplateVars, null)); 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 6b93525bbf..9ec24ba0eb 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 @@ -384,7 +384,7 @@ 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"); + AbstractResourceWebScript executor = getExecutor(); Object result = executor.execute(propResource, Params.valueOf("234", null, null), mock(WebScriptResponse.class), true); assertNotNull(result); } diff --git a/source/test-java/org/alfresco/rest/framework/tests/core/WithResponseTest.java b/source/test-java/org/alfresco/rest/framework/tests/core/WithResponseTest.java index bc5c8af2c8..7c9c96a044 100644 --- a/source/test-java/org/alfresco/rest/framework/tests/core/WithResponseTest.java +++ b/source/test-java/org/alfresco/rest/framework/tests/core/WithResponseTest.java @@ -12,6 +12,7 @@ import static org.mockito.Mockito.when; import org.alfresco.rest.framework.resource.content.ContentInfo; import org.alfresco.rest.framework.resource.content.ContentInfoImpl; +import org.alfresco.rest.framework.tools.ApiAssistant; import org.alfresco.rest.framework.webscripts.AbstractResourceWebScript; import org.alfresco.rest.framework.webscripts.ApiWebScript; import org.alfresco.rest.framework.webscripts.ResourceWebScriptDelete; @@ -43,17 +44,17 @@ public class WithResponseTest @Test public void testDefaults() throws Exception { - WithResponse callBack = new WithResponse(Status.STATUS_OK,ApiWebScript.DEFAULT_JSON_CONTENT, ApiWebScript.CACHE_NEVER); + WithResponse callBack = new WithResponse(Status.STATUS_OK,ApiAssistant.DEFAULT_JSON_CONTENT, ApiAssistant.CACHE_NEVER); assertEquals(Status.STATUS_OK, callBack.getStatus()); - assertEquals(ApiWebScript.DEFAULT_JSON_CONTENT, callBack.getContentInfo()); - assertEquals(ApiWebScript.CACHE_NEVER, callBack.getCache()); + assertEquals(ApiAssistant.DEFAULT_JSON_CONTENT, callBack.getContentInfo()); + assertEquals(ApiAssistant.CACHE_NEVER, callBack.getCache()); assertTrue(callBack.getHeaders().isEmpty()); } @Test public void testSetHeader() throws Exception { - WithResponse callBack = new WithResponse(Status.STATUS_OK,ApiWebScript.DEFAULT_JSON_CONTENT, ApiWebScript.CACHE_NEVER); + WithResponse callBack = new WithResponse(Status.STATUS_OK,ApiAssistant.DEFAULT_JSON_CONTENT, ApiAssistant.CACHE_NEVER); callBack.setHeader("king", "can"); callBack.setHeader("king", "kong"); assertTrue(callBack.getHeaders().size() == 1); @@ -65,7 +66,7 @@ public class WithResponseTest @Test public void testAddHeader() throws Exception { - WithResponse callBack = new WithResponse(Status.STATUS_OK,ApiWebScript.DEFAULT_JSON_CONTENT, ApiWebScript.CACHE_NEVER); + WithResponse callBack = new WithResponse(Status.STATUS_OK,ApiAssistant.DEFAULT_JSON_CONTENT, ApiAssistant.CACHE_NEVER); callBack.addHeader("king", "can"); callBack.addHeader("king", "kong"); assertTrue(callBack.getHeaders().size() == 1); @@ -78,7 +79,7 @@ public class WithResponseTest @Test public void testSetters() throws Exception { - WithResponse callBack = new WithResponse(Status.STATUS_OK, ApiWebScript.DEFAULT_JSON_CONTENT, ApiWebScript.CACHE_NEVER); + WithResponse callBack = new WithResponse(Status.STATUS_OK, ApiAssistant.DEFAULT_JSON_CONTENT, ApiAssistant.CACHE_NEVER); callBack.setStatus(Status.STATUS_GONE); Cache myCache = new Cache(new Description.RequiredCache() { @@ -114,7 +115,8 @@ public class WithResponseTest public void testSetResponse() throws Exception { AbstractResourceWebScript responseWriter = new ResourceWebScriptDelete(); - WithResponse wr = new WithResponse(Status.STATUS_OK, ApiWebScript.DEFAULT_JSON_CONTENT, ApiWebScript.CACHE_NEVER); + responseWriter.setAssistant(new ApiAssistant()); + WithResponse wr = new WithResponse(Status.STATUS_OK, ApiAssistant.DEFAULT_JSON_CONTENT, ApiAssistant.CACHE_NEVER); WebScriptResponse response = mock(WebScriptResponse.class); diff --git a/source/test-resources/test-rest-context.xml b/source/test-resources/test-rest-context.xml index dac4e1e42b..28501eff7f 100644 --- a/source/test-resources/test-rest-context.xml +++ b/source/test-resources/test-rest-context.xml @@ -32,6 +32,10 @@ + + + + @@ -77,7 +81,6 @@