/**
   * Adds attendees to an existing event with a given role Common logic for addAttendeesToEvent and
   * addChairAttendeestoEvent
   *
   * @param vevent the VEvent to add the attendess too
   * @param attendees list of Users that have been invited to the event
   * @param role the role with which to add each user
   * @return the VEvent for the given event or null if there was an error
   */
  protected VEvent addAttendeesToEventWithRole(VEvent vevent, List<User> attendees, Role role) {

    if (!isIcsEnabled()) {
      log.debug(
          "ExternalCalendaringService is disabled. Enable via calendar.ics.generation.enabled=true in sakai.properties");
      return null;
    }

    // add attendees to event with 'required participant' role
    if (attendees != null) {
      for (User u : attendees) {
        Attendee a = new Attendee(createMailURI(u.getEmail()));
        a.getParameters().add(role);
        a.getParameters().add(new Cn(u.getDisplayName()));
        a.getParameters().add(PartStat.ACCEPTED);
        a.getParameters().add(Rsvp.FALSE);

        vevent.getProperties().add(a);
      }
    }

    if (log.isDebugEnabled()) {
      log.debug("VEvent with attendees:" + vevent);
    }

    return vevent;
  }
  /** {@inheritDoc} */
  public void notifyCourseRequestRequester(
      String requestEmail, String supportEmailContent, String termTitle) {
    User currentUser = userDirectoryService.getCurrentUser();
    String currentUserDisplayName = currentUser != null ? currentUser.getDisplayName() : "";
    String currentUserDisplayId = currentUser != null ? currentUser.getDisplayId() : "";
    String currentUserId = currentUser != null ? currentUser.getId() : "";
    String currentUserEmail = currentUser != null ? currentUser.getEmail() : "";

    ResourceLoader rb = new ResourceLoader(currentUserId, "UserNotificationProvider");

    String from = requestEmail;
    String to = currentUserEmail;
    String headerTo = to;
    String replyTo = to;
    // message subject
    String message_subject =
        rb.getString("java.sitereqfrom")
            + " "
            + currentUserDisplayName
            + " "
            + rb.getString("java.for")
            + " "
            + termTitle;

    StringBuffer buf = new StringBuffer();
    buf.append(rb.getString("java.isbeing") + " ");
    buf.append(rb.getString("java.meantime") + "\n\n");
    buf.append(rb.getString("java.copy") + "\n\n");
    buf.append(supportEmailContent);
    buf.append("\n" + rb.getString("java.wish") + " " + requestEmail);
    emailService.send(from, to, message_subject, buf.toString(), headerTo, replyTo, null);
  }
 public String getUserNameForDisplay(User user) {
   if (isSortUsersByDisplayName()) {
     return user.getDisplayName();
   } else {
     return user.getSortName();
   }
 }
  protected Map<String, String> getCurrentUserFields() {
    Map<String, String> rv = new HashMap<String, String>();
    String userRef = developerHelperService.getCurrentUserReference();
    if (userRef != null) {
      User user = (User) developerHelperService.fetchEntity(userRef);
      try {
        String email = user.getEmail();
        if (email == null) email = "";
        String first = user.getFirstName();
        if (first == null) first = "";
        String last = user.getLastName();
        if (last == null) last = "";

        rv.put(CURRENT_USER_EMAIL, email);
        rv.put(CURRENT_USER_FIRST_NAME, first);
        rv.put(CURRENT_USER_LAST_NAME, last);
        rv.put(CURRENT_USER_DISPLAY_NAME, user.getDisplayName());
        rv.put(CURRENT_USER_DISPLAY_ID, user.getDisplayId());
        rv.put("currentUserDispalyId", user.getDisplayId());

      } catch (Exception e) {
        log.warn("Failed to get current user replacements: " + userRef, e);
      }
    }
    /*NoN user fields */
    rv.put(LOCAL_SAKAI_NAME, serverConfigurationService.getString("ui.service", "Sakai"));
    rv.put(
        LOCAL_SAKAI_SUPPORT_MAIL,
        serverConfigurationService.getString(
            "support.email", "help@" + serverConfigurationService.getServerUrl()));
    rv.put(LOCAL_SAKAI_URL, serverConfigurationService.getServerUrl());

    return rv;
  }
  /**
   * Format the announcement notification from address.
   *
   * @param event The event that matched criteria to cause the notification.
   * @return the announcement notification from address.
   */
  protected String getFromAddress(Event event) {
    Reference ref = EntityManager.newReference(event.getResource());

    // SAK-14831, yorkadam, make site title reflected in 'From:' name instead of default
    // ServerConfigurationService.getString("ui.service", "Sakai");
    String siteId = (getSite() != null) ? getSite() : ref.getContext();
    String title = "";
    try {
      Site site = SiteService.getSite(siteId);
      title = site.getTitle();
    } catch (Exception ignore) {
    }

    String userEmail = "no-reply@" + ServerConfigurationService.getServerName();
    String userDisplay = ServerConfigurationService.getString("ui.service", "Sakai");
    // String no_reply = "From: \"" + userDisplay + "\" <" + userEmail + ">";
    // String no_reply_withTitle = "From: \"" + title + "\" <" + userEmail + ">";
    String from = "From: Sakai"; // fallback value
    if (title != null && !title.equals("")) {
      from = "From: \"" + title + "\" <" + userEmail + ">";
    } else {
      String fromVal = getFrom(event); // should not return null but better safe than sorry
      if (fromVal != null) {
        from = fromVal;
      }
    }

    // get the message
    AnnouncementMessage msg = (AnnouncementMessage) ref.getEntity();
    String userId = msg.getAnnouncementHeader().getFrom().getDisplayId();

    // checks if "from" email id has to be included? and whether the notification is a delayed
    // notification?. SAK-13512
    // SAK-20988 - emailFromReplyable@org.sakaiproject.event.api.NotificationService is deprecated
    boolean notificationEmailFromReplyable =
        ServerConfigurationService.getBoolean("notify.email.from.replyable", false);
    if (notificationEmailFromReplyable && from.contains("no-reply@") && userId != null) {
      try {
        User u = UserDirectoryService.getUser(userId);
        userDisplay = u.getDisplayName();
        userEmail = u.getEmail();
        if ((userEmail != null) && (userEmail.trim().length()) == 0) userEmail = null;

      } catch (UserNotDefinedException e) {
      }

      // some fallback positions
      if (userEmail == null) userEmail = "no-reply@" + ServerConfigurationService.getServerName();
      if (userDisplay == null)
        userDisplay = ServerConfigurationService.getString("ui.service", "Sakai");
      from = "From: \"" + userDisplay + "\" <" + userEmail + ">";
    }

    return from;
  }
