/***************************************************************************
* 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;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.portlet.PortletPreferences;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.faq.rendering.RenderHelper;
import org.exoplatform.faq.rendering.RenderingException;
import org.exoplatform.faq.service.Answer;
import org.exoplatform.faq.service.Category;
import org.exoplatform.faq.service.Comment;
import org.exoplatform.faq.service.FAQService;
import org.exoplatform.faq.service.FAQServiceUtils;
import org.exoplatform.faq.service.FAQSetting;
import org.exoplatform.faq.service.JCRPageList;
import org.exoplatform.faq.service.Question;
import org.exoplatform.faq.service.QuestionLanguage;
import org.exoplatform.faq.service.Utils;
import org.exoplatform.faq.webui.popup.UICategoryForm;
import org.exoplatform.faq.webui.popup.UICommentForm;
import org.exoplatform.faq.webui.popup.UIDeleteQuestion;
import org.exoplatform.faq.webui.popup.UIExportForm;
import org.exoplatform.faq.webui.popup.UIImportForm;
import org.exoplatform.faq.webui.popup.UIMoveQuestionForm;
import org.exoplatform.faq.webui.popup.UIPrintAllQuestions;
import org.exoplatform.faq.webui.popup.UIQuestionForm;
import org.exoplatform.faq.webui.popup.UIQuestionManagerForm;
import org.exoplatform.faq.webui.popup.UIResponseForm;
import org.exoplatform.faq.webui.popup.UISendMailForm;
import org.exoplatform.faq.webui.popup.UISettingForm;
import org.exoplatform.faq.webui.popup.UIViewUserProfile;
import org.exoplatform.forum.service.Forum;
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.UserHelper;
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.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.organization.User;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
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.UIContainer;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SARL
* Author : Hung Nguyen
* hung.nguyen@exoplatform.com
* Aus 01, 2007 2:48:18 PM
*/
@ComponentConfig(
template = "app:/templates/faq/webui/UIQuestions.gtmpl",
events = {
@EventConfig(listeners = UIQuestions.DownloadAttachActionListener.class),
@EventConfig(listeners = UIQuestions.DeleteCategoryActionListener.class, confirm = "UIQuestions.msg.confirm-delete-category"),
@EventConfig(listeners = UIQuestions.ChangeStatusAnswerActionListener.class) ,
@EventConfig(listeners = UIQuestions.AddCategoryActionListener.class),
@EventConfig(listeners = UIQuestions.AddNewQuestionActionListener.class) ,
@EventConfig(listeners = UIQuestions.SettingActionListener.class),
@EventConfig(listeners = UIQuestions.QuestionManagamentActionListener.class) ,
@EventConfig(listeners = UIQuestions.ViewQuestionActionListener.class),
@EventConfig(listeners = UIQuestions.OpenQuestionActionListener.class) ,
@EventConfig(listeners = UIQuestions.CloseQuestionActionListener.class),
@EventConfig(listeners = UIQuestions.ViewUserProfileActionListener.class) ,
@EventConfig(listeners = UIQuestions.ResponseQuestionActionListener.class),
@EventConfig(listeners = UIQuestions.EditAnswerActionListener.class) ,
@EventConfig(listeners = UIQuestions.EditQuestionActionListener.class),
@EventConfig(listeners = UIQuestions.DeleteQuestionActionListener.class) ,
@EventConfig(listeners = UIQuestions.MoveQuestionActionListener.class),
@EventConfig(listeners = UIQuestions.SendQuestionActionListener.class) ,
@EventConfig(listeners = UIQuestions.CommentQuestionActionListener.class),
@EventConfig(listeners = UIQuestions.DeleteCommentActionListener.class, confirm = "UIQuestions.msg.confirm-delete-comment"),
@EventConfig(listeners = UIQuestions.DeleteAnswerActionListener.class, confirm = "UIQuestions.msg.confirm-delete-answer"),
@EventConfig(listeners = UIQuestions.UnVoteQuestionActionListener.class, confirm = "UIQuestions.msg.confirm-unvote-question"),
@EventConfig(listeners = UIQuestions.CommentToAnswerActionListener.class) ,
@EventConfig(listeners = UIQuestions.VoteQuestionActionListener.class),
@EventConfig(listeners = UIQuestions.ChangeLanguageActionListener.class) ,
@EventConfig(listeners = UIQuestions.SortAnswerActionListener.class),
@EventConfig(listeners = UIQuestions.ExportActionListener.class) ,
@EventConfig(listeners = UIQuestions.ImportActionListener.class) ,
@EventConfig(listeners = UIQuestions.EditCategoryActionListener.class) ,
@EventConfig(listeners = UIQuestions.VoteAnswerActionListener.class),
@EventConfig(listeners = UIQuestions.PrintAllQuestionActionListener.class) ,
@EventConfig(listeners = UIQuestions.DiscussForumActionListener.class)
}
)
@SuppressWarnings("unused")
public class UIQuestions extends UIContainer {
private static Log log = ExoLogger.getLogger(UIQuestions.class);
private static String SEARCH_INPUT = "SearchInput";
private static String COMMENT_ITER = "CommentIter";
private static String ANSWER_ITER = "AnswerIter";
public static final String OBJECT_ITERATOR = "object_iter";
private FAQSetting faqSetting_ = null;
private Map<String, Question> questionMap_ = new LinkedHashMap<String, Question>();
public JCRPageList pageList;
private boolean canEditQuestion = false;
private Boolean isSortAnswerUp = null;
public String categoryId_ = null;
public String viewingQuestionId_ = "";
private String currentUser_ = "";
private String link_ = "";
private FAQService faqService_ = null;
private Map<String, QuestionLanguage> languageMap = new HashMap<String, QuestionLanguage>();
public boolean isChangeLanguage = false;
public List<String> listLanguage = new ArrayList<String>();
public String backPath_ = "";
private String language_ = FAQUtils.getDefaultLanguage();
private String discussId = "";
private String[] firstTollbar_ = new String[] { "AddNewQuestion", "QuestionManagament" };
private String[] menuCateManager = new String[] { "EditCategory", "AddCategory", "DeleteCategory", "Export", "Import", };
private String[] userActionsCate_ = new String[] { "AddNewQuestion", "Watch" };
private String[] moderatorActionQues_ = new String[] { "CommentQuestion", "ResponseQuestion", "EditQuestion", "DeleteQuestion", "MoveQuestion", "SendQuestion" };
private String[] moderatorActionQues2_ = new String[] { "ResponseQuestion", "EditQuestion", "DeleteQuestion", "MoveQuestion", "SendQuestion" };
private String[] userActionQues_ = new String[] { "CommentQuestion", "ResponseQuestion", "SendQuestion" };
private String[] userActionQues2_ = new String[] { "SendQuestion" };
private String[] userActionQues3_ = new String[] { "ResponseQuestion", "SendQuestion" };
private String[] sizes_ = new String[] { "bytes", "KB", "MB" };
private boolean isViewRootCate = true;
public boolean viewAuthorInfor = false;
private RenderHelper renderHelper = new RenderHelper();
public UIAnswersPageIterator pageIterator = null;
public long pageSelect = 0;
public UIQuestions() throws Exception {
backPath_ = null;
this.categoryId_ = null;
currentUser_ = FAQUtils.getCurrentUser();
addChild(UIAnswersPageIterator.class, null, OBJECT_ITERATOR);
if (faqService_ == null)
faqService_ = (FAQService) PortalContainer.getInstance().getComponentInstanceOfType(FAQService.class);
if (FAQUtils.isFieldEmpty(getId()))
setId("UIQuestions");
}
private boolean isNotInSpace() {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
return (portletPref.getValue("SPACE_URL", null) != null) ? false : true;
}
private boolean isCategoryHome() {
return (categoryId_ == null || categoryId_.equals(Utils.CATEGORY_HOME)) ? true : false;
}
public boolean isViewRootCate() {
return isViewRootCate;
}
public void setViewRootCate() {
try {
boolean b = (boolean) ((UIAnswersContainer) getParent()).isRenderCategory(categoryId_);
if (b != isViewRootCate) {
isViewRootCate = b;
}
setListObject();
} catch (Exception e) {
}
}
private boolean isAddQuestion() {
if (isViewRootCate && (currentUser_ != null || currentUser_ == null && faqSetting_.isEnableAnonymousSubmitQuestion())) {
if (isCategoryHome() && !faqSetting_.isPostQuestionInRootCategory()) {
return false;
}
return true;
}
return false;
}
public String getRSSLink() {
String catepath = categoryId_.substring(categoryId_.lastIndexOf("/") + 1);
return org.exoplatform.ks.common.Utils.getRSSLink("faq", getPortalName(), catepath);
}
public String getPortalName() {
PortalContainer pcontainer = PortalContainer.getInstance();
return pcontainer.getPortalContainerInfo().getContainerName();
}
public String getImageUrl(String imagePath) throws Exception {
String url = "";
try {
url = org.exoplatform.ks.common.Utils.getImageUrl(imagePath);
} catch (Exception e) {
log.debug("Failed to get url of image.", e);
}
return url;
}
private boolean isDiscussForum() throws Exception {
return faqSetting_.getIsDiscussForum();
}
public void setListObject() throws Exception {
try {
String objectId = null;
if (pageList != null)
objectId = pageList.getObjectId();
if (isViewRootCate) {
pageList = faqService_.getQuestionsByCatetory(this.categoryId_, this.faqSetting_);
pageList.setPageSize(10);
if (objectId != null && objectId.trim().length() > 0)
pageList.setObjectId(objectId);
pageIterator = this.getChildById(OBJECT_ITERATOR);
pageIterator.updatePageList(pageList);
} else {
pageList = null;
}
} catch (Exception e) {
log.debug("Failed to get list question in category.", e);
}
}
private Answer[] getPageListAnswer(String questionId) throws Exception {
if (isSortAnswerUp != null) {
Answer[] answers = languageMap.get(language_).getAnswers();
Answer temp;
for (int i = 0; i < answers.length - 1; i++) {
for (int j = i + 1; j < answers.length; j++) {
if (isSortAnswerUp) {
if (answers[j].getMarkVotes() < answers[i].getMarkVotes()) {
temp = answers[i];
answers[i] = answers[j];
answers[j] = temp;
}
} else {
if (answers[j].getMarkVotes() > answers[i].getMarkVotes()) {
temp = answers[i];
answers[i] = answers[j];
answers[j] = temp;
}
}
}
}
return answers;
}
return languageMap.get(language_).getAnswers();
}
private Comment[] getPageListComment(String questionId) throws Exception {
return languageMap.get(language_).getComments();
}
private String[] getActionTollbar() {
return firstTollbar_;
}
private String[] getMenuCateManager() {
return menuCateManager;
}
public FAQSetting getFAQSetting() {
return faqSetting_;
}
private String[] getActionCategoryWithUser() {
if (currentUser_ != null)
return userActionsCate_;
else if (faqSetting_.isEnableAutomaticRSS())
return new String[] { userActionsCate_[0], "RSSFAQ" };
else
return new String[] { userActionsCate_[0] };
}
private String[] getActionQuestion() {
return (canEditQuestion) ? ((faqSetting_.isEnanbleVotesAndComments()) ? moderatorActionQues_ : moderatorActionQues2_) : ((FAQUtils.isFieldEmpty(currentUser_)) ? userActionQues2_ : ((faqSetting_.isEnanbleVotesAndComments()) ? userActionQues_ : userActionQues3_));
}
public void updateCurrentQuestionList() throws Exception {
questionMap_.clear();
if (pageList != null) {
pageSelect = pageIterator.getPageSelected();
for (Question question : pageList.getPage(pageSelect, null)) {
questionMap_.put(question.getId(), question);
}
pageSelect = this.pageList.getCurrentPage();
pageIterator.setSelectPage(pageSelect);
}
}
public void setFAQSetting(FAQSetting setting) {
this.faqSetting_ = setting;
}
public void setFAQService(FAQService service) {
faqService_ = service;
}
public void setLanguageView(String language) {
this.language_ = language;
}
private String getQuestionContent() {
if (languageMap.containsKey(language_)) {
return languageMap.get(language_).getQuestion();
}
return "";
}
private Question getQuestionDetail() {
Question question = new Question();
if (languageMap.containsKey(language_)) {
question.setDetail(languageMap.get(language_).getDetail());
}
return question;
}
private void setIsModerators() throws Exception {
canEditQuestion = (faqSetting_.isAdmin() || faqService_.isCategoryModerator(categoryId_, currentUser_)) ? true : false;
}
public String getVoteScore(Question question) {
double vote = question.getMarkVote();
vote = vote < 0 ? 0 : vote;
DecimalFormat df = new DecimalFormat("0");
return df.format(vote);
}
// should be check canVote in Question object
private boolean canVote(Question question) {
if (question.getUsersVote() != null)
for (String user : question.getUsersVote()) {
if (user.contains(currentUser_ + "/"))
return false;
}
return true;
}
public void setDefaultLanguage() {
String language = FAQUtils.getDefaultLanguage();
if (languageMap.containsKey(language) || FAQUtils.isFieldEmpty(language_))
language_ = language;
}
private String convertSize(long size) {
String result = "";
long residual = 0;
int i = 0;
while (size >= 1000) {
i++;
residual = size % 1024;
size /= 1024;
}
if (residual > 500) {
result = (size + 1) + " " + sizes_[i];
} else {
result = size + " " + sizes_[i];
}
return result;
}
private Question[] getListQuestion() {
try {
updateCurrentQuestionList();
} catch (Exception e) {
log.debug("Failed to update current question list.", e);
}
return questionMap_.values().toArray(new Question[] {});
}
private boolean getCanEditQuestion() {
return this.canEditQuestion;
}
private String getQuestionView() {
return this.viewingQuestionId_;
}
private String[] getQuestionLangauges(String questionPath) {
return languageMap.keySet().toArray(new String[] {});
}
private String getAvatarUrl(String userId) throws Exception {
return FAQUtils.getUserAvatar(userId);
}
public String getCategoryId() {
return this.categoryId_;
}
public void setCategoryId(String categoryId) throws Exception {
viewAuthorInfor = faqService_.isViewAuthorInfo(categoryId);
this.categoryId_ = categoryId;
setViewRootCate();
setListObject();
}
public void viewQuestion(Question question) throws Exception {
if (!questionMap_.containsKey(question.getLanguage())) {
List<QuestionLanguage> languages = faqService_.getQuestionLanguages(question.getPath());
languageMap.clear();
for (QuestionLanguage lang : languages) {
languageMap.put(lang.getLanguage(), lang);
}
if (!questionMap_.containsKey(question.getId()))
questionMap_.put(question.getLanguage(), question);
viewingQuestionId_ = question.getPath();
}
}
// update current language of viewing question
public void updateCurrentLanguage() throws Exception {
if (viewingQuestionId_ != null && viewingQuestionId_.length() > 0) {
try {
languageMap.put(language_, faqService_.getQuestionLanguageByLanguage(viewingQuestionId_, language_));
} catch (Exception e) {
}
} else
languageMap.clear();
}
public void updateQuestionLanguageByLanguage(String questionPath, String language) throws Exception {
languageMap.put(language, faqService_.getQuestionLanguageByLanguage(questionPath, language));
}
public void updateLanguageMap() throws Exception {
try {
languageMap.clear();
if (viewingQuestionId_ != null && viewingQuestionId_.length() > 0) {
List<QuestionLanguage> languages = faqService_.getQuestionLanguages(viewingQuestionId_);
for (QuestionLanguage lang : languages) {
languageMap.put(lang.getLanguage(), lang);
}
}
} catch (Exception e) {
viewingQuestionId_ = "";
log.debug("Failed to update map language by viewing question", e);
}
}
private String getQuestionRelationById(String questionId) {
try {
List<String> ids = new ArrayList<String>();
ids.add(questionId);
ids = faqService_.getQuestionContents(ids);
if (ids != null && ids.size() > 0)
return ids.get(0);
} catch (Exception e) {
log.debug("Failed to get question relation by id: " + questionId, e);
}
return "";
}
private String getLink() {
return link_;
}
private String getBackPath() {
return this.backPath_;
}
private void setLink(String link) {
this.link_ = link;
}
public String render(Object obj) throws RenderingException {
if (obj instanceof Question)
return renderHelper.renderQuestion((Question) obj);
else if (obj instanceof Answer)
return renderHelper.renderAnswer((Answer) obj);
else if (obj instanceof Comment)
return renderHelper.renderComment((Comment) obj);
return "";
}
private String calculateTimeMessageOfLastActivity(long time) {
Calendar calendar = Utils.getInstanceTempCalendar();
long current = calendar.getTimeInMillis();
long interval = current - time;
if (interval < 60 * 60 * 1000) { // if interval is less than one hour.
String msg = FAQUtils.getResourceBundle(this.getId() + ".label.last-act-time-minute");
int mins = (int) interval / (60 * 1000);
msg = msg.replace("{0}", String.valueOf(mins));
return msg;
} else if (interval < 24 * 60 * 60 * 1000) {
String msg = FAQUtils.getResourceBundle(this.getId() + ".label.last-act-time-hour");
int hours = (int) interval / (60 * 60 * 1000);
msg = msg.replace("{0}", String.valueOf(hours));
return msg;
} else {
return FAQUtils.getLongDateFormat(new Date(time));
}
}
private boolean checkQuestionToView(Question question, UIApplication uiApplication, Event<UIQuestions> event) {
if (!question.isActivated() || (!question.isApproved() && faqSetting_.getDisplayMode().equals(FAQUtils.DISPLAYAPPROVED))) {
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.question-pending", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
event.getRequestContext().addUIComponentToUpdateByAjax(this.getAncestorOfType(UIAnswersContainer.class));
return true;
} else {
return false;
}
}
public void setLanguage(String language) {
this.language_ = language;
}
static public class DownloadAttachActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions question = event.getSource();
event.getRequestContext().addUIComponentToUpdateByAjax(question);
}
}
static public class AddCategoryActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions question = event.getSource();
UIAnswersPortlet uiPortlet = question.getAncestorOfType(UIAnswersPortlet.class);
String categoryId = question.getCategoryId();
UIPopupAction uiPopupAction = uiPortlet.getChild(UIPopupAction.class);
UIApplication uiApplication = question.getAncestorOfType(UIApplication.class);
UIPopupContainer uiPopupContainer = uiPopupAction.createUIComponent(UIPopupContainer.class, null, null);
UICategoryForm category = uiPopupContainer.addChild(UICategoryForm.class, null, null);
if (!FAQUtils.isFieldEmpty(categoryId)) {
try {
if (question.faqSetting_.isAdmin() || question.faqService_.isCategoryModerator(categoryId, FAQUtils.getCurrentUser())) {
uiPopupAction.activate(uiPopupContainer, 580, 500);
uiPopupContainer.setId("SubCategoryForm");
category.setParentId(categoryId);
category.updateAddNew(true);
} else {
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.admin-moderator-removed-action", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
event.getRequestContext().addUIComponentToUpdateByAjax(uiPortlet);
return;
}
} catch (Exception e) {
FAQUtils.findCateExist(question.faqService_, question.getAncestorOfType(UIAnswersContainer.class));
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.category-id-deleted", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
event.getRequestContext().addUIComponentToUpdateByAjax(uiPortlet);
return;
}
} else {
uiPopupAction.activate(uiPopupContainer, 540, 400);
uiPopupContainer.setId("AddCategoryForm");
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupAction);
}
}
static public class AddNewQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
if (!questions.faqService_.isExisting(questions.categoryId_)) {
UIApplication uiApplication = questions.getAncestorOfType(UIApplication.class);
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.category-id-deleted", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
UIAnswersContainer fAQContainer = questions.getAncestorOfType(UIAnswersContainer.class);
event.getRequestContext().addUIComponentToUpdateByAjax(fAQContainer);
return;
}
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UIQuestionForm questionForm = popupContainer.addChild(UIQuestionForm.class, null, null);
String email = "";
String name = "";
String userName = FAQUtils.getCurrentUser();
if (!FAQUtils.isFieldEmpty(userName)) {
name = userName;
email = FAQUtils.getEmailUser(userName);
}
questionForm.setFAQSetting(questions.faqSetting_);
questionForm.setAuthor(name);
questionForm.setEmail(email);
questionForm.setCategoryId(questions.categoryId_);
questionForm.refresh();
popupContainer.setId("AddQuestion");
popupAction.activate(popupContainer, 900, 420);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class SettingActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions question = event.getSource();
UIAnswersPortlet uiPortlet = question.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = uiPortlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UISettingForm uiSetting = popupContainer.addChild(UISettingForm.class, null, null);
uiSetting.setFaqSetting(question.faqSetting_);
uiSetting.init();
popupContainer.setId("CategorySettingForm");
popupAction.activate(popupContainer, 480, 0);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class QuestionManagamentActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UIQuestionManagerForm questionManagerForm = popupContainer.addChild(UIQuestionManagerForm.class, null, null);
popupContainer.setId("FAQQuestionManagerment");
popupAction.activate(popupContainer, 900, 850);
questionManagerForm.setFAQSetting(questions.faqSetting_);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class ExportActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String categoryId = event.getRequestContext().getRequestParameter(OBJECTID);
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
popupContainer.setId("FAQExportForm");
UIExportForm exportForm = popupContainer.addChild(UIExportForm.class, null, null);
popupAction.activate(popupContainer, 500, 200);
exportForm.setObjectId(categoryId);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class EditCategoryActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String categoryId = event.getRequestContext().getRequestParameter(OBJECTID);
UIAnswersPortlet uiPortlet = questions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = uiPortlet.getChild(UIPopupAction.class);
UIApplication uiApplication = questions.getAncestorOfType(UIApplication.class);
try {
if (questions.faqSetting_.isAdmin() || questions.canEditQuestion) {
Category category = questions.faqService_.getCategoryById(categoryId);
UIPopupContainer uiPopupContainer = popupAction.activate(UIPopupContainer.class, 540);
uiPopupContainer.setId("EditCategoryForm");
UICategoryForm uiCategoryForm = uiPopupContainer.addChild(UICategoryForm.class, null, null);
uiCategoryForm.updateAddNew(false);
uiCategoryForm.setCategoryValue(category, true);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
} else {
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.admin-moderator-removed-action", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
event.getRequestContext().addUIComponentToUpdateByAjax(uiPortlet);
}
} catch (Exception e) {
log.debug("Failed to edit category.", e);
FAQUtils.findCateExist(questions.faqService_, questions.getAncestorOfType(UIAnswersContainer.class));
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.category-id-deleted", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
event.getRequestContext().addUIComponentToUpdateByAjax(uiPortlet);
}
}
}
static public class VoteAnswerActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String objectId = event.getRequestContext().getRequestParameter(OBJECTID);
String answerPath = objectId.substring(0, objectId.lastIndexOf("/"));
String voteType = objectId.substring(objectId.lastIndexOf("/") + 1);
boolean isUp = true;
if (voteType.equals("down"))
isUp = false;
try {
questions.faqService_.voteAnswer(answerPath, FAQUtils.getCurrentUser(), isUp);
questions.updateCurrentLanguage();
event.getRequestContext().addUIComponentToUpdateByAjax(questions.getAncestorOfType(UIAnswersContainer.class));
} catch (Exception e) {
questions.showMessageDeletedQuestion(event.getRequestContext());
}
}
}
static public class ImportActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
String categoryId = questions.getCategoryId();
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
popupContainer.setId("FAQImportForm");
UIImportForm importForm = popupContainer.addChild(UIImportForm.class, null, null);
popupAction.activate(popupContainer, 500, 170);
importForm.setCategoryId(categoryId);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class SortAnswerActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
if (questions.isSortAnswerUp == null)
questions.isSortAnswerUp = false;
else
questions.isSortAnswerUp = !questions.isSortAnswerUp;
event.getRequestContext().addUIComponentToUpdateByAjax(questions.getAncestorOfType(UIAnswersContainer.class));
}
}
static public class ViewQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiQuestions = event.getSource();
UIAnswersPortlet answerPortlet = uiQuestions.getAncestorOfType(UIAnswersPortlet.class);
UIApplication uiApplication = uiQuestions.getAncestorOfType(UIApplication.class);
uiQuestions.isSortAnswerUp = null;
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
try {
boolean isRelation = false;
String answerNow = event.getRequestContext().getRequestParameter("answer-now");
if (questionId.indexOf("/language=") > 0) {
String[] array = questionId.split("/language=");
questionId = array[0];
if (array[1].indexOf("/relation") > 0) { // click on relation
isRelation = true;
if (!FAQUtils.isFieldEmpty(uiQuestions.viewingQuestionId_)) {
uiQuestions.backPath_ = uiQuestions.viewingQuestionId_ + "/language=" + uiQuestions.language_ + "/back";
}
} else { // Click on back
uiQuestions.viewingQuestionId_ = questionId;
if (array[1].indexOf("/back") > 0) {
isRelation = true;
array[1] = array[1].replaceFirst("/back", "");
}
uiQuestions.language_ = array[1];
uiQuestions.backPath_ = "";
}
}
Question question = uiQuestions.faqService_.getQuestionById(questionId);
if (questionId.indexOf("/") < 0) {
questionId = question.getPath();
uiQuestions.viewingQuestionId_ = questionId;
}
if (uiQuestions.checkQuestionToView(question, uiApplication, event))
return;
String categoryId = uiQuestions.faqService_.getCategoryPathOf(questionId);
FAQSetting faqSetting = uiQuestions.faqSetting_;
Boolean canViewQuestion = false;
if (question.isActivated() && (faqSetting.getDisplayMode().equals("both") || question.isApproved())) {
canViewQuestion = true;
}
if (canViewQuestion) {
uiQuestions.pageList.setObjectId(questionId);
uiQuestions.setCategoryId(categoryId);
UIBreadcumbs breadcumbs = answerPortlet.findFirstComponentOfType(UIBreadcumbs.class);
breadcumbs.setUpdataPath(categoryId);
UICategories categories = answerPortlet.findFirstComponentOfType(UICategories.class);
categories.setPathCategory(breadcumbs.getPaths());
event.getRequestContext().addUIComponentToUpdateByAjax(breadcumbs);
if ("true".equalsIgnoreCase(answerNow)) {
uiQuestions.processResponseQuestionAction(event, questionId);
}
} else {
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.question-pending", null, ApplicationMessage.INFO));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
event.getRequestContext().addUIComponentToUpdateByAjax(answerPortlet);
return;
}
uiQuestions.viewingQuestionId_ = questionId;
uiQuestions.updateCurrentQuestionList();
try {
uiQuestions.updateQuestionLanguageByLanguage(questionId, uiQuestions.language_);
} catch (Exception e) {
uiQuestions.language_ = question.getLanguage();
}
if (isRelation)
uiQuestions.updateLanguageMap();
event.getRequestContext().addUIComponentToUpdateByAjax(uiQuestions.getAncestorOfType(UIAnswersContainer.class));
} catch (Exception e) {
log.debug("Failed to view question by id: " + questionId, e);
uiQuestions.showMessageDeletedQuestion(event.getRequestContext());
}
}
}
static public class OpenQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiQuestions = event.getSource();
UIApplication uiApplication = uiQuestions.getAncestorOfType(UIApplication.class);
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
String id = questionId.substring(questionId.lastIndexOf("/") + 1);
Question question = uiQuestions.questionMap_.get(id);
if (uiQuestions.checkQuestionToView(question, uiApplication, event))
return;
uiQuestions.language_ = question.getLanguage();
uiQuestions.isSortAnswerUp = null;
uiQuestions.backPath_ = "";
uiQuestions.viewingQuestionId_ = questionId;
uiQuestions.updateLanguageMap();
event.getRequestContext().addUIComponentToUpdateByAjax(uiQuestions.getAncestorOfType(UIAnswersContainer.class));
}
}
static public class CloseQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiQuestions = event.getSource();
uiQuestions.isSortAnswerUp = null;
uiQuestions.language_ = FAQUtils.getDefaultLanguage();
uiQuestions.backPath_ = "";
uiQuestions.viewingQuestionId_ = "";
event.getRequestContext().addUIComponentToUpdateByAjax(uiQuestions.getAncestorOfType(UIAnswersContainer.class));
}
}
/**
* this function is pick up from <code>ResponseQuestionActionListener</code> for reuse in <code>ViewQuestionActionListener</code>
* @param event
* @param questionId
* @throws Exception
*/
private void processResponseQuestionAction(Event<UIQuestions> event, String questionId) throws Exception {
boolean isAnswerApproved = false;
try {
Question question = faqService_.getQuestionById(questionId);
isAnswerApproved = !faqService_.isModerateAnswer(questionId);
UIAnswersPortlet portlet = getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UIResponseForm responseForm = popupContainer.addChild(UIResponseForm.class, null, null);
responseForm.setModertator(canEditQuestion);
if (questionId.equals(viewingQuestionId_)) { // response for viewing question or not
responseForm.setQuestionId(question, language_, isAnswerApproved);
} else {
responseForm.setQuestionId(question, "", isAnswerApproved);
}
responseForm.setFAQSetting(faqSetting_);
popupContainer.setId("FAQResponseQuestion");
popupAction.activate(popupContainer, 900, 500);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
} catch (Exception e) {
updateCurrentQuestionList();
showMessageDeletedQuestion(event.getRequestContext());
}
}
static public class ResponseQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiForm = event.getSource();
Question question = null;
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
uiForm.processResponseQuestionAction(event, questionId);
}
}
static public class EditAnswerActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiQuestions = event.getSource();
Question question = null;
Answer answer = null;
String answerId = event.getRequestContext().getRequestParameter(OBJECTID);
try {
question = uiQuestions.faqService_.getQuestionById(uiQuestions.viewingQuestionId_);
answer = uiQuestions.faqService_.getAnswerById(uiQuestions.viewingQuestionId_, answerId, uiQuestions.language_);
} catch (javax.jcr.PathNotFoundException e) {
uiQuestions.showMessageDeletedQuestion(event.getRequestContext());
return;
} catch (Exception e) {
log.debug("Failed to edit answer by Id: " + answerId, e);
}
UIAnswersPortlet portlet = uiQuestions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UIResponseForm responseForm = popupContainer.addChild(UIResponseForm.class, null, null);
responseForm.setModertator(uiQuestions.canEditQuestion);
responseForm.setAnswerInfor(question, answer, uiQuestions.language_);
responseForm.setFAQSetting(uiQuestions.faqSetting_);
popupContainer.setId("FAQResponseQuestion");
popupAction.activate(popupContainer, 900, 500);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class ViewUserProfileActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions question = event.getSource();
String userId = event.getRequestContext().getRequestParameter(OBJECTID);
User user = UserHelper.getUserByUserId(userId);
if (user != null) {
UIAnswersPortlet portlet = question.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UIViewUserProfile viewUserProfile = popupContainer.addChild(UIViewUserProfile.class, null, null);
popupContainer.setId("ViewUserProfile");
viewUserProfile.setUser(user, question.faqService_);
popupAction.activate(popupContainer, 680, 350);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
} else {
UIApplication uiApplication = question.getAncestorOfType(UIApplication.class);
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.user-is-not-exist", new Object[] { userId }, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
return;
}
}
}
static public class EditQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
Question question = null;
try {
question = questions.faqService_.getQuestionById(questionId);
} catch (Exception e) {
questions.showMessageDeletedQuestion(event.getRequestContext());
return;
}
UIQuestionForm questionForm = popupContainer.addChild(UIQuestionForm.class, null, null);
questionForm.setFAQSetting(questions.faqSetting_);
questionForm.setQuestion(question);
popupContainer.setId("EditQuestion");
popupAction.activate(popupContainer, 900, 450);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
private boolean checkExistingQuestion(WebuiRequestContext context, String questionId) throws Exception {
if (!this.faqService_.isExisting(questionId)) {
showMessageDeletedQuestion(context);
return false;
}
return true;
}
private void showMessageDeletedQuestion(WebuiRequestContext context) throws Exception {
UIAnswersPortlet portlet = this.getAncestorOfType(UIAnswersPortlet.class);
portlet.addMessage(new ApplicationMessage("UIQuestions.msg.question-id-deleted", null, ApplicationMessage.WARNING));
context.addUIComponentToUpdateByAjax(portlet.getUIPopupMessages());
context.addUIComponentToUpdateByAjax(portlet);
}
static public class DeleteQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
if (questions.checkExistingQuestion(event.getRequestContext(), questionId)) {
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UIDeleteQuestion deleteQuestion = popupContainer.addChild(UIDeleteQuestion.class, null, null);
deleteQuestion.setQuestionId(questions.faqService_.getQuestionById(questionId));
popupContainer.setId("FAQDeleteQuestion");
popupAction.activate(popupContainer, 450, 250);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
}
static public class PrintAllQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
if (!questions.faqService_.isExisting(questions.categoryId_)) {
FAQUtils.findCateExist(questions.faqService_, questions.getAncestorOfType(UIAnswersContainer.class));
UIApplication uiApplication = questions.getAncestorOfType(UIApplication.class);
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.admin-moderator-removed-action", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
event.getRequestContext().addUIComponentToUpdateByAjax(portlet);
return;
}
UIPrintAllQuestions uiPrintAll = popupContainer.addChild(UIPrintAllQuestions.class, null, null);
uiPrintAll.setCategoryId(questions.categoryId_, questions.faqService_, questions.faqSetting_, questions.canEditQuestion);
popupContainer.setId("FAQPrintAllQuestion");
popupAction.activate(popupContainer, 800, 500);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class DeleteAnswerActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
if (questions.checkExistingQuestion(event.getRequestContext(), questions.viewingQuestionId_)) {
String answerId = event.getRequestContext().getRequestParameter(OBJECTID);
questions.faqService_.deleteAnswerQuestionLang(questions.viewingQuestionId_, answerId, questions.language_);
questions.updateCurrentLanguage();
event.getRequestContext().addUIComponentToUpdateByAjax(questions);
}
}
}
static public class DeleteCommentActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String commentId = event.getRequestContext().getRequestParameter(OBJECTID);
if (questions.checkExistingQuestion(event.getRequestContext(), questions.viewingQuestionId_)) {
questions.faqService_.deleteCommentQuestionLang(questions.viewingQuestionId_, commentId, questions.language_);
questions.updateCurrentLanguage();
event.getRequestContext().addUIComponentToUpdateByAjax(questions);
}
}
}
// approve comment become answer
static public class CommentToAnswerActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String commentId = event.getRequestContext().getRequestParameter(OBJECTID);
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
try {
Comment comment = questions.faqService_.getCommentById(questions.viewingQuestionId_, commentId, questions.language_);
if (comment != null) {
Answer answer = new Answer();
answer.setNew(true);
answer.setResponses(comment.getComments());
answer.setResponseBy(comment.getCommentBy());
answer.setFullName(comment.getFullName());
answer.setDateResponse(comment.getDateComment());
answer.setMarksVoteAnswer(0);
answer.setUsersVoteAnswer(null);
answer.setActivateAnswers(true);
answer.setApprovedAnswers(true);
questions.faqService_.saveAnswer(questions.viewingQuestionId_, answer, questions.language_);
questions.faqService_.deleteCommentQuestionLang(questions.viewingQuestionId_, commentId, questions.language_);
} else {
questions.showMessageDeletedQuestion(event.getRequestContext());
return;
}
} catch (Exception e) {
questions.showMessageDeletedQuestion(event.getRequestContext());
return;
}
questions.setLanguageView(questions.language_);
questions.updateCurrentLanguage();
event.getRequestContext().addUIComponentToUpdateByAjax(questions);
}
}
static public class CommentQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String objIds = event.getRequestContext().getRequestParameter(OBJECTID);
try {
String questionId = objIds.substring(0, objIds.lastIndexOf("/"));
String commentId = objIds.substring(objIds.lastIndexOf("/") + 1);
if (commentId.indexOf("Question") >= 0) {
questionId = objIds;
commentId = "new";
}
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
if (questions.checkExistingQuestion(event.getRequestContext(), questionId)) {
Question question = questions.faqService_.getQuestionById(questionId);
if (question != null) {
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UICommentForm commentForm = popupContainer.addChild(UICommentForm.class, null, null);
commentForm.setInfor(question, commentId, questions.faqSetting_, questions.language_);
popupContainer.setId("FAQCommentForm");
popupAction.activate(popupContainer, 850, 500);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
} else {
questions.showMessageDeletedQuestion(event.getRequestContext());
return;
}
}
} catch (Exception e) {
log.debug("Failed to comment in question questionId: " + objIds);
}
}
}
static public class VoteQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
String objectId = event.getRequestContext().getRequestParameter(OBJECTID);
if (questions.checkExistingQuestion(event.getRequestContext(), questions.viewingQuestionId_)) {
String userName = FAQUtils.getCurrentUser();
int number = Integer.parseInt(objectId);
questions.faqService_.voteQuestion(questions.viewingQuestionId_, userName, number);
Question question = questions.faqService_.getQuestionById(questions.viewingQuestionId_);
if (question != null) {
if (questions.questionMap_.containsKey(question.getId())) {
questions.questionMap_.put(question.getId(), question);
} else if (questions.questionMap_.containsKey(question.getLanguage())) {
questions.questionMap_.put(question.getLanguage(), question);
}
}
event.getRequestContext().addUIComponentToUpdateByAjax(questions.getAncestorOfType(UIAnswersContainer.class));
}
}
}
static public class UnVoteQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
if (questions.checkExistingQuestion(event.getRequestContext(), questionId)) {
String userName = FAQUtils.getCurrentUser();
questions.faqService_.unVoteQuestion(questionId, userName);
Question question = questions.faqService_.getQuestionById(questionId);
if (question != null) {
if (questions.questionMap_.containsKey(question.getId())) {
questions.questionMap_.put(question.getId(), question);
} else if (questions.questionMap_.containsKey(question.getLanguage())) {
questions.questionMap_.put(question.getLanguage(), question);
}
}
event.getRequestContext().addUIComponentToUpdateByAjax(questions.getAncestorOfType(UIAnswersContainer.class));
}
}
}
static public class MoveQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions questions = event.getSource();
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
if (questions.checkExistingQuestion(event.getRequestContext(), questionId)) {
UIAnswersPortlet portlet = questions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer popupContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UIMoveQuestionForm moveQuestionForm = popupContainer.addChild(UIMoveQuestionForm.class, null, null);
moveQuestionForm.setQuestionId(questionId);
popupContainer.setId("FAQMoveQuestion");
moveQuestionForm.setFAQSetting(questions.faqSetting_);
popupAction.activate(popupContainer, 600, 400);
moveQuestionForm.updateSubCategory();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
}
static public class SendQuestionActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiQuestions = event.getSource();
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
boolean isSendLink = true;
if (questionId.indexOf("/true") > 0) {
questionId = questionId.replace("/true", "");
isSendLink = false;
}
if (uiQuestions.checkExistingQuestion(event.getRequestContext(), questionId)) {
UIAnswersPortlet portlet = uiQuestions.getAncestorOfType(UIAnswersPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
UIPopupContainer watchContainer = popupAction.createUIComponent(UIPopupContainer.class, null, null);
UISendMailForm sendMailForm = watchContainer.addChild(UISendMailForm.class, null, null);
// Create link by Vu Duy Tu.
String link = "";
if (isSendLink) {
link = uiQuestions.getLink();
link = FAQUtils.getLink(link, uiQuestions.getId(), uiQuestions.getId(), "Setting", "ViewQuestion", questionId).replaceFirst("private", "public");
}
sendMailForm.setLink(link);
if (!questionId.equals(uiQuestions.viewingQuestionId_) || FAQUtils.isFieldEmpty(uiQuestions.language_))
sendMailForm.setUpdateQuestion(questionId, "");
else
sendMailForm.setUpdateQuestion(questionId, uiQuestions.language_);
watchContainer.setId("FAQSendMailForm");
popupAction.activate(watchContainer, 700, 0);
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
}
// switch language
static public class ChangeLanguageActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiQuestions = event.getSource();
uiQuestions.language_ = event.getRequestContext().getRequestParameter(OBJECTID);
event.getRequestContext().addUIComponentToUpdateByAjax(uiQuestions);
}
}
// approve/activate
static public class ChangeStatusAnswerActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiQuestions = event.getSource();
String[] param = event.getRequestContext().getRequestParameter(OBJECTID).split("/");
String questionId = uiQuestions.viewingQuestionId_;
String language = uiQuestions.language_;
String answerId = param[0];
String action = param[1];
try {
if (language == null || language.equals(""))
language = FAQUtils.getDefaultLanguage();
QuestionLanguage questionLanguage = uiQuestions.languageMap.get(language);
for (Answer answer : questionLanguage.getAnswers()) {
if (answer.getId().equals(answerId)) {
if (action.equals("Activate"))
answer.setActivateAnswers(!answer.getActivateAnswers());
else
answer.setApprovedAnswers(!answer.getApprovedAnswers());
uiQuestions.faqService_.saveAnswer(questionId, answer, language);
break;
}
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiQuestions.getAncestorOfType(UIAnswersContainer.class));
} catch (Exception e) {
uiQuestions.showMessageDeletedQuestion(event.getRequestContext());
return;
}
}
}
static public class DiscussForumActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiForm = event.getSource();
String questionId = event.getRequestContext().getRequestParameter(OBJECTID);
UIAnswersPortlet portlet = uiForm.getAncestorOfType(UIAnswersPortlet.class);
FAQUtils.getPorletPreference(uiForm.faqSetting_);
String forumId = uiForm.faqSetting_.getIdNameCategoryForum();
forumId = forumId.substring(0, forumId.indexOf(";"));
ForumService forumService = (ForumService) PortalContainer.getInstance().getComponentInstanceOfType(ForumService.class);
String categoryId;
try {
Forum forum = (Forum) forumService.getObjectNameById(forumId, org.exoplatform.forum.service.Utils.FORUM);
String[] paths = forum.getPath().split("/");
categoryId = paths[paths.length - 2];
Topic topic = new Topic();
String topicId = topic.getId();
uiForm.discussId = topicId;
String link = FAQUtils.getLinkDiscuss(topicId);
link = link.replaceFirst("private", "public");
Question question = uiForm.faqService_.getQuestionById(questionId);
String userName = question.getAuthor();
String remoteAddr = WebUIUtils.getRemoteIP();
if (UserHelper.getUserByUserId(userName) == null) {
String temp = userName;
String listMode[] = uiForm.faqService_.getModeratorsOf(question.getPath());
if (listMode != null && listMode.length > 0) {
List<String> modes = FAQServiceUtils.getUserPermission(listMode);
if (modes.size() > 0) {
userName = modes.get(0);
} else {
List<String> listAdmin = uiForm.faqService_.getAllFAQAdmin();
userName = listAdmin.get(0);
}
} else {
List<String> listAdmin = uiForm.faqService_.getAllFAQAdmin();
userName = listAdmin.get(0);
}
if (userName.equals(temp)) {
userName = "user";
}
}
topic.setOwner(userName);
topic.setTopicName(question.getQuestion());
topic.setDescription(question.getDetail());
topic.setIcon("IconsView");
topic.setIsModeratePost(true);
topic.setLink(link);
topic.setRemoteAddr(remoteAddr);
topic.setIsApproved(!forum.getIsModerateTopic());
topic.setCanView(new String[] { "" });
forumService.saveTopic(categoryId, forumId, topic, true, false, new MessageBuilder());
uiForm.faqService_.saveTopicIdDiscussQuestion(questionId, topicId);
Post post = new Post();
Answer[] answers = question.getAnswers();
if (answers != null && answers.length > 0) {
for (int i = 0; i < answers.length; ++i) {
post = new Post();
post.setIcon("IconsView");
post.setName("Re: " + question.getQuestion());
post.setMessage(answers[i].getResponses());
post.setOwner(answers[i].getResponseBy());
post.setLink(link);
post.setIsApproved(false);
post.setRemoteAddr(remoteAddr);
forumService.savePost(categoryId, forumId, topicId, post, true, new MessageBuilder());
answers[i].setPostId(post.getId());
answers[i].setNew(true);
if (answers[i].getLanguage() == null)
answers[i].setLanguage(question.getLanguage());
}
uiForm.faqService_.saveAnswer(questionId, answers);
}
Comment[] comments = question.getComments();
for (int i = 0; i < comments.length; ++i) {
post = new Post();
post.setIcon("IconsView");
post.setName("Re: " + question.getQuestion());
post.setMessage(comments[i].getComments());
post.setOwner(comments[i].getCommentBy());
post.setLink(link);
post.setIsApproved(false);
post.setRemoteAddr(remoteAddr);
forumService.savePost(categoryId, forumId, topicId, post, true, new MessageBuilder());
comments[i].setPostId(post.getId());
uiForm.faqService_.saveComment(questionId, comments[i], false);
}
uiForm.updateCurrentQuestionList();
} catch (Exception e) {
uiForm.discussId = "";
UIApplication uiApplication = uiForm.getAncestorOfType(UIApplication.class);
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.Discuss-forum-fall", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
}
event.getRequestContext().addUIComponentToUpdateByAjax(portlet);
}
}
static public class DeleteCategoryActionListener extends EventListener<UIQuestions> {
public void execute(Event<UIQuestions> event) throws Exception {
UIQuestions uiQuestions = event.getSource();
String categoryId = uiQuestions.getCategoryId(); // event.getRequestContext().getRequestParameter(OBJECTID);
UIAnswersPortlet uiPortlet = uiQuestions.getAncestorOfType(UIAnswersPortlet.class);
UIApplication uiApplication = uiQuestions.getAncestorOfType(UIApplication.class);
UICategories categories = uiPortlet.findFirstComponentOfType(UICategories.class);
try {
Category cate = uiQuestions.faqService_.getCategoryById(categoryId);
if (uiQuestions.faqSetting_.isAdmin() || cate.getModeratorsCategory().contains(FAQUtils.getCurrentUser())) {
uiQuestions.faqService_.removeCategory(categoryId);
uiQuestions.updateCurrentQuestionList();
if (categoryId.indexOf("/") > 0)
categoryId = categoryId.substring(0, categoryId.lastIndexOf("/"));
else
categoryId = Utils.CATEGORY_HOME;
UIBreadcumbs breadcumbs = uiPortlet.findFirstComponentOfType(UIBreadcumbs.class);
breadcumbs.setUpdataPath(categoryId);
categories.setPathCategory(categoryId);
uiQuestions.setCategoryId(categoryId);
} else {
uiApplication.addMessage(new ApplicationMessage("UIQuestions.msg.admin-moderator-removed-action", null, ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiApplication.getUIPopupMessages());
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiPortlet);
} catch (Exception e) {
FAQUtils.findCateExist(uiQuestions.faqService_, uiQuestions.getAncestorOfType(UIAnswersContainer.class));
uiQuestions.showMessageDeletedQuestion(event.getRequestContext());
}
}
}
}