MNT-12360 - Error on Alfresco Cloud accessing a content item: java.lang.OutOfMemoryError

- Fix to ensure download webscript is only using a readonly (non-buffered) txn
 - Activity creation only now performed in a new WRITE txn
 - UserAgent fix - handle as lowercase to avoid "FireFox" and "Firefox" issue - also added IE11 support to RFC5987 detection

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@86278 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2014-10-02 13:23:26 +00:00
parent a0c3fac7ba
commit f27b2d4873
4 changed files with 27 additions and 12 deletions

View File

@@ -7,6 +7,6 @@
<url>/slingshot/node/{store_type}/{store_id}/{id}/content{property}/{filename}?a={attach?}</url> <url>/slingshot/node/{store_type}/{store_id}/{id}/content{property}/{filename}?a={attach?}</url>
<format default="">argument</format> <format default="">argument</format>
<authentication>user</authentication> <authentication>user</authentication>
<transaction>required</transaction> <transaction allow="readonly">required</transaction>
<lifecycle>internal</lifecycle> <lifecycle>internal</lifecycle>
</webscript> </webscript>

View File

@@ -1855,6 +1855,7 @@
<bean id="webscript.org.alfresco.slingshot.download.get" class="org.alfresco.slingshot.web.scripts.SlingshotContentGet" parent="webscript.org.alfresco.content.content.get"> <bean id="webscript.org.alfresco.slingshot.download.get" class="org.alfresco.slingshot.web.scripts.SlingshotContentGet" parent="webscript.org.alfresco.content.content.get">
<property name="siteService" ref="SiteService" /> <property name="siteService" ref="SiteService" />
<property name="poster" ref="activitiesPoster" /> <property name="poster" ref="activitiesPoster" />
<property name="transactionHelper" ref="retryingTransactionHelper" />
</bean> </bean>
<!-- Node browser web script --> <!-- Node browser web script -->

View File

@@ -142,16 +142,16 @@ public class ContentGet extends StreamContent implements ServletContextAware
private void streamContentLocal(WebScriptRequest req, WebScriptResponse res, NodeRef nodeRef, boolean attach, QName propertyQName) throws IOException private void streamContentLocal(WebScriptRequest req, WebScriptResponse res, NodeRef nodeRef, boolean attach, QName propertyQName) throws IOException
{ {
String userAgent = req.getHeader("User-Agent"); String userAgent = req.getHeader("User-Agent");
userAgent = userAgent != null ? userAgent.toLowerCase() : "";
boolean rfc5987Supported = (null != userAgent) && (userAgent.contains("MSIE") || userAgent.contains(" Chrome/") || userAgent.contains(" FireFox/")); boolean rfc5987Supported = (userAgent.contains("msie") || userAgent.contains(" trident/") || userAgent.contains(" chrome/") || userAgent.contains(" firefox/"));
if (attach && rfc5987Supported) if (attach && rfc5987Supported)
{ {
String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
//IE use file extension to get mimetype // IE use file extension to get mimetype
//So we set correct extension. see MNT-11246 // So we set correct extension. see MNT-11246
if(userAgent.contains("MSIE")) if (userAgent.contains("msie") || userAgent.contains(" trident/"))
{ {
String mimeType = contentService.getReader(nodeRef, propertyQName).getMimetype(); String mimeType = contentService.getReader(nodeRef, propertyQName).getMimetype();
if (!mimetypeService.getMimetypes(FilenameUtils.getExtension(name)).contains(mimeType)) if (!mimetypeService.getMimetypes(FilenameUtils.getExtension(name)).contains(mimeType))

View File

@@ -24,6 +24,8 @@ import java.util.Map;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.Client; import org.alfresco.repo.Client;
import org.alfresco.repo.Client.ClientType; import org.alfresco.repo.Client.ClientType;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.repo.web.scripts.content.ContentGet; import org.alfresco.repo.web.scripts.content.ContentGet;
import org.alfresco.service.cmr.activities.ActivityPoster; import org.alfresco.service.cmr.activities.ActivityPoster;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
@@ -48,6 +50,7 @@ public class SlingshotContentGet extends ContentGet
{ {
protected SiteService siteService; protected SiteService siteService;
private ActivityPoster poster; private ActivityPoster poster;
private RetryingTransactionHelper transactionHelper;
public void setSiteService(SiteService siteService) public void setSiteService(SiteService siteService)
{ {
@@ -59,9 +62,12 @@ public class SlingshotContentGet extends ContentGet
this.poster = poster; this.poster = poster;
} }
/* (non-Javadoc) public void setTransactionHelper(RetryingTransactionHelper transactionHelper)
* @see org.alfresco.repo.web.scripts.content.ContentGet#execute(org.springframework.extensions.webscripts.WebScriptRequest, org.springframework.extensions.webscripts.WebScriptResponse) {
*/ this.transactionHelper = transactionHelper;
}
@Override @Override
public void execute(final WebScriptRequest req, final WebScriptResponse res) throws IOException public void execute(final WebScriptRequest req, final WebScriptResponse res) throws IOException
{ {
@@ -87,9 +93,17 @@ public class SlingshotContentGet extends ContentGet
{ {
filename = (String)this.nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); filename = (String)this.nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
} }
// post an activity - mirror the mechanism as if from the Share application final String strFilename = filename;
poster.postFileFolderActivity(ActivityPoster.DOWNLOADED, null, null, transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>() {
site.getShortName(), null, nodeRef, filename, "documentlibrary", Client.asType(ClientType.webclient), null); @Override
public Void execute() throws Throwable
{
// post an activity - mirror the mechanism as if from the Share application
poster.postFileFolderActivity(ActivityPoster.DOWNLOADED, null, null,
site.getShortName(), null, nodeRef, strFilename, "documentlibrary", Client.asType(ClientType.webclient), null);
return null;
}
}, false, true);
} }
} }
} }