diff --git a/config/alfresco/remote-api-context.xml b/config/alfresco/remote-api-context.xml index 598465db4f..b1fddde825 100644 --- a/config/alfresco/remote-api-context.xml +++ b/config/alfresco/remote-api-context.xml @@ -77,6 +77,7 @@ ${system.webdav.url.path.prefix} + diff --git a/source/java/org/alfresco/repo/webdav/GetMethod.java b/source/java/org/alfresco/repo/webdav/GetMethod.java index 8ebecee20f..37f860217b 100644 --- a/source/java/org/alfresco/repo/webdav/GetMethod.java +++ b/source/java/org/alfresco/repo/webdav/GetMethod.java @@ -314,6 +314,7 @@ public class GetMethod extends WebDAVMethod { 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()); 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 m_response.setHeader(WebDAV.HEADER_CONTENT_LENGTH, Long.toString(reader.getSize())); 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 reader.getContent(m_response.getOutputStream()); } diff --git a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java index c345694d81..842aa7456e 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java @@ -32,8 +32,13 @@ import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; 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.model.ContentModel; +import org.alfresco.repo.events.EventPreparator; +import org.alfresco.repo.events.EventPublisher; import org.alfresco.repo.lock.LockUtils; import org.alfresco.repo.model.filefolder.HiddenAspect; 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.namespace.NamespaceService; import org.alfresco.util.EqualsHelper; +import org.alfresco.util.FileFilterMode.Client; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.extensions.surf.util.URLDecoder; @@ -86,7 +92,7 @@ public class WebDAVHelper // Logging protected static Log logger = LogFactory.getLog("org.alfresco.webdav.protocol"); - + // Service registry TODO: eliminate this - not dependency injection! private ServiceRegistry m_serviceRegistry; @@ -103,6 +109,7 @@ public class WebDAVHelper private PermissionService m_permissionService; private TenantService m_tenantService; private HiddenAspect m_hiddenAspect; + private EventPublisher eventPublisher; // 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}$)"); @@ -318,6 +325,14 @@ public class WebDAVHelper this.m_namespaceService = namespaceService; } + /** + * @param eventPublisher the eventPublisher service + */ + public void setEventPublisher(EventPublisher eventPublisher) + { + this.eventPublisher = eventPublisher; + } + /** * @param dictionaryService the dictionary service */ @@ -1063,6 +1078,39 @@ public class WebDAVHelper 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) { // Try and get the path