/*
* 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 java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jcr.PathNotFoundException;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.faq.rendering.RenderHelper;
import org.exoplatform.faq.service.Answer;
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.UIPopupAction;
import org.exoplatform.ks.common.webui.UIPopupContainer;
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.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormCheckBoxInput;
import org.exoplatform.webui.form.UIFormSelectBox;
import org.exoplatform.webui.form.wysiwyg.UIFormWYSIWYGInput;
/**
* Created by The eXo Platform SARL
* Author : Ha Mai
* ha.mai@exoplatform.com
* Apr 17, 2008 ,3:19:00 PM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/faq/webui/popup/UIResponseForm.gtmpl",
events = {
@EventConfig(listeners = UIResponseForm.SaveActionListener.class),
@EventConfig(listeners = UIResponseForm.CancelActionListener.class),
@EventConfig(listeners = UIResponseForm.AddRelationActionListener.class),
@EventConfig(listeners = UIResponseForm.RemoveRelationActionListener.class),
@EventConfig(listeners = UIResponseForm.ChangeLanguageActionListener.class)
}
)
public class UIResponseForm extends BaseUIFAQForm implements UIPopupComponent {
private static final String QUESTION_LANGUAGE = "Language";
private static final String RESPONSE_CONTENT = "QuestionRespone";
private static final String SHOW_ANSWER = "QuestionShowAnswer";
private static final String IS_APPROVED = "IsApproved";
private Question question_ = null;
private String questionDetail = "";
private String questionContent = "";
private boolean isModerator = true;
public void setModertator(boolean isMod) {
this.isModerator = isMod;
}
// form input :
private UIFormSelectBox questionLanguages_;
private UIFormWYSIWYGInput inputResponseQuestion_;
private UIFormCheckBoxInput<Boolean> checkShowAnswer_;
private UIFormCheckBoxInput<Boolean> isApproved_;
// question infor :
public String questionId_ = "";
private List<String> listRelationQuestion = new ArrayList<String>();
private List<String> listQuestIdRela = new ArrayList<String>();
// form variable:
Map<String, Answer> mapAnswers = new HashMap<String, Answer>();
Map<String, QuestionLanguage> languageMap = new HashMap<String, QuestionLanguage>();
private List<SelectItemOption<String>> listLanguageToReponse = new ArrayList<SelectItemOption<String>>();
private String currentLanguage = "";
private String link_ = "";
private boolean isChildOfQuestionManager_;
private FAQSetting faqSetting_;
private boolean isAnswerApproved = true;
public void activate() throws Exception {
}
public void deActivate() throws Exception {
}
private RenderHelper renderHelper = new RenderHelper();
public String getLink() {
return link_;
}
public void setLink(String link) {
this.link_ = link;
}
public void setFAQSetting(FAQSetting faqSetting) {
this.faqSetting_ = faqSetting;
}
public UIResponseForm() throws Exception {
isChildOfQuestionManager_ = false;
inputResponseQuestion_ = new UIFormWYSIWYGInput(RESPONSE_CONTENT, RESPONSE_CONTENT, "");
inputResponseQuestion_.setFCKConfig(WebUIUtils.getFCKConfig());
inputResponseQuestion_.setToolBarName("Basic");
checkShowAnswer_ = new UIFormCheckBoxInput<Boolean>(SHOW_ANSWER, SHOW_ANSWER, false);
isApproved_ = new UIFormCheckBoxInput<Boolean>(IS_APPROVED, IS_APPROVED, false);
this.setActions(new String[] { "Save", "Cancel" });
}
public Question getQuestion() {
return question_;
}
public void setAnswerInfor(Question question, Answer answer, String language) {
setQuestionId(question, language, answer.getApprovedAnswers());
mapAnswers.clear();
mapAnswers.put(answer.getLanguage(), answer);
inputResponseQuestion_.setValue(answer.getResponses());
listLanguageToReponse.clear();
listLanguageToReponse.add(new SelectItemOption<String>(answer.getLanguage() + " (default) ", answer.getLanguage()));
questionLanguages_ = new UIFormSelectBox(QUESTION_LANGUAGE, QUESTION_LANGUAGE, listLanguageToReponse);
questionLanguages_.setValue(answer.getLanguage());
questionLanguages_.setSelectedValues(new String[] { answer.getLanguage() });
getUIFormCheckBoxInput(SHOW_ANSWER).setChecked(answer.getActivateAnswers());
getUIFormCheckBoxInput(IS_APPROVED).setChecked(answer.getApprovedAnswers());
}
public void setQuestionId(Question question, String languageViewed, boolean isAnswerApp) {
this.isAnswerApproved = isAnswerApp;
try {
questionDetail = question.getDetail();
questionContent = question.getQuestion();
listRelationQuestion.clear();
listQuestIdRela.clear();
question_ = question;
if (languageViewed != null && languageViewed.trim().length() > 0) {
currentLanguage = languageViewed;
} else {
currentLanguage = question.getLanguage();
}
this.setListRelation();
} catch (Exception e) {
log.error("Can not set Question id, exception: " + e.getMessage());
}
this.questionId_ = question.getPath();
listLanguageToReponse.clear();
listLanguageToReponse.add(new SelectItemOption<String>(question.getLanguage() + " (default) ", question.getLanguage()));
QuestionLanguage defaultLanguage = new QuestionLanguage();
defaultLanguage.setLanguage(question.getLanguage());
defaultLanguage.setQuestion(question.getQuestion());
defaultLanguage.setDetail(question.getDetail());
defaultLanguage.setState(QuestionLanguage.VIEW);
languageMap.put(defaultLanguage.getLanguage(), defaultLanguage);
try {
for (QuestionLanguage language : getFAQService().getQuestionLanguages(questionId_)) {
if (language.getLanguage().equals(currentLanguage)) {
questionDetail = language.getDetail();
questionContent = language.getQuestion();
}
languageMap.put(language.getLanguage(), language);
if (!language.getLanguage().equals(question.getLanguage()))
listLanguageToReponse.add(new SelectItemOption<String>(language.getLanguage(), language.getLanguage()));
}
} catch (Exception e) {
log.error("Can not set Question id, exception: " + e.getMessage());
}
checkShowAnswer_.setChecked(question_.isActivated());
checkShowAnswer_.setRendered(isModerator);
isApproved_.setChecked(isAnswerApproved);
isApproved_.setRendered(isModerator);
questionLanguages_ = new UIFormSelectBox(QUESTION_LANGUAGE, QUESTION_LANGUAGE, listLanguageToReponse);
questionLanguages_.setValue(currentLanguage);
questionLanguages_.setSelectedValues(new String[] { currentLanguage });
questionLanguages_.setOnChange("ChangeLanguage");
questionLanguages_.setRendered((listLanguageToReponse.size() <= 1) ? false : true);
addChild(inputResponseQuestion_);
addChild(questionLanguages_);
addChild(isApproved_);
addChild(checkShowAnswer_);
}
@SuppressWarnings("unused")
private String render(String s) {
Question question = new Question();
question.setDetail(s);
return renderHelper.renderQuestion(question);
}
@SuppressWarnings("unused")
private String getValue(String id) {
if (id.equals("QuestionTitle"))
return questionContent;
else
return questionDetail;
}
@SuppressWarnings("unused")
private String getLanguageIsResponse() {
return this.currentLanguage;
}
private void setListRelation() throws Exception {
String[] relations = question_.getRelations();
this.setListIdQuesRela(Arrays.asList(relations));
if (relations != null && relations.length > 0)
for (String relation : relations) {
listRelationQuestion.add(getFAQService().getQuestionById(relation).getQuestion());
}
}
public List<String> getListRelation() {
return listRelationQuestion;
}
public List<String> getListIdQuesRela() {
return this.listQuestIdRela;
}
public void setListIdQuesRela(List<String> listId) {
listQuestIdRela = new ArrayList<String>();
listQuestIdRela.addAll(listId);
}
public void setListRelationQuestion(List<String> listQuestionContent) {
this.listRelationQuestion.clear();
this.listRelationQuestion.addAll(listQuestionContent);
}
@SuppressWarnings("unused")
private List<String> getListRelationQuestion() {
return this.listRelationQuestion;
}
public void updateChildOfQuestionManager(boolean isChild) {
this.isChildOfQuestionManager_ = isChild;
this.removeChildById(RESPONSE_CONTENT);
this.removeChildById(QUESTION_LANGUAGE);
this.removeChildById(IS_APPROVED);
this.removeChildById(SHOW_ANSWER);
this.inputResponseQuestion_.setValue("");
listLanguageToReponse.clear();
listQuestIdRela.clear();
listRelationQuestion.clear();
}
private Answer[] updateDiscussForum(Answer[] answers) throws Exception {
// Vu Duy Tu Save post Discuss Forum. Mai Ha removed to this function
if (faqSetting_.getIsDiscussForum()) {
String topicId = 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[] ids = topic.getPath().split("/");
int t = ids.length;
String linkForum = FAQUtils.getLinkDiscuss(topicId);
Post post;
int l = answers.length;
String remoteAddr = WebUIUtils.getRemoteIP();
for (int i = 0; i < l; ++i) {
String postId = answers[i].getPostId();
try {
if (postId != null && postId.length() > 0) {
post = forumService.getPost(ids[t - 3], ids[t - 2], topicId, postId);
if (post == null) {
post = new Post();
post.setOwner(answers[i].getResponseBy());
post.setName("Re: " + question_.getQuestion());
post.setIcon("ViewIcon");
answers[i].setPostId(post.getId());
post.setMessage(answers[i].getResponses());
post.setLink(linkForum);
post.setIsApproved(!topic.getIsModeratePost());
post.setRemoteAddr(remoteAddr);
forumService.savePost(ids[t - 3], ids[t - 2], topicId, post, true, new MessageBuilder());
} else {
post.setIsApproved(!topic.getIsModeratePost());
post.setMessage(answers[i].getResponses());
forumService.savePost(ids[t - 3], ids[t - 2], topicId, post, false, new MessageBuilder());
}
} else {
post = new Post();
post.setOwner(answers[i].getResponseBy());
post.setName("Re: " + question_.getQuestion());
post.setIcon("ViewIcon");
post.setMessage(answers[i].getResponses());
post.setLink(linkForum);
post.setIsApproved(!topic.getIsModeratePost());
post.setRemoteAddr(remoteAddr);
forumService.savePost(ids[t - 3], ids[t - 2], topicId, post, true, new MessageBuilder());
answers[i].setPostId(post.getId());
}
} catch (Exception e) {
log.error("Can not discuss question into forum, exception: ", e);
}
}
}
}
}
return answers;
}
static public class SaveActionListener extends EventListener<UIResponseForm> {
@SuppressWarnings("unchecked")
public void execute(Event<UIResponseForm> event) throws Exception {
UIResponseForm responseForm = event.getSource();
String language = responseForm.questionLanguages_.getValue();
String responseQuestionContent = responseForm.inputResponseQuestion_.getValue();
responseQuestionContent = Utils.encodeSpecialCharInContent(responseQuestionContent);
Answer answer;
if (ValidatorDataInput.fckContentIsNotEmpty(responseQuestionContent)) {
if (responseForm.mapAnswers.containsKey(language)) {
answer = responseForm.mapAnswers.get(language);
answer.setResponses(responseQuestionContent);
answer.setNew(true);
} else {
answer = new Answer();
answer.setDateResponse(org.exoplatform.faq.service.Utils.getInstanceTempCalendar().getTime());
String currentUser = FAQUtils.getCurrentUser();
answer.setResponseBy(currentUser);
answer.setFullName(FAQUtils.getFullName(currentUser));
answer.setNew(true);
answer.setResponses(responseQuestionContent);
answer.setLanguage(language);
}
// author: Vu Duy Tu. set show answer
answer.setApprovedAnswers(((UIFormCheckBoxInput<Boolean>) responseForm.getChildById(IS_APPROVED)).isChecked());
answer.setActivateAnswers(((UIFormCheckBoxInput<Boolean>) responseForm.getChildById(SHOW_ANSWER)).isChecked());
responseForm.mapAnswers.put(language, answer);
} else {
if (responseForm.mapAnswers.containsKey(language)) {
answer = responseForm.mapAnswers.get(language);
answer.setNew(false);
responseForm.mapAnswers.put(language, answer);
}
}
if (responseForm.mapAnswers.isEmpty()) {
responseForm.warning("UIResponseForm.msg.response-null");
return;
}
// set relateion of question:
Question question = responseForm.getQuestion();
question.setRelations(responseForm.listQuestIdRela.toArray(new String[responseForm.listQuestIdRela.size()]));
// link
UIAnswersPortlet portlet = responseForm.getAncestorOfType(UIAnswersPortlet.class);
UIQuestions uiQuestions = portlet.getChild(UIAnswersContainer.class).getChild(UIQuestions.class);
// Link Question to send mail
String link = FAQUtils.getLink(responseForm.getLink(), responseForm.getId(), "UIQuestions", "AddRelation", "ViewQuestion", "OBJECTID");
link = link.replaceFirst("OBJECTID", question.getPath()).replace("private", "public");
question.setLink(link);
// set answer to question for discuss forum function
if (responseForm.mapAnswers.containsKey(question.getLanguage())) {
question.setAnswers(new Answer[] { responseForm.mapAnswers.get(question.getLanguage()) });
}
try {
FAQUtils.getEmailSetting(responseForm.faqSetting_, false, false);
// save answers and question
Answer[] answers = responseForm.mapAnswers.values().toArray(new Answer[] {});
try {
// author: Vu Duy Tu. Make discuss forum
answers = responseForm.updateDiscussForum(answers);
} catch (Exception e) {
responseForm.log.error("Can not discuss question into forum, exception: ", e);
}
responseForm.getFAQService().saveAnswer(question.getPath(), answers);
responseForm.getFAQService().updateQuestionRelatives(question.getPath(), responseForm.listQuestIdRela.toArray(new String[responseForm.listQuestIdRela.size()]));
if (!responseForm.isModerator && !responseForm.isAnswerApproved)
responseForm.info("UIResponseForm.msg.pending-for-moderation");
} catch (PathNotFoundException e) {
responseForm.log.error("Can not save Question, this question is deleted, exception: " + e.getMessage());
responseForm.warning("UIQuestions.msg.question-id-deleted");
} catch (Exception e) {
responseForm.log.error("Can not save Question, exception: " + e.getMessage());
}
// cancel
if (!responseForm.isChildOfQuestionManager_) {
uiQuestions.updateCurrentQuestionList();
// uiQuestions.updateCurrentLanguage() ;
uiQuestions.updateLanguageMap();
uiQuestions.setLanguageView(responseForm.currentLanguage);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
event.getRequestContext().addUIComponentToUpdateByAjax(uiQuestions.getAncestorOfType(UIAnswersContainer.class));
} else {
UIQuestionManagerForm questionManagerForm = responseForm.getParent();
UIQuestionForm questionForm = questionManagerForm.getChild(UIQuestionForm.class);
if (questionManagerForm.isEditQuestion && responseForm.questionId_.equals(questionForm.getQuestionId())) {
questionForm.setIsChildOfManager(true);
questionForm.setQuestion(question);
questionForm.setIsMode(true);
}
questionManagerForm.isResponseQuestion = false;
UIPopupContainer popupContainer = questionManagerForm.getParent();
event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer);
}
}
}
static public class CancelActionListener extends EventListener<UIResponseForm> {
public void execute(Event<UIResponseForm> event) throws Exception {
UIResponseForm response = event.getSource();
UIAnswersPortlet portlet = response.getAncestorOfType(UIAnswersPortlet.class);
if (!response.isChildOfQuestionManager_) {
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
} else {
UIQuestionManagerForm questionManagerForm = portlet.findFirstComponentOfType(UIQuestionManagerForm.class);
questionManagerForm.isResponseQuestion = false;
UIPopupContainer popupContainer = questionManagerForm.getAncestorOfType(UIPopupContainer.class);
UIPopupAction popupAction = popupContainer.getChild(UIPopupAction.class);
if (popupAction != null) {
popupAction.deActivate();
}
event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer);
}
}
}
static public class AddRelationActionListener extends EventListener<UIResponseForm> {
public void execute(Event<UIResponseForm> event) throws Exception {
UIResponseForm response = event.getSource();
UIPopupContainer popupContainer = response.getAncestorOfType(UIPopupContainer.class);
UIAddRelationForm addRelationForm = response.openPopup(popupContainer, UIAddRelationForm.class, 500, 0);
addRelationForm.setQuestionId(response.questionId_);
addRelationForm.setRelationed(response.listQuestIdRela);
}
}
static public class RemoveRelationActionListener extends EventListener<UIResponseForm> {
public void execute(Event<UIResponseForm> event) throws Exception {
UIResponseForm questionForm = event.getSource();
String quesId = event.getRequestContext().getRequestParameter(OBJECTID);
for (int i = 0; i < questionForm.listQuestIdRela.size(); i++) {
if (questionForm.listQuestIdRela.get(i).equals(quesId)) {
questionForm.listRelationQuestion.remove(i);
break;
}
}
questionForm.listQuestIdRela.remove(quesId);
event.getRequestContext().addUIComponentToUpdateByAjax(questionForm);
}
}
static public class ChangeLanguageActionListener extends EventListener<UIResponseForm> {
public void execute(Event<UIResponseForm> event) throws Exception {
UIResponseForm responseForm = event.getSource();
String newLanguage = responseForm.questionLanguages_.getValue();
String responseContent = responseForm.inputResponseQuestion_.getValue();
String user = FAQUtils.getCurrentUser();
Answer answer;
if (ValidatorDataInput.fckContentIsNotEmpty(responseContent)) {
if (responseForm.mapAnswers.containsKey(responseForm.currentLanguage)) {
answer = responseForm.mapAnswers.get(responseForm.currentLanguage);
answer.setResponses(responseContent);
} else {
answer = new Answer();
answer.setNew(true);
answer.setActivateAnswers(true);
answer.setApprovedAnswers(responseForm.isAnswerApproved);
answer.setDateResponse(org.exoplatform.faq.service.Utils.getInstanceTempCalendar().getTime());
answer.setResponseBy(user);
answer.setResponses(responseContent);
answer.setLanguage(responseForm.currentLanguage);
}
responseForm.mapAnswers.put(responseForm.currentLanguage, answer);
} else {
if (responseForm.mapAnswers.containsKey(responseForm.currentLanguage)) {
answer = responseForm.mapAnswers.get(responseForm.currentLanguage);
answer.setNew(false);
responseForm.mapAnswers.put(responseForm.currentLanguage, answer);
}
}
// get Question by language
responseForm.currentLanguage = newLanguage;
if (newLanguage.equals(responseForm.question_.getLanguage())) {
responseForm.questionDetail = responseForm.question_.getDetail();
responseForm.questionContent = responseForm.question_.getQuestion();
} else {
responseForm.questionDetail = responseForm.languageMap.get(newLanguage).getDetail();
responseForm.questionContent = responseForm.languageMap.get(newLanguage).getQuestion();
}
// get answer by language
if (responseForm.mapAnswers.containsKey(newLanguage))
responseForm.inputResponseQuestion_.setValue(responseForm.mapAnswers.get(newLanguage).getResponses());
else
responseForm.inputResponseQuestion_.setValue("");
event.getRequestContext().addUIComponentToUpdateByAjax(responseForm);
}
}
}