/*************************************************************************** * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. ***************************************************************************/ package org.exoplatform.faq.webui.popup; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.mail.internet.InternetAddress; import org.exoplatform.container.component.ComponentPlugin; import org.exoplatform.faq.service.Answer; import org.exoplatform.faq.service.Question; import org.exoplatform.faq.service.QuestionLanguage; import org.exoplatform.faq.webui.BaseUIFAQForm; import org.exoplatform.faq.webui.FAQUtils; import org.exoplatform.faq.webui.UIAnswersPortlet; import org.exoplatform.ks.common.EmailNotifyPlugin; import org.exoplatform.ks.common.webui.BaseEventListener; import org.exoplatform.ks.common.webui.UIPopupAction; import org.exoplatform.ks.common.webui.UIPopupContainer; import org.exoplatform.ks.common.webui.WebUIUtils; import org.exoplatform.services.mail.Message; import org.exoplatform.services.organization.User; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIPopupComponent; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.wysiwyg.UIFormWYSIWYGInput; /** * Created by The eXo Platform SARL * Author : Hung Nguyen * hung.nguyen@exoplatform.com * Aus 01, 2007 2:48:18 PM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/templates/faq/webui/popup/UISendMailForm.gtmpl", events = { @EventConfig(listeners = UISendMailForm.SendActionListener.class), @EventConfig(listeners = UISendMailForm.ToActionListener.class), @EventConfig(listeners = UISendMailForm.CcActionListener.class), @EventConfig(listeners = UISendMailForm.BccActionListener.class), @EventConfig(listeners = UISendMailForm.CancelActionListener.class), @EventConfig(listeners = UISendMailForm.ChangeLanguageActionListener.class) } ) @SuppressWarnings("unused") public class UISendMailForm extends BaseUIFAQForm implements UIPopupComponent { private boolean isViewCC = false; private boolean isViewBCC = false; private static final String FILED_FROM_NAME = "FromName"; private static final String FILED_FROM = "From"; private static final String FILED_TO = "To"; private static final String FILED_ADD_CC = "AddCc"; private static final String FILED_ADD_BCC = "AddBcc"; private static final String FILED_SUBJECT = "Subject"; private static final String FILED_QUESTION_LANGUAGE = "Language"; private static final String FILED_MESSAGE = "Message"; final static public String FIELD_FROM_INPUT = "fromInput"; final private static String MIMETYPE_TEXTHTML = "text/html".intern(); private Map<String, String> serverConfig_ = new HashMap<String, String>(); private List<SelectItemOption<String>> listLanguageToReponse = new ArrayList<SelectItemOption<String>>(); private List<QuestionLanguage> listQuestionLanguage = new ArrayList<QuestionLanguage>(); private String languageIsResponsed = ""; private String questionChanged_ = ""; private String link_ = ""; public List<User> toUsers = new ArrayList<User>(); public List<User> addCCUsers = new ArrayList<User>(); public List<User> addBCCUsers = new ArrayList<User>(); private int posOfResponse = 0; private List<String> listAnotherEmail = new ArrayList<String>(); public UISendMailForm() throws Exception { listAnotherEmail = new ArrayList<String>(); this.setActions(new String[] { "Send", "Cancel" }); } public void activate() throws Exception { } public void deActivate() throws Exception { } public String getLink() { return link_; } public void setLink(String link) { this.link_ = link; } public List<User> getToUsers() { return toUsers; } public void setToUsers(List<User> userList) { toUsers = userList; } public List<User> getAddCCUsers() { return addCCUsers; } public void setAddCCUsers(List<User> userList) { addCCUsers = userList; } public List<User> getAddBCCUsers() { return addBCCUsers; } public void setAddBCCUsers(List<User> userList) { addBCCUsers = userList; } private List<SelectItemOption<String>> getListLanguageToSendFriend() { return listLanguageToReponse; } public void addPlugin(ComponentPlugin plugin) throws Exception { try { serverConfig_ = ((EmailNotifyPlugin) plugin).getServerConfiguration(); } catch (Exception e) { log.error("Can not add Plugin Email Norify, exception: " + e.getMessage()); } } public void setUpdateQuestion(String questionPath, String language) throws Exception { Question question = FAQUtils.getFAQService().getQuestionById(questionPath); if (language.length() <= 0) language = question.getLanguage(); String email = ""; String name = ""; String userName = FAQUtils.getCurrentUser(); if (!FAQUtils.isFieldEmpty(userName)) { name = FAQUtils.getFullName(userName); email = FAQUtils.getEmailUser(userName); } languageIsResponsed = question.getLanguage(); QuestionLanguage questionLanguage = new QuestionLanguage(); questionLanguage.setId(question.getId()); questionLanguage.setQuestion(question.getQuestion()); questionLanguage.setDetail(question.getDetail()); questionLanguage.setLanguage(question.getLanguage()); questionLanguage.setAnswers(question.getAnswers()); questionLanguage.setComments(question.getComments()); listQuestionLanguage.add(questionLanguage); for (QuestionLanguage questionLanguage2 : getFAQService().getQuestionLanguages(questionPath)) { String quest2 = questionLanguage2.getDetail().replaceAll("\n", "<br>").replaceAll("'", "'"); questionLanguage2.setDetail(quest2); if (!isContainLanguageList(listQuestionLanguage, questionLanguage2.getLanguage())) listQuestionLanguage.add(questionLanguage2); } questionChanged_ = question.getQuestion(); listLanguageToReponse.add(new SelectItemOption<String>(language, language)); // set info for form // for(QuestionLanguage quesLanguage : listQuestionLanguage) { // listLanguageToReponse.add(new SelectItemOption<String>(quesLanguage.getLanguage(), quesLanguage.getLanguage())) ; // } addChild(new UIFormStringInput(FILED_FROM_NAME, FILED_FROM_NAME, name)); addChild(new UIFormStringInput(FILED_FROM, FILED_FROM, email)); addChild(new UIFormStringInput(FILED_TO, FILED_TO, null)); addChild(new UIFormStringInput(FILED_ADD_CC, FILED_ADD_CC, null)); addChild(new UIFormStringInput(FILED_ADD_BCC, FILED_ADD_BCC, null)); UIFormSelectBox questionLanguages = new UIFormSelectBox(FILED_QUESTION_LANGUAGE, FILED_QUESTION_LANGUAGE, listLanguageToReponse); questionLanguages.setSelectedValues(new String[] { language }); questionLanguages.setOptions(listLanguageToReponse); questionLanguages.setOnChange("ChangeLanguage"); addChild(questionLanguages); // question String contenQuestion = ""; StringBuffer stringBuffer = new StringBuffer(); for (QuestionLanguage questionLangua : listQuestionLanguage) { if (questionLangua.getLanguage().equals(language)) { contenQuestion = questionLangua.getQuestion(); Answer[] answers = questionLangua.getAnswers(); stringBuffer.append(getLabel("change-content")).append(":<p><b>").append(getLabel("Question")).append("</b> ").append(contenQuestion).append("</p>"); if (questionLangua.getDetail() != null && questionLangua.getDetail().trim().length() > 0) stringBuffer.append("<p><b>").append(this.getLabel("Detail")).append("</b> ").append(questionLangua.getDetail()).append("</p>"); if (answers != null && answers.length > 0) { stringBuffer.append("<p>"); for (Answer answer : answers) { stringBuffer.append("<br/><b>").append(getLabel("Response")).append("</b>").append("<br/>").append(answer.getResponses()); } stringBuffer.append("</p>"); } if (!FAQUtils.isFieldEmpty(link_)) { if (!language.equals(question.getLanguage())) { if (!link_.contains("language")) { link_ = link_ + "/language=" + language; } } stringBuffer.append(getLabel("Link").replaceFirst("<link>", link_)); } break; } } addChild(new UIFormStringInput(FILED_SUBJECT, FILED_SUBJECT, this.getLabel("change-title") + " " + contenQuestion.replaceAll("<br>", " "))); UIFormWYSIWYGInput filedMessage = new UIFormWYSIWYGInput(FILED_MESSAGE, FILED_MESSAGE, ""); filedMessage.setValue(stringBuffer.toString()); filedMessage.setFCKConfig(WebUIUtils.getFCKConfig()); filedMessage.setToolBarName("Basic"); addChild(filedMessage); } private boolean isContainLanguageList(List<QuestionLanguage> questionlg, String language) throws Exception { for (QuestionLanguage questionLanguage : questionlg) { if (questionLanguage.getLanguage().equals(language)) return true; } return false; } public void setFieldToValue(String value) { if (listAnotherEmail != null && listAnotherEmail.size() > 0) { for (String email : listAnotherEmail) { value = email + "," + value; } } getUIStringInput(FILED_TO).setValue(value); } public String getFieldToValue() { return getUIStringInput(FILED_TO).getValue(); } public void setFieldCCValue(String value) { if (listAnotherEmail != null && listAnotherEmail.size() > 0) { for (String email : listAnotherEmail) { value = email + "," + value; } } if (value != null && value.trim().length() > 0) isViewCC = true; getUIStringInput(FILED_ADD_CC).setValue(value); } public String getFieldCCValue() { return getUIStringInput(FILED_ADD_CC).getValue(); } public void setFieldBCCValue(String value) { if (listAnotherEmail != null && listAnotherEmail.size() > 0) { for (String email : listAnotherEmail) { value = email + "," + value; } } if (value != null && value.trim().length() > 0) isViewBCC = true; getUIStringInput(FILED_ADD_BCC).setValue(value); } public String getFieldBCCValue() { return getUIStringInput(FILED_ADD_BCC).getValue(); } static public class SendActionListener extends BaseEventListener<UISendMailForm> { public void onEvent(Event<UISendMailForm> event, UISendMailForm sendMailForm, String objectId) throws Exception { String fromName = ((UIFormStringInput) sendMailForm.getChildById(FILED_FROM_NAME)).getValue(); String from = ((UIFormStringInput) sendMailForm.getChildById(FILED_FROM)).getValue(); String fullFrom = fromName + " (" + from + ") <" + sendMailForm.getServerConfig().get("account") + ">"; String to = ((UIFormStringInput) sendMailForm.getChildById(FILED_TO)).getValue(); String subject = ((UIFormStringInput) sendMailForm.getChildById(FILED_SUBJECT)).getValue(); String cc = ((UIFormStringInput) sendMailForm.getChildById(FILED_ADD_CC)).getValue(); String bcc = ((UIFormStringInput) sendMailForm.getChildById(FILED_ADD_BCC)).getValue(); String body = ((UIFormWYSIWYGInput) sendMailForm.getChildById(FILED_MESSAGE)).getValue(); if (to != null && to.indexOf(";") > -1) to = to.replace(';', ','); if (cc != null && cc.indexOf(";") > -1) cc = cc.replace(';', ','); if (bcc != null && bcc.indexOf(";") > -1) bcc = bcc.replace(';', ','); if (FAQUtils.isFieldEmpty(fromName)) { warning("UISendMailForm.msg.fromName-field-empty"); return; } else if (FAQUtils.isFieldEmpty(from)) { warning("UISendMailForm.msg.from-field-empty"); return; } else if (!FAQUtils.isValidEmailAddresses(from)) { warning("UISendMailForm.msg.invalid-from-field"); return; } else if (FAQUtils.isFieldEmpty(to)) { warning("UISendMailForm.msg.to-field-empty"); return; } else if (!FAQUtils.isValidEmailAddresses(to)) { warning("UISendMailForm.msg.invalid-to-field"); return; } else if (!FAQUtils.isValidEmailAddresses(cc)) { warning("UISendMailForm.msg.invalid-cc-field"); return; } else if (!FAQUtils.isValidEmailAddresses(bcc)) { warning("UISendMailForm.msg.invalid-bcc-field"); return; } else if (subject == null || subject.trim().length() < 0) { warning("UISendMailForm.msg.subject-field-empty"); return; } Message message = new Message(); message.setMimeType(MIMETYPE_TEXTHTML); message.setFrom(fullFrom); message.setTo(to); message.setCC(cc); message.setBCC(bcc); message.setSubject(subject); message.setBody(body); try { sendMailForm.getFAQService().sendMessage(message); } catch (Exception e) { warning("UISendMailForm.msg.send-mail-error"); sendMailForm.log.error("Can not send email, exception: " + e.getMessage()); return; } info("UISendMailForm.msg.send-mail-success"); UIAnswersPortlet portlet = sendMailForm.getAncestorOfType(UIAnswersPortlet.class); UIPopupAction popupAction = portlet.getChild(UIPopupAction.class); popupAction.deActivate(); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } } static public class ToActionListener extends EventListener<UISendMailForm> { public void execute(Event<UISendMailForm> event) throws Exception { UISendMailForm sendMailForm = event.getSource(); UIPopupContainer popupContainer = sendMailForm.getAncestorOfType(UIPopupContainer.class); UIAddressEmailsForm addressEmailsForm = sendMailForm.openPopup(popupContainer, UIAddressEmailsForm.class, 660, 0); addressEmailsForm.setRecipientsType(FILED_TO); String toAddressString = ((UIFormStringInput) sendMailForm.getChildById(FILED_TO)).getValue(); InternetAddress[] toAddresses = FAQUtils.getInternetAddress(toAddressString); List<String> emailList = new ArrayList<String>(); sendMailForm.listAnotherEmail = new ArrayList<String>(); for (int i = 0; i < toAddresses.length; i++) { if (toAddresses[i] != null) emailList.add(toAddresses[i].getAddress()); } sendMailForm.listAnotherEmail.addAll(emailList); List<User> toUser = sendMailForm.getToUsers(); if (toUser != null && toUser.size() > 0) { List<User> userList = new ArrayList<User>(); for (User ct : toUser) { if (emailList.contains(ct.getEmail())) { userList.add(ct); sendMailForm.listAnotherEmail.remove(ct.getEmail()); } } addressEmailsForm.setAlreadyCheckedUser(userList); } // event.getRequestContext().addUIComponentToUpdateByAjax(popupAction) ; } } static public class CcActionListener extends EventListener<UISendMailForm> { public void execute(Event<UISendMailForm> event) throws Exception { UISendMailForm sendMailForm = event.getSource(); UIPopupContainer popupContainer = sendMailForm.getAncestorOfType(UIPopupContainer.class); UIAddressEmailsForm addressEmailsForm = sendMailForm.openPopup(popupContainer, UIAddressEmailsForm.class, 660, 0); addressEmailsForm.setRecipientsType(FILED_ADD_CC); String toAddressString = ((UIFormStringInput) sendMailForm.getChildById(FILED_ADD_CC)).getValue(); InternetAddress[] toAddresses = FAQUtils.getInternetAddress(toAddressString); List<String> emailList = new ArrayList<String>(); sendMailForm.listAnotherEmail = new ArrayList<String>(); for (int i = 0; i < toAddresses.length; i++) { if (toAddresses[i] != null) emailList.add(toAddresses[i].getAddress()); } sendMailForm.listAnotherEmail.addAll(emailList); List<User> toUser = sendMailForm.getAddCCUsers(); if (toUser != null && toUser.size() > 0) { List<User> userList = new ArrayList<User>(); for (User ct : toUser) { if (emailList.contains(ct.getEmail())) { userList.add(ct); sendMailForm.listAnotherEmail.remove(ct.getEmail()); } } addressEmailsForm.setAlreadyCheckedUser(userList); } // event.getRequestContext().addUIComponentToUpdateByAjax(popupAction) ; } } static public class BccActionListener extends EventListener<UISendMailForm> { public void execute(Event<UISendMailForm> event) throws Exception { UISendMailForm sendMailForm = event.getSource(); UIPopupContainer popupContainer = sendMailForm.getAncestorOfType(UIPopupContainer.class); UIAddressEmailsForm addressEmailsForm = sendMailForm.openPopup(popupContainer, UIAddressEmailsForm.class, 660, 0); addressEmailsForm.setRecipientsType(FILED_ADD_BCC); String toAddressString = ((UIFormStringInput) sendMailForm.getChildById(FILED_ADD_BCC)).getValue(); InternetAddress[] toAddresses = FAQUtils.getInternetAddress(toAddressString); List<String> emailList = new ArrayList<String>(); sendMailForm.listAnotherEmail = new ArrayList<String>(); for (int i = 0; i < toAddresses.length; i++) { if (toAddresses[i] != null) emailList.add(toAddresses[i].getAddress()); } sendMailForm.listAnotherEmail.addAll(emailList); List<User> toUser = sendMailForm.getAddBCCUsers(); if (toUser != null && toUser.size() > 0) { List<User> userList = new ArrayList<User>(); for (User ct : toUser) { if (emailList.contains(ct.getEmail())) { userList.add(ct); sendMailForm.listAnotherEmail.remove(ct.getEmail()); } } addressEmailsForm.setAlreadyCheckedUser(userList); } // event.getRequestContext().addUIComponentToUpdateByAjax(popupAction) ; } } static public class CancelActionListener extends EventListener<UISendMailForm> { public void execute(Event<UISendMailForm> event) throws Exception { UISendMailForm sendMailForm = event.getSource(); UIAnswersPortlet portlet = sendMailForm.getAncestorOfType(UIAnswersPortlet.class); UIPopupAction popupAction = portlet.getChild(UIPopupAction.class); popupAction.deActivate(); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } } static public class ChangeLanguageActionListener extends EventListener<UISendMailForm> { public void execute(Event<UISendMailForm> event) throws Exception { UISendMailForm sendMailForm = event.getSource(); UIFormSelectBox formSelectBox = sendMailForm.getChildById(FILED_QUESTION_LANGUAGE); UIFormWYSIWYGInput body = sendMailForm.getChildById(FILED_MESSAGE); UIFormStringInput subject = sendMailForm.getChildById(FILED_SUBJECT); String language = formSelectBox.getValue(); String contenQuestion = ""; StringBuilder strBuilder = new StringBuilder(); for (QuestionLanguage questionLanguage : sendMailForm.listQuestionLanguage) { if (questionLanguage.getLanguage().equals(language)) { sendMailForm.languageIsResponsed = language; contenQuestion = questionLanguage.getQuestion(); Answer[] answers = questionLanguage.getAnswers(); strBuilder.append(sendMailForm.getLabel("change-content")).append(":<p><b>").append(sendMailForm.getLabel("Question")).append("</b> ").append(contenQuestion).append("</p>").append("<p><b>").append(sendMailForm.getLabel("Detail")).append("</b> ").append(questionLanguage.getDetail()).append("</p>"); if (answers != null && answers.length > 0) { strBuilder.append(sendMailForm.getLabel("Response")).append("</b> ").append(answers[sendMailForm.posOfResponse].getResponses()).append("</p>"); } if (!FAQUtils.isFieldEmpty(sendMailForm.link_)) { String link_ = sendMailForm.link_; if (!link_.contains("language")) { link_ = link_ + "/language=" + language; } strBuilder.append(sendMailForm.getLabel("Link").replaceFirst("<link>", link_)); } body.setValue(strBuilder.toString()); subject.setValue(sendMailForm.getLabel("change-title") + contenQuestion); break; } } event.getRequestContext().addUIComponentToUpdateByAjax(sendMailForm); } } public Map<String, String> getServerConfig() { return serverConfig_; } }