/*************************************************************************** * Copyright (C) 2003-2008 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.forum.webui.popup; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.exoplatform.commons.utils.HTMLSanitizer; import org.exoplatform.forum.ForumUtils; import org.exoplatform.forum.common.CommonUtils; import org.exoplatform.forum.common.UserHelper; import org.exoplatform.forum.common.webui.*; import org.exoplatform.forum.service.ForumPrivateMessage; import org.exoplatform.forum.service.UserProfile; import org.exoplatform.forum.webui.BaseForumForm; import org.exoplatform.forum.webui.UIForumPortlet; import org.exoplatform.forum.webui.popup.UIForumInputWithActions.ActionData; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.ComponentConfigs; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIPopupComponent; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.UITree; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIFormRichtextInput; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.validator.MandatoryValidator; @ComponentConfigs({ @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "app:/templates/forum/webui/popup/UIPrivateMessegeForm.gtmpl", events = { @EventConfig(listeners = UIPrivateMessageForm.AddValuesUserActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPrivateMessageForm.AddUserActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPrivateMessageForm.SelectTabActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPrivateMessageForm.CancelActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPrivateMessageForm.SendPrivateMessageActionListener.class, phase = Phase.DECODE) }), @ComponentConfig(id = "UIPMUserPopupWindow", type = UIPopupWindow.class, template = "system:/groovy/webui/core/UIPopupWindow.gtmpl", events = { @EventConfig(listeners = UIPrivateMessageForm.ClosePopupActionListener.class, name = "ClosePopup"), @EventConfig(listeners = UIPrivateMessageForm.AddActionListener.class, name = "Add", phase = Phase.DECODE), @EventConfig(listeners = UIPrivateMessageForm.CloseActionListener.class, name = "Close", phase = Phase.DECODE) }) }) public class UIPrivateMessageForm extends BaseForumForm implements UIPopupComponent, UISelector { public static final String FIELD_SENDTO_TEXT = "SendTo"; public static final String FIELD_MAILTITLE_INPUT = "MailTitle"; public static final String FIELD_MAILMESSAGE_INPUT = "MailMessage"; public static final String FIELD_SENDMESSAGE_TAB = "MessageTab"; public static final String FIELD_REPLY_LABEL = "Reply"; public static final String FIELD_FORWARD_LABEL = "Forward"; public static final String USER_SELECTOR_POPUPWINDOW = "UIPMUserPopupWindow"; private String userName; private int id = 0; private boolean fullMessage = true; public UIPrivateMessageForm() throws Exception { UIFormStringInput sendTo = new UIFormStringInput(FIELD_SENDTO_TEXT, FIELD_SENDTO_TEXT, null); sendTo.addValidator(MandatoryValidator.class); UIFormStringInput mailTitle = new UIFormStringInput(FIELD_MAILTITLE_INPUT, FIELD_MAILTITLE_INPUT, null); mailTitle.addValidator(MandatoryValidator.class); UIFormRichtextInput formWYSIWYGInput = new UIFormRichtextInput(FIELD_MAILMESSAGE_INPUT, FIELD_MAILMESSAGE_INPUT, CommonUtils.EMPTY_STR); formWYSIWYGInput.addValidator(MandatoryValidator.class); formWYSIWYGInput.setIsPasteAsPlainText(true).setIgnoreParserHTML(true).setToolbar(UIFormRichtextInput.FORUM_TOOLBAR); UIForumInputWithActions sendMessageTab = new UIForumInputWithActions(FIELD_SENDMESSAGE_TAB); sendMessageTab.addUIFormInput(sendTo); sendMessageTab.addUIFormInput(mailTitle); sendMessageTab.addUIFormInput(formWYSIWYGInput); String[] strings = new String[] { "SelectUser", "SelectMemberShip", "SelectGroup" }; String[] icons = ForumUtils.getClassIconWithAction(); ActionData ad; int i = 0; List<ActionData> actions = new ArrayList<ActionData>(); for (String string : strings) { ad = new ActionData(); if (i == 0) ad.setActionListener("AddUser"); else ad.setActionListener("AddValuesUser"); ad.setActionParameter(String.valueOf(i)); ad.setCssIconClass(icons[i]); ad.setActionName("UIPrivateMessageForm.label.action." + string); actions.add(ad); ++i; } sendMessageTab.setActionField(FIELD_SENDTO_TEXT, actions); addUIFormInput(sendMessageTab); addChild(UIListInBoxPrivateMessage.class, null, null); addChild(UIListSentPrivateMessage.class, null, null); setAddColonInLabel(true); } public void activate() { } public void deActivate() { } public void setUserProfile(UserProfile userProfile) { this.userProfile = userProfile; this.userName = userProfile.getUserId(); } public void setSendtoField(String str) { getUIStringInput(FIELD_SENDTO_TEXT).setValue(str); } public void updateSelect(String selectField, String value) throws Exception { UIFormStringInput fieldInput = getUIStringInput(selectField); String values = fieldInput.getValue(); fieldInput.setValue(ForumUtils.updateMultiValues(value, values)); } private String removeCurrentUser(String s) throws Exception { if (s.equals(userName)) return ForumUtils.EMPTY_STR; if (s.contains(userName + ForumUtils.COMMA)) s = StringUtils.remove(s, userName + ForumUtils.COMMA); if (s.contains(ForumUtils.COMMA + userName)) s = StringUtils.remove(s, ForumUtils.COMMA + userName); return s; } protected int getIsSelected() { return this.id; } public void setUpdate(ForumPrivateMessage privateMessage, boolean isReply) throws Exception { UIForumInputWithActions messageTab = getChildById(FIELD_SENDMESSAGE_TAB); UIFormStringInput stringInput = messageTab.getUIStringInput(FIELD_MAILTITLE_INPUT); UIFormRichtextInput message = messageTab.getChild(UIFormRichtextInput.class); String content = privateMessage.getMessage(); String replyLabel = getLabel(FIELD_REPLY_LABEL) + CommonUtils.COLON; String forwardLabel = getLabel(FIELD_FORWARD_LABEL) + CommonUtils.COLON; String title = CommonUtils.decodeSpecialCharToHTMLnumber(privateMessage.getName()); title = getTitleMessage(getTitleMessage(title, replyLabel), forwardLabel); if (isReply) { setSendtoField(privateMessage.getFrom()); stringInput.setValue(replyLabel + title); content = new StringBuffer("<br/><br/><br/><div style=\"padding: 5px; border-left:solid 2px blue;\">").append(content) .append("</div>") .toString(); } else { setSendtoField(CommonUtils.EMPTY_STR); stringInput.setValue(forwardLabel + title); } message.setValue(content); this.id = 2; } private String getTitleMessage(String title, String defautlLabel) { if (CommonUtils.isEmpty(title) == true) { return CommonUtils.EMPTY_STR; } while (title.indexOf(defautlLabel) == 0) { title = title.replaceFirst(defautlLabel, CommonUtils.EMPTY_STR); } return title; } public boolean isFullMessage() { return fullMessage; } public void setFullMessage(boolean fullMessage) { this.fullMessage = fullMessage; } static public class SelectTabActionListener extends EventListener<UIPrivateMessageForm> { public void execute(Event<UIPrivateMessageForm> event) throws Exception { String id = event.getRequestContext().getRequestParameter(OBJECTID); UIPrivateMessageForm messageForm = event.getSource(); messageForm.id = Integer.parseInt(id); event.getRequestContext().addUIComponentToUpdateByAjax(messageForm); } } static public class SendPrivateMessageActionListener extends EventListener<UIPrivateMessageForm> { public void execute(Event<UIPrivateMessageForm> event) throws Exception { UIPrivateMessageForm messageForm = event.getSource(); UIForumInputWithActions messageTab = messageForm.getChildById(FIELD_SENDMESSAGE_TAB); UIFormStringInput inputSendTo = messageForm.getUIStringInput(FIELD_SENDTO_TEXT); String sendTo = inputSendTo.getValue(); sendTo = ForumUtils.removeSpaceInString(sendTo); sendTo = ForumUtils.removeStringResemble(sendTo); if (ForumUtils.isEmpty(sendTo)) { messageForm.warning("EmptyFieldValidator.msg.empty-input", messageForm.getLabel(FIELD_SENDTO_TEXT)); return; } sendTo = messageForm.removeCurrentUser(sendTo); if (ForumUtils.isEmpty(sendTo)) { messageForm.warning("UIPrivateMessageForm.msg.sendToCurrentUser", new String[] { messageForm.getLabel(FIELD_SENDTO_TEXT) }); return; } String erroUser = UserHelper.checkValueUser(sendTo); if (!ForumUtils.isEmpty(erroUser)) { messageForm.warning("NameValidator.msg.erroUser-input", new String[] { messageForm.getLabel(FIELD_SENDTO_TEXT), erroUser }); return; } UIFormStringInput mailTitleInput = messageTab.getUIStringInput(FIELD_MAILTITLE_INPUT); String mailTitle = mailTitleInput.getValue(); if (ForumUtils.isEmpty(mailTitle)) { messageForm.warning("EmptyFieldValidator.msg.empty-input", messageForm.getLabel(FIELD_MAILTITLE_INPUT)); return; } int maxText = 80; if (mailTitle.length() > maxText) { messageForm.warning("NameValidator.msg.warning-long-text", new String[] { messageForm.getLabel(FIELD_MAILTITLE_INPUT), String.valueOf(maxText) }); return; } mailTitle = CommonUtils.encodeSpecialCharInTitle(mailTitle); UIFormRichtextInput formWYSIWYGInput = messageTab.getChild(UIFormRichtextInput.class); String message = formWYSIWYGInput.getValue(); message = HTMLSanitizer.sanitize(message); if (!ForumUtils.isEmpty(message)) { ForumPrivateMessage privateMessage = new ForumPrivateMessage(); privateMessage.setFrom(messageForm.userName); privateMessage.setSendTo(sendTo); privateMessage.setName(mailTitle); privateMessage.setMessage(message); try { messageForm.getForumService().savePrivateMessage(privateMessage); } catch (Exception e) { messageForm.log.warn("Failed to save private message", e); } inputSendTo.setValue(ForumUtils.EMPTY_STR); mailTitleInput.setValue(ForumUtils.EMPTY_STR); formWYSIWYGInput.setValue(ForumUtils.EMPTY_STR); messageForm.info("UIPrivateMessageForm.msg.sent-successfully", false); if (messageForm.fullMessage) { messageForm.id = 1; event.getRequestContext().addUIComponentToUpdateByAjax(messageForm.getParent()); } else { UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class); forumPortlet.cancelAction(); } } else { messageForm.warning("EmptyFieldValidator.msg.empty-input", messageForm.getLabel(FIELD_MAILMESSAGE_INPUT)); } } } static public class AddValuesUserActionListener extends EventListener<UIPrivateMessageForm> { public void execute(Event<UIPrivateMessageForm> event) throws Exception { UIPrivateMessageForm messageForm = event.getSource(); String type = event.getRequestContext().getRequestParameter(OBJECTID); if (!ForumUtils.isEmpty(type)) { UIPopupContainer popupContainer = messageForm.getAncestorOfType(UIPopupContainer.class); UIPopupAction popupAction = popupContainer.getChild(UIPopupAction.class); UIUserSelect uiUserSelect = popupContainer.findFirstComponentOfType(UIUserSelect.class); if (uiUserSelect != null) { UIPopupWindow popupWindow = uiUserSelect.getParent(); closePopupWindow(popupWindow); } UIGroupSelector uiGroupSelector = popupAction.activate(UIGroupSelector.class, 600); if (type.equals(UIGroupSelector.TYPE_MEMBERSHIP)) uiGroupSelector.setId("UIMemberShipSelector"); else if (type.equals(UIGroupSelector.TYPE_GROUP)) uiGroupSelector.setId("UIGroupSelector"); uiGroupSelector.setType(type); uiGroupSelector.setSelectedGroups(null); uiGroupSelector.setComponent(messageForm, new String[] { FIELD_SENDTO_TEXT }); uiGroupSelector.getChild(UITree.class).setId(UIGroupSelector.TREE_GROUP_ID); uiGroupSelector.getChild(org.exoplatform.webui.core.UIBreadcumbs.class).setId(UIGroupSelector.BREADCUMB_GROUP_ID); event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } } } static public class CancelActionListener extends EventListener<UIPrivateMessageForm> { public void execute(Event<UIPrivateMessageForm> event) throws Exception { UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class); forumPortlet.cancelAction(); } } static public class CloseActionListener extends EventListener<UIUserSelect> { public void execute(Event<UIUserSelect> event) throws Exception { UIUserSelect uiUserSelector = event.getSource(); UIPopupWindow popupWindow = uiUserSelector.getParent(); closePopupWindow(popupWindow); } } static public class ClosePopupActionListener extends EventListener<UIPopupWindow> { public void execute(Event<UIPopupWindow> event) throws Exception { UIPopupWindow popupWindow = event.getSource(); closePopupWindow(popupWindow); } } static public class AddActionListener extends EventListener<UIUserSelect> { public void execute(Event<UIUserSelect> event) throws Exception { UIUserSelect uiUserSelector = event.getSource(); String values = uiUserSelector.getSelectedUsers(); UIForumPortlet forumPortlet = uiUserSelector.getAncestorOfType(UIForumPortlet.class); UIPrivateMessageForm messageForm = forumPortlet.findFirstComponentOfType(UIPrivateMessageForm.class); if (messageForm != null) { messageForm.updateSelect(FIELD_SENDTO_TEXT, values); } UIPopupWindow popupWindow = uiUserSelector.getParent(); closePopupWindow(popupWindow); UIPopupContainer uiPopupContainer = messageForm.getAncestorOfType(UIPopupContainer.class); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupContainer); } } static public class AddUserActionListener extends EventListener<UIPrivateMessageForm> { public void execute(Event<UIPrivateMessageForm> event) throws Exception { UIPrivateMessageForm messageForm = event.getSource(); UIPopupContainer uiPopupContainer = messageForm.getAncestorOfType(UIPopupContainer.class); messageForm.showUIUserSelect(uiPopupContainer, USER_SELECTOR_POPUPWINDOW, ForumUtils.EMPTY_STR); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupContainer); } } }