diff --git a/config/alfresco/subsystems/ActivitiesFeed/default/activities-feed-context.xml b/config/alfresco/subsystems/ActivitiesFeed/default/activities-feed-context.xml
index 391a463c2d..c89667eed3 100644
--- a/config/alfresco/subsystems/ActivitiesFeed/default/activities-feed-context.xml
+++ b/config/alfresco/subsystems/ActivitiesFeed/default/activities-feed-context.xml
@@ -10,6 +10,7 @@
+
diff --git a/source/java/org/alfresco/opencmis/ActivityPosterImpl.java b/source/java/org/alfresco/opencmis/ActivityPosterImpl.java
index 6ca7fc6357..f37540219a 100644
--- a/source/java/org/alfresco/opencmis/ActivityPosterImpl.java
+++ b/source/java/org/alfresco/opencmis/ActivityPosterImpl.java
@@ -35,6 +35,7 @@ import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.FileFilterMode.Client;
import org.alfresco.util.PropertyCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -290,12 +291,15 @@ public class ActivityPosterImpl implements ActivityPoster, InitializingBean
String name)
{
JSONObject json = createActivityJSON(getCurrentTenantDomain(), path, parentNodeRef, nodeRef, name);
-
+ FileInfo fileInfo = fileFolderService.getFileInfo(nodeRef);
+
activityService.postActivity(
activityType,
siteId,
APP_TOOL,
- json.toString());
+ json.toString(),
+ Client.cmis,
+ fileInfo);
}
/**
diff --git a/source/java/org/alfresco/opencmis/CMISConnector.java b/source/java/org/alfresco/opencmis/CMISConnector.java
index c6c8d9ece0..b844d68d1a 100644
--- a/source/java/org/alfresco/opencmis/CMISConnector.java
+++ b/source/java/org/alfresco/opencmis/CMISConnector.java
@@ -1662,7 +1662,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
{
result.setStream(contentReader.getContentInputStream());
result.setLength(BigInteger.valueOf(contentSize));
- publishReadEvent(streamNodeRef, result.getMimeType(), contentSize, contentReader.getEncoding(), null);
+ publishReadEvent(streamNodeRef, info.getName(), result.getMimeType(), contentSize, contentReader.getEncoding(), null);
}
else
{
@@ -1675,7 +1675,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
result.setStream(new RangeInputStream(contentReader.getContentInputStream(), off, len));
result.setLength(BigInteger.valueOf(len));
- publishReadEvent(streamNodeRef, result.getMimeType(), contentSize, contentReader.getEncoding(), off+" - "+len);
+ publishReadEvent(streamNodeRef, info.getName(), result.getMimeType(), contentSize, contentReader.getEncoding(), off+" - "+len);
}
}
catch (Exception e)
@@ -1711,7 +1711,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
* @param encoding
* @param string
*/
- protected void publishReadEvent(final NodeRef nodeRef, final String mimeType, final long contentSize, final String encoding, final String range)
+ protected void publishReadEvent(final NodeRef nodeRef, final String name, final String mimeType, final long contentSize, final String encoding, final String range)
{
final QName nodeType = nodeRef==null?null:nodeService.getType(nodeRef);
@@ -1722,12 +1722,12 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
if (StringUtils.hasText(range))
{
return new ContentReadRangeEvent(user, networkId, transactionId,
- nodeRef.getId(), null, nodeType.toString(), Client.cmis, mimeType, contentSize, encoding, range);
+ nodeRef.getId(), null, nodeType.toString(), Client.cmis, name, mimeType, contentSize, encoding, range);
}
else
{
return new ContentEventImpl(ContentEvent.DOWNLOAD, user, networkId, transactionId,
- nodeRef.getId(), null, nodeType.toString(), Client.cmis, mimeType, contentSize, encoding);
+ nodeRef.getId(), null, nodeType.toString(), Client.cmis, name, mimeType, contentSize, encoding);
}
}
});
diff --git a/source/java/org/alfresco/repo/activities/ActivityPostServiceImpl.java b/source/java/org/alfresco/repo/activities/ActivityPostServiceImpl.java
index e65e1dab3b..51f1723c91 100644
--- a/source/java/org/alfresco/repo/activities/ActivityPostServiceImpl.java
+++ b/source/java/org/alfresco/repo/activities/ActivityPostServiceImpl.java
@@ -32,8 +32,12 @@ import org.alfresco.repo.events.EventPublisher;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.tenant.TenantService;
import org.alfresco.service.cmr.activities.ActivityPostService;
+import org.alfresco.service.cmr.model.FileFolderService;
+import org.alfresco.service.cmr.model.FileInfo;
+import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.FileFilterMode.Client;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
@@ -54,6 +58,8 @@ public class ActivityPostServiceImpl implements ActivityPostService
private ActivityPostDAO postDAO;
private TenantService tenantService;
private EventPublisher eventPublisher;
+ private FileFolderService fileFolderService;
+
private int estGridSize = 1;
private boolean userNamesAreCaseSensitive = false;
@@ -82,13 +88,30 @@ public class ActivityPostServiceImpl implements ActivityPostService
{
this.eventPublisher = eventPublisher;
}
-
+
+ public void setFileFolderService(FileFolderService fileFolderService)
+ {
+ this.fileFolderService = fileFolderService;
+ }
/* (non-Javadoc)
* @see org.alfresco.service.cmr.activities.ActivityService#postActivity(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
public void postActivity(String activityType, String siteId, String appTool, String activityData)
{
- postActivity(activityType, siteId, appTool, activityData, ActivityPostEntity.STATUS.PENDING, getCurrentUser(), null);
+ postActivity(activityType, siteId, appTool, activityData, ActivityPostEntity.STATUS.PENDING, getCurrentUser(), null, null);
+ }
+
+
+ @Override
+ public void postActivity(String activityType, String siteId, String appTool, String activityData, Client client)
+ {
+ postActivity(activityType, siteId, appTool, activityData, ActivityPostEntity.STATUS.PENDING, getCurrentUser(), client, null);
+ }
+
+ @Override
+ public void postActivity(String activityType, String siteId, String appTool, String jsonActivityData, Client client, FileInfo contentNodeInfo)
+ {
+ postActivity(activityType, siteId, appTool, jsonActivityData, ActivityPostEntity.STATUS.PENDING, getCurrentUser(), client, contentNodeInfo);
}
/* (non-Javadoc)
@@ -96,7 +119,7 @@ public class ActivityPostServiceImpl implements ActivityPostService
*/
public void postActivity(String activityType, String siteId, String appTool, String activityData, String userId)
{
- postActivity(activityType, siteId, appTool, activityData, ActivityPostEntity.STATUS.PENDING, userId, null);
+ postActivity(activityType, siteId, appTool, activityData, ActivityPostEntity.STATUS.PENDING, userId,null, null);
}
/* (non-Javadoc)
@@ -109,7 +132,7 @@ public class ActivityPostServiceImpl implements ActivityPostService
StringBuffer sb = new StringBuffer();
sb.append("{").append("\""+PostLookup.JSON_NODEREF_LOOKUP+"\":\"").append(nodeRef.toString()).append("\"").append("}");
- postActivity(activityType, siteId, appTool, sb.toString(), ActivityPostEntity.STATUS.PENDING, getCurrentUser(), nodeRef);
+ postActivity(activityType, siteId, appTool, sb.toString(), ActivityPostEntity.STATUS.PENDING, getCurrentUser(),null, null);
}
/* (non-Javadoc)
@@ -124,7 +147,7 @@ public class ActivityPostServiceImpl implements ActivityPostService
.append("\"name\":\"").append(name).append("\"")
.append("}");
- postActivity(activityType, siteId, appTool, sb.toString(), ActivityPostEntity.STATUS.PENDING, getCurrentUser(),nodeRef);
+ postActivity(activityType, siteId, appTool, sb.toString(), ActivityPostEntity.STATUS.PENDING, getCurrentUser(),null,null);
}
/* (non-Javadoc)
@@ -145,12 +168,14 @@ public class ActivityPostServiceImpl implements ActivityPostService
.append("\""+PostLookup.JSON_NODEREF_PARENT+"\":\"").append(parentNodeRef.toString()).append("\"")
.append("}");
- postActivity(activityType, siteId, appTool, sb.toString(), ActivityPostEntity.STATUS.PENDING, getCurrentUser(), nodeRef);
+ postActivity(activityType, siteId, appTool, sb.toString(), ActivityPostEntity.STATUS.PENDING, getCurrentUser(), null,null);
}
- private void postActivity(final String activityType, String siteId, String appTool, String activityData, ActivityPostEntity.STATUS status, String userId, NodeRef nodeRef)
+ private void postActivity(final String activityType, String siteId, String appTool, String activityData, ActivityPostEntity.STATUS status, String userId, final Client client, final FileInfo contentNodeInfo)
{
+ NodeRef nodeRef = null;
+
try
{
// optional - default to empty string
@@ -198,7 +223,7 @@ public class ActivityPostServiceImpl implements ActivityPostService
jo.put(PostLookup.JSON_TENANT_DOMAIN, tenantService.getCurrentUserDomain());
activityData = jo.toString();
}
- checkNodeRef(jo);
+ nodeRef = checkNodeRef(jo);
// ALF-10362 - belts-and-braces (note: Share sets "title" from cm:name)
if (jo.has(PostLookup.JSON_TITLE))
@@ -244,8 +269,8 @@ public class ActivityPostServiceImpl implements ActivityPostService
final Date postDate = new Date();
final ActivityPostEntity activityPost = new ActivityPostEntity();
final String network = tenantService.getName(siteId);
- final String nodeId = nodeRef!=null?nodeRef.toString():null;
final String site = siteId;
+ final NodeRef finalNodeRef = nodeRef;
//MNT-9104 If username contains uppercase letters the action of joining a site will not be displayed in "My activities"
if (! userNamesAreCaseSensitive)
@@ -263,11 +288,47 @@ public class ActivityPostServiceImpl implements ActivityPostService
activityPost.setLastModified(postDate);
eventPublisher.publishEvent(new EventPreparator(){
+
@Override
public Event prepareEvent(String user, String networkId, String transactionId)
- {
- return new ActivityEvent(activityType, transactionId, networkId, postDate.getTime(), user, nodeId,
- site, null, null, activityPost.getActivityData());
+ {
+ String filename = null, nodeType = null, mime = null, encoding = null;
+ long size = 0l;
+ String nodeId = finalNodeRef!=null?finalNodeRef.getId():null;
+ FileInfo fileInfo = contentNodeInfo;
+
+ //Get content info if available
+ if (fileInfo == null && finalNodeRef !=null)
+ {
+ fileInfo = fileFolderService.getFileInfo(finalNodeRef);
+ }
+
+ //Use content info
+ if (fileInfo != null)
+ {
+ if (nodeId == null)
+ {
+ nodeId = fileInfo.getNodeRef().getId();
+ }
+ filename = fileInfo.getName();
+ nodeType = fileInfo.getType().toString();
+
+ if (!fileInfo.isFolder())
+ {
+ //It's a file so get more info
+ ContentData contentData = fileInfo.getContentData();
+ if (contentData!=null)
+ {
+ mime = contentData.getMimetype();
+ size = contentData.getSize();
+ encoding = contentData.getEncoding();
+ }
+ }
+
+ }
+
+ return new ActivityEvent(activityType, transactionId, networkId, user, nodeId,
+ site, nodeType, client, activityPost.getActivityData(), filename, mime, size, encoding);
}
});
@@ -323,7 +384,7 @@ public class ActivityPostServiceImpl implements ActivityPostService
* @param activityPost
* @throws JSONException
*/
- private void checkNodeRef(JSONObject jo) throws JSONException
+ private NodeRef checkNodeRef(JSONObject jo) throws JSONException
{
String nodeRefStr = null;
try
@@ -331,12 +392,14 @@ public class ActivityPostServiceImpl implements ActivityPostService
if (jo.has(PostLookup.JSON_NODEREF))
{
nodeRefStr = jo.getString(PostLookup.JSON_NODEREF);
- new NodeRef(nodeRefStr);
+ return new NodeRef(nodeRefStr);
}
}
catch (Exception e)
{
throw new IllegalArgumentException("Invalid node ref: " + nodeRefStr);
}
+ return null;
}
+
}
diff --git a/source/java/org/alfresco/repo/activities/ActivityServiceImpl.java b/source/java/org/alfresco/repo/activities/ActivityServiceImpl.java
index 42867062dd..ba4ef421c1 100644
--- a/source/java/org/alfresco/repo/activities/ActivityServiceImpl.java
+++ b/source/java/org/alfresco/repo/activities/ActivityServiceImpl.java
@@ -40,6 +40,7 @@ import org.alfresco.repo.tenant.TenantService;
import org.alfresco.service.cmr.activities.ActivityPostService;
import org.alfresco.service.cmr.activities.ActivityService;
import org.alfresco.service.cmr.activities.FeedControl;
+import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
@@ -49,6 +50,7 @@ import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.FileFilterMode.Client;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONObject;
@@ -194,6 +196,21 @@ public class ActivityServiceImpl implements ActivityService, InitializingBean
activityPostService.postActivity(activityType, siteId, appTool, nodeRef, name, typeQName, parentNodeRef);
}
+
+ @Override
+ public void postActivity(String activityType, String siteId, String appTool, String jsonActivityData, Client client)
+ {
+ // delegate
+ activityPostService.postActivity(activityType, siteId, appTool, jsonActivityData, client);
+ }
+
+ @Override
+ public void postActivity(String activityType, String siteId, String appTool, String jsonActivityData, Client client, FileInfo contentNodeInfo)
+ {
+ // delegate
+ activityPostService.postActivity(activityType, siteId, appTool, jsonActivityData, client, contentNodeInfo);
+ }
+
/* (non-Javadoc)
* @see org.alfresco.service.cmr.activities.ActivityService#getUserFeedEntries(java.lang.String, java.lang.String, java.lang.String)
*/
diff --git a/source/java/org/alfresco/repo/activities/script/Activity.java b/source/java/org/alfresco/repo/activities/script/Activity.java
index 11686ad589..7ab2178aff 100644
--- a/source/java/org/alfresco/repo/activities/script/Activity.java
+++ b/source/java/org/alfresco/repo/activities/script/Activity.java
@@ -26,6 +26,7 @@ import org.alfresco.service.cmr.activities.ActivityService;
import org.alfresco.service.cmr.activities.FeedControl;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.FileFilterMode.Client;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
@@ -72,7 +73,7 @@ public final class Activity extends BaseScopableProcessorExtension
*/
public void postActivity(String activityType, String siteId, String appTool, String jsonActivityData)
{
- activityService.postActivity(activityType, siteId, appTool, jsonActivityData);
+ activityService.postActivity(activityType, siteId, appTool, jsonActivityData, Client.webclient);
}
/**
diff --git a/source/java/org/alfresco/repo/quickshare/QuickShareServiceImpl.java b/source/java/org/alfresco/repo/quickshare/QuickShareServiceImpl.java
index e0ccb75943..0f7e776234 100644
--- a/source/java/org/alfresco/repo/quickshare/QuickShareServiceImpl.java
+++ b/source/java/org/alfresco/repo/quickshare/QuickShareServiceImpl.java
@@ -20,7 +20,6 @@ package org.alfresco.repo.quickshare;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -63,8 +62,8 @@ import org.alfresco.service.cmr.thumbnail.ThumbnailService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.EqualsHelper;
-import org.alfresco.util.Pair;
import org.alfresco.util.FileFilterMode.Client;
+import org.alfresco.util.Pair;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -250,9 +249,9 @@ public class QuickShareServiceImpl implements QuickShareService, NodeServicePoli
@Override
public Event prepareEvent(String user, String networkId, String transactionId)
{
- return new ActivityEvent("quickshare", transactionId, networkId, new Date().getTime(),
- user, nodeRef.getId(),
- null, typeQName.toString(), Client.webclient, sb.toString());
+ return new ActivityEvent("quickshare", transactionId, networkId, user, nodeRef.getId(),
+ null, typeQName.toString(), Client.webclient, sb.toString(),
+ null, null, 0l, null);
}
});
diff --git a/source/java/org/alfresco/service/cmr/activities/ActivityPostService.java b/source/java/org/alfresco/service/cmr/activities/ActivityPostService.java
index ad7da32e25..2e93f9413f 100644
--- a/source/java/org/alfresco/service/cmr/activities/ActivityPostService.java
+++ b/source/java/org/alfresco/service/cmr/activities/ActivityPostService.java
@@ -18,8 +18,10 @@
*/
package org.alfresco.service.cmr.activities;
+import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.FileFilterMode.Client;
public interface ActivityPostService
{
@@ -37,6 +39,27 @@ public interface ActivityPostService
* @param jsonActivityData - required
*/
public void postActivity(String activityType, String siteId, String appTool, String jsonActivityData);
+
+ /**
+ * Post a custom activity type
+ *
+ * @param activityType - required
+ * @param siteId - optional, if null will be stored as empty string
+ * @param appTool - optional, if null will be stored as empty string
+ * @param jsonActivityData - required
+ */
+ public void postActivity(String activityType, String siteId, String appTool, String jsonActivityData, Client client);
+
+ /**
+ * Post a custom activity type
+ *
+ * @param activityType - required
+ * @param siteId - optional, if null will be stored as empty string
+ * @param appTool - optional, if null will be stored as empty string
+ * @param jsonActivityData - required
+ * @param contentNodeInfo FileInfo
+ */
+ public void postActivity(String activityType, String siteId, String appTool, String jsonActivityData, Client client, FileInfo contentNodeInfo);
/**
* Post a custom activity type