示例#6
0
 /** @return return the current user */
 public EmailUser getCurrentUser() {
   EmailUser euser = null;
   User curU = null;
   try {
     curU = m_userDirectoryService.getCurrentUser();
     euser = new EmailUser(curU.getId(), curU.getDisplayName(), curU.getEmail());
   } catch (Exception e) {
     log.debug("Exception: Mailtool.getCurrentUser(), " + e.getMessage());
   }
   return euser;
 }
  public RankImage createRankImageAttachmentObject(String attachId, String name) {
    if (!isRanksEnabled()) {
      LOG.warn("createRankImageAttachmentObject invoked, but ranks are disabled");
      return null;
    }
    try {
      RankImage attach = new RankImageImpl();
      attach.setCreated(new Date());
      attach.setModified(new Date());

      ContentResource cr = contentHostingService.getResource(attachId);

      User creator =
          userDirectoryService.getUser(
              cr.getProperties().getProperty(cr.getProperties().getNamePropCreator()));
      attach.setCreatedBy(creator.getDisplayName());
      User modifier =
          userDirectoryService.getUser(
              cr.getProperties().getProperty(cr.getProperties().getNamePropModifiedBy()));
      attach.setModifiedBy(modifier.getDisplayName());

      attach.setAttachmentSize((Long.valueOf(cr.getContentLength())).toString());
      attach.setAttachmentId(attachId);
      attach.setAttachmentName(name);
      attach.setAttachmentType(cr.getContentType());
      String tempString = cr.getUrl();
      attach.setAttachmentUrl(resourceUrlEscaping(tempString));

      getHibernateTemplate().saveOrUpdate(attach);

      return attach;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }
  public void notifyNewUserEmail(User user, String newUserPassword, String siteTitle) {

    String from = getSetupRequestEmailAddress();
    String productionSiteName = serverConfigurationService.getString("ui.service", "");
    String newUserEmail = user.getEmail();
    String to = newUserEmail;
    String headerTo = newUserEmail;
    String replyTo = newUserEmail;

    String content = "";

    if (from != null && newUserEmail != null) {
      /*
       * $userName
       * $localSakaiName
       * $currentUserName
       * $localSakaiUrl
       */
      Map<String, String> replacementValues = new HashMap<String, String>();
      replacementValues.put("userName", user.getDisplayName());
      replacementValues.put(
          "localSakaiName", serverConfigurationService.getString("ui.service", ""));
      replacementValues.put(
          "currentUserName", userDirectoryService.getCurrentUser().getDisplayName());
      replacementValues.put("userEid", user.getEid());
      replacementValues.put("localSakaiUrl", serverConfigurationService.getPortalUrl());
      replacementValues.put("newPassword", newUserPassword);
      replacementValues.put("siteName", siteTitle);
      replacementValues.put("productionSiteName", productionSiteName);
      RenderedTemplate template =
          emailTemplateService.getRenderedTemplateForUser(
              NOTIFY_NEW_USER, user.getReference(), replacementValues);
      if (template == null) return;
      content = template.getRenderedMessage();

      String message_subject = template.getRenderedSubject();
      List<String> headers = new ArrayList<String>();
      headers.add("Precedence: bulk");
      emailService.send(from, to, message_subject, content, headerTo, replyTo, headers);
    }
  }
  /** {@inheritDoc} */
  public void notifyNewUserEmail(User user, String newUserPassword, Site site) {
    ResourceLoader rb = new ResourceLoader("UserNotificationProvider");
    // set the locale to individual receipient's setting
    rb.setContextLocale(rb.getLocale(user.getId()));

    String from = getSetupRequestEmailAddress();
    String productionSiteName = serverConfigurationService.getString("ui.service", "");
    String productionSiteUrl = serverConfigurationService.getPortalUrl();

    String newUserEmail = user.getEmail();
    String to = newUserEmail;
    String headerTo = newUserEmail;
    // UVa: change Reply-To to be the From (collab support) address
    String replyTo = from;
    String message_subject = productionSiteName + " " + rb.getString("java.newusernoti");
    String content = "";

    if (from != null && newUserEmail != null) {
      StringBuilder buf = new StringBuilder();
      buf.setLength(0);

      // email body
      buf.append(user.getDisplayName() + ":\n\n");

      buf.append(
          rb.getString("java.addedto")
              + " "
              + productionSiteName
              + " ("
              + productionSiteUrl
              + ") ");
      buf.append(rb.getString("java.simpleby") + " ");
      buf.append(userDirectoryService.getCurrentUser().getDisplayName() + ". \n\n");
      buf.append(rb.getString("java.passwordis1") + "\n" + newUserPassword + "\n\n");
      buf.append(rb.getString("java.passwordis2") + "\n\n");

      content = buf.toString();
      emailService.send(from, to, message_subject, content, headerTo, replyTo, null);
    }
  }
  /** {@inheritDoc} */
  public void notifyTemplateUse(Site templateSite, User currentUser, Site site) {
    // send an email to track who are using the template
    String from = getSetupRequestEmailAddress();
    // send it to the email archive of the template site
    // TODO: need a better way to get the email archive address
    // String domain = from.substring(from.indexOf('@'));
    String templateEmailArchive =
        templateSite.getId() + "@" + serverConfigurationService.getServerName();
    String to = templateEmailArchive;
    String headerTo = templateEmailArchive;
    String replyTo = templateEmailArchive;
    String message_subject = templateSite.getId() + ": copied by " + currentUser.getDisplayId();

    if (from != null && templateEmailArchive != null) {
      StringBuffer buf = new StringBuffer();
      buf.setLength(0);

      // email body
      buf.append("Dear template maintainer,\n\n");
      buf.append("Congratulations!\n\n");
      buf.append("The following user just created a new site based on your template.\n\n");
      buf.append("Template name: " + templateSite.getTitle() + "\n");
      buf.append(
          "User         : "******" ("
              + currentUser.getDisplayId()
              + ")\n");
      buf.append("Date         : " + new java.util.Date() + "\n");
      buf.append("New site Id  : " + site.getId() + "\n");
      buf.append("New site name: " + site.getTitle() + "\n\n");
      buf.append("Cheers,\n");
      buf.append("Alliance Team\n");
      String content = buf.toString();

      emailService.send(from, to, message_subject, content, headerTo, replyTo, null);
    }
  }
示例#11
0
  protected void processRoster(
      HttpServletRequest request,
      HttpServletResponse response,
      String lti_message_type,
      Site site,
      String siteId,
      String placement_id,
      Properties pitch,
      String user_id,
      Map<String, Object> theMap)
      throws java.io.IOException {
    // Check for permission in placement
    String allowRoster = pitch.getProperty(LTIService.LTI_ALLOWROSTER);
    if (!"on".equals(allowRoster)) {
      doError(
          request,
          response,
          theMap,
          "outcomes.invalid",
          "lti_message_type=" + lti_message_type,
          null);
      return;
    }

    String roleMapProp = pitch.getProperty("rolemap");
    String releaseName = pitch.getProperty(LTIService.LTI_SENDNAME);
    String releaseEmail = pitch.getProperty(LTIService.LTI_SENDEMAILADDR);
    String assignment = pitch.getProperty("assignment");
    String allowOutcomes =
        ServerConfigurationService.getString(
            SakaiBLTIUtil.BASICLTI_OUTCOMES_ENABLED,
            SakaiBLTIUtil.BASICLTI_OUTCOMES_ENABLED_DEFAULT);
    if (!"true".equals(allowOutcomes)) allowOutcomes = null;

    String maintainRole = site.getMaintainRole();

    SakaiBLTIUtil.pushAdvisor();
    boolean success = false;
    try {
      List<Map<String, Object>> lm = new ArrayList<Map<String, Object>>();
      Set<Member> members = site.getMembers();
      Map<String, String> roleMap = SakaiBLTIUtil.convertRoleMapPropToMap(roleMapProp);
      for (Member member : members) {
        Map<String, Object> mm = new TreeMap<String, Object>();
        Role role = member.getRole();
        String ims_user_id = member.getUserId();
        mm.put("/user_id", ims_user_id);
        String ims_role = "Learner";

        // If there is a role mapping, it has precedence over site.update
        if (roleMap.containsKey(role.getId())) {
          ims_role = roleMap.get(role.getId());
        } else if (ComponentManager.get(AuthzGroupService.class)
            .isAllowed(ims_user_id, SiteService.SECURE_UPDATE_SITE, "/site/" + siteId)) {
          ims_role = "Instructor";
        }

        // Using "/role" is inconsistent with to
        // http://developers.imsglobal.org/ext_membership.html. It
        // should be roles. If we can determine that nobody is using
        // the role tag, we should remove it.

        mm.put("/role", ims_role);
        mm.put("/roles", ims_role);
        User user = null;
        if ("true".equals(allowOutcomes) && assignment != null) {
          user = UserDirectoryService.getUser(ims_user_id);
          String placement_secret = pitch.getProperty(LTIService.LTI_PLACEMENTSECRET);
          String result_sourcedid =
              SakaiBLTIUtil.getSourceDID(user, placement_id, placement_secret);
          if (result_sourcedid != null) mm.put("/lis_result_sourcedid", result_sourcedid);
        }

        if ("on".equals(releaseName) || "on".equals(releaseEmail)) {
          if (user == null) user = UserDirectoryService.getUser(ims_user_id);
          if ("on".equals(releaseName)) {
            mm.put("/person_name_given", user.getFirstName());
            mm.put("/person_name_family", user.getLastName());
            mm.put("/person_name_full", user.getDisplayName());
          }
          if ("on".equals(releaseEmail)) {
            mm.put("/person_contact_email_primary", user.getEmail());
            mm.put("/person_sourcedid", user.getEid());
          }
        }

        Collection groups = site.getGroupsWithMember(ims_user_id);

        if (groups.size() > 0) {
          List<Map<String, Object>> lgm = new ArrayList<Map<String, Object>>();
          for (Iterator i = groups.iterator(); i.hasNext(); ) {
            Group group = (Group) i.next();
            Map<String, Object> groupMap = new HashMap<String, Object>();
            groupMap.put("/id", group.getId());
            groupMap.put("/title", group.getTitle());
            groupMap.put("/set", new HashMap(groupMap));
            lgm.add(groupMap);
          }
          mm.put("/groups/group", lgm);
        }

        lm.add(mm);
      }
      theMap.put("/message_response/members/member", lm);
      success = true;
    } catch (Exception e) {
      doError(request, response, theMap, "memberships.fail", "", e);
    } finally {
      SakaiBLTIUtil.popAdvisor();
    }

    if (!success) return;

    theMap.put("/message_response/statusinfo/codemajor", "Success");
    theMap.put("/message_response/statusinfo/severity", "Status");
    theMap.put("/message_response/statusinfo/codeminor", "fullsuccess");
    String theXml = XMLMap.getXML(theMap, true);
    PrintWriter out = response.getWriter();
    out.println(theXml);
    M_log.debug(theXml);
  }
示例#12
0
  public void printComment(
      SimplePageComment comment,
      UIContainer tofill,
      boolean highlight,
      boolean anonymous,
      boolean showModifiers,
      CommentsViewParameters params,
      SimplePageItem commentsItem,
      SimplePage currentPage) {
    if (canEditPage && itemToPageowner != null && comment.getItemId() != lastTitle) {
      UIBranchContainer commentContainer = UIBranchContainer.make(tofill, "commentList:");
      UIOutput.make(
          commentContainer,
          "commentTitle",
          messageLocator
              .getMessage("simplepage.comments-grading")
              .replace("{}", itemToPageowner.get(comment.getItemId())));
      lastTitle = comment.getItemId();
    }

    // print title if this is a comment on a different page. Normally this
    // shold only happen for subpages of student pages
    String pageTitle = null;
    if (currentPage.getPageId() != comment.getPageId()) {
      SimplePage commentPage = simplePageBean.getPage(comment.getPageId());
      pageTitle = commentPage.getTitle();
    }

    UIBranchContainer commentContainer = UIBranchContainer.make(tofill, "commentList:");
    UIOutput.make(commentContainer, "commentDiv");
    if (highlight) commentContainer.decorate(new UIStyleDecorator("highlight-comment"));

    if (!filter && params.author != null && params.author.equals(comment.getAuthor())) {
      commentContainer.decorate(new UIStyleDecorator("backgroundHighlight"));
    }

    String author;

    if (!anonymous) {
      try {
        User user = UserDirectoryService.getUser(comment.getAuthor());
        author = user.getDisplayName();
      } catch (Exception ex) {
        author = messageLocator.getMessage("simplepage.comment-unknown-user");
        ex.printStackTrace();
      }
    } else {
      author = anonymousLookup.get(comment.getAuthor());

      if (comment.getAuthor().equals(owner)) {
        author = messageLocator.getMessage("simplepage.comment-author-owner");
      }

      if (author == null) author = "Anonymous User"; // Shouldn't ever occur

      if (simplePageBean.getEditPrivs() == 0) {
        try {
          User user = UserDirectoryService.getUser(comment.getAuthor());
          author += " (" + user.getDisplayName() + ")";
        } catch (Exception ex) {
          author += " (" + messageLocator.getMessage("simplepage.comment-unknown-user") + ")";
        }
      } else if (comment.getAuthor().equals(currentUserId)) {
        author += " (" + messageLocator.getMessage("simplepage.comment-you") + ")";
      }
    }

    UIOutput authorOutput = UIOutput.make(commentContainer, "userId", author);

    if (comment.getAuthor().equals(currentUserId)) {
      authorOutput.decorate(new UIStyleDecorator("specialCommenter"));
      authorOutput.decorate(new UIStyleDecorator("personalComment"));
    } else if (comment.getAuthor().equals(owner)) {
      authorOutput.decorate(new UIStyleDecorator("specialCommenter"));
      authorOutput.decorate(new UIStyleDecorator("ownerComment"));
    }

    if (pageTitle != null) UIOutput.make(commentContainer, "pageTitle", pageTitle);

    String timeDifference = getTimeDifference(comment.getTimePosted().getTime());

    UIOutput.make(commentContainer, "timePosted", timeDifference);

    if (showModifiers) {
      UIOutput.make(commentContainer, "deleteSpan");

      CommentsViewParameters eParams = (CommentsViewParameters) params.copy();
      eParams.placementId = params.placementId;
      eParams.deleteComment = comment.getUUID();
      eParams.pageId = params.pageId;
      eParams.siteId = params.siteId;

      UIInternalLink.make(commentContainer, "deleteCommentURL", eParams);
      UIOutput.make(commentContainer, "deleteComment")
          .decorate(
              new UIFreeAttributeDecorator(
                  "title",
                  messageLocator.getMessage("simplepage.comment-delete").replace("{}", author)));
      UIOutput.make(commentContainer, "editComment")
          .decorate(
              new UIFreeAttributeDecorator("onclick", "edit($(this), " + comment.getId() + ");"))
          .decorate(
              new UIFreeAttributeDecorator(
                  "title",
                  messageLocator.getMessage("simplepage.comment-edit").replace("{}", author)));

      if (!filter && simplePageBean.getEditPrivs() == 0 && commentsItem.getGradebookId() != null) {
        UIOutput.make(commentContainer, "gradingSpan");
        UIOutput.make(commentContainer, "commentsUUID", comment.getUUID());
        UIOutput.make(
            commentContainer,
            "commentPoints",
            (comment.getPoints() == null ? "" : String.valueOf(comment.getPoints())));
        UIOutput.make(commentContainer, "pointsBox")
            .decorate(
                new UIFreeAttributeDecorator(
                    "title",
                    messageLocator
                        .getMessage("simplepage.grade-for-student")
                        .replace("{}", author)));

        UIOutput.make(commentContainer, "maxpoints", " / " + commentsItem.getGradebookPoints());
        UIOutput.make(commentContainer, "authorUUID", comment.getAuthor());
      }
    }

    if (filter && simplePageBean.getEditPrivs() == 0) {
      UIOutput.make(commentContainer, "contextSpan");

      // because this is called via /faces, the full Sakai context is not set up.
      // in particular, UIInternalLink will generate the wrong thing. Thus we
      // make up a full URL ourselves.
      String pars =
          "/portal/tool/"
              + URLEncoder.encode(params.placementId)
              + "/ShowPage?path=none"
              + "&author="
              + URLEncoder.encode(comment.getAuthor());
      // Need to provide the item ID
      if (!params.studentContentItem && params.pageItemId != -1L) {
        pars += "&itemId=" + URLEncoder.encode(Long.toString(params.pageItemId));
      }
      UILink contextLink =
          UILink.make(
              commentContainer,
              "contextLink",
              messageLocator.getMessage("simplepage.show-context"),
              pars);
      if (itemToPageowner == null)
        contextLink.decorate(
            new UIFreeAttributeDecorator(
                "title",
                messageLocator
                    .getMessage("simplepage.context-link-title-1")
                    .replace("{}", author)));
      else
        contextLink.decorate(
            new UIFreeAttributeDecorator(
                "title",
                messageLocator
                    .getMessage("simplepage.context-link-title-2")
                    .replace("{1}", author)
                    .replace("{2}", itemToPageowner.get(comment.getItemId()))));
    }

    String dateString = df.format(comment.getTimePosted());

    if (!filter)
      UIOutput.make(commentContainer, "replyTo")
          .decorate(
              new UIFreeAttributeDecorator(
                  "onclick",
                  "replyToComment($(this),'"
                      + messageLocator
                          .getMessage("simplepage.in-reply-to")
                          .replace("{1}", author)
                          .replace("{2}", dateString)
                      + "')"))
          .decorate(
              new UIFreeAttributeDecorator(
                  "title",
                  messageLocator.getMessage("simplepage.comment-reply").replace("{}", author)));

    if (!comment.getHtml()) {
      UIOutput.make(commentContainer, "comment", comment.getComment());
    } else {
      UIVerbatim.make(commentContainer, "comment", comment.getComment());
    }
  }
  /** {@inheritDoc} */
  public void notifySiteCreation(
      Site site, List notifySites, boolean courseSite, String termTitle, String requestEmail) {
    // send emails
    String id = site.getId();
    String title = site.getTitle();

    SimpleDateFormat dform = ((SimpleDateFormat) DateFormat.getDateInstance());
    dform.applyPattern("yyyy-MM-dd HH:mm:ss");
    String dateDisplay = dform.format(new Date());

    User currentUser = userDirectoryService.getCurrentUser();
    String currentUserName = currentUser.getDisplayName();
    String currentUserId = currentUser.getId();
    String currentUserEmail = currentUser.getEmail();

    ResourceLoader rb = new ResourceLoader("UserNotificationProvider");

    String message_subject =
        courseSite
            ? rb.getString("java.official")
                + " "
                + currentUserName
                + " "
                + rb.getString("java.for")
                + " "
                + termTitle
            : rb.getString("java.site.createdBy") + " " + currentUserName;

    String from = currentUser.getEmail();
    String to = requestEmail;
    String headerTo = requestEmail;
    String replyTo = currentUserEmail;
    StringBuilder buf = new StringBuilder();
    buf.append(
        "\n"
            + rb.getString("java.fromwork")
            + " "
            + serverConfigurationService.getServerName()
            + " "
            + rb.getString("java.supp")
            + ":\n\n");
    buf.append(courseSite ? rb.getString("java.off") : rb.getString("java.site"));
    buf.append(" '" + title + "' (id " + id + "), " + rb.getString("java.wasset") + " ");
    buf.append(
        currentUserName
            + " ("
            + currentUserId
            + ", "
            + rb.getString("java.email2")
            + " "
            + replyTo
            + ") ");
    buf.append(rb.getString("java.on") + " " + dateDisplay);
    if (courseSite) {
      buf.append(rb.getString("java.for") + " " + termTitle + ", ");
    }
    if (notifySites != null) {
      int nbr_sections = notifySites.size();
      if (nbr_sections > 1) {
        buf.append(
            rb.getString("java.withrost")
                + " "
                + Integer.toString(nbr_sections)
                + " "
                + rb.getString("java.sections")
                + "\n\n");
      } else {
        buf.append(" " + rb.getString("java.withrost2") + "\n\n");
      }

      for (int i = 0; i < nbr_sections; i++) {
        String course = (String) notifySites.get(i);
        buf.append(rb.getString("java.course2") + " " + course + "\n");
      }
    }
    emailService.send(from, to, message_subject, buf.toString(), headerTo, replyTo, null);

    // send a confirmation email to site creator
    from = requestEmail;
    to = currentUserEmail;
    headerTo = currentUserEmail;
    replyTo =
        serverConfigurationService.getString(
            "setup.request", "no-reply@" + serverConfigurationService.getServerName());
    String content =
        rb.getFormattedMessage(
            "java.siteCreation.confirmation",
            new Object[] {title, serverConfigurationService.getServerName()});
    content += "\n\n" + buf.toString();
    emailService.send(from, to, message_subject, content, headerTo, replyTo, null);
  }
  /** {@inheritDoc} */
  public boolean notifyCourseRequestAuthorizer(
      String instructorId,
      String requestEmail,
      String replyToEmail,
      String termTitle,
      String requestSectionInfo,
      String siteTitle,
      String siteId,
      String additionalInfo,
      String serverName) {
    try {
      User instructor = userDirectoryService.getUserByEid(instructorId);

      ResourceLoader rb = new ResourceLoader(instructorId, "UserNotificationProvider");

      StringBuffer buf = new StringBuffer();

      String to = instructor.getEmail();
      String from = requestEmail;
      String headerTo = to;
      String replyTo = replyToEmail;

      User currentUser = userDirectoryService.getCurrentUser();
      String currentUserDisplayName = currentUser != null ? currentUser.getDisplayName() : "";

      // message subject
      String message_subject =
          rb.getString("java.sitereqfrom")
              + " "
              + currentUserDisplayName
              + " "
              + rb.getString("java.for")
              + " "
              + termTitle;

      buf.append(rb.getString("java.hello") + " \n\n");
      buf.append(rb.getString("java.receiv") + " " + currentUserDisplayName + ", ");
      buf.append(rb.getString("java.who") + "\n");
      if (!termTitle.isEmpty()) {
        buf.append(termTitle + "\n");
      }

      // course section information
      buf.append(requestSectionInfo);

      buf.append(rb.getString("java.sitetitle") + "\t" + siteTitle + "\n");
      buf.append(rb.getString("java.siteid") + "\t" + siteId + "\n\n");
      buf.append(rb.getString("java.siteinstr") + "\n" + additionalInfo + "\n\n");
      buf.append(
          rb.getString("java.according")
              + " "
              + currentUserDisplayName
              + " "
              + rb.getString("java.record"));
      buf.append(
          " "
              + rb.getString("java.canyou")
              + " "
              + currentUserDisplayName
              + " "
              + rb.getString("java.assoc")
              + "\n\n");
      buf.append(
          rb.getString("java.respond")
              + " "
              + currentUserDisplayName
              + rb.getString("java.appoint")
              + "\n\n");
      buf.append(rb.getString("java.thanks") + "\n");
      buf.append(serverName + " " + rb.getString("java.support"));

      try {
        // send the email
        emailService.send(from, to, message_subject, buf.toString(), headerTo, replyTo, null);
        return true;
      } catch (Exception ee) {
        M_log.warn(
            this
                + " problem occurs with sending course request email to authorizer "
                + instructorId);
        return false;
      }
    } catch (Exception e) {
      M_log.warn(this + " cannot find user " + instructorId);
      return false;
    }
  }
  public void notifyAddedParticipant(boolean newNonOfficialAccount, User user, String siteTitle) {

    String from =
        serverConfigurationService.getBoolean(NOTIFY_FROM_CURRENT_USER, false)
            ? getCurrentUserEmailAddress()
            : getSetupRequestEmailAddress();
    // we need to get the template

    if (from != null) {
      String productionSiteName = serverConfigurationService.getString("ui.service", "");
      String emailId = user.getEmail();
      String to = emailId;
      String headerTo = emailId;
      String replyTo = emailId;
      Map<String, String> rv = new HashMap<String, String>();
      rv.put("productionSiteName", productionSiteName);

      String content = "";
      /*
       * $userName
       * $localSakaiName
       * $currentUserName
       * $localSakaiUrl
       */
      Map<String, String> replacementValues = new HashMap<String, String>();
      replacementValues.put("userName", user.getDisplayName());
      replacementValues.put("userEid", user.getEid());
      replacementValues.put(
          "localSakaiName", serverConfigurationService.getString("ui.service", ""));
      replacementValues.put(
          "currentUserName", userDirectoryService.getCurrentUser().getDisplayName());
      replacementValues.put("localSakaiUrl", serverConfigurationService.getPortalUrl());
      String nonOfficialAccountUrl =
          serverConfigurationService.getString("nonOfficialAccount.url", null);
      replacementValues.put(
          "hasNonOfficialAccountUrl",
          nonOfficialAccountUrl != null
              ? Boolean.TRUE.toString().toLowerCase()
              : Boolean.FALSE.toString().toLowerCase());
      replacementValues.put("nonOfficialAccountUrl", nonOfficialAccountUrl);
      replacementValues.put("siteName", siteTitle);
      replacementValues.put("productionSiteName", productionSiteName);
      replacementValues.put(
          "newNonOfficialAccount", Boolean.valueOf(newNonOfficialAccount).toString().toLowerCase());

      M_log.debug("getting template: sitemange.notifyAddedParticipant");
      RenderedTemplate template = null;
      try {
        template =
            emailTemplateService.getRenderedTemplateForUser(
                NOTIFY_ADDED_PARTICIPANT, user.getReference(), replacementValues);
        if (template == null) return;
      } catch (Exception e) {
        e.printStackTrace();
        return;
      }
      List<String> headers = new ArrayList<String>();
      headers.add("Precedence: bulk");

      content = template.getRenderedMessage();
      emailService.send(
          from, to, template.getRenderedSubject(), content, headerTo, replyTo, headers);
    } // if
  }
  /** {@inheritDoc} */
  public String notifyCourseRequestSupport(
      String requestEmail,
      String serverName,
      String request,
      String termTitle,
      int requestListSize,
      String requestSectionInfo,
      String officialAccountName,
      String siteTitle,
      String siteId,
      String additionalInfo,
      boolean requireAuthorizer,
      String authorizerNotified,
      String authorizerNotNotified) {
    ResourceLoader rb = new ResourceLoader("UserNotificationProvider");

    User currentUser = userDirectoryService.getCurrentUser();
    String currentUserDisplayName = currentUser != null ? currentUser.getDisplayName() : "";
    String currentUserDisplayId = currentUser != null ? currentUser.getDisplayId() : "";
    String currentUserEmail = currentUser != null ? currentUser.getEmail() : "";

    // To Support
    String from = currentUserEmail;
    String to = requestEmail;
    String headerTo = requestEmail;
    String replyTo = currentUserEmail;

    StringBuffer buf = new StringBuffer();
    buf.append(
        rb.getString("java.to") + "\t\t" + serverName + " " + rb.getString("java.supp") + "\n");
    buf.append("\n" + rb.getString("java.from") + "\t" + currentUserDisplayName + "\n");
    if ("new".equals(request)) {
      buf.append(rb.getString("java.subj") + "\t" + rb.getString("java.sitereq") + "\n");
    } else {
      buf.append(rb.getString("java.subj") + "\t" + rb.getString("java.sitechreq") + "\n");
    }
    SimpleDateFormat dform = ((SimpleDateFormat) DateFormat.getDateInstance());
    dform.applyPattern("yyyy-MM-dd HH:mm:ss");
    String dateDisplay = dform.format(new Date());

    buf.append(rb.getString("java.date") + "\t" + dateDisplay + "\n\n");
    if ("new".equals(request)) {
      buf.append(
          rb.getString("java.approval")
              + " "
              + serverName
              + " "
              + rb.getString("java.coursesite")
              + " ");
    } else {
      buf.append(
          rb.getString("java.approval2")
              + " "
              + serverName
              + " "
              + rb.getString("java.coursesite")
              + " ");
    }
    if (!termTitle.isEmpty()) {
      buf.append(termTitle);
    }
    if (requestListSize > 1) {
      buf.append(
          " "
              + rb.getString("java.forthese")
              + " "
              + requestListSize
              + " "
              + rb.getString("java.sections")
              + "\n\n");
    } else {
      buf.append(" " + rb.getString("java.forthis") + "\n\n");
    }
    // the course section information
    buf.append(requestSectionInfo);

    buf.append(
        rb.getString("java.name")
            + "\t"
            + currentUserDisplayName
            + " ("
            + officialAccountName
            + " "
            + currentUserDisplayId
            + ")\n");
    buf.append(rb.getString("java.email") + "\t" + replyTo + "\n");
    buf.append(rb.getString("java.sitetitle") + "\t" + siteTitle + "\n");
    buf.append(rb.getString("java.siteid") + "\t" + siteId + "\n\n");
    buf.append(rb.getString("java.siteinstr") + "\n" + additionalInfo + "\n\n");

    if (requireAuthorizer) {
      // if authorizer is required
      if (!authorizerNotified.isEmpty()) {
        buf.append(
            rb.getString("java.authoriz")
                + " "
                + authorizerNotified
                + " "
                + rb.getString("java.asreq"));
      }
      if (!authorizerNotNotified.isEmpty()) {
        buf.append(
            rb.getString("java.thesiteemail")
                + " "
                + authorizerNotNotified
                + " "
                + rb.getString("java.asreq"));
      }
    }
    String content = buf.toString();

    // message subject
    String message_subject =
        rb.getString("java.sitereqfrom")
            + " "
            + currentUserDisplayName
            + " "
            + rb.getString("java.for")
            + " "
            + termTitle;

    try {
      emailService.send(from, to, message_subject, content, headerTo, replyTo, null);
      return content;
    } catch (Exception e) {
      M_log.warn(
          this + " problem in send site request email to support for " + currentUserDisplayName);
      return "";
    }
  }
 private void checkForContextualProperties(User user) {
   Assert.assertEquals(user.getEid() + CONTEXTUAL_SITE_NAME, user.getDisplayId());
   Assert.assertEquals(
       user.getFirstName() + " " + user.getLastName() + CONTEXTUAL_SITE_NAME,
       user.getDisplayName());
 }
 private void checkForUnadvisedProperties(User user) {
   Assert.assertEquals(user.getEid(), user.getDisplayId());
   Assert.assertEquals(user.getFirstName() + " " + user.getLastName(), user.getDisplayName());
 }
 private void checkForAdvisedProperties(User user) {
   Assert.assertEquals(user.getEid() + DISPLAY_ADVISED_SUFFIX, user.getDisplayId());
   Assert.assertEquals(
       user.getFirstName() + " " + user.getLastName() + DISPLAY_ADVISED_SUFFIX,
       user.getDisplayName());
 }
  /** {@inheritDoc} */
  public void notifyAddedParticipant(boolean newNonOfficialAccount, User user, Site site) {
    ResourceLoader rb = new ResourceLoader(user.getId(), "UserNotificationProvider");

    String from =
        serverConfigurationService.getBoolean(NOTIFY_FROM_CURRENT_USER, false)
            ? getCurrentUserEmailAddress()
            : getSetupRequestEmailAddress();
    if (from != null) {
      String productionSiteName = serverConfigurationService.getString("ui.service", "");
      String productionSiteUrl = serverConfigurationService.getPortalUrl();
      String nonOfficialAccountUrl =
          serverConfigurationService.getString("nonOfficialAccount.url", null);
      String emailId = user.getEmail();
      String to = emailId;
      String headerTo = emailId;
      // UVa: change Reply-To to be the user adding the new participant
      String replyTo = from;
      String message_subject = productionSiteName + " " + rb.getString("java.sitenoti");
      String content = "";
      StringBuilder buf = new StringBuilder();
      buf.setLength(0);

      // email bnonOfficialAccounteen newly added nonOfficialAccount account
      // and other users
      buf.append(user.getDisplayName() + ":\n\n");
      buf.append(
          rb.getString("java.following")
              + " "
              + productionSiteName
              + " "
              + rb.getString("java.simplesite")
              + "\n");
      buf.append(site.getTitle() + "\n");
      buf.append(rb.getString("java.simpleby") + " ");
      buf.append(userDirectoryService.getCurrentUser().getDisplayName() + ". \n\n");
      if (newNonOfficialAccount) {
        buf.append(serverConfigurationService.getString("nonOfficialAccountInstru", "") + "\n");

        if (nonOfficialAccountUrl != null) {
          buf.append(rb.getString("java.togeta1") + "\n" + nonOfficialAccountUrl + "\n");
          buf.append(rb.getString("java.togeta2") + "\n\n");
        }
        buf.append(rb.getString("java.once") + " " + productionSiteName + ": \n");
        buf.append(
            rb.getString("java.loginhow1")
                + " "
                + productionSiteName
                + ": "
                + productionSiteUrl
                + "\n");
        buf.append(rb.getString("java.loginhow2") + "\n");
        buf.append(rb.getString("java.loginhow3") + "\n");
      } else {
        buf.append(rb.getString("java.tolog") + "\n");
        buf.append(
            rb.getString("java.loginhow1")
                + " "
                + productionSiteName
                + ": "
                + productionSiteUrl
                + "\n");
        buf.append(rb.getString("java.loginhow2") + "\n");
        buf.append(rb.getString("java.loginhow3u") + "\n");
      }
      buf.append(rb.getString("java.tabscreen"));
      content = buf.toString();
      emailService.send(from, to, message_subject, content, headerTo, replyTo, null);
    } // if
  }
  public void sendRenderedMessages(
      String key,
      List<String> userReferences,
      Map<String, String> replacementValues,
      String fromEmail,
      String fromName) {

    Map<EmailTemplateLocaleUsers, RenderedTemplate> tMap =
        this.getRenderedTemplates(key, userReferences, replacementValues);
    Set<Entry<EmailTemplateLocaleUsers, RenderedTemplate>> set = tMap.entrySet();
    Iterator<Entry<EmailTemplateLocaleUsers, RenderedTemplate>> it = set.iterator();

    while (it.hasNext()) {

      Entry<EmailTemplateLocaleUsers, RenderedTemplate> entry = it.next();
      RenderedTemplate rt = entry.getValue();
      EmailTemplateLocaleUsers etlu = entry.getKey();
      List<User> toAddress = getUsersEmail(etlu.getUserIds());
      log.info(
          "sending template "
              + key
              + " for locale "
              + etlu.getLocale().toString()
              + " to "
              + toAddress.size()
              + " users");
      StringBuilder message = new StringBuilder();
      message.append(MIME_ADVISORY);
      if (rt.getRenderedMessage() != null) {
        message.append(BOUNDARY_LINE);
        message.append("Content-Type: text/plain; charset=iso-8859-1\n");
        message.append(rt.getRenderedMessage());
      }
      if (rt.getRenderedHtmlMessage() != null) {
        // append the HMTL part
        message.append(BOUNDARY_LINE);
        message.append("Content-Type: text/html; charset=iso-8859-1\n");
        message.append(rt.getRenderedHtmlMessage());
      }

      message.append(TERMINATION_LINE);

      // we need to manually construct the headers
      List<String> headers = new ArrayList<String>();
      // the template may specify a from address
      if (StringUtils.isNotBlank(rt.getFrom())) {
        headers.add("From: \"" + rt.getFrom());
      } else {
        headers.add("From: \"" + fromName + "\" <" + fromEmail + ">");
      }
      // Add a To: header of either the recipient (if only 1), or the sender (if multiple)
      String toName = fromName;
      String toEmail = fromEmail;

      if (toAddress.size() == 1) {
        User u = toAddress.get(0);
        toName = u.getDisplayName();
        toEmail = u.getEmail();
      }

      headers.add("To: \"" + toName + "\" <" + toEmail + ">");

      // SAK-21742 we need the rendered subject
      headers.add("Subject: " + rt.getRenderedSubject());
      headers.add("Content-Type: multipart/alternative; boundary=\"" + MULTIPART_BOUNDARY + "\"");
      headers.add("Mime-Version: 1.0");
      headers.add("Precedence: bulk");

      String body = message.toString();
      log.debug("message body " + body);
      emailService.sendToUsers(toAddress, headers, body);
    }
  }