Web Script Framework enhancements: ReadOnly transactions, Buffered Responses

- additional 'allow' attribute on <transaction> element in web script descriptor
   - values: readonly, readwrite (default)
   - readonly means that the whole web script executes in read transaction
   - readonly lighter weight; no flushing, no cache checks/updates
- transaction aware web script response buffers
   - only commits to response when trx is committed
   - fixes ALFCOM-2497 - CMIS: createFolder & immediately add document can fail
   - also means errors half-way thru response result in clean response with error contents only
   - readonly transactions are not buffered
- WebScript RepoStore now uses ReadOnly transaction for gets
- CMIS getter Web Scripts set to ReadOnly transaction
- Fix up Web Script pattern that checks for WebScriptServletResponse using instanceof
   - no longer the case, as it may be wrapped in BufferedResponse
   - use getRuntime() instanceof WebScriptServletRuntime and/or
   - WebScriptServletRuntime.getHttpServletResponse/Request(WebScriptReponse r) - returns null, if none

Tests:
- Run CMIS Tests
- Run CMIS BulkCreateSystemTest (now working)
- Run Share

Suggestion:
- Update your 'read' web script descriptors to include <transaction allow="readonly">. This will improve repo performance significantly.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@14670 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
David Caruana
2009-06-11 18:25:59 +00:00
parent 63bc21f5c5
commit 565c57d893
23 changed files with 291 additions and 53 deletions

View File

@@ -46,7 +46,6 @@ import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.web.scripts.Status;
import org.alfresco.web.scripts.WebScriptException;
import org.alfresco.web.scripts.WebScriptResponse;
import org.alfresco.web.scripts.servlet.WebScriptServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -167,11 +166,10 @@ public class AVMRemoteStore extends BaseRemoteStore
}
// set mimetype for the content and the character encoding + length for the stream
WebScriptServletResponse httpRes = (WebScriptServletResponse)res;
httpRes.setContentType(mimetype);
httpRes.getHttpServletResponse().setCharacterEncoding(reader.getEncoding());
httpRes.getHttpServletResponse().setDateHeader("Last-Modified", desc.getModDate());
httpRes.setHeader("Content-Length", Long.toString(reader.getSize()));
res.setContentType(mimetype);
res.setContentEncoding(reader.getEncoding());
res.setHeader("Last-Modified", Long.toString(desc.getModDate()));
res.setHeader("Content-Length", Long.toString(reader.getSize()));
if (logger.isDebugEnabled())
logger.debug("AVMRemoteStore.getDocument() " + mimetype + " of size: " + reader.getSize());

View File

@@ -47,7 +47,7 @@ import org.alfresco.web.scripts.WebScriptException;
import org.alfresco.web.scripts.WebScriptRequest;
import org.alfresco.web.scripts.WebScriptResponse;
import org.alfresco.web.scripts.servlet.HTTPProxy;
import org.alfresco.web.scripts.servlet.WebScriptServletResponse;
import org.alfresco.web.scripts.servlet.WebScriptServletRuntime;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Attribute;
@@ -166,11 +166,12 @@ public class SearchProxy extends AbstractWebScript implements InitializingBean
// issue request against search engine
// NOTE: This web script must be executed in a HTTP servlet environment
if (!(res instanceof WebScriptServletResponse))
if (!(res.getRuntime() instanceof WebScriptServletRuntime))
{
throw new WebScriptException("Search Proxy must be executed in HTTP Servlet environment");
}
HttpServletResponse servletRes = ((WebScriptServletResponse)res).getHttpServletResponse();
HttpServletResponse servletRes = WebScriptServletRuntime.getHttpServletResponse(res);
SearchEngineHttpProxy proxy = new SearchEngineHttpProxy(req.getServicePath() + "/" + req.getContextPath(), engine, engineUrl, servletRes);
proxy.service();
}