package org.exoplatform.ks.ext.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.faq.service.Comment;
import org.exoplatform.faq.service.FAQService;
import org.exoplatform.faq.service.Question;
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.webui.WebUIUtils;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.User;
import org.exoplatform.social.core.activity.model.ExoSocialActivity;
import org.exoplatform.social.core.activity.model.ExoSocialActivityImpl;
import org.exoplatform.social.core.identity.model.Identity;
import org.exoplatform.social.core.identity.provider.OrganizationIdentityProvider;
import org.exoplatform.social.core.manager.IdentityManager;
import org.exoplatform.social.webui.activity.BaseUIActivity;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
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.core.lifecycle.WebuiBindingContext;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormTextAreaInput;
@ComponentConfig (
lifecycle = UIFormLifecycle.class,
template = "classpath:groovy/ks/social-integration/plugin/space/AnswerUIActivity.gtmpl",
events = {
@EventConfig(listeners = BaseUIActivity.ToggleDisplayLikesActionListener.class),
@EventConfig(listeners = BaseUIActivity.ToggleDisplayCommentFormActionListener.class),
@EventConfig(listeners = BaseUIActivity.LikeActivityActionListener.class),
@EventConfig(listeners = BaseUIActivity.SetCommentListStatusActionListener.class),
@EventConfig(listeners = BaseUIActivity.PostCommentActionListener.class),
@EventConfig(listeners = BaseUIActivity.DeleteActivityActionListener.class, confirm = "UIActivity.msg.Are_You_Sure_To_Delete_This_Activity"),
@EventConfig(listeners = BaseUIActivity.DeleteCommentActionListener.class, confirm = "UIActivity.msg.Are_You_Sure_To_Delete_This_Comment"),
@EventConfig(listeners = AnswerUIActivity.CommentQuestionActionListener.class)
}
)
public class AnswerUIActivity extends BaseKSActivity {
public AnswerUIActivity() {
}
private List<ExoSocialActivity> questionComments_;
private ExoSocialActivity toActivity(Comment comment) {
ExoSocialActivity activity = null;
if (comment != null) {
activity = new ExoSocialActivityImpl();
IdentityManager identityM = (IdentityManager) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(IdentityManager.class);
Identity userIdentity = identityM.getOrCreateIdentity(OrganizationIdentityProvider.NAME, comment.getCommentBy(), false);
activity.setUserId(userIdentity.getId());
activity.setTitle(comment.getComments());
activity.setPostedTime(comment.getDateComment().getTime());
activity.setId(comment.getId());
}
return activity;
}
/*
* (non-Javadoc)
* @see org.exoplatform.social.webui.activity.BaseUIActivity#getComments()
*/
@Override
public List<ExoSocialActivity> getComments() {
if (isQuestionActivity()) {
if (questionComments_ == null)
questionComments_ = new ArrayList<ExoSocialActivity>();
if (questionComments_.isEmpty()) {
FAQService faqService = (FAQService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(FAQService.class);
try {
Comment[] comments = faqService.getComments(getActivityParamValue(AnswersSpaceActivityPublisher.QUESTION_ID_KEY));
for (Comment comment : comments) {
ExoSocialActivity act = toActivity(comment);
if (act != null)
questionComments_.add(act);
}
} catch (Exception e) {
if (log.isWarnEnabled()) {
log.warn(String.format("Failed to get comments of question: %s",getActivityParamValue(AnswersSpaceActivityPublisher.QUESTION_ID_KEY)), e);
}
}
}
return questionComments_;
} else {
return super.getComments();
}
}
@SuppressWarnings("unused")
private String getTitle(WebuiBindingContext _ctx) throws Exception {
String title = "";
if (getActivityParamValue(AnswersSpaceActivityPublisher.ACTIVITY_TYPE_KEY).equalsIgnoreCase(AnswersSpaceActivityPublisher.QUESTION_ADD)) {
title = _ctx.appRes("AnswerUIActivity.label.question-add");
} else if (getActivityParamValue(AnswersSpaceActivityPublisher.ACTIVITY_TYPE_KEY).equalsIgnoreCase(AnswersSpaceActivityPublisher.QUESTION_UPDATE)) {
title = _ctx.appRes("AnswerUIActivity.label.question-update");
} else if (getActivityParamValue(AnswersSpaceActivityPublisher.ACTIVITY_TYPE_KEY).equalsIgnoreCase(AnswersSpaceActivityPublisher.ANSWER_ADD)) {
title = _ctx.appRes("AnswerUIActivity.label.answer-add");
} else if (getActivityParamValue(AnswersSpaceActivityPublisher.ACTIVITY_TYPE_KEY).equalsIgnoreCase(AnswersSpaceActivityPublisher.ANSWER_UPDATE)) {
title = _ctx.appRes("AnswerUIActivity.label.answer-update");
}
title = StringUtils.replaceOnce(title, "{0}", getUriOfAuthor());
title = StringUtils.replaceOnce(title, "{1}", new StringBuffer().append("<a href=").append(getActivityParamValue(AnswersSpaceActivityPublisher.LINK_KEY))
.append(">").append(getActivityParamValue(AnswersSpaceActivityPublisher.QUESTION_NAME_KEY)).append("</a>").toString());
return title;
}
public boolean isQuestionActivity() {
String value = getActivityParamValue(AnswersSpaceActivityPublisher.ACTIVITY_TYPE_KEY);
if (value.indexOf(AnswersSpaceActivityPublisher.QUESTION) >= 0) {
return true;
}
return false;
}
static public String getFullName(String userName) throws Exception {
try {
OrganizationService organizationService = (OrganizationService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(OrganizationService.class);
User user = organizationService.getUserHandler().findUserByName(userName);
String fullName = user.getFullName();
if (fullName == null || fullName.trim().length() <= 0)
fullName = userName;
return fullName;
} catch (Exception e) {
return userName;
}
}
public static String getLinkDiscuss(String topicId) throws Exception {
PortalRequestContext portalContext = Util.getPortalRequestContext();
String link = portalContext.getRequest().getRequestURL().toString();
String selectedNode = Util.getUIPortal().getSelectedUserNode().getURI();
String portalName = "/" + Util.getUIPortal().getName();
if (link.indexOf(portalName) > 0) {
if (link.indexOf(portalName + "/" + selectedNode) < 0) {
link = link.replaceFirst(portalName, portalName + "/" + selectedNode);
}
}
link = link.substring(0, link.indexOf(selectedNode) + selectedNode.length());
link = link.replaceAll(selectedNode, "forum") + "/" + org.exoplatform.forum.service.Utils.TOPIC + "/" + topicId;
return link;
}
public static class CommentQuestionActionListener extends EventListener<AnswerUIActivity> {
@Override
public void execute(Event<AnswerUIActivity> event) throws Exception {
AnswerUIActivity uiActivity = event.getSource();
// uiActivity.refresh();
WebuiRequestContext context = event.getRequestContext();
UIApplication application = (UIApplication) uiActivity.getAncestorOfType(UIApplication.class);
UIFormTextAreaInput uiFormComment = uiActivity.getChild(UIFormTextAreaInput.class);
String message = uiFormComment.getValue();
if (message == null || message.trim().length() == 0) {
application.addMessage(new ApplicationMessage("AnswerUIActivity.msg.content-empty", null, ApplicationMessage.WARNING));
context.addUIComponentToUpdateByAjax(application.getUIPopupMessages());
return;
}
FAQService faqService = (FAQService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(FAQService.class);
Question question = faqService.getQuestionById(uiActivity.getActivityParamValue(AnswersSpaceActivityPublisher.QUESTION_ID_KEY));
Comment comment = new Comment();
comment.setNew(true);
comment.setCommentBy(context.getRemoteUser());
comment.setComments(message);
comment.setFullName(getFullName(context.getRemoteUser()));
comment.setDateComment(new Date());
// add new corresponding post to forum.
String topicId = question.getTopicIdDiscuss();
if (topicId != null && topicId.length() > 0) {
ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().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 = getLinkDiscuss(topicId);
String postId = comment.getPostId();
if (postId == null || postId.length() == 0) {
Post post = new Post();
post.setOwner(context.getRemoteUser());
post.setIcon("ViewIcon");
post.setName("Re: " + question.getQuestion());
post.setMessage(comment.getComments());
post.setLink(linkForum);
post.setIsApproved(!topic.getIsModeratePost());
post.setRemoteAddr(remoteAddr);
forumService.savePost(ids[t - 3], ids[t - 2], topicId, post, true, new MessageBuilder());
comment.setPostId(post.getId());
} else {
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(context.getRemoteUser());
post.setIcon("ViewIcon");
post.setName("Re: " + question.getQuestion());
comment.setPostId(post.getId());
post.setLink(linkForum);
post.setRemoteAddr(remoteAddr);
} else {
post.setModifiedBy(context.getRemoteUser());
}
post.setIsApproved(!topic.getIsModeratePost());
post.setMessage(comment.getComments());
forumService.savePost(ids[t - 3], ids[t - 2], topicId, post, isNew, new MessageBuilder());
}
}
} // end adding post to forum.
faqService.saveComment(question.getPath(), comment, uiActivity.getActivityParamValue(AnswersSpaceActivityPublisher.LANGUAGE_KEY));
// cache question's comment
ExoSocialActivity act = uiActivity.toActivity(comment);
if (act != null)
uiActivity.questionComments_.add(act);
uiFormComment.reset();
uiActivity.setCommentFormFocused(true);
context.addUIComponentToUpdateByAjax(uiActivity);
uiActivity.getParent().broadcast(event, event.getExecutionPhase());
}
}
}