/*
* 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.faq.webui.popup;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.faq.rendering.RenderHelper;
import org.exoplatform.faq.service.Comment;
import org.exoplatform.faq.service.FAQSetting;
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.UIAnswersContainer;
import org.exoplatform.faq.webui.UIAnswersPortlet;
import org.exoplatform.faq.webui.UIQuestions;
import org.exoplatform.faq.webui.ValidatorDataInput;
import org.exoplatform.forum.service.ForumService;
import org.exoplatform.forum.service.MessageBuilder;
import org.exoplatform.forum.service.Post;
import org.exoplatform.forum.service.Topic;
import org.exoplatform.ks.common.Utils;
import org.exoplatform.ks.common.webui.BaseEventListener;
import org.exoplatform.ks.common.webui.UIPopupAction;
import org.exoplatform.ks.common.webui.WebUIUtils;
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.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.wysiwyg.UIFormWYSIWYGInput;
/**
* Created by The eXo Platform SARL
* Author : Ha Mai
* ha.mai@exoplatform.com
* Oct 20, 2008, 3:12:37 PM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/faq/webui/popup/UICommentForm.gtmpl",
events = {
@EventConfig(listeners = UICommentForm.SaveActionListener.class),
@EventConfig(listeners = UICommentForm.CancelActionListener.class)
}
)
public class UICommentForm extends BaseUIFAQForm implements UIPopupComponent {
private String languageSelected;
private Question question_;
private Comment comment;
private String questionContent;
private String questionDetail;
private String currentUser_ = "";
private final String TITLE_USERNAME = "UserName";
private final String COMMENT_CONTENT = "CommentContent";
private FAQSetting faqSetting_;
private String link_ = "";
private RenderHelper renderHelper = new RenderHelper();
public UICommentForm() throws Exception {
currentUser_ = FAQUtils.getCurrentUser();
this.addChild((new UIFormStringInput(TITLE_USERNAME, TITLE_USERNAME, currentUser_)).setEditable(false));
UIFormWYSIWYGInput commentContent = new UIFormWYSIWYGInput(COMMENT_CONTENT, COMMENT_CONTENT, "");
commentContent.setFCKConfig(WebUIUtils.getFCKConfig());
commentContent.setToolBarName("Basic");
this.addChild(commentContent);
}
public String getQuestionContent() {
return questionContent;
}
@SuppressWarnings("unused")
private String getQuestionDetail() {
Question question = new Question();
question.setDetail(questionDetail);
return renderHelper.renderQuestion(question);
}
public void activate() throws Exception {
}
public void deActivate() throws Exception {
}
public void setInfor(Question question, String commentId, FAQSetting faqSetting, String language) throws Exception {
if (!language.equals(question.getLanguage())) {
try {
QuestionLanguage questionLanguage = getFAQService().getQuestionLanguageByLanguage(question.getPath(), language);
this.questionContent = questionLanguage.getQuestion();
this.questionDetail = questionLanguage.getDetail();
languageSelected = language;
} catch (Exception e) {
this.questionContent = question.getQuestion();
this.questionDetail = question.getDetail();
languageSelected = question.getLanguage();
}
} else {
this.questionContent = question.getQuestion();
this.questionDetail = question.getDetail();
languageSelected = question.getLanguage();
}
this.question_ = question;
this.faqSetting_ = faqSetting;
FAQUtils.getEmailSetting(faqSetting_, false, false);
if (commentId.indexOf("new") < 0) {
comment = getFAQService().getCommentById(question.getPath(), commentId, language);
((UIFormWYSIWYGInput) this.getChildById(COMMENT_CONTENT)).setValue(comment.getComments());
}
}
public void setLink(String link) {
this.link_ = link;
}
public String getLink() {
return link_;
}
static public class CancelActionListener extends EventListener<UICommentForm> {
public void execute(Event<UICommentForm> event) throws Exception {
UICommentForm commentForm = event.getSource();
UIAnswersPortlet portlet = commentForm.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class SaveActionListener extends BaseEventListener<UICommentForm> {
public void onEvent(Event<UICommentForm> event, UICommentForm commentForm, final String objectId) throws Exception {
String comment = ((UIFormWYSIWYGInput) commentForm.getChildById(commentForm.COMMENT_CONTENT)).getValue();
UIAnswersPortlet portlet = commentForm.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIQuestions questions = portlet.getChild(UIAnswersContainer.class).getChild(UIQuestions.class);
if (Utils.isEmpty(comment) || !ValidatorDataInput.fckContentIsNotEmpty(comment)) {
warning("UICommentForm.msg.comment-is-null");
return;
}
if (!commentForm.getFAQService().isExisting(commentForm.question_.getPath())) {
warning("UIQuestions.msg.comment-id-deleted");
return;
}
comment = Utils.encodeSpecialCharInContent(comment);
try {
// Create link by Vu Duy Tu.
String link = FAQUtils.getLink(commentForm.getLink(), commentForm.getId(), "UICommentForm", "Cancel", "ViewQuestion", "OBJECTID");
link = link.replaceFirst("OBJECTID", commentForm.question_.getId()).replace("private", "public");
commentForm.question_.setLink(link);
if (commentForm.comment != null) {
commentForm.comment.setNew(false);
} else {
commentForm.comment = new Comment();
commentForm.comment.setNew(true);
}
commentForm.comment.setComments(comment);
// For discuss in forum
String topicId = commentForm.question_.getTopicIdDiscuss();
if (topicId != null && topicId.length() > 0) {
ForumService forumService = (ForumService) PortalContainer.getInstance().getComponentInstanceOfType(ForumService.class);
Topic topic = (Topic) forumService.getObjectNameById(topicId, org.exoplatform.forum.service.Utils.TOPIC);
if (topic != null) {
String remoteAddr = WebUIUtils.getRemoteIP();
String[] ids = topic.getPath().split("/");
int t = ids.length;
String linkForum = FAQUtils.getLinkDiscuss(topicId);
String postId = commentForm.comment.getPostId();
if (postId == null || postId.length() == 0) {
Post post = new Post();
post.setOwner(commentForm.currentUser_);
post.setIcon("ViewIcon");
post.setName("Re: " + commentForm.question_.getQuestion());
post.setMessage(comment);
post.setLink(linkForum);
post.setIsApproved(!topic.getIsModeratePost());
post.setRemoteAddr(remoteAddr);
try {
forumService.savePost(ids[t - 3], ids[t - 2], topicId, post, true, new MessageBuilder());
} catch (Exception e) {
event.getSource().log.debug("Saving post fail: ", e);
}
commentForm.comment.setPostId(post.getId());
} else {
try {
Post post = forumService.getPost(ids[t - 3], ids[t - 2], topicId, postId);
boolean isNew = false;
if (post == null) {
post = new Post();
isNew = true;
post.setOwner(commentForm.currentUser_);
post.setIcon("ViewIcon");
post.setName("Re: " + commentForm.question_.getQuestion());
commentForm.comment.setPostId(post.getId());
post.setLink(linkForum);
post.setRemoteAddr(remoteAddr);
} else {
post.setModifiedBy(commentForm.currentUser_);
}
post.setIsApproved(!topic.getIsModeratePost());
post.setMessage(comment);
forumService.savePost(ids[t - 3], ids[t - 2], topicId, post, isNew, new MessageBuilder());
} catch (Exception e) {
event.getSource().log.debug("Saving post fail: ", e);
}
}
}
}
String language = "";
if (!commentForm.languageSelected.equals(commentForm.question_.getLanguage()))
language = commentForm.languageSelected;
String currentUser = FAQUtils.getCurrentUser();
commentForm.comment.setCommentBy(currentUser);
commentForm.comment.setFullName(FAQUtils.getFullName(currentUser));
commentForm.getFAQService().saveComment(commentForm.question_.getPath(), commentForm.comment, language);
if (!commentForm.languageSelected.equals(commentForm.question_.getLanguage())) {
try {
questions.updateCurrentLanguage();
} catch (Exception e) {
questions.updateQuestionLanguageByLanguage(commentForm.question_.getPath(), commentForm.languageSelected);
}
} else {
questions.updateQuestionLanguageByLanguage(commentForm.question_.getPath(), commentForm.languageSelected);
}
} catch (Exception e) {
event.getSource().log.error("Fail to save action: ", e);
warning("UIQuestions.msg.category-id-deleted");
}
// questions.setDefaultLanguage() ;
event.getRequestContext().addUIComponentToUpdateByAjax(questions);
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
}