/*************************************************************************** * Copyright (C) 2003-2009 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.Date; import java.util.List; import javax.jcr.PathNotFoundException; import javax.portlet.ActionResponse; import javax.xml.namespace.QName; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.forum.ForumTransformHTML; import org.exoplatform.forum.ForumUtils; import org.exoplatform.forum.info.ForumParameter; import org.exoplatform.forum.info.UIForumQuickReplyPortlet; import org.exoplatform.forum.service.ForumService; import org.exoplatform.forum.service.Post; import org.exoplatform.forum.service.Topic; import org.exoplatform.forum.service.UserProfile; import org.exoplatform.ks.common.UserHelper; import org.exoplatform.ks.common.webui.UIPopupAction; import org.exoplatform.ks.common.webui.WebUIUtils; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.exception.MessageException; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormTextAreaInput; /** * Created by The eXo Platform SAS * Author : Vu Duy Tu * tu.duy@exoplatform.com * Apr 15, 2009 - 4:34:11 AM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/templates/forum/webui/popup/UIQuickReplyForm.gtmpl", events = { @EventConfig(listeners = UIQuickReplyForm.PreviewReplyActionListener.class), @EventConfig(listeners = UIQuickReplyForm.QuickReplyActionListener.class) } ) public class UIQuickReplyForm extends UIForm { private String categoryId; private String forumId; private String topicId = ForumUtils.EMPTY_STR; private String userName; private String links = ForumUtils.EMPTY_STR; private Topic topic; private boolean isModerator = false; public static final String FIELD_MESSAGE_TEXTAREA = "Message"; public UIQuickReplyForm() { addUIFormInput(new UIFormTextAreaInput(FIELD_MESSAGE_TEXTAREA, FIELD_MESSAGE_TEXTAREA, null)); } private String getLink() { return links; } public void setInitForm(String categoryId, String forumId, String topicId, boolean isModerator) throws Exception { this.categoryId = categoryId; this.forumId = forumId; this.topicId = topicId; this.isModerator = isModerator; this.userName = UserHelper.getCurrentUser(); try { ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); this.topic = forumService.getTopic(categoryId, forumId, topicId, userName); } catch (Exception e) { topic = new Topic(); } } static public class QuickReplyActionListener extends EventListener<UIQuickReplyForm> { public void execute(Event<UIQuickReplyForm> event) throws Exception { Log log = ExoLogger.getLogger(QuickReplyActionListener.class); UIQuickReplyForm quickReply = event.getSource(); ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); UIFormTextAreaInput textAreaInput = quickReply.getUIFormTextAreaInput(FIELD_MESSAGE_TEXTAREA); String message = textAreaInput.getValue(); String checksms = message; if (checksms != null && checksms.trim().length() > 0) { boolean isOffend = false; boolean hasTopicMod = false; if (!quickReply.isModerator) { String[] censoredKeyword = ForumUtils.getCensoredKeyword(forumService); checksms = checksms.toLowerCase().trim(); for (String string : censoredKeyword) { if (checksms.indexOf(string) >= 0) { isOffend = true; break; } } if (quickReply.topic != null) hasTopicMod = quickReply.topic.getIsModeratePost(); } message = ForumTransformHTML.enCodeHTMLContent(message); String remoteAddr = WebUIUtils.getRemoteIP(); UserProfile userProfile = forumService.getDefaultUserProfile(quickReply.userName, remoteAddr); // set link // String link = ForumSessionUtils.getBreadcumbUrl(quickReply.getLink(), quickReply.getId(), "QuickReply", quickReply.topicId).replaceFirst("private", "public"); String link = ForumUtils.createdForumLink(ForumUtils.TOPIC, quickReply.topicId).replaceFirst("private", "public"); // Topic topic = quickReply.topic; Post post = new Post(); post.setName(quickReply.getLabel("Re") + topic.getTopicName()); post.setMessage(message); post.setOwner(quickReply.userName); post.setRemoteAddr(remoteAddr); post.setIcon(topic.getIcon()); post.setIsHidden(isOffend); post.setIsApproved(!hasTopicMod); post.setLink(link); try { forumService.savePost(quickReply.categoryId, quickReply.forumId, quickReply.topicId, post, true, ForumUtils.getDefaultMail()); forumService.updateTopicAccess(quickReply.userName, topic.getId()); if (userProfile.getIsAutoWatchTopicIPost()) { List<String> values = new ArrayList<String>(); values.add(userProfile.getEmail()); String path = quickReply.categoryId + ForumUtils.SLASH + quickReply.forumId + ForumUtils.SLASH + quickReply.topicId; forumService.addWatch(1, path, values, quickReply.userName); } } catch (PathNotFoundException e) { String[] args = new String[] {}; throw new MessageException(new ApplicationMessage("UIPostForm.msg.isParentDelete", args, ApplicationMessage.WARNING)); } textAreaInput.setValue(ForumUtils.EMPTY_STR); if (isOffend || hasTopicMod) { Object[] args = { ForumUtils.EMPTY_STR }; UIApplication uiApp = quickReply.getAncestorOfType(UIApplication.class); if (isOffend) uiApp.addMessage(new ApplicationMessage("MessagePost.msg.isOffend", args, ApplicationMessage.WARNING)); else { args = new Object[] {}; uiApp.addMessage(new ApplicationMessage("MessagePost.msg.isModerate", args, ApplicationMessage.WARNING)); } event.getRequestContext().addUIComponentToUpdateByAjax(uiApp.getUIPopupMessages()); } else { try { ActionResponse actionRes = event.getRequestContext().getResponse(); ForumParameter param = new ForumParameter(); param.setTopicId(topic.getId()); actionRes.setEvent(new QName("ReLoadPortletEvent"), param); } catch (Exception e) { log.debug("\nSetting Topic fail: " + e.getMessage() + "\n" + e.getCause()); } } event.getRequestContext().addUIComponentToUpdateByAjax(quickReply); } else { String[] args = new String[] { quickReply.getLabel(FIELD_MESSAGE_TEXTAREA) }; throw new MessageException(new ApplicationMessage("MessagePost.msg.message-empty", args)); } } } static public class PreviewReplyActionListener extends EventListener<UIQuickReplyForm> { public void execute(Event<UIQuickReplyForm> event) throws Exception { UIQuickReplyForm quickReply = event.getSource(); String message = quickReply.getUIStringInput(FIELD_MESSAGE_TEXTAREA).getValue(); String checksms = (message); if (checksms != null && checksms.trim().length() > 3) { message = ForumTransformHTML.enCodeHTMLContent(message); Topic topic = quickReply.topic; Post post = new Post(); post.setName(quickReply.getLabel("Re") + topic.getTopicName()); post.setMessage(message); post.setOwner(quickReply.userName); post.setRemoteAddr(ForumUtils.EMPTY_STR); post.setIcon(topic.getIcon()); post.setIsApproved(false); post.setCreatedDate(new Date()); UIForumQuickReplyPortlet quickReplyPortlet = quickReply.getAncestorOfType(UIForumQuickReplyPortlet.class); UIPopupAction popupAction = quickReplyPortlet.getChild(UIPopupAction.class).setRendered(true); UIViewPost viewPost = popupAction.activate(UIViewPost.class, 670); viewPost.setPostView(post); viewPost.setViewUserInfo(false); viewPost.setActionForm(new String[] { "Close" }); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } else { String[] args = new String[] { quickReply.getLabel(FIELD_MESSAGE_TEXTAREA) }; throw new MessageException(new ApplicationMessage("MessagePost.msg.message-empty", args)); } } } }