diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml index 830d4959cc..556dea4607 100644 --- a/config/alfresco/web-scripts-application-context.xml +++ b/config/alfresco/web-scripts-application-context.xml @@ -1816,7 +1816,7 @@ - + diff --git a/source/java/org/alfresco/repo/webdav/ActivityPostProducer.java b/source/java/org/alfresco/repo/webdav/ActivityPostProducer.java index cd4544a659..3817511ce3 100644 --- a/source/java/org/alfresco/repo/webdav/ActivityPostProducer.java +++ b/source/java/org/alfresco/repo/webdav/ActivityPostProducer.java @@ -28,5 +28,5 @@ package org.alfresco.repo.webdav; */ public interface ActivityPostProducer { - void setActivityPoster(ActivityPoster activityPoster); + void setActivityPoster(WebDAVActivityPoster activityPoster); } diff --git a/source/java/org/alfresco/repo/webdav/ActivityPosterImpl.java b/source/java/org/alfresco/repo/webdav/ActivityPosterImpl.java index a1e0fc5847..fdebc9ccc8 100644 --- a/source/java/org/alfresco/repo/webdav/ActivityPosterImpl.java +++ b/source/java/org/alfresco/repo/webdav/ActivityPosterImpl.java @@ -20,28 +20,29 @@ package org.alfresco.repo.webdav; import javax.servlet.http.HttpServletResponse; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.Client; import org.alfresco.repo.Client.ClientType; import org.alfresco.repo.activities.ActivityType; -import org.alfresco.repo.tenant.TenantService; +import org.alfresco.service.cmr.activities.ActivityPoster; import org.alfresco.service.cmr.activities.ActivityService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.NodeRef; -import org.json.JSONException; -import org.json.JSONObject; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * WebDAV methods may use an instance of this class to post activity data. * - * @see ActivityPoster + * @see WebDAVActivityPoster * @author Matt Ward */ -// TODO consolidate with ActivityPost for OpenCMIS -public class ActivityPosterImpl implements ActivityPoster +public class ActivityPosterImpl implements WebDAVActivityPoster { private String appTool; - private ActivityService activityService; + private ActivityPoster poster; + protected static Log logger = LogFactory.getLog("org.alfresco.webdav.protocol.activity"); /** * Default constructor. @@ -61,7 +62,6 @@ public class ActivityPosterImpl implements ActivityPoster public ActivityPosterImpl(String appTool, ActivityService activityService) { this.appTool = appTool; - this.activityService = activityService; } @@ -119,78 +119,27 @@ public class ActivityPosterImpl implements ActivityPoster String fileName = contentNodeInfo.getName(); NodeRef nodeRef = contentNodeInfo.getNodeRef(); - JSONObject json = createActivityJSON(tenantDomain, path, parentNodeRef, nodeRef, fileName); - - activityService.postActivity( - activityType, - siteId, - appTool, - json.toString(), - Client.asType(ClientType.webdav), - contentNodeInfo); - } - - /** - * Create JSON suitable for create, modify or delete activity posts. Returns a new JSONObject - * containing appropriate key/value pairs. - * - * @param tenantDomain - * @param nodeRef - * @param fileName - * @throws WebDAVServerException - * @return JSONObject - */ - private JSONObject createActivityJSON( - String tenantDomain, - String path, - NodeRef parentNodeRef, - NodeRef nodeRef, - String fileName) throws WebDAVServerException - { - JSONObject json = new JSONObject(); try { - json.put("nodeRef", nodeRef); - - if (parentNodeRef != null) - { - // Used for deleted files. - json.put("parentNodeRef", parentNodeRef); - } - - if (path != null) - { - // Used for deleted files and folders (added or deleted) - json.put("page", "documentlibrary?path=" + path); - } - else - { - // Used for added or modified files. - json.put("page", "document-details?nodeRef=" + nodeRef); - } - json.put("title", fileName); - - if (!tenantDomain.equals(TenantService.DEFAULT_DOMAIN)) - { - // Only used in multi-tenant setups. - json.put("tenantDomain", tenantDomain); - } + poster.postFileFolderActivity(activityType, path, tenantDomain, siteId, + parentNodeRef, nodeRef, fileName, + appTool, Client.asType(ClientType.webdav),contentNodeInfo); } - catch (JSONException error) + catch (AlfrescoRuntimeException are) { + logger.error("Failed to post activity.", are); throw new WebDAVServerException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } - - return json; } + public void setAppTool(String appTool) { this.appTool = appTool; } - public void setActivityService(ActivityService activityService) + public void setPoster(ActivityPoster poster) { - this.activityService = activityService; + this.poster = poster; } } diff --git a/source/java/org/alfresco/repo/webdav/DeleteMethod.java b/source/java/org/alfresco/repo/webdav/DeleteMethod.java index 9d55431018..b175614c02 100644 --- a/source/java/org/alfresco/repo/webdav/DeleteMethod.java +++ b/source/java/org/alfresco/repo/webdav/DeleteMethod.java @@ -45,7 +45,7 @@ import org.alfresco.util.FileFilterMode; */ public class DeleteMethod extends WebDAVMethod implements ActivityPostProducer { - private ActivityPoster activityPoster; + private WebDAVActivityPoster activityPoster; /** * Default constructor @@ -248,7 +248,7 @@ public class DeleteMethod extends WebDAVMethod implements ActivityPostProducer } @Override - public void setActivityPoster(ActivityPoster activityPoster) + public void setActivityPoster(WebDAVActivityPoster activityPoster) { this.activityPoster = activityPoster; } diff --git a/source/java/org/alfresco/repo/webdav/MkcolMethod.java b/source/java/org/alfresco/repo/webdav/MkcolMethod.java index 5a0d250774..cdbafe34ee 100644 --- a/source/java/org/alfresco/repo/webdav/MkcolMethod.java +++ b/source/java/org/alfresco/repo/webdav/MkcolMethod.java @@ -35,7 +35,7 @@ import org.alfresco.service.cmr.webdav.WebDavService; */ public class MkcolMethod extends WebDAVMethod implements ActivityPostProducer { - private ActivityPoster activityPoster; + private WebDAVActivityPoster activityPoster; /** * Default constructor @@ -180,7 +180,7 @@ public class MkcolMethod extends WebDAVMethod implements ActivityPostProducer } @Override - public void setActivityPoster(ActivityPoster activityPoster) + public void setActivityPoster(WebDAVActivityPoster activityPoster) { this.activityPoster = activityPoster; } diff --git a/source/java/org/alfresco/repo/webdav/PutMethod.java b/source/java/org/alfresco/repo/webdav/PutMethod.java index 3c585cd3b3..2a36c0c152 100644 --- a/source/java/org/alfresco/repo/webdav/PutMethod.java +++ b/source/java/org/alfresco/repo/webdav/PutMethod.java @@ -52,7 +52,7 @@ public class PutMethod extends WebDAVMethod implements ActivityPostProducer // Try to delete the node if the PUT fails private boolean noContent = false; private boolean created = false; - private ActivityPoster activityPoster; + private WebDAVActivityPoster activityPoster; private FileInfo contentNodeInfo; private long fileSize; @@ -411,7 +411,7 @@ public class PutMethod extends WebDAVMethod implements ActivityPostProducer } @Override - public void setActivityPoster(ActivityPoster activityPoster) + public void setActivityPoster(WebDAVActivityPoster activityPoster) { this.activityPoster = activityPoster; } diff --git a/source/java/org/alfresco/repo/webdav/ActivityPoster.java b/source/java/org/alfresco/repo/webdav/WebDAVActivityPoster.java similarity index 92% rename from source/java/org/alfresco/repo/webdav/ActivityPoster.java rename to source/java/org/alfresco/repo/webdav/WebDAVActivityPoster.java index de267ec051..c5f1620f8f 100644 --- a/source/java/org/alfresco/repo/webdav/ActivityPoster.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVActivityPoster.java @@ -25,8 +25,7 @@ import org.alfresco.service.cmr.model.FileInfo; * * @author Matt Ward */ -// TODO consolidate with ActivityPost for OpenCMIS -public interface ActivityPoster +public interface WebDAVActivityPoster { void postFileFolderAdded( String siteId, diff --git a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java index 4b1eb92485..1caa0a3754 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java @@ -32,15 +32,10 @@ import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.alfresco.events.types.ContentEvent; -import org.alfresco.events.types.ContentEventImpl; -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.Client; import org.alfresco.repo.Client.ClientType; -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; @@ -48,6 +43,7 @@ import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.tenant.TenantService; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.activities.ActivityPoster; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.lock.LockService; import org.alfresco.service.cmr.model.FileFolderService; @@ -112,6 +108,7 @@ public class WebDAVHelper private TenantService m_tenantService; private HiddenAspect m_hiddenAspect; private EventPublisher eventPublisher; + private ActivityPoster poster; // 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}$)"); @@ -335,6 +332,15 @@ public class WebDAVHelper this.eventPublisher = eventPublisher; } + + /** + * @param poster + */ + public void setPoster(ActivityPoster poster) + { + this.poster = poster; + } + /** * @param dictionaryService the dictionary service */ @@ -1091,25 +1097,30 @@ public class WebDAVHelper 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(), - null, realNodeInfo.getType().toString(), Client.asType(ClientType.webdav), realNodeInfo.getName(), mimetype, size, contentEncoding, range); - } - else - { - return new ContentEventImpl(ContentEvent.DOWNLOAD, user, networkId, transactionId, realNodeInfo.getNodeRef().getId(), - null, realNodeInfo.getType().toString(), Client.asType(ClientType.webdav), realNodeInfo.getName(), mimetype, size, contentEncoding); - } - } - }); + if (!StringUtils.hasText(range)) + { + //Its not a range request + SiteService siteService = getServiceRegistry().getSiteService(); + final String siteId = siteService.getSiteShortName(realNodeInfo.getNodeRef()); + + poster.postFileFolderActivity(ActivityPoster.DOWNLOADED, null, m_tenantService.getCurrentUserDomain(), + siteId, null, realNodeInfo.getNodeRef(), realNodeInfo.getName(), + "webdav", Client.asType(ClientType.webdav), null); + } + +// eventPublisher.publishEvent(new EventPreparator(){ +// @Override +// public Event prepareEvent(String user, String networkId, String transactionId) +// { +// +// +// if (StringUtils.hasText(range)) +// { +// return new ContentReadRangeEvent(user, networkId, transactionId, realNodeInfo.getNodeRef().getId(), +// siteId, realNodeInfo.getType().toString(), Client.asType(ClientType.webdav), realNodeInfo.getName(), mimetype, size, contentEncoding, range); +// } +// } +// }); } diff --git a/source/java/org/alfresco/repo/webdav/WebDAVServlet.java b/source/java/org/alfresco/repo/webdav/WebDAVServlet.java index 439d1201cc..16047e95d0 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVServlet.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVServlet.java @@ -92,7 +92,7 @@ public class WebDAVServlet extends HttpServlet // WebDAV helper class private WebDAVHelper m_davHelper; - private ActivityPoster activityPoster; + private WebDAVActivityPoster activityPoster; /** * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, diff --git a/source/java/org/alfresco/slingshot/web/scripts/SlingshotContentGet.java b/source/java/org/alfresco/slingshot/web/scripts/SlingshotContentGet.java index 819db53e79..c80889dfd3 100644 --- a/source/java/org/alfresco/slingshot/web/scripts/SlingshotContentGet.java +++ b/source/java/org/alfresco/slingshot/web/scripts/SlingshotContentGet.java @@ -22,15 +22,15 @@ import java.io.IOException; import java.util.Map; import org.alfresco.model.ContentModel; +import org.alfresco.repo.Client; +import org.alfresco.repo.Client.ClientType; import org.alfresco.repo.web.scripts.content.ContentGet; -import org.alfresco.service.cmr.activities.ActivityService; +import org.alfresco.service.cmr.activities.ActivityPoster; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.site.SiteInfo; import org.alfresco.service.cmr.site.SiteService; -import org.springframework.extensions.surf.util.StringBuilderWriter; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; -import org.springframework.extensions.webscripts.json.JSONWriter; /** * Share specific ContentGet implementation. @@ -47,16 +47,16 @@ import org.springframework.extensions.webscripts.json.JSONWriter; public class SlingshotContentGet extends ContentGet { protected SiteService siteService; - protected ActivityService activityService; + private ActivityPoster poster; public void setSiteService(SiteService siteService) { this.siteService = siteService; } - public void setActivityService(ActivityService activityService) + public void setPoster(ActivityPoster poster) { - this.activityService = activityService; + this.poster = poster; } /* (non-Javadoc) @@ -68,7 +68,7 @@ public class SlingshotContentGet extends ContentGet // are we downloading content as an attachment? if (Boolean.valueOf(req.getParameter("a"))) { - // is this node part of a Site context? + // is this private ActivityPoster poster; node part of a Site context? Map templateVars = req.getServiceMatch().getTemplateVars(); String storeType = templateVars.get("store_type"); String storeId = templateVars.get("store_id"); @@ -87,20 +87,9 @@ public class SlingshotContentGet extends ContentGet { filename = (String)this.nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); } - StringBuilderWriter out = new StringBuilderWriter(256); - final JSONWriter json = new JSONWriter(out); - json.startObject(); - json.writeValue("title", filename); - json.writeValue("nodeRef", nodeRef.toString()); - json.writeValue("page", "document-details?nodeRef=" + nodeRef.toString()); - json.endObject(); - // post an activity - mirror the mechanism as if from the Share application - this.activityService.postActivity( - "org.alfresco.documentlibrary.file-downloaded", - site.getShortName(), - "documentlibrary", - out.toString()); + poster.postFileFolderActivity(ActivityPoster.DOWNLOADED, null, null, + site.getShortName(), null, nodeRef, filename, "documentlibrary", Client.asType(ClientType.webclient), null); } } } diff --git a/source/test-java/org/alfresco/repo/webdav/WebDAVHelperIntegrationTest.java b/source/test-java/org/alfresco/repo/webdav/WebDAVHelperIntegrationTest.java index 433e1fddb7..37247643f0 100644 --- a/source/test-java/org/alfresco/repo/webdav/WebDAVHelperIntegrationTest.java +++ b/source/test-java/org/alfresco/repo/webdav/WebDAVHelperIntegrationTest.java @@ -133,27 +133,4 @@ public class WebDAVHelperIntegrationTest FileInfo found = webDAVHelper.getNodeForPath(rootFolder, "/"); assertEquals(rootFolder, found.getNodeRef()); } - /* - @Test - public void testPublishEvent() - { - FileInfo folderInfo = fileFolderService.create(rootFolder, "my_folder", ContentModel.TYPE_FOLDER); - FileInfo fileInfo = fileFolderService.create(folderInfo.getNodeRef(), "my_file.txt", ContentModel.TYPE_CONTENT); - webDAVHelper.publishReadEvent(fileInfo, "text", 2l, "UTF-8", null); - - List readEvents = eventPublisher.getQueueByType(ContentReadEvent.class); - boolean found = false; - for (ContentReadEvent event : readEvents) - { - if (fileInfo.getNodeRef().getId().equals(event.getNodeId())) - { - assertEquals(event.getMimeType(),("text")); - assertEquals(event.getClient(),Client.webdav); - found = true; - break; - } - } - assertTrue(found); - } - */ }