/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/
package org.olat.course.nodes.projectbroker.service;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import org.apache.velocity.VelocityContext;
import org.olat.basesecurity.GroupRoles;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity;
import org.olat.core.id.UserConstants;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.Formatter;
import org.olat.core.util.mail.MailBundle;
import org.olat.core.util.mail.MailContext;
import org.olat.core.util.mail.MailContextImpl;
import org.olat.core.util.mail.MailManager;
import org.olat.core.util.mail.MailTemplate;
import org.olat.core.util.mail.MailerResult;
import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.ProjectBrokerCourseNode;
import org.olat.course.nodes.projectbroker.datamodel.Project;
import org.olat.course.run.environment.CourseEnvironment;
import org.olat.group.BusinessGroup;
import org.olat.group.BusinessGroupService;
import org.olat.properties.Property;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* @author guretzki
*/
@Service
public class ProjectBrokerMailerImpl implements ProjectBrokerMailer {
private static final String KEY_ENROLLED_EMAIL_TO_PARTICIPANT_SUBJECT = "mail.enrolled.to.participant.subject";
private static final String KEY_ENROLLED_EMAIL_TO_PARTICIPANT_BODY = "mail.enrolled.to.participant.body";
private static final String KEY_ENROLLED_EMAIL_TO_MANAGER_SUBJECT = "mail.enrolled.to.manager.subject";
private static final String KEY_ENROLLED_EMAIL_TO_MANAGER_BODY = "mail.enrolled.to.manager.body";
private static final String KEY_CANCEL_ENROLLMENT_EMAIL_TO_PARTICIPANT_SUBJECT = "mail.cancel.enrollment.to.participant.subject";
private static final String KEY_CANCEL_ENROLLMENT_EMAIL_TO_PARTICIPANT_BODY = "mail.cancel.enrollment.to.participant.body";
private static final String KEY_CANCEL_ENROLLMENT_EMAIL_TO_MANAGER_SUBJECT = "mail.cancel.enrollment.to.manager.subject";
private static final String KEY_CANCEL_ENROLLMENT_EMAIL_TO_MANAGER_BODY = "mail.cancel.enrollment.to.manager.body";
private static final String KEY_PROJECT_CHANGED_EMAIL_TO_PARTICIPANT_SUBJECT = "mail.project.changed.to.participant.subject";
private static final String KEY_PROJECT_CHANGED_EMAIL_TO_PARTICIPANT_BODY = "mail.project.changed.to.participant.body";
private static final String KEY_PROJECT_DELETED_EMAIL_TO_PARTICIPANT_SUBJECT = "mail.project.deleted.to.participant.subject";
private static final String KEY_PROJECT_DELETED_EMAIL_TO_PARTICIPANT_BODY = "mail.project.deleted.to.participant.body";
private static final String KEY_REMOVE_CANDIDATE_EMAIL_SUBJECT = "mail.remove.candidate.subject";
private static final String KEY_REMOVE_CANDIDATE_EMAIL_BODY = "mail.remove.candidate.body";
private static final String KEY_ACCEPT_CANDIDATE_EMAIL_SUBJECT = "mail.accept.candidate.subject";
private static final String KEY_ACCEPT_CANDIDATE_EMAIL_BODY = "mail.accept.candidate.body";
private static final String KEY_ADD_CANDIDATE_EMAIL_SUBJECT = "mail.add.candidate.subject";
private static final String KEY_ADD_CANDIDATE_EMAIL_BODY = "mail.add.candidate.body";
private static final String KEY_ADD_PARTICIPANT_EMAIL_SUBJECT = "mail.add.participant.subject";
private static final String KEY_ADD_PARTICIPANT_EMAIL_BODY = "mail.add.participant.body";
private static final String KEY_REMOVE_PARTICIPANT_EMAIL_SUBJECT = "mail.remove.participant.subject";
private static final String KEY_REMOVE_PARTICIPANT_EMAIL_BODY = "mail.remove.participant.body";
private OLog log = Tracing.createLoggerFor(this.getClass());
@Autowired
private MailManager mailManager;
@Autowired
private BusinessGroupService businessGroupService;
// For Enrollment
public MailerResult sendEnrolledEmailToParticipant(Identity enrolledIdentity, Project project, Translator pT) {
return sendEmail(enrolledIdentity, project,
pT.translate(KEY_ENROLLED_EMAIL_TO_PARTICIPANT_SUBJECT),
pT.translate(KEY_ENROLLED_EMAIL_TO_PARTICIPANT_BODY), pT.getLocale());
}
public MailerResult sendEnrolledEmailToManager(Identity enrolledIdentity, Project project, Translator pT) {
List<Identity> coaches = businessGroupService
.getMembers(project.getProjectGroup(), GroupRoles.coach.name());
return sendEmailToGroup(coaches, enrolledIdentity, project,
pT.translate(KEY_ENROLLED_EMAIL_TO_MANAGER_SUBJECT),
pT.translate(KEY_ENROLLED_EMAIL_TO_MANAGER_BODY), pT.getLocale());
}
// For cancel enrollment
public MailerResult sendCancelEnrollmentEmailToParticipant(Identity enrolledIdentity, Project project, Translator pT) {
return sendEmail(enrolledIdentity, project,
pT.translate(KEY_CANCEL_ENROLLMENT_EMAIL_TO_PARTICIPANT_SUBJECT),
pT.translate(KEY_CANCEL_ENROLLMENT_EMAIL_TO_PARTICIPANT_BODY), pT.getLocale());
}
public MailerResult sendCancelEnrollmentEmailToManager(Identity enrolledIdentity, Project project, Translator pT) {
List<Identity> coaches = businessGroupService
.getMembers(project.getProjectGroup(), GroupRoles.coach.name());
return sendEmailToGroup(coaches, enrolledIdentity, project,
pT.translate(KEY_CANCEL_ENROLLMENT_EMAIL_TO_MANAGER_SUBJECT),
pT.translate(KEY_CANCEL_ENROLLMENT_EMAIL_TO_MANAGER_BODY), pT.getLocale());
}
// Project change
public MailerResult sendProjectChangedEmailToParticipants(Identity changer, Project project, Translator pT) {
List<Identity> participants = businessGroupService
.getMembers(project.getProjectGroup(), GroupRoles.participant.name());
return sendEmailProjectChanged(participants, changer, project,
pT.translate(KEY_PROJECT_CHANGED_EMAIL_TO_PARTICIPANT_SUBJECT),
pT.translate(KEY_PROJECT_CHANGED_EMAIL_TO_PARTICIPANT_BODY), pT.getLocale());
}
public MailerResult sendProjectDeletedEmailToParticipants(Identity changer, Project project, Translator pT) {
List<Identity> participants = businessGroupService
.getMembers(project.getProjectGroup(), GroupRoles.participant.name());
return sendEmailProjectChanged(participants, changer, project,
pT.translate(KEY_PROJECT_DELETED_EMAIL_TO_PARTICIPANT_SUBJECT),
pT.translate(KEY_PROJECT_DELETED_EMAIL_TO_PARTICIPANT_BODY), pT.getLocale());
}
public MailerResult sendProjectDeletedEmailToManager(Identity changer, Project project, Translator pT) {
List<Identity> coaches = businessGroupService
.getMembers(project.getProjectGroup(), GroupRoles.coach.name());
return sendEmailProjectChanged(coaches, changer, project,
pT.translate(KEY_PROJECT_DELETED_EMAIL_TO_PARTICIPANT_SUBJECT),
pT.translate(KEY_PROJECT_DELETED_EMAIL_TO_PARTICIPANT_BODY), pT.getLocale());
}
public MailerResult sendProjectDeletedEmailToAccountManagers(Identity changer, Project project, CourseEnvironment courseEnv, CourseNode node, Translator pT){
Long groupKey = null;
Property accountManagerGroupProperty = courseEnv.getCoursePropertyManager().findCourseNodeProperty(node, null, null, ProjectBrokerCourseNode.CONF_ACCOUNTMANAGER_GROUP_KEY);
// Check if account-manager-group-key-property already exist
if (accountManagerGroupProperty != null) {
groupKey = accountManagerGroupProperty.getLongValue();
}
if (groupKey != null) {
BusinessGroup accountManagerGroup = businessGroupService.loadBusinessGroup(groupKey);
List<Identity> participants = businessGroupService
.getMembers(accountManagerGroup, GroupRoles.participant.name());
return sendEmailProjectChanged(participants, changer, project,
pT.translate(KEY_PROJECT_DELETED_EMAIL_TO_PARTICIPANT_SUBJECT),
pT.translate(KEY_PROJECT_DELETED_EMAIL_TO_PARTICIPANT_BODY), pT.getLocale());
}
return null;
}
public MailTemplate createRemoveAsCandiadateMailTemplate(Project project, Identity projectManager, Translator pT) {
return createProjectChangeMailTemplate( project, projectManager, pT.translate(KEY_REMOVE_CANDIDATE_EMAIL_SUBJECT), pT.translate(KEY_REMOVE_CANDIDATE_EMAIL_BODY), pT.getLocale());
}
public MailTemplate createAcceptCandiadateMailTemplate(Project project, Identity projectManager, Translator pT) {
return createProjectChangeMailTemplate( project, projectManager, pT.translate(KEY_ACCEPT_CANDIDATE_EMAIL_SUBJECT), pT.translate(KEY_ACCEPT_CANDIDATE_EMAIL_BODY), pT.getLocale());
}
public MailTemplate createAddCandidateMailTemplate(Project project, Identity projectManager, Translator pT) {
return createProjectChangeMailTemplate( project, projectManager, pT.translate(KEY_ADD_CANDIDATE_EMAIL_SUBJECT), pT.translate(KEY_ADD_CANDIDATE_EMAIL_BODY), pT.getLocale());
}
public MailTemplate createAddParticipantMailTemplate(Project project, Identity projectManager, Translator pT) {
return createProjectChangeMailTemplate( project, projectManager, pT.translate(KEY_ADD_PARTICIPANT_EMAIL_SUBJECT), pT.translate(KEY_ADD_PARTICIPANT_EMAIL_BODY), pT.getLocale());
}
public MailTemplate createRemoveParticipantMailTemplate(Project project, Identity projectManager, Translator pT) {
return createProjectChangeMailTemplate( project, projectManager, pT.translate(KEY_REMOVE_PARTICIPANT_EMAIL_SUBJECT), pT.translate(KEY_REMOVE_PARTICIPANT_EMAIL_BODY), pT.getLocale());
}
//////////////////
// Private Methods
//////////////////
private MailerResult sendEmail(Identity enrolledIdentity, Project project, String subject, String body, Locale locale) {
MailTemplate enrolledMailTemplate = createMailTemplate(project, enrolledIdentity, subject, body, locale );
MailContext context = new MailContextImpl(project.getProjectBroker(), null, null);
MailerResult result = new MailerResult();
MailBundle bundle = mailManager.makeMailBundle(context, enrolledIdentity, enrolledMailTemplate, null, null, result);
if(bundle != null) {
mailManager.sendMessage(bundle);
}
log.audit("ProjectBroker: sendEmail to identity.name=" + enrolledIdentity.getName() + " , mailerResult.returnCode=" + result.getReturnCode());
return result;
}
private MailerResult sendEmailToGroup(List<Identity> group, Identity enrolledIdentity, Project project, String subject, String body, Locale locale) {
MailTemplate enrolledMailTemplate = this.createMailTemplate(project, enrolledIdentity, subject, body, locale );
// loop over all project manger
StringBuilder identityNames = new StringBuilder();
for (Identity identity : group) {
if (identityNames.length()>0) identityNames.append(",");
identityNames.append(identity.getName());
}
MailContext context = new MailContextImpl(project.getProjectBroker(), null, null);
String metaId = UUID.randomUUID().toString().replace("-", "");
MailerResult result = new MailerResult();
MailBundle[] bundles = mailManager.makeMailBundles(context, group, enrolledMailTemplate, null, metaId, result);
result.append(mailManager.sendMessage(bundles));
log.audit("ProjectBroker: sendEmailToGroup: identities=" + identityNames.toString() + " , mailerResult.returnCode=" + result.getReturnCode());
return result;
}
private MailerResult sendEmailProjectChanged(List<Identity> group, Identity changer, Project project, String subject, String body, Locale locale) {
MailTemplate enrolledMailTemplate = this.createProjectChangeMailTemplate(project, changer, subject, body, locale );
// loop over all project manger
StringBuilder identityNames = new StringBuilder();
for (Identity identity : group) {
if (identityNames.length()>0) identityNames.append(",");
identityNames.append(identity.getName());
}
MailContext context = new MailContextImpl(project.getProjectBroker(), null, null);
MailerResult result = new MailerResult();
MailBundle[] bundles = mailManager.makeMailBundles(context, group, enrolledMailTemplate, null, null, result);
result.append(mailManager.sendMessage(bundles));
log.audit("ProjectBroker: sendEmailToGroup: identities=" + identityNames.toString() + " , mailerResult.returnCode=" + result.getReturnCode());
return result;
}
/**
* Create default template which fill in context 'firstname' , 'lastname' and 'username'.
* @param subject
* @param body
* @return
*/
private MailTemplate createMailTemplate(Project project, Identity enrolledIdentity, String subject, String body, Locale locale) {
final String projectTitle = project.getTitle();
final String currentDate = Formatter.getInstance(locale).formatDateAndTime(new Date());
final String firstNameEnrolledIdentity = enrolledIdentity.getUser().getProperty(UserConstants.FIRSTNAME, null);
final String lastnameEnrolledIdentity = enrolledIdentity.getUser().getProperty(UserConstants.LASTNAME, null);
final String usernameEnrolledIdentity = enrolledIdentity.getName();
return new MailTemplate(subject, body, null) {
@Override
public void putVariablesInMailContext(VelocityContext context, Identity identity) {
context.put("enrolled_identity_firstname", firstNameEnrolledIdentity);
context.put("enrolled_identity_lastname", lastnameEnrolledIdentity);
context.put("enrolled_identity_username", usernameEnrolledIdentity);
// Put variables from greater context
context.put("projectTitle", projectTitle);
context.put("currentDate", currentDate);
}
};
}
/**
* Create default template which fill in context 'firstname' , 'lastname' and 'username'.
* @param subject
* @param body
* @return
*/
private MailTemplate createProjectChangeMailTemplate(Project project, Identity changer, String subject, String body, Locale locale) {
final String projectTitle = project.getTitle();
final String currentDate = Formatter.getInstance(locale).formatDateAndTime(new Date());
final String firstnameProjectManager = changer.getUser().getProperty(UserConstants.FIRSTNAME, null);
final String lastnameProjectManager = changer.getUser().getProperty(UserConstants.LASTNAME, null);
final String usernameProjectManager = changer.getName();
return new MailTemplate(subject, body, null) {
@Override
public void putVariablesInMailContext(VelocityContext context, Identity identity) {
// Put variables from greater context
context.put("projectTitle", projectTitle);
context.put("currentDate", currentDate);
context.put("firstnameProjectManager", firstnameProjectManager);
context.put("lastnameProjectManager", lastnameProjectManager);
context.put("usernameProjectManager", usernameProjectManager);
}
};
}
}