/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <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 the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <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> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.modules.fo.export; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.velocity.VelocityContext; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.wizard.StepFormBasicController; import org.olat.core.gui.control.generic.wizard.StepsEvent; import org.olat.core.gui.control.generic.wizard.StepsRunContext; import org.olat.core.id.Identity; import org.olat.core.id.UserConstants; import org.olat.core.util.Util; import org.olat.core.util.mail.MailTemplate; import org.olat.core.util.mail.MailTemplateForm; import org.olat.course.ICourse; import org.olat.course.nodes.FOCourseNode; import org.olat.modules.fo.Message; import org.olat.modules.fo.manager.ForumManager; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryService; import org.olat.user.UserManager; import org.springframework.beans.factory.annotation.Autowired; /** * Initial Date: 16.02.2017 * @author fkiefer, fabian.kiefer@frentix.com, www.frentix.com */ public class SendMailStepForm extends StepFormBasicController { protected static final String SENDMAIL = "sendmail"; protected static final String RECIPIENTS = "recipients"; protected static final String SENDER = "sender"; protected static final String MAIL_TEMPLATE = "mailTemplate"; protected static final String FORUM = "forum"; public static final String START_COURSE = "startCourse"; protected static final String PARENT_MESSAGE = "parentMessage"; public static final String MESSAGE_TO_MOVE = "messageToMove"; public static final String START_THREADTOP = "startMessage"; protected static final String ICOURSE = "icourse"; protected static final String COURSE = "course"; protected static final String NEW_THREAD = "newThread"; protected static final String COURSE_CHOSEN = "courseChosen"; private MailTemplate mailTemplate; private MailTemplateForm templateForm; private Message startMessage, parentMessage; private List<Identity> threadMembers; private Map<Identity, String> pseudonymes; private String targetForum, targetCourseTitle, startMessageTitle; @Autowired private ForumManager forumManager; @Autowired UserManager userManager; public SendMailStepForm(UserRequest ureq, WindowControl wControl, Form rootForm, StepsRunContext runContext) { super(ureq, wControl, rootForm, runContext, LAYOUT_BAREBONE, null); setTranslator(Util.createPackageTranslator(SendMailStepForm.class, getLocale(), Util.createPackageTranslator(RepositoryService.class, getLocale()))); String comment = translate("forum.comment"); String thread = translate("forum.thread"); ICourse course = (ICourse)getFromRunContext(ICOURSE); targetCourseTitle = course.getCourseTitle(); RepositoryEntry startCourse = (RepositoryEntry)getFromRunContext(START_COURSE); String startCourseTitle = startCourse.getDisplayname(); startMessage = (Message)getFromRunContext(MESSAGE_TO_MOVE); if (startMessage.getThreadtop() == null) { comment = thread; } startMessageTitle = startMessage.getTitle(); parentMessage = (Message)getFromRunContext(PARENT_MESSAGE); String parentMessageTitle = parentMessage != null ? parentMessage.getTitle() : startMessage.getTitle(); FOCourseNode node = (FOCourseNode)getFromRunContext(FORUM); targetForum = node.getShortTitle(); String userName = getIdentity().getUser().getProperty(UserConstants.FIRSTNAME, null) + " " + getIdentity().getUser().getProperty(UserConstants.LASTNAME, null); String email = getIdentity().getUser().getProperty(UserConstants.EMAIL, null); String[] subject = { comment, startMessageTitle }; String[] body = { comment, startMessageTitle, startCourseTitle, targetCourseTitle, targetForum, parentMessageTitle, userName, email }; String subjectContent = translate("wizard.mail.subject", subject); String bodyContent = translate("wizard.mail.body", body); mailTemplate = createMailTemplate(subjectContent, bodyContent); templateForm = new MailTemplateForm(ureq, wControl, mailTemplate, false, rootForm); templateForm.setSendMailElementSelected(); initForm(ureq); } private MailTemplate createMailTemplate(String subject, String body) { return new MailTemplate(subject, body, null) { @Override public void putVariablesInMailContext(VelocityContext context, Identity identity) { // nothing to do } }; } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { String members = displayThreadMembers(); // summary String summary = translate("thread.moving.info", new String[]{startMessageTitle, targetForum, targetCourseTitle}); Set<Long> messageKeys = new HashSet<>(); forumManager.countMessageChildrenRecursively(startMessage, messageKeys); int childrenCount = messageKeys.size(); if (childrenCount > 0) { summary += childrenCount > 1 ? translate("many.children.move", String.valueOf(childrenCount)) : translate("one.child.move") ; } FormLayoutContainer infoContainer = FormLayoutContainer.createDefaultFormLayout("summary", getTranslator()); formLayout.add(infoContainer); infoContainer.setRootForm(mainForm); uifactory.addStaticTextElement("thread.moved.summary", summary, infoContainer); // members uifactory.addStaticTextElement("sendmail.recipients", members, infoContainer); // mail template formLayout.add(templateForm.getInitialFormItem()); } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { super.formInnerEvent(ureq, source, event); } @Override protected void doDispose() { // } @Override protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = true; if (mailTemplate == null || templateForm == null) { allOk &= false; } if (getIdentity() == null) { allOk &= false; } return allOk &= super.validateFormLogic(ureq); } @Override protected void formOK(UserRequest ureq) { if (templateForm.sendMailSwitchEnabled()) { templateForm.updateTemplateFromForm(mailTemplate); addToRunContext(MAIL_TEMPLATE, mailTemplate); addToRunContext(SENDER, getIdentity()); ListWrapper recipients = new ListWrapper(threadMembers); addToRunContext(RECIPIENTS, recipients); addToRunContext(SENDMAIL, Boolean.TRUE); } else { addToRunContext(SENDMAIL, Boolean.FALSE); } showInfo("thread.moved.success", new String[]{startMessageTitle, targetForum, targetCourseTitle}); fireEvent(ureq, StepsEvent.ACTIVATE_NEXT); } private List<Identity> collectCreators () { pseudonymes = new HashMap<>(); Set<Identity> threadMemberSet = new HashSet<>(); // inform start message (thread top) if (!startMessage.isGuest()) { Identity creator = startMessage.getCreator(); if (creator != null) { threadMemberSet.add(creator); String pseudonym = startMessage.getPseudonym(); if(pseudonym != null) { pseudonymes.put(creator, pseudonym); } } Identity modifier = startMessage.getModifier(); if (modifier != null) { threadMemberSet.add(modifier); } } // send copy of email to sender if (templateForm != null && templateForm.isCCSenderSelected()) { threadMemberSet.add(getIdentity()); } // inform children forumManager.collectThreadMembersRecursively(startMessage, threadMemberSet, pseudonymes); return new ArrayList<Identity>(threadMemberSet); } private String displayThreadMembers() { StringBuilder sb = new StringBuilder(); threadMembers = collectCreators(); Iterator<Identity> listIterator = threadMembers.iterator(); while(listIterator.hasNext()) { Identity identity = listIterator.next(); if (pseudonymes.containsKey(identity)) { sb.append(pseudonymes.get(identity)); } else { String displayName = userManager.getUserDisplayName(identity); sb.append(displayName); } if (listIterator.hasNext()) { sb.append("; "); } } return sb.toString(); } }