diff --git a/config/alfresco/activities/activities-feed-context.xml b/config/alfresco/activities/activities-feed-context.xml index 535b2e83d4..bd8aecffab 100644 --- a/config/alfresco/activities/activities-feed-context.xml +++ b/config/alfresco/activities/activities-feed-context.xml @@ -65,6 +65,7 @@ + diff --git a/source/java/org/alfresco/repo/activities/ActivityServiceImpl.java b/source/java/org/alfresco/repo/activities/ActivityServiceImpl.java index 5b1c282523..1a9e172f30 100644 --- a/source/java/org/alfresco/repo/activities/ActivityServiceImpl.java +++ b/source/java/org/alfresco/repo/activities/ActivityServiceImpl.java @@ -456,7 +456,7 @@ public class ActivityServiceImpl implements ActivityService } catch (SQLException e) { - throw new AlfrescoRuntimeException("Failed to set feed control: " + e, e); + throw new AlfrescoRuntimeException("Failed to get feed controls: " + e, e); } } @@ -479,7 +479,7 @@ public class ActivityServiceImpl implements ActivityService } catch (SQLException e) { - throw new AlfrescoRuntimeException("Failed to set feed control: " + e, e); + throw new AlfrescoRuntimeException("Failed to unset feed control: " + e, e); } } diff --git a/source/java/org/alfresco/repo/activities/feed/AbstractFeedGenerator.java b/source/java/org/alfresco/repo/activities/feed/AbstractFeedGenerator.java index e74c3aeb96..8fa28170d7 100644 --- a/source/java/org/alfresco/repo/activities/feed/AbstractFeedGenerator.java +++ b/source/java/org/alfresco/repo/activities/feed/AbstractFeedGenerator.java @@ -47,6 +47,8 @@ public abstract class AbstractFeedGenerator implements FeedGenerator private AuthenticationService authenticationService; private String repoEndPoint; // http://hostname:port/webapp (eg. http://localhost:8080/alfresco) + + private boolean userNamesAreCaseSensitive = false; private RepoCtx ctx = null; @@ -67,6 +69,11 @@ public abstract class AbstractFeedGenerator implements FeedGenerator this.repoEndPoint = repoEndPoint; } + public void setUserNamesAreCaseSensitive(boolean userNamesAreCaseSensitive) + { + this.userNamesAreCaseSensitive = userNamesAreCaseSensitive; + } + public void setMaxItemsPerCycle(int maxItemsPerCycle) { this.maxItemsPerCycle = maxItemsPerCycle; @@ -95,6 +102,7 @@ public abstract class AbstractFeedGenerator implements FeedGenerator public void init() throws Exception { ctx = new RepoCtx(repoEndPoint); + ctx.setUserNamesAreCaseSensitive(userNamesAreCaseSensitive); busy = false; } diff --git a/source/java/org/alfresco/repo/activities/feed/FeedTaskProcessor.java b/source/java/org/alfresco/repo/activities/feed/FeedTaskProcessor.java index 2467322fd6..78821de807 100644 --- a/source/java/org/alfresco/repo/activities/feed/FeedTaskProcessor.java +++ b/source/java/org/alfresco/repo/activities/feed/FeedTaskProcessor.java @@ -408,6 +408,12 @@ public abstract class FeedTaskProcessor { JSONObject member = (JSONObject)ja.get(i); JSONObject person = (JSONObject)member.getJSONObject("person"); + + String userName = person.getString("userName"); + if (! ctx.isUserNamesAreCaseSensitive()) + { + userName = userName.toLowerCase(); + } members.add(person.getString("userName")); } } @@ -523,7 +529,7 @@ public abstract class FeedTaskProcessor for (FeedControlDAO feedControl : feedControls) { - if ((feedControl.getSiteNetwork() == null) && (feedControl.getAppTool() != null)) + if (((feedControl.getSiteNetwork() == null) || (feedControl.getSiteNetwork().length() == 0)) && (feedControl.getAppTool() != null)) { if (feedControl.getAppTool().equals(activityPost.getAppTool())) { @@ -531,7 +537,7 @@ public abstract class FeedTaskProcessor return false; } } - else if ((feedControl.getAppTool() == null) && (feedControl.getSiteNetwork() != null)) + else if (((feedControl.getAppTool() == null) || (feedControl.getAppTool().length() == 0)) && (feedControl.getSiteNetwork() != null)) { if (feedControl.getSiteNetwork().equals(activityPost.getSiteNetwork())) { @@ -539,7 +545,8 @@ public abstract class FeedTaskProcessor return false; } } - else if ((feedControl.getSiteNetwork() != null) && (feedControl.getAppTool() != null)) + else if (((feedControl.getSiteNetwork() != null) && (feedControl.getSiteNetwork().length() > 0)) && + ((feedControl.getAppTool() != null) && (feedControl.getAppTool().length() > 0))) { if ((feedControl.getSiteNetwork().equals(activityPost.getSiteNetwork())) && (feedControl.getAppTool().equals(activityPost.getAppTool()))) diff --git a/source/java/org/alfresco/repo/activities/feed/RepoCtx.java b/source/java/org/alfresco/repo/activities/feed/RepoCtx.java index f57e0d025a..7f9cf6059d 100644 --- a/source/java/org/alfresco/repo/activities/feed/RepoCtx.java +++ b/source/java/org/alfresco/repo/activities/feed/RepoCtx.java @@ -32,6 +32,8 @@ import java.io.Serializable; public class RepoCtx implements Serializable { private String repoEndPoint; // http://hostname:port/webapp (eg. http://localhost:8080/alfresco) + private boolean userNamesAreCaseSensitive = false; + private String ticket; public static final long serialVersionUID = -3896042917378679686L; @@ -54,4 +56,14 @@ public class RepoCtx implements Serializable { this.ticket = ticket; } + + public boolean isUserNamesAreCaseSensitive() + { + return userNamesAreCaseSensitive; + } + + public void setUserNamesAreCaseSensitive(boolean userNamesAreCaseSensitive) + { + this.userNamesAreCaseSensitive = userNamesAreCaseSensitive; + } } diff --git a/source/java/org/alfresco/repo/activities/script/Activity.java b/source/java/org/alfresco/repo/activities/script/Activity.java index f58339be1b..a4741c3cc0 100644 --- a/source/java/org/alfresco/repo/activities/script/Activity.java +++ b/source/java/org/alfresco/repo/activities/script/Activity.java @@ -24,8 +24,11 @@ */ package org.alfresco.repo.activities.script; +import java.util.List; + import org.alfresco.repo.jscript.BaseScopableProcessorExtension; 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; @@ -46,6 +49,11 @@ public final class Activity extends BaseScopableProcessorExtension { this.activityService = activityService; } + + + /* + * Post Activity + */ /** * Post a custom activity type @@ -108,4 +116,42 @@ public final class Activity extends BaseScopableProcessorExtension { activityService.postActivity(activityType, siteId, appTool, nodeRef, name, typeQName, parentNodeRef); } + + + /* + * Manage User Feed Controls + */ + + /** + * For current user, get feed controls + * + * @return array of user feed controls + */ + public FeedControl[] getFeedControls() + { + List feedControls = activityService.getFeedControls(); + return (FeedControl[])feedControls.toArray(new FeedControl[feedControls.size()]); + } + + /** + * For current user, set feed control (opt-out) for a site or an appTool or a site/appTool combination + * + * @param siteId - required (optional, if appToolId is supplied) + * @param appToolId - required (optional, if siteId is supplied) + */ + public void setFeedControl(String siteId, String appToolId) + { + activityService.setFeedControl(new FeedControl(siteId, appToolId)); + } + + /** + * For current user, unset feed control + * + * @param siteId - required (optional, if appToolId is supplied) + * @param appToolId - required (optional, if siteId is supplied) + */ + public void unsetFeedControl(String siteId, String appToolId) + { + activityService.unsetFeedControl(new FeedControl(siteId, appToolId)); + } } diff --git a/source/java/org/alfresco/repo/activities/script/test_activityService.js b/source/java/org/alfresco/repo/activities/script/test_activityService.js index a1b31182cc..0b7e562d2f 100644 --- a/source/java/org/alfresco/repo/activities/script/test_activityService.js +++ b/source/java/org/alfresco/repo/activities/script/test_activityService.js @@ -12,6 +12,33 @@ activities.postActivity("test activity type 5", "my site", null, '{ "item2" : 45 activities.postActivity("test activity type 6", "my site", "my app tool", '{ "item3" : 789 }'); activities.postActivity("test activity type 7", "my site", "my app tool", '{ invalidJSON }'); +// user feed controls +var feedControls = activities.getFeedControls(); +test.assertEquals(0, feedControls.length); + +activities.setFeedControl("my site", "my app tool"); + +feedControls = activities.getFeedControls(); +test.assertEquals(1, feedControls.length); + +activities.setFeedControl("my site", null); + +feedControls = activities.getFeedControls(); +test.assertEquals(2, feedControls.length); + +activities.setFeedControl("", "my app tool"); + +feedControls = activities.getFeedControls(); +test.assertEquals(3, feedControls.length); + + +activities.unsetFeedControl("my site", "my app tool"); +activities.unsetFeedControl("my site", ""); +activities.unsetFeedControl(null, "my app tool"); + +feedControls = activities.getFeedControls(); +test.assertEquals(0, feedControls.length); + failure = ""; diff --git a/source/java/org/alfresco/service/cmr/activities/ActivityService.java b/source/java/org/alfresco/service/cmr/activities/ActivityService.java index 4136e7d7bf..8a091def1e 100644 --- a/source/java/org/alfresco/service/cmr/activities/ActivityService.java +++ b/source/java/org/alfresco/service/cmr/activities/ActivityService.java @@ -116,7 +116,7 @@ public interface ActivityService */ /** - * For current user, set feed control (opt-out) for a site or an appTool or a site/appTool + * For current user, set feed control (opt-out) for a site or an appTool or a site/appTool combination * * @param feedControl - required */ diff --git a/source/java/org/alfresco/service/cmr/activities/FeedControl.java b/source/java/org/alfresco/service/cmr/activities/FeedControl.java index 2a3fc6b21f..5dd34102ec 100644 --- a/source/java/org/alfresco/service/cmr/activities/FeedControl.java +++ b/source/java/org/alfresco/service/cmr/activities/FeedControl.java @@ -24,11 +24,16 @@ */ package org.alfresco.service.cmr.activities; -public class FeedControl +import java.io.Serializable; + +public class FeedControl implements Serializable { + private static final long serialVersionUID = -1934566916718472843L; + private String siteId; private String appToolId; + public FeedControl(String siteId, String appToolId) { if (siteId == null) siteId = "";