/** @inheritDoc */
  protected List<User> 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<User> users = SecurityService.unlockUsers(ability, ref.getReference());

      // get the list of users who have the appropriate access to the resource
      if (getResourceAbility() != null) {
        List<User> users2 = SecurityService.unlockUsers(getResourceAbility(), ref.getReference());

        // find intersection of users and user2
        users.retainAll(users2);
      }

      // only use direct site members for the base list of users
      refineToSiteMembers(users, site);

      // add any other users
      addSpecialRecipients(users, ref);

      return users;
    } catch (Exception any) {
      return new Vector<User>();
    }
  }