Merged HEAD-BUG-FIX (5.0/Cloud) to HEAD (5.0/Cloud)

75026: Merged WAT2 (5.0/Cloud) to HEAD-BUG-FIX (5.0/Cloud)
      71710: Raises a ContentReadEvent when content is downloaded via webdav


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@75354 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Will Abson
2014-07-01 15:09:29 +00:00
parent c28ef528ce
commit 9f32c46002
3 changed files with 52 additions and 2 deletions

View File

@@ -77,6 +77,7 @@
<property name="urlPathPrefix"> <property name="urlPathPrefix">
<value>${system.webdav.url.path.prefix}</value> <value>${system.webdav.url.path.prefix}</value>
</property> </property>
<property name="eventPublisher" ref="eventPublisher" />
</bean> </bean>
<bean id="defaultImageResolver" class="org.alfresco.repo.utils.FacesImageResolver" /> <bean id="defaultImageResolver" class="org.alfresco.repo.utils.FacesImageResolver" />

View File

@@ -314,6 +314,7 @@ public class GetMethod extends WebDAVMethod
{ {
if (byteRanges != null && byteRanges.startsWith(RANGE_HEADER_UNIT_SPECIFIER)) if (byteRanges != null && byteRanges.startsWith(RANGE_HEADER_UNIT_SPECIFIER))
{ {
m_davHelper.publishReadEvent(realNodeInfo, reader.getMimetype(), reader.getSize(), byteRanges.substring(6), reader.getEncoding());
HttpRangeProcessor rangeProcessor = new HttpRangeProcessor(getContentService()); HttpRangeProcessor rangeProcessor = new HttpRangeProcessor(getContentService());
String userAgent = m_request.getHeader(WebDAV.HEADER_USER_AGENT); String userAgent = m_request.getHeader(WebDAV.HEADER_USER_AGENT);
@@ -336,7 +337,7 @@ public class GetMethod extends WebDAVMethod
// there is content associated with the node // there is content associated with the node
m_response.setHeader(WebDAV.HEADER_CONTENT_LENGTH, Long.toString(reader.getSize())); m_response.setHeader(WebDAV.HEADER_CONTENT_LENGTH, Long.toString(reader.getSize()));
m_response.setHeader(WebDAV.HEADER_CONTENT_TYPE, reader.getMimetype()); m_response.setHeader(WebDAV.HEADER_CONTENT_TYPE, reader.getMimetype());
m_davHelper.publishReadEvent(realNodeInfo, reader.getMimetype(), reader.getSize(), null, reader.getEncoding());
// copy the content to the response output stream // copy the content to the response output stream
reader.getContent(m_response.getOutputStream()); reader.getContent(m_response.getOutputStream());
} }

View File

@@ -32,8 +32,13 @@ import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.alfresco.events.types.ContentReadEvent;
import org.alfresco.events.types.ContentReadRangeEvent;
import org.alfresco.events.types.Event;
import org.alfresco.jlan.util.IPAddress; import org.alfresco.jlan.util.IPAddress;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.events.EventPreparator;
import org.alfresco.repo.events.EventPublisher;
import org.alfresco.repo.lock.LockUtils; import org.alfresco.repo.lock.LockUtils;
import org.alfresco.repo.model.filefolder.HiddenAspect; import org.alfresco.repo.model.filefolder.HiddenAspect;
import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.BehaviourFilter;
@@ -56,6 +61,7 @@ import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.util.EqualsHelper; import org.alfresco.util.EqualsHelper;
import org.alfresco.util.FileFilterMode.Client;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.URLDecoder; import org.springframework.extensions.surf.util.URLDecoder;
@@ -86,7 +92,7 @@ public class WebDAVHelper
// Logging // Logging
protected static Log logger = LogFactory.getLog("org.alfresco.webdav.protocol"); protected static Log logger = LogFactory.getLog("org.alfresco.webdav.protocol");
// Service registry TODO: eliminate this - not dependency injection! // Service registry TODO: eliminate this - not dependency injection!
private ServiceRegistry m_serviceRegistry; private ServiceRegistry m_serviceRegistry;
@@ -103,6 +109,7 @@ public class WebDAVHelper
private PermissionService m_permissionService; private PermissionService m_permissionService;
private TenantService m_tenantService; private TenantService m_tenantService;
private HiddenAspect m_hiddenAspect; private HiddenAspect m_hiddenAspect;
private EventPublisher eventPublisher;
// pattern is tested against full path after it has been lower cased. // pattern is tested against full path after it has been lower cased.
private Pattern m_renameShufflePattern = Pattern.compile("(.*/\\..*)|(.*[a-f0-9]{8}+$)|(.*\\.tmp$)|(.*\\.wbk$)|(.*\\.bak$)|(.*\\~$)|(.*backup.*\\.do[ct]{1}[x]?[m]?$)|(.*\\.sb\\-\\w{8}\\-\\w{6}$)"); private Pattern m_renameShufflePattern = Pattern.compile("(.*/\\..*)|(.*[a-f0-9]{8}+$)|(.*\\.tmp$)|(.*\\.wbk$)|(.*\\.bak$)|(.*\\~$)|(.*backup.*\\.do[ct]{1}[x]?[m]?$)|(.*\\.sb\\-\\w{8}\\-\\w{6}$)");
@@ -318,6 +325,14 @@ public class WebDAVHelper
this.m_namespaceService = namespaceService; this.m_namespaceService = namespaceService;
} }
/**
* @param eventPublisher the eventPublisher service
*/
public void setEventPublisher(EventPublisher eventPublisher)
{
this.eventPublisher = eventPublisher;
}
/** /**
* @param dictionaryService the dictionary service * @param dictionaryService the dictionary service
*/ */
@@ -1063,6 +1078,39 @@ public class WebDAVHelper
return urlStr.toString(); return urlStr.toString();
} }
/**
* Notifies listeners that a read has taken place
* @param nodeRef
* @param propertyQName
* @param attach
* @param mimetype
* @param size
*/
protected void publishReadEvent(final FileInfo realNodeInfo, final String mimetype, final Long size, final String contentEncoding, final String range)
{
eventPublisher.publishEvent(new EventPreparator(){
@Override
public Event prepareEvent(String user, String networkId, String transactionId)
{
SiteService siteService = getServiceRegistry().getSiteService();
final String siteId = siteService.getSiteShortName(realNodeInfo.getNodeRef());
if (StringUtils.hasText(range))
{
return new ContentReadRangeEvent(user, networkId, transactionId, realNodeInfo.getNodeRef().getId(),
siteId, realNodeInfo.getType().toString(), Client.webdav, mimetype, size, contentEncoding, range);
}
else
{
return new ContentReadEvent(ContentReadEvent.DOWNLOAD, user, networkId, transactionId, realNodeInfo.getNodeRef().getId(),
siteId, realNodeInfo.getType().toString(), Client.webdav, mimetype, size, contentEncoding);
}
}
});
}
public String getRepositoryPath(HttpServletRequest request) public String getRepositoryPath(HttpServletRequest request)
{ {
// Try and get the path // Try and get the path