From ec0595f0afe582d87a5a2810193d1dedfa33a8d8 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 12 Feb 2019 19:45:56 +0100
Subject: [PATCH] OO-3771: evaluate template before showing it to user

---
 .../org/olat/core/util/mail/MailManager.java  |  2 ++
 .../util/mail/manager/MailManagerImpl.java    | 19 +++++++++++++++++++
 .../util/mail/model/SimpleMailContent.java    |  6 +++---
 .../olat/course/nodes/co/CORunController.java | 12 ++++++++++--
 4 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/olat/core/util/mail/MailManager.java b/src/main/java/org/olat/core/util/mail/MailManager.java
index bb100412c74..a0814cc0225 100644
--- a/src/main/java/org/olat/core/util/mail/MailManager.java
+++ b/src/main/java/org/olat/core/util/mail/MailManager.java
@@ -202,5 +202,7 @@ public interface MailManager {
 	public MailContent decorateMail(MailBundle bundle);
 	
 	public String decorateMailBody(String body, Locale locale);
+	
+	public MailContent evaluateTemplate(MailTemplate template);
 
 }
diff --git a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
index bbfe593cc19..d15faefcce9 100644
--- a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
+++ b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
@@ -755,6 +755,25 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 		return new SimpleMailContent(content.getSubject(), decoratedBody, content.getAttachments());
 	}
 	
+	@Override
+	public MailContent evaluateTemplate(MailTemplate template) {
+		VelocityContext context;
+		if(template.getContext() != null) {
+			context = new VelocityContext(template.getContext());
+		} else {
+			context = new VelocityContext();
+		}
+		template.putVariablesInMailContext(context, null);
+		context.put("server", Settings.getServerContextPathURI());
+
+		MailerResult result = new MailerResult();
+		StringWriter subjectWriter = new StringWriter(2000);
+		evaluate(context, template.getSubjectTemplate(), subjectWriter, result);
+		StringWriter bodyWriter = new StringWriter(2000);
+		evaluate(context, template.getBodyTemplate(), bodyWriter, result);
+		return new SimpleMailContent(subjectWriter.toString(), bodyWriter.toString(), template.getAttachments());
+	}
+
 	public String decorateMailBody(String body, Locale locale) {
 		String template = getMailTemplate();
 		boolean htmlTemplate = StringHelper.isHtml(template);
diff --git a/src/main/java/org/olat/core/util/mail/model/SimpleMailContent.java b/src/main/java/org/olat/core/util/mail/model/SimpleMailContent.java
index d413f9ae73f..6fb9fd2f1b8 100644
--- a/src/main/java/org/olat/core/util/mail/model/SimpleMailContent.java
+++ b/src/main/java/org/olat/core/util/mail/model/SimpleMailContent.java
@@ -41,7 +41,7 @@ public class SimpleMailContent implements MailContent {
 		this.subject = subject;
 		this.body = body;
 		
-		attachments = new ArrayList<File>();
+		attachments = new ArrayList<>();
 		if(attachmentArr != null && attachmentArr.length > 0) {
 			for(File attachment:attachmentArr) {
 				if(attachment != null && attachment.exists()) {
@@ -55,9 +55,9 @@ public class SimpleMailContent implements MailContent {
 		this.subject = subject;
 		this.body = body;
 		if(attachmentList == null) {
-			this.attachments = new ArrayList<File>(1);
+			this.attachments = new ArrayList<>(1);
 		} else {
-			this.attachments = new ArrayList<File>(attachmentList);
+			this.attachments = new ArrayList<>(attachmentList);
 		}
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/co/CORunController.java b/src/main/java/org/olat/course/nodes/co/CORunController.java
index df6e82cebc6..53a471c368b 100755
--- a/src/main/java/org/olat/course/nodes/co/CORunController.java
+++ b/src/main/java/org/olat/course/nodes/co/CORunController.java
@@ -46,6 +46,8 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.mail.ContactList;
 import org.olat.core.util.mail.ContactMessage;
+import org.olat.core.util.mail.MailContent;
+import org.olat.core.util.mail.MailManager;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
@@ -70,12 +72,15 @@ public class CORunController extends BasicController {
 	private ContactFormController coFoCtr;
 
 	private final CourseGroupManager cgm;
+	
+	@Autowired
+	private MailManager mailManager;
 	@Autowired
 	private BGAreaManager areaManager;
 	@Autowired
-	private BusinessGroupService businessGroupService;	
+	private RepositoryService repositoryService;
 	@Autowired
-	private  RepositoryService repositoryService;
+	private BusinessGroupService businessGroupService;
 
 	/**
 	 * Constructor for the contact form run controller
@@ -225,6 +230,9 @@ public class CORunController extends BasicController {
 			CourseMailTemplate template = new CourseMailTemplate(entry, getIdentity(), getLocale());
 			template.setBodyTemplate(mBody);
 			template.setSubjectTemplate(mSubject);
+			MailContent content = mailManager.evaluateTemplate(template);
+			template.setSubjectTemplate(content.getSubject());
+			template.setBodyTemplate(content.getBody());
 			coFoCtr = new ContactFormController(ureq, getWindowControl(), false, false, false, cmsg, template);
 			listenTo(coFoCtr);//dispose as this controller is disposed
 			putInitialPanel(coFoCtr.getInitialComponent());
-- 
GitLab