diff --git a/config/alfresco/site-services-context.xml b/config/alfresco/site-services-context.xml index 5371db62bc..a743a85270 100644 --- a/config/alfresco/site-services-context.xml +++ b/config/alfresco/site-services-context.xml @@ -22,6 +22,8 @@ + + diff --git a/source/java/org/alfresco/repo/activities/ActivityType.java b/source/java/org/alfresco/repo/activities/ActivityType.java index d799100402..1ec54fd4b6 100644 --- a/source/java/org/alfresco/repo/activities/ActivityType.java +++ b/source/java/org/alfresco/repo/activities/ActivityType.java @@ -30,4 +30,9 @@ public interface ActivityType // generic fallback (if specific template is missing) public final String GENERIC_FALLBACK = "org.alfresco.generic"; + + // site membership + public final String SITE_USER_JOINED = "org.alfresco.site.user-joined"; + public final String SITE_USER_REMOVED = "org.alfresco.site.user-left"; + public final String SITE_USER_ROLE_UPDATE = "org.alfresco.site.user-role-changed"; } diff --git a/source/java/org/alfresco/repo/site/SiteServiceImpl.java b/source/java/org/alfresco/repo/site/SiteServiceImpl.java index 58b7f5190c..92683fc0ba 100644 --- a/source/java/org/alfresco/repo/site/SiteServiceImpl.java +++ b/source/java/org/alfresco/repo/site/SiteServiceImpl.java @@ -33,8 +33,10 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; +import org.alfresco.repo.activities.ActivityType; import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.service.cmr.activities.ActivityService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -42,28 +44,40 @@ import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AccessPermission; +import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.AbstractLifecycleBean; import org.alfresco.util.ISO9075; import org.alfresco.util.PropertyMap; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.json.JSONObject; import org.springframework.context.ApplicationEvent; /** - * Bootstraps the site AVN and DM stores + * Site Service Implementation. Also bootstraps the site AVM and DM stores. * * @author Roy Wetherall */ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteService, SiteModel { + private static Log logger = LogFactory.getLog(SiteServiceImpl.class); + public static final String SITE_AVM_STORE = "SiteStore"; public static final StoreRef SITE_DM_STORE = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SiteStore"); + private static final String ACTIVITY_TOOL = "siteService"; + private NodeService nodeService; private SearchService searchService; private PermissionService permissionService; + private ActivityService activityService; + private PersonService personService; private AuthenticationComponent authenticationComponent; private RetryingTransactionHelper retryingTransactionHelper; @@ -82,6 +96,16 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic this.permissionService = permissionService; } + public void setActivityService(ActivityService activityService) + { + this.activityService = activityService; + } + + public void setPersonService(PersonService personService) + { + this.personService = personService; + } + public void setAuthenticationComponent(AuthenticationComponent authenticationComponent) { this.authenticationComponent = authenticationComponent; @@ -359,7 +383,17 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic // TODO do not remove the only site manager // Clear the permissions for the user - this.permissionService.clearPermission(siteNodeRef, userName); + this.permissionService.clearPermission(siteNodeRef, userName); + + if (AuthorityType.getAuthorityType(userName) == AuthorityType.USER) + { + activityService.postActivity(ActivityType.SITE_USER_REMOVED, shortName, ACTIVITY_TOOL, getActivityData(userName, "")); + } + else + { + // TODO - update this, if sites support groups + logger.error("setMembership - failed to post activity: unexpected authority type: " + AuthorityType.getAuthorityType(userName)); + } } /** @@ -373,6 +407,18 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic throw new AlfrescoRuntimeException("Site " + shortName + " does not exist."); } + boolean alreadyMember = false; + Set permissions = this.permissionService.getAllSetPermissions(siteNodeRef); + for (AccessPermission permission : permissions) + { + String authority = permission.getAuthority(); + if (authority.equals(userName)) + { + alreadyMember = true; + break; + } + } + // TODO if this is the only site manager do not downgrade their permissions // Clear any existing permissions @@ -380,6 +426,58 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic // Set the permissions this.permissionService.setPermission(siteNodeRef, userName, role, true); + + if (! alreadyMember) + { + if (AuthorityType.getAuthorityType(userName) == AuthorityType.USER) + { + activityService.postActivity(ActivityType.SITE_USER_JOINED, shortName, ACTIVITY_TOOL, getActivityData(userName, role)); + } + else + { + // TODO - update this, if sites support groups + logger.error("setMembership - failed to post activity: unexpected authority type: " + AuthorityType.getAuthorityType(userName)); + } + } + else + { + if (AuthorityType.getAuthorityType(userName) == AuthorityType.USER) + { + activityService.postActivity(ActivityType.SITE_USER_ROLE_UPDATE, shortName, ACTIVITY_TOOL, getActivityData(userName, role)); + } + else + { + // TODO - update this, if sites support groups + logger.error("setMembership - failed to post activity: unexpected authority type: " + AuthorityType.getAuthorityType(userName)); + } + } + } + + private String getActivityData(String userName, String role) + { + String memberFN = ""; + String memberLN = ""; + NodeRef person = personService.getPerson(userName); + if (person != null) + { + memberFN = (String)nodeService.getProperty(person, ContentModel.PROP_FIRSTNAME); + memberLN = (String)nodeService.getProperty(person, ContentModel.PROP_LASTNAME); + } + + try + { + JSONObject activityData = new JSONObject(); + activityData.put("role", role); + activityData.put("memberFirstName", memberFN); + activityData.put("memberLastName", memberLN); + return activityData.toString(); + } + catch (JSONException je) + { + // log error, subsume exception + logger.error("Failed to get activity data: " + je); + return ""; + } } /**