All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sakaiproject.util.SiteEmailNotification Maven / Gradle / Ivy

There is a newer version: 23.3
Show newest version
/**********************************************************************************
 * $URL$
 * $Id$
 ***********************************************************************************
 *
 * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Sakai Foundation
 *
 * Licensed under the Educational Community License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.opensource.org/licenses/ECL-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 **********************************************************************************/

package org.sakaiproject.util;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import org.sakaiproject.alias.api.Alias;
import org.sakaiproject.alias.api.AliasService;
import org.sakaiproject.authz.cover.SecurityService;
import org.sakaiproject.authz.api.Member;
import org.sakaiproject.component.cover.ComponentManager;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.entity.cover.EntityManager;
import org.sakaiproject.event.api.Event;
import org.sakaiproject.event.api.NotificationAction;
import org.sakaiproject.event.cover.NotificationService;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.user.api.User;

/**
 * 

* SiteEmailNotification is an EmailNotification that selects the site's participants (based on site access) as the recipients of the notification. *

*

* getRecipients() is satified here (although it can be customized by the extensions to this class). *

*

* The following should be specified to extend the class: *

    *
  • getResourceAbility() - to require an additional permission to qualify as a recipient (other than site membership)
  • *
  • addSpecialRecipients() - to add other recipients
  • *
*

*/ public class SiteEmailNotification extends EmailNotification { private AliasService aliasService; /** * Construct. */ public SiteEmailNotification() { this(ComponentManager.get(AliasService.class)); } public SiteEmailNotification(AliasService aliasService) { this.aliasService = aliasService; } /** * Construct. * * @param siteId * The id of the site whose users will get a mailing. */ public SiteEmailNotification(String siteId) { super(siteId); } /** * @inheritDoc */ public NotificationAction getClone() { EmailNotification clone = makeEmailNotification(); clone.set(this); return clone; } /** * @inheritDoc */ protected List getRecipients(Event event) { // get the resource reference Reference ref = EntityManager.newReference(event.getResource()); // use either the configured site, or if not configured, the site (context) of the resource String siteId = (getSite() != null) ? getSite() : ref.getContext(); // if the site is published, use the list of users who can SITE_VISIT the site, // else use the list of users who can SITE_VISIT_UNP the site. try { Site site = SiteService.getSite(siteId); String ability = SiteService.SITE_VISIT; if (!site.isPublished()) { ability = SiteService.SITE_VISIT_UNPUBLISHED; } // get the list of users who can do the right kind of visit List users = SecurityService.unlockUsers(ability, ref.getReference()); // get the list of users who have the appropriate access to the resource if (getResourceAbility() != null) { List users2 = SecurityService.unlockUsers(getResourceAbility(), ref.getReference()); // find intersection of users and user2 users.retainAll(users2); } // add any other users addSpecialRecipients(users, ref); //only use direct site members for the base list of users refineToSiteMembers(users, site); return users; } catch (Exception any) { return new Vector(); } } /** * Add to the user list any other users who should be notified about this ref's change. * * @param users * The user list, already populated based on site visit and resource ability. * @param ref * The entity reference. */ protected void addSpecialRecipients(List users, Reference ref) { } /** * Get the additional security function string needed for the resource that is the target of the notification
* users who get notified need to have this ability with this resource, too. * * @return The additional ability string needed for a user to receive notification. */ protected String getResourceAbility() { return null; } /** * Format a to address, sensitive to the notification service's replyable configuration. * * @param event * @return */ protected String getTo(Event event) { if (NotificationService.isNotificationToReplyable()) { // to site title return "To: " + getToSite(event); } else { // to the site, but with no reply return "To: " + getToSiteNoReply(event); } } /** * Format a to address, to the related site, but with no reply. * * @param event * The event that matched criteria to cause the notification. * @return a to address, to the related site, but with no reply. */ protected String getToSiteNoReply(Event event) { Reference ref = EntityManager.newReference(event.getResource()); // use either the configured site, or if not configured, the site (context) of the resource String siteId = (getSite() != null) ? getSite() : ref.getContext(); // get a site title String title = siteId; try { Site site = SiteService.getSite(siteId); title = site.getTitle(); } catch (Exception ignore) { } return "\"" + title + "\" <"+ ServerConfigurationService.getString("setup.request","no-reply@" + ServerConfigurationService.getServerName()) + ">"; } /** * Format the to site email address. * * @param event * The event that matched criteria to cause the notification. * @return the email address attribution for the site. */ protected String getToSite(Event event) { Reference ref = EntityManager.newReference(event.getResource()); // use either the configured site, or if not configured, the site (context) of the resource String siteId = (getSite() != null) ? getSite() : ref.getContext(); // get a site title String title = siteId; String email = null; try { Site site = SiteService.getSite(siteId); title = site.getTitle(); // check that the channel exists String channel = "/mailarchive/channel/" + siteId + "/main"; EntityManager.newReference(channel); // find the alias for this site's mail channel List all = aliasService.getAliases(channel); if (!all.isEmpty()) email = ((Alias) all.get(0)).getId(); } catch (Exception ignore) { } // if for any reason we did not find an email, setup for the no-reply for email if (email == null) email = "no-reply"; String rv = "\"" + title + "\" <" + email + "@" + ServerConfigurationService.getServerName() + ">"; return rv; } /** * Refine the recipients list to only users that are actually members * of the given site. * * @param users * The list of users to refine * @param site * The site whose membership the users will be refined to */ protected void refineToSiteMembers(List users, Site site) { Set members = site.getMembers(); Set memberUserIds = getUserIds(members); for (Iterator i = users.listIterator(); i.hasNext();) { User user = i.next(); if (!memberUserIds.contains(user.getId())) { i.remove(); } } } /** * Extract a 'Set' of user ids from the given set of members. * * @param members The Set of members from which to extract the userIds * @return * The set of user ids that belong to the users in the member set. */ private Set getUserIds(Collection members) { Set userIds = new HashSet(); for (Member member : members) userIds.add(member.getUserId()); return userIds; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy