diff --git a/config/alfresco/public-rest-context.xml b/config/alfresco/public-rest-context.xml index 327e9fda76..586ea12688 100644 --- a/config/alfresco/public-rest-context.xml +++ b/config/alfresco/public-rest-context.xml @@ -142,9 +142,14 @@ /> --> - + + + + + + @@ -159,7 +164,6 @@ class="org.alfresco.rest.framework.webscripts.ResourceWebScriptGet" parent="apiWebScriptParent"> - @@ -167,7 +171,6 @@ class="org.alfresco.rest.framework.webscripts.ResourceWebScriptPost" parent="apiWebScriptParent"> - @@ -175,7 +178,6 @@ class="org.alfresco.rest.framework.webscripts.ResourceWebScriptPut" parent="apiWebScriptParent"> - @@ -183,7 +185,6 @@ class="org.alfresco.rest.framework.webscripts.ResourceWebScriptDelete" parent="apiWebScriptParent"> - @@ -702,16 +703,14 @@ + class="org.alfresco.rest.api.NetworksWebScriptGet" parent="apiWebScriptParent"> - + class="org.alfresco.rest.api.NetworkWebScriptGet" parent="apiWebScriptParent"> - diff --git a/source/java/org/alfresco/repo/web/scripts/BufferedRequest.java b/source/java/org/alfresco/repo/web/scripts/BufferedRequest.java new file mode 100644 index 0000000000..2e2d3cd706 --- /dev/null +++ b/source/java/org/alfresco/repo/web/scripts/BufferedRequest.java @@ -0,0 +1,365 @@ +package org.alfresco.repo.web.scripts; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.apache.chemistry.opencmis.server.shared.ThresholdOutputStream; +import org.apache.chemistry.opencmis.server.shared.ThresholdOutputStreamFactory; +import org.springframework.extensions.surf.util.Content; +import org.springframework.extensions.webscripts.Description.FormatStyle; +import org.springframework.extensions.webscripts.Match; +import org.springframework.extensions.webscripts.Runtime; +import org.springframework.extensions.webscripts.WebScriptRequest; +import org.springframework.extensions.webscripts.WrappingWebScriptRequest; +import org.springframework.util.FileCopyUtils; + +public class BufferedRequest implements WrappingWebScriptRequest +{ + private ThresholdOutputStreamFactory streamFactory; + private WebScriptRequest req; + private File requestBody; + private InputStream contentStream; + private BufferedReader contentReader; + + public BufferedRequest(WebScriptRequest req, ThresholdOutputStreamFactory streamFactory) + { + this.req = req; + this.streamFactory = streamFactory; + } + + private InputStream bufferInputStream() throws IOException + { + ThresholdOutputStream bufferStream = streamFactory.newOutputStream(); + + try + { + FileCopyUtils.copy(req.getContent().getInputStream(), bufferStream); + } + catch (IOException e) + { + bufferStream.destroy(); // remove temp file + throw e; + } + + return bufferStream.getInputStream(); + } + + public void reset() + { + if (contentStream != null) + { + try + { + contentStream.close(); + } + catch (Exception e) + { + } + contentStream = null; + } + if (contentReader != null) + { + try + { + contentReader.close(); + } + catch (Exception e) + { + } + contentReader = null; + } + } + + public void close() + { + reset(); + if (requestBody != null) + { + try + { + requestBody.delete(); + } + catch (Exception e) + { + } + requestBody = null; + } + } + + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WrappingWebScriptRequest#getNext() + */ + @Override + public WebScriptRequest getNext() + { + return req; + } + + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#forceSuccessStatus() + */ + @Override + public boolean forceSuccessStatus() + { + return req.forceSuccessStatus(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getAgent() + */ + @Override + public String getAgent() + { + return req.getAgent(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getContent() + */ + @Override + public Content getContent() + { + final Content wrapped = req.getContent(); + return new Content(){ + + @Override + public String getContent() throws IOException + { + return wrapped.getContent(); + } + + @Override + public String getEncoding() + { + return wrapped.getEncoding(); + } + + @Override + public String getMimetype() + { + return wrapped.getMimetype(); + } + + + @Override + public long getSize() + { + return wrapped.getSize(); + } + + @Override + public InputStream getInputStream() + { + if (BufferedRequest.this.contentReader != null) + { + throw new IllegalStateException("Reader in use"); + } + if (BufferedRequest.this.contentStream == null) + { + try + { + BufferedRequest.this.contentStream = bufferInputStream(); + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + return BufferedRequest.this.contentStream; + } + + @Override + public BufferedReader getReader() throws IOException + { + if (BufferedRequest.this.contentStream != null) + { + throw new IllegalStateException("Input Stream in use"); + } + if (BufferedRequest.this.contentReader == null) + { + String encoding = wrapped.getEncoding(); + InputStream in = bufferInputStream(); + BufferedRequest.this.contentReader = new BufferedReader(new InputStreamReader(in, encoding == null ? "ISO-8859-1" : encoding)); + } + return BufferedRequest.this.contentReader; + } + }; + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getContentType() + */ + @Override + public String getContentType() + { + return req.getContentType(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getContextPath() + */ + @Override + public String getContextPath() + { + return req.getContextPath(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getExtensionPath() + */ + @Override + public String getExtensionPath() + { + return req.getExtensionPath(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getFormat() + */ + @Override + public String getFormat() + { + return req.getFormat(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getFormatStyle() + */ + @Override + public FormatStyle getFormatStyle() + { + return req.getFormatStyle(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getHeader(java.lang.String) + */ + @Override + public String getHeader(String name) + { + return req.getHeader(name); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getHeaderNames() + */ + @Override + public String[] getHeaderNames() + { + return req.getHeaderNames(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getHeaderValues(java.lang.String) + */ + @Override + public String[] getHeaderValues(String name) + { + return req.getHeaderValues(name); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getJSONCallback() + */ + @Override + public String getJSONCallback() + { + return req.getJSONCallback(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getParameter(java.lang.String) + */ + @Override + public String getParameter(String name) + { + return req.getParameter(name); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getParameterNames() + */ + @Override + public String[] getParameterNames() + { + return req.getParameterNames(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getParameterValues(java.lang.String) + */ + @Override + public String[] getParameterValues(String name) + { + return req.getParameterValues(name); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getPathInfo() + */ + @Override + public String getPathInfo() + { + return req.getPathInfo(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getQueryString() + */ + @Override + public String getQueryString() + { + return req.getQueryString(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getRuntime() + */ + @Override + public Runtime getRuntime() + { + return req.getRuntime(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getServerPath() + */ + @Override + public String getServerPath() + { + return req.getServerPath(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getServiceContextPath() + */ + @Override + public String getServiceContextPath() + { + return req.getServiceContextPath(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getServiceMatch() + */ + @Override + public Match getServiceMatch() + { + return req.getServiceMatch(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getServicePath() + */ + @Override + public String getServicePath() + { + return req.getServicePath(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#getURL() + */ + @Override + public String getURL() + { + return req.getURL(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#isGuest() + */ + @Override + public boolean isGuest() + { + return req.isGuest(); + } + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptRequest#parseContent() + */ + @Override + public Object parseContent() + { + return req.parseContent(); + } +} diff --git a/source/java/org/alfresco/repo/web/scripts/BufferedResponse.java b/source/java/org/alfresco/repo/web/scripts/BufferedResponse.java new file mode 100644 index 0000000000..52f10b454b --- /dev/null +++ b/source/java/org/alfresco/repo/web/scripts/BufferedResponse.java @@ -0,0 +1,231 @@ +package org.alfresco.repo.web.scripts; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.surf.util.StringBuilderWriter; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Runtime; +import org.springframework.extensions.webscripts.WebScriptResponse; +import org.springframework.extensions.webscripts.WrappingWebScriptResponse; + +/** + * Transactional Buffered Response + */ +public class BufferedResponse implements WrappingWebScriptResponse +{ + // Logger + protected static final Log logger = LogFactory.getLog(BufferedResponse.class); + + private WebScriptResponse res; + private int bufferSize; + private ByteArrayOutputStream outputStream = null; + private StringBuilderWriter outputWriter = null; + + + /** + * Construct + * + * @param res + * @param bufferSize + */ + public BufferedResponse(WebScriptResponse res, int bufferSize) + { + this.res = res; + this.bufferSize = bufferSize; + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WrappingWebScriptResponse#getNext() + */ + public WebScriptResponse getNext() + { + return res; + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#addHeader(java.lang.String, java.lang.String) + */ + public void addHeader(String name, String value) + { + res.addHeader(name, value); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#encodeScriptUrl(java.lang.String) + */ + public String encodeScriptUrl(String url) + { + return res.encodeScriptUrl(url); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#getEncodeScriptUrlFunction(java.lang.String) + */ + public String getEncodeScriptUrlFunction(String name) + { + return res.getEncodeScriptUrlFunction(name); + } + + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptResponse#encodeResourceUrl(java.lang.String) + */ + public String encodeResourceUrl(String url) + { + return res.encodeResourceUrl(url); + } + + /* (non-Javadoc) + * @see org.springframework.extensions.webscripts.WebScriptResponse#getEncodeResourceUrlFunction(java.lang.String) + */ + public String getEncodeResourceUrlFunction(String name) + { + return res.getEncodeResourceUrlFunction(name); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#getOutputStream() + */ + public OutputStream getOutputStream() throws IOException + { + if (outputStream == null) + { + if (outputWriter != null) + { + throw new AlfrescoRuntimeException("Already buffering output writer"); + } + this.outputStream = new ByteArrayOutputStream(bufferSize); + } + return outputStream; + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#getRuntime() + */ + public Runtime getRuntime() + { + return res.getRuntime(); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#getWriter() + */ + public Writer getWriter() throws IOException + { + if (outputWriter == null) + { + if (outputStream != null) + { + throw new AlfrescoRuntimeException("Already buffering output stream"); + } + outputWriter = new StringBuilderWriter(bufferSize); + } + return outputWriter; + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#reset() + */ + public void reset() + { + if (outputStream != null) + { + outputStream.reset(); + } + else if (outputWriter != null) + { + outputWriter = null; + } + res.reset(); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#setCache(org.alfresco.web.scripts.Cache) + */ + public void setCache(Cache cache) + { + res.setCache(cache); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#setContentType(java.lang.String) + */ + public void setContentType(String contentType) + { + res.setContentType(contentType); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#setContentEncoding(java.lang.String) + */ + public void setContentEncoding(String contentEncoding) + { + res.setContentEncoding(contentEncoding); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#setHeader(java.lang.String, java.lang.String) + */ + public void setHeader(String name, String value) + { + res.setHeader(name, value); + } + + /* + * (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#setStatus(int) + */ + public void setStatus(int status) + { + res.setStatus(status); + } + + /** + * Write buffered response to underlying response + */ + public void writeResponse() + { + try + { + if (logger.isDebugEnabled() && outputStream != null) + { + logger.debug("Writing Transactional response: size=" + outputStream.size()); + } + + if (outputWriter != null) + { + outputWriter.flush(); + res.getWriter().write(outputWriter.toString()); + } + else if (outputStream != null) + { + if (logger.isDebugEnabled()) + logger.debug("Writing Transactional response: size=" + outputStream.size()); + + outputStream.flush(); + outputStream.writeTo(res.getOutputStream()); + } + } + catch (IOException e) + { + throw new AlfrescoRuntimeException("Failed to commit buffered response", e); + } + } +} diff --git a/source/java/org/alfresco/repo/web/scripts/RepositoryContainer.java b/source/java/org/alfresco/repo/web/scripts/RepositoryContainer.java index fab0d903a6..75d95f7739 100644 --- a/source/java/org/alfresco/repo/web/scripts/RepositoryContainer.java +++ b/source/java/org/alfresco/repo/web/scripts/RepositoryContainer.java @@ -18,14 +18,8 @@ */ package org.alfresco.repo.web.scripts; -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Writer; import java.util.HashMap; import java.util.Map; @@ -33,7 +27,6 @@ import javax.servlet.http.HttpServletResponse; import javax.transaction.Status; import javax.transaction.UserTransaction; -import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.model.Repository; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; @@ -48,34 +41,24 @@ import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.descriptor.DescriptorService; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.TempFileProvider; -import org.apache.chemistry.opencmis.server.shared.ThresholdOutputStream; import org.apache.chemistry.opencmis.server.shared.ThresholdOutputStreamFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.extensions.surf.util.Content; -import org.springframework.extensions.surf.util.StringBuilderWriter; import org.springframework.extensions.webscripts.AbstractRuntimeContainer; import org.springframework.extensions.webscripts.Authenticator; -import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Description; -import org.springframework.extensions.webscripts.Description.FormatStyle; import org.springframework.extensions.webscripts.Description.RequiredAuthentication; import org.springframework.extensions.webscripts.Description.RequiredTransaction; import org.springframework.extensions.webscripts.Description.RequiredTransactionParameters; import org.springframework.extensions.webscripts.Description.TransactionCapability; -import org.springframework.extensions.webscripts.Match; -import org.springframework.extensions.webscripts.Runtime; import org.springframework.extensions.webscripts.ServerModel; import org.springframework.extensions.webscripts.WebScript; import org.springframework.extensions.webscripts.WebScriptException; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; -import org.springframework.extensions.webscripts.WrappingWebScriptRequest; -import org.springframework.extensions.webscripts.WrappingWebScriptResponse; -import org.springframework.util.FileCopyUtils; /** @@ -634,565 +617,4 @@ public class RepositoryContainer extends AbstractRuntimeContainer { super.reset(); } - - /** - * Transactional Buffered Response - */ - private static class BufferedResponse implements WrappingWebScriptResponse - { - private WebScriptResponse res; - private int bufferSize; - private ByteArrayOutputStream outputStream = null; - private StringBuilderWriter outputWriter = null; - - - /** - * Construct - * - * @param res - * @param bufferSize - */ - public BufferedResponse(WebScriptResponse res, int bufferSize) - { - this.res = res; - this.bufferSize = bufferSize; - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WrappingWebScriptResponse#getNext() - */ - public WebScriptResponse getNext() - { - return res; - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#addHeader(java.lang.String, java.lang.String) - */ - public void addHeader(String name, String value) - { - res.addHeader(name, value); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#encodeScriptUrl(java.lang.String) - */ - public String encodeScriptUrl(String url) - { - return res.encodeScriptUrl(url); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#getEncodeScriptUrlFunction(java.lang.String) - */ - public String getEncodeScriptUrlFunction(String name) - { - return res.getEncodeScriptUrlFunction(name); - } - - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptResponse#encodeResourceUrl(java.lang.String) - */ - public String encodeResourceUrl(String url) - { - return res.encodeResourceUrl(url); - } - - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptResponse#getEncodeResourceUrlFunction(java.lang.String) - */ - public String getEncodeResourceUrlFunction(String name) - { - return res.getEncodeResourceUrlFunction(name); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#getOutputStream() - */ - public OutputStream getOutputStream() throws IOException - { - if (outputStream == null) - { - if (outputWriter != null) - { - throw new AlfrescoRuntimeException("Already buffering output writer"); - } - this.outputStream = new ByteArrayOutputStream(bufferSize); - } - return outputStream; - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#getRuntime() - */ - public Runtime getRuntime() - { - return res.getRuntime(); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#getWriter() - */ - public Writer getWriter() throws IOException - { - if (outputWriter == null) - { - if (outputStream != null) - { - throw new AlfrescoRuntimeException("Already buffering output stream"); - } - outputWriter = new StringBuilderWriter(bufferSize); - } - return outputWriter; - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#reset() - */ - public void reset() - { - if (outputStream != null) - { - outputStream.reset(); - } - else if (outputWriter != null) - { - outputWriter = null; - } - res.reset(); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#setCache(org.alfresco.web.scripts.Cache) - */ - public void setCache(Cache cache) - { - res.setCache(cache); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#setContentType(java.lang.String) - */ - public void setContentType(String contentType) - { - res.setContentType(contentType); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#setContentEncoding(java.lang.String) - */ - public void setContentEncoding(String contentEncoding) - { - res.setContentEncoding(contentEncoding); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#setHeader(java.lang.String, java.lang.String) - */ - public void setHeader(String name, String value) - { - res.setHeader(name, value); - } - - /* - * (non-Javadoc) - * @see org.alfresco.web.scripts.WebScriptResponse#setStatus(int) - */ - public void setStatus(int status) - { - res.setStatus(status); - } - - /** - * Write buffered response to underlying response - */ - private void writeResponse() - { - try - { - if (logger.isDebugEnabled() && outputStream != null) - { - logger.debug("Writing Transactional response: size=" + outputStream.size()); - } - - if (outputWriter != null) - { - outputWriter.flush(); - res.getWriter().write(outputWriter.toString()); - } - else if (outputStream != null) - { - if (logger.isDebugEnabled()) - logger.debug("Writing Transactional response: size=" + outputStream.size()); - - outputStream.flush(); - outputStream.writeTo(res.getOutputStream()); - } - } - catch (IOException e) - { - throw new AlfrescoRuntimeException("Failed to commit buffered response", e); - } - } - } - - private static class BufferedRequest implements WrappingWebScriptRequest - { - private ThresholdOutputStreamFactory streamFactory; - private WebScriptRequest req; - private File requestBody; - private InputStream contentStream; - private BufferedReader contentReader; - - public BufferedRequest(WebScriptRequest req, ThresholdOutputStreamFactory streamFactory) - { - this.req = req; - this.streamFactory = streamFactory; - } - - private InputStream bufferInputStream() throws IOException - { - ThresholdOutputStream bufferStream = streamFactory.newOutputStream(); - - try - { - FileCopyUtils.copy(req.getContent().getInputStream(), bufferStream); - } - catch (IOException e) - { - bufferStream.destroy(); // remove temp file - throw e; - } - - return bufferStream.getInputStream(); - } - - public void reset() - { - if (contentStream != null) - { - try - { - contentStream.close(); - } - catch (Exception e) - { - } - contentStream = null; - } - if (contentReader != null) - { - try - { - contentReader.close(); - } - catch (Exception e) - { - } - contentReader = null; - } - } - - public void close() - { - reset(); - if (requestBody != null) - { - try - { - requestBody.delete(); - } - catch (Exception e) - { - } - requestBody = null; - } - } - - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WrappingWebScriptRequest#getNext() - */ - @Override - public WebScriptRequest getNext() - { - return req; - } - - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#forceSuccessStatus() - */ - @Override - public boolean forceSuccessStatus() - { - return req.forceSuccessStatus(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getAgent() - */ - @Override - public String getAgent() - { - return req.getAgent(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getContent() - */ - @Override - public Content getContent() - { - final Content wrapped = req.getContent(); - return new Content(){ - - @Override - public String getContent() throws IOException - { - return wrapped.getContent(); - } - - @Override - public String getEncoding() - { - return wrapped.getEncoding(); - } - - @Override - public String getMimetype() - { - return wrapped.getMimetype(); - } - - - @Override - public long getSize() - { - return wrapped.getSize(); - } - - @Override - public InputStream getInputStream() - { - if (BufferedRequest.this.contentReader != null) - { - throw new IllegalStateException("Reader in use"); - } - if (BufferedRequest.this.contentStream == null) - { - try - { - BufferedRequest.this.contentStream = bufferInputStream(); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - return BufferedRequest.this.contentStream; - } - - @Override - public BufferedReader getReader() throws IOException - { - if (BufferedRequest.this.contentStream != null) - { - throw new IllegalStateException("Input Stream in use"); - } - if (BufferedRequest.this.contentReader == null) - { - String encoding = wrapped.getEncoding(); - InputStream in = bufferInputStream(); - BufferedRequest.this.contentReader = new BufferedReader(new InputStreamReader(in, encoding == null ? "ISO-8859-1" : encoding)); - } - return BufferedRequest.this.contentReader; - } - }; - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getContentType() - */ - @Override - public String getContentType() - { - return req.getContentType(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getContextPath() - */ - @Override - public String getContextPath() - { - return req.getContextPath(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getExtensionPath() - */ - @Override - public String getExtensionPath() - { - return req.getExtensionPath(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getFormat() - */ - @Override - public String getFormat() - { - return req.getFormat(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getFormatStyle() - */ - @Override - public FormatStyle getFormatStyle() - { - return req.getFormatStyle(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getHeader(java.lang.String) - */ - @Override - public String getHeader(String name) - { - return req.getHeader(name); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getHeaderNames() - */ - @Override - public String[] getHeaderNames() - { - return req.getHeaderNames(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getHeaderValues(java.lang.String) - */ - @Override - public String[] getHeaderValues(String name) - { - return req.getHeaderValues(name); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getJSONCallback() - */ - @Override - public String getJSONCallback() - { - return req.getJSONCallback(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getParameter(java.lang.String) - */ - @Override - public String getParameter(String name) - { - return req.getParameter(name); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getParameterNames() - */ - @Override - public String[] getParameterNames() - { - return req.getParameterNames(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getParameterValues(java.lang.String) - */ - @Override - public String[] getParameterValues(String name) - { - return req.getParameterValues(name); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getPathInfo() - */ - @Override - public String getPathInfo() - { - return req.getPathInfo(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getQueryString() - */ - @Override - public String getQueryString() - { - return req.getQueryString(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getRuntime() - */ - @Override - public Runtime getRuntime() - { - return req.getRuntime(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getServerPath() - */ - @Override - public String getServerPath() - { - return req.getServerPath(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getServiceContextPath() - */ - @Override - public String getServiceContextPath() - { - return req.getServiceContextPath(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getServiceMatch() - */ - @Override - public Match getServiceMatch() - { - return req.getServiceMatch(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getServicePath() - */ - @Override - public String getServicePath() - { - return req.getServicePath(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#getURL() - */ - @Override - public String getURL() - { - return req.getURL(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#isGuest() - */ - @Override - public boolean isGuest() - { - return req.isGuest(); - } - /* (non-Javadoc) - * @see org.springframework.extensions.webscripts.WebScriptRequest#parseContent() - */ - @Override - public Object parseContent() - { - return req.parseContent(); - } - } } diff --git a/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java b/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java index 4557d353de..14fe1c82a1 100644 --- a/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java +++ b/source/java/org/alfresco/rest/api/NetworkWebScriptGet.java @@ -4,34 +4,30 @@ import java.io.IOException; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.tenant.TenantUtil; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.rest.api.model.PersonNetwork; import org.alfresco.rest.api.networks.NetworksEntityResource; import org.alfresco.rest.framework.Api; +import org.alfresco.rest.framework.core.exceptions.ApiException; import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException; -import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper.Writer; import org.alfresco.rest.framework.resource.parameters.Params; +import org.alfresco.rest.framework.webscripts.ApiWebScript; import org.alfresco.rest.framework.webscripts.ResourceWebScriptHelper; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; -import org.springframework.extensions.webscripts.AbstractWebScript; import org.springframework.extensions.webscripts.Format; +import org.springframework.extensions.webscripts.WebScriptException; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; -public class NetworkWebScriptGet extends AbstractWebScript +public class NetworkWebScriptGet extends ApiWebScript { private Networks networks; - private JacksonHelper jsonHelper; private ResourceWebScriptHelper helper; - public void setJsonHelper(JacksonHelper jsonHelper) - { - this.jsonHelper = jsonHelper; - } - public void setHelper(ResourceWebScriptHelper helper) { this.helper = helper; @@ -42,36 +38,60 @@ public class NetworkWebScriptGet extends AbstractWebScript this.networks = networks; } - @Override - public void execute(final WebScriptRequest req, WebScriptResponse res) throws IOException - { - // apply content type - res.setContentType(Format.JSON.mimetype() + ";charset=UTF-8"); - - jsonHelper.withWriter(res.getOutputStream(), new Writer() + @Override + public void execute(final Api api, final WebScriptRequest req, final WebScriptResponse res) throws IOException + { + try { - @Override - public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) - throws JsonGenerationException, JsonMappingException, IOException + transactionService.getRetryingTransactionHelper().doInTransaction( + new RetryingTransactionCallback() { - String personId = AuthenticationUtil.getFullyAuthenticatedUser(); - String networkId = TenantUtil.getCurrentDomain(); - - PersonNetwork networkMembership = networks.getNetwork(personId, networkId); - if(networkMembership != null) - { - // TODO this is not ideal, but the only way to populate the embedded network entities (this would normally be - // done automatically by the api framework). - Object wrapped = helper.postProcessResponse(Api.ALFRESCO_PUBLIC, NetworksEntityResource.NAME, Params.valueOf(personId, null), networkMembership); - - objectMapper.writeValue(generator, wrapped); - } - else - { - throw new EntityNotFoundException(networkId); - } - } - }); - } + @Override + public Void execute() throws Throwable + { + // apply content type + res.setContentType(Format.JSON.mimetype() + ";charset=UTF-8"); + + jsonHelper.withWriter(res.getOutputStream(), new Writer() + { + @Override + public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) + throws JsonGenerationException, JsonMappingException, IOException + { + String personId = AuthenticationUtil.getFullyAuthenticatedUser(); + String networkId = TenantUtil.getCurrentDomain(); + + PersonNetwork networkMembership = networks.getNetwork(personId, networkId); + if(networkMembership != null) + { + // TODO this is not ideal, but the only way to populate the embedded network entities (this would normally be + // done automatically by the api framework). + Object wrapped = helper.postProcessResponse(Api.ALFRESCO_PUBLIC, NetworksEntityResource.NAME, Params.valueOf(personId, null), networkMembership); + + objectMapper.writeValue(generator, wrapped); + } + else + { + throw new EntityNotFoundException(networkId); + } + } + }); + return null; + } + }, true, true); + } + catch (ApiException apiException) + { + renderErrorResponse(resolveException(apiException), res); + } + catch (WebScriptException webException) + { + renderErrorResponse(resolveException(webException), res); + } + catch (RuntimeException runtimeException) + { + renderErrorResponse(resolveException(runtimeException), res); + } + } } diff --git a/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java b/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java index 3bda0c7a65..5677ecda9a 100644 --- a/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java +++ b/source/java/org/alfresco/rest/api/NetworksWebScriptGet.java @@ -23,21 +23,23 @@ import java.util.ArrayList; import java.util.List; import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.rest.api.model.PersonNetwork; import org.alfresco.rest.api.networks.NetworksEntityResource; import org.alfresco.rest.framework.Api; -import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; +import org.alfresco.rest.framework.core.exceptions.ApiException; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper.Writer; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.Paging; import org.alfresco.rest.framework.resource.parameters.Params; +import org.alfresco.rest.framework.webscripts.ApiWebScript; import org.alfresco.rest.framework.webscripts.ResourceWebScriptHelper; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; -import org.springframework.extensions.webscripts.AbstractWebScript; import org.springframework.extensions.webscripts.Format; +import org.springframework.extensions.webscripts.WebScriptException; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; @@ -47,17 +49,11 @@ import org.springframework.extensions.webscripts.WebScriptResponse; * @author steveglover * */ -public class NetworksWebScriptGet extends AbstractWebScript +public class NetworksWebScriptGet extends ApiWebScript { private Networks networks; - private JacksonHelper jsonHelper; private ResourceWebScriptHelper helper; - public void setJsonHelper(JacksonHelper jsonHelper) - { - this.jsonHelper = jsonHelper; - } - public void setHelper(ResourceWebScriptHelper helper) { this.helper = helper; @@ -68,35 +64,60 @@ public class NetworksWebScriptGet extends AbstractWebScript this.networks = networks; } - @Override - public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException - { - final Paging paging = ResourceWebScriptHelper.findPaging(req); - - // apply content type - res.setContentType(Format.JSON.mimetype() + ";charset=UTF-8"); - - jsonHelper.withWriter(res.getOutputStream(), new Writer() + @Override + public void execute(final Api api, final WebScriptRequest req, final WebScriptResponse res) throws IOException + { + try { - @Override - public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) - throws JsonGenerationException, JsonMappingException, IOException + transactionService.getRetryingTransactionHelper().doInTransaction( + new RetryingTransactionCallback() { - List entities = new ArrayList(); - - String personId = AuthenticationUtil.getFullyAuthenticatedUser(); - - CollectionWithPagingInfo networkMemberships = networks.getNetworks(personId, paging); - for (PersonNetwork networkMember : networkMemberships.getCollection()) + @Override + public Void execute() throws Throwable { - // TODO this is not ideal, but the only way to populate the embedded network entities (this would normally be - // done automatically by the api framework). - Object wrapped = helper.postProcessResponse(Api.ALFRESCO_PUBLIC, NetworksEntityResource.NAME, Params.valueOf(personId, null), networkMember); - entities.add(wrapped); + final Paging paging = ResourceWebScriptHelper.findPaging(req); + + // apply content type + res.setContentType(Format.JSON.mimetype() + ";charset=UTF-8"); + + jsonHelper.withWriter(res.getOutputStream(), new Writer() + { + @Override + public void writeContents(JsonGenerator generator, ObjectMapper objectMapper) + throws JsonGenerationException, JsonMappingException, IOException + { + List entities = new ArrayList(); + + String personId = AuthenticationUtil.getFullyAuthenticatedUser(); + + CollectionWithPagingInfo networkMemberships = networks.getNetworks(personId, paging); + for (PersonNetwork networkMember : networkMemberships.getCollection()) + { + // TODO this is not ideal, but the only way to populate the embedded network entities (this would normally be + // done automatically by the api framework). + Object wrapped = helper.postProcessResponse(Api.ALFRESCO_PUBLIC, NetworksEntityResource.NAME, Params.valueOf(personId, null), networkMember); + entities.add(wrapped); + } + + objectMapper.writeValue(generator, CollectionWithPagingInfo.asPaged(paging, entities)); + } + }); + + return null; } - - objectMapper.writeValue(generator, CollectionWithPagingInfo.asPaged(paging, entities)); - } - }); - } + }, true, true); + } + catch (ApiException apiException) + { + renderErrorResponse(resolveException(apiException), res); + } + catch (WebScriptException webException) + { + renderErrorResponse(resolveException(webException), res); + } + catch (RuntimeException runtimeException) + { + renderErrorResponse(resolveException(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 b3d3c9e20e..a7132e8b40 100644 --- a/source/java/org/alfresco/rest/api/PublicApiDeclarativeRegistry.java +++ b/source/java/org/alfresco/rest/api/PublicApiDeclarativeRegistry.java @@ -18,7 +18,6 @@ */ package org.alfresco.rest.api; -import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -62,13 +61,19 @@ public class PublicApiDeclarativeRegistry extends DeclarativeRegistry { if(method.equalsIgnoreCase("get") && uri.equals(PublicApiTenantWebScriptServletRequest.NETWORKS_PATH)) { - Map templateVars = Collections.emptyMap(); + Map templateVars = new HashMap(); + templateVars.put("apiScope", "public"); + templateVars.put("apiVersion", "1"); + templateVars.put("apiName", "networks"); Match match = new Match("", templateVars, "", getNetworksWebScript); return match; } else if(method.equalsIgnoreCase("get") && uri.equals(PublicApiTenantWebScriptServletRequest.NETWORK_PATH)) { - Map templateVars = new HashMap(); + Map templateVars = new HashMap(); + templateVars.put("apiScope", "public"); + templateVars.put("apiVersion", "1"); + templateVars.put("apiName", "network"); Match match = new Match("", templateVars, "", getNetworkWebScript); return match; } diff --git a/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java b/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java index ee664e6ccc..74b6efa12e 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java +++ b/source/java/org/alfresco/rest/framework/webscripts/AbstractResourceWebScript.java @@ -17,7 +17,6 @@ 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.service.transaction.TransactionService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.JsonGenerationException; @@ -52,7 +51,6 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements private ParamsExtractor paramsExtractor; private ContentStreamer streamer; protected ResourceWebScriptHelper helper; - protected TransactionService transactionService; @SuppressWarnings("rawtypes") @Override @@ -60,13 +58,12 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements { try { - final Map respons = new HashMap(); final Map 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()); - + //This execution usually takes place in a Retrying Transaction (see subclasses) executor.execute(resource, params, new ExecutionCallback() { @@ -172,11 +169,6 @@ public abstract class AbstractResourceWebScript extends ApiWebScript implements //Ignore all params and return this return this; } - - public void setTransactionService(TransactionService transactionService) - { - this.transactionService = transactionService; - } public void setLocator(ResourceLocator locator) { diff --git a/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java b/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java index e7dd7a7116..b17fa50685 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java @@ -1,8 +1,11 @@ package org.alfresco.rest.framework.webscripts; +import java.io.File; import java.io.IOException; import java.util.Map; +import org.alfresco.repo.web.scripts.BufferedRequest; +import org.alfresco.repo.web.scripts.BufferedResponse; import org.alfresco.rest.framework.Api; import org.alfresco.rest.framework.core.exceptions.DefaultExceptionResolver; import org.alfresco.rest.framework.core.exceptions.ErrorResponse; @@ -11,6 +14,9 @@ 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.service.transaction.TransactionService; +import org.alfresco.util.TempFileProvider; +import org.apache.chemistry.opencmis.server.shared.ThresholdOutputStreamFactory; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.JsonMappingException; @@ -36,6 +42,54 @@ public abstract class ApiWebScript extends AbstractWebScript ExceptionResolver defaultResolver = new DefaultExceptionResolver(); ExceptionResolver resolver; + protected boolean encryptTempFiles = false; + protected String tempDirectoryName = null; + protected int memoryThreshold = 4 * 1024 * 1024; // 4mb + protected long maxContentSize = (long) 4 * 1024 * 1024 * 1024; // 4gb + protected ThresholdOutputStreamFactory streamFactory = null; + protected TransactionService transactionService; + + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } + + public void setDefaultResolver(ExceptionResolver defaultResolver) + { + this.defaultResolver = defaultResolver; + } + + public void setTempDirectoryName(String tempDirectoryName) + { + this.tempDirectoryName = tempDirectoryName; + } + + public void setEncryptTempFiles(boolean encryptTempFiles) + { + this.encryptTempFiles = encryptTempFiles; + } + + public void setMemoryThreshold(int memoryThreshold) + { + this.memoryThreshold = memoryThreshold; + } + + public void setMaxContentSize(long maxContentSize) + { + this.maxContentSize = maxContentSize; + } + + public void setStreamFactory(ThresholdOutputStreamFactory streamFactory) + { + this.streamFactory = streamFactory; + } + + public void init() + { + File tempDirectory = new File(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() { @@ -64,7 +118,28 @@ public abstract class ApiWebScript extends AbstractWebScript { Map templateVars = req.getServiceMatch().getTemplateVars(); Api api = determineApi(templateVars); - execute(api, req, res); + + final BufferedRequest bufferedReq = getRequest(req); + final BufferedResponse bufferedRes = getResponse(res); + + try + { + execute(api, bufferedReq, bufferedRes); + } + finally + { + // Get rid of any temporary files + if (bufferedReq != null) + { + bufferedReq.close(); + } + } + + // Ensure a response is always flushed after successful execution + if (bufferedRes != null) + { + bufferedRes.writeResponse(); + } } private Api determineApi(Map templateVars) @@ -85,6 +160,20 @@ public abstract class ApiWebScript extends AbstractWebScript return error; } + protected BufferedRequest getRequest(final WebScriptRequest req) + { + // create buffered request and response that allow transaction retrying + final BufferedRequest bufferedReq = new BufferedRequest(req, streamFactory); + return bufferedReq; + } + + protected BufferedResponse getResponse(final WebScriptResponse resp) + { + // create buffered request and response that allow transaction retrying + final BufferedResponse bufferedRes = new BufferedResponse(resp, memoryThreshold); + return bufferedRes; + } + public abstract void execute(final Api api, WebScriptRequest req, WebScriptResponse res) throws IOException; /** diff --git a/source/test-java/org/alfresco/rest/api/tests/TestNetworks.java b/source/test-java/org/alfresco/rest/api/tests/TestNetworks.java index 4cfb500c7f..79a5a9cd15 100644 --- a/source/test-java/org/alfresco/rest/api/tests/TestNetworks.java +++ b/source/test-java/org/alfresco/rest/api/tests/TestNetworks.java @@ -405,5 +405,21 @@ public class TestNetworks extends EnterpriseTestApi Person ret = peopleProxy.getPerson(person31.getId()); person31.expected(ret); } + + // ALF-20216, ALF-20217, ALF-20098 + // http://localhost:8080/alfresco/api/-default- + @Test + public void testALF20098() throws Exception + { + final TestNetwork testAccount = getTestFixture().getRandomNetwork(); + Iterator personIt = testAccount.getPeople().iterator(); + final TestPerson person = personIt.next(); + + RequestContext rc = new RequestContext("-default-", person.getId()); + publicApiClient.setRequestContext(rc); + + HttpResponse response = publicApiClient.get("/-default-", null); + assertEquals(200, response.getStatusCode()); + } }