/***************************************************************************
* 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.forum.webui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.forum.ForumTransformHTML;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.service.Category;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.service.ForumService;
import org.exoplatform.forum.service.ForumServiceUtils;
import org.exoplatform.forum.service.Tag;
import org.exoplatform.forum.service.Topic;
import org.exoplatform.forum.service.UserProfile;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.ks.bbcode.core.ExtendedBBCodeProvider;
import org.exoplatform.ks.common.webui.BaseEventListener;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormCheckBoxInput;
/**
* Created by The eXo Platform SARL
* Author : Hung Nguyen
* hung.nguyen@exoplatform.com
* Aus 01, 2007 2:48:18 PM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/forum/webui/UITopicsTag.gtmpl",
events = {
@EventConfig(listeners = UITopicsTag.OpenTopicActionListener.class),
@EventConfig(listeners = UITopicsTag.RemoveTopicActionListener.class),
@EventConfig(listeners = UITopicsTag.AddWatchingActionListener.class),
@EventConfig(listeners = UITopicsTag.UnWatchActionListener.class),
@EventConfig(listeners = UITopicsTag.AddBookMarkActionListener.class),
@EventConfig(listeners = UITopicsTag.RSSActionListener.class),
@EventConfig(listeners = UITopicsTag.SetOrderByActionListener.class),
@EventConfig(listeners = UIForumKeepStickPageIterator.GoPageActionListener.class)
}
)
public class UITopicsTag extends UIForumKeepStickPageIterator {
private String tagId = ForumUtils.EMPTY_STR;
private Tag tag;
private boolean isUpdateTag = true;
private String strOrderBy = ForumUtils.EMPTY_STR;
private String userIdAndtagId;
private String linkUserInfo = ForumUtils.EMPTY_STR;
private List<Topic> topics = new ArrayList<Topic>();
private Map<String, Long> mapNumberPagePost = new HashMap<String, Long>();
public UITopicsTag() throws Exception {
}
public void setIdTag(String tagId) throws Exception {
this.tagId = tagId;
this.isUpdateTag = true;
this.mapNumberPagePost.clear();
UIForumPortlet forumPortlet = this.getAncestorOfType(UIForumPortlet.class);
this.userProfile = forumPortlet.getUserProfile();
linkUserInfo = forumPortlet.getPortletLink();
if (!userProfile.getUserId().equals(UserProfile.USER_GUEST)) {
this.userIdAndtagId = userProfile.getUserId() + ":" + tagId;
} else
this.userIdAndtagId = tagId;
}
@SuppressWarnings("unused")
private String getActionViewInfoUser(String linkType, String userName) {
String link = linkUserInfo.replace("ViewPublicUserInfo", linkType).replace("userName", userName);
return link;
}
public void setTag(Tag tag, String userIdAndtagId) throws Exception {
this.tag = tag;
this.tagId = tag.getId();
this.isUpdateTag = false;
this.mapNumberPagePost.clear();
this.userIdAndtagId = userIdAndtagId;
UIForumPortlet forumPortlet = this.getAncestorOfType(UIForumPortlet.class);
this.userProfile = forumPortlet.getUserProfile();
linkUserInfo = forumPortlet.getPortletLink();
}
public String getRSSLink(String cateId) {
PortalContainer pcontainer = PortalContainer.getInstance();
return org.exoplatform.ks.common.Utils.getRSSLink("forum", pcontainer.getPortalContainerInfo().getContainerName(), cateId);
}
@SuppressWarnings("unused")
private String getTitleInHTMLCode(String s) {
return ForumTransformHTML.getTitleInHTMLCode(s, new ArrayList<String>((new ExtendedBBCodeProvider()).getSupportedBBCodes()));
}
@SuppressWarnings("unused")
private long getSizePost(String Id) throws Exception {
if (mapNumberPagePost.containsKey(Id))
return mapNumberPagePost.get(Id);
String Ids[] = Id.split(ForumUtils.SLASH);
Topic topic = getTopic(Ids[(Ids.length - 1)]);
long maxPost = getUserProfile().getMaxPostInPage();
if (maxPost <= 0)
maxPost = 10;
if (topic != null && topic.getPostCount() > maxPost) {
String isApprove = ForumUtils.EMPTY_STR;
String isHidden = ForumUtils.EMPTY_STR;
String userLogin = this.userProfile.getUserId();
long role = this.userProfile.getUserRole();
if (role >= 2) {
isHidden = "false";
}
Forum forum = this.getForumService().getForum(Ids[(Ids.length - 3)], Ids[(Ids.length - 2)]);
if (role == 1) {
if (!ForumServiceUtils.hasPermission(forum.getModerators(), userLogin)) {
isHidden = "false";
}
}
if (forum.getIsModeratePost() || topic.getIsModeratePost()) {
if (isHidden.equals("false") && !(topic.getOwner().equals(userLogin)))
isApprove = "true";
}
long availablePost = this.getForumService().getAvailablePost(Ids[(Ids.length - 3)], Ids[(Ids.length - 2)], Ids[(Ids.length - 1)], isApprove, isHidden, userLogin);
long value = availablePost / maxPost;
if (value * maxPost < availablePost)
value = value + 1;
mapNumberPagePost.put(Id, value);
return value;
} else {
mapNumberPagePost.put(Id, (long) 1);
return 1;
}
}
@SuppressWarnings( { "unchecked", "unused" })
private List<Topic> getTopicsTag() throws Exception {
this.pageList = getForumService().getTopicByMyTag(userIdAndtagId, strOrderBy);
int maxTopic = this.userProfile.getMaxTopicInPage().intValue();
if (maxTopic <= 0)
maxTopic = 10;
this.pageList.setPageSize(maxTopic);
this.maxPage = this.pageList.getAvailablePage();
topics = pageList.getPage(pageSelect);
pageSelect = pageList.getCurrentPage();
if (topics == null)
topics = new ArrayList<Topic>();
for (Topic topic : topics) {
if (getUIFormCheckBoxInput(topic.getId()) != null) {
getUIFormCheckBoxInput(topic.getId()).setChecked(false);
} else {
addUIFormInput(new UIFormCheckBoxInput(topic.getId(), topic.getId(), false));
}
}
if(topics.size() > 0) {
setListWatches();
}
return topics;
}
private Tag getTagById() throws Exception {
if (this.isUpdateTag) {
try {
this.tag = getForumService().getTag(this.tagId);
} catch (Exception e) {
throw e;
}
this.isUpdateTag = false;
}
return this.tag;
}
@SuppressWarnings("unused")
private String[] getStarNumber(Topic topic) throws Exception {
double voteRating = topic.getVoteRating();
return ForumUtils.getStarNumber(voteRating);
}
private Topic getTopic(String topicId) throws Exception {
for (Topic topic : topics) {
if (topic.getId().equals(topicId))
return topic;
}
return (Topic) getForumService().getObjectNameById(topicId, Utils.TOPIC);
}
private Forum getForum(String categoryId, String forumId) throws Exception {
return this.getForumService().getForum(categoryId, forumId);
}
static public class OpenTopicActionListener extends BaseEventListener<UITopicsTag> {
public void onEvent(Event<UITopicsTag> event, UITopicsTag uiTopicsTag, final String idAndNumber) throws Exception {
String[] id = idAndNumber.split(ForumUtils.COMMA);
Topic topic = uiTopicsTag.getTopic(id[0]);
String[] ids = topic.getPath().split(ForumUtils.SLASH);
String cateId = ForumUtils.EMPTY_STR, forumId = ForumUtils.EMPTY_STR;
for (int i = 0; i < ids.length; i++) {
if (ids[i].indexOf(Utils.CATEGORY) >= 0)
cateId = ids[i];
if (ids[i].indexOf(Utils.FORUM) >= 0)
forumId = ids[i];
}
Category category = ((ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class)).getCategory(cateId);
String[] privateUsers = category.getUserPrivate();
if (privateUsers.length > 0 && privateUsers[0].trim().length() > 0 && !ForumServiceUtils.hasPermission(privateUsers, uiTopicsTag.userProfile.getUserId())) {
warning("UIForumPortlet.msg.do-not-permission");
return;
}
topic = uiTopicsTag.getForumService().getTopicUpdate(topic, false);
Forum forum = uiTopicsTag.getForum(cateId, forumId);
UIForumPortlet forumPortlet = uiTopicsTag.getAncestorOfType(UIForumPortlet.class);
forumPortlet.updateIsRendered(ForumUtils.FORUM);
UIForumContainer uiForumContainer = forumPortlet.getChild(UIForumContainer.class);
UITopicDetailContainer uiTopicDetailContainer = uiForumContainer.getChild(UITopicDetailContainer.class);
uiForumContainer.setIsRenderChild(false);
uiForumContainer.getChild(UIForumDescription.class).setForum(forum);
UITopicDetail uiTopicDetail = uiTopicDetailContainer.getChild(UITopicDetail.class);
uiTopicDetail.setUpdateForum(forum);
uiTopicDetail.initInfoTopic(cateId, forumId, topic, Integer.parseInt(id[1]));
uiTopicDetailContainer.getChild(UITopicPoll.class).updateFormPoll(cateId, forumId, topic.getId());
if (id[2].equals("true")) {
uiTopicDetail.setIdPostView("lastpost");
} else {
uiTopicDetail.setIdPostView("top");
}
forumPortlet.getChild(UIForumLinks.class).setValueOption(cateId + ForumUtils.SLASH + forumId + " ");
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
}
}
static public class OpenTopicsTagActionListener extends BaseEventListener<UITopicsTag> {
public void onEvent(Event<UITopicsTag> event, UITopicsTag topicsTag, final String tagId) throws Exception {
UIForumPortlet forumPortlet = topicsTag.getParent();
forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath(tagId);
topicsTag.setIdTag(tagId);
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
}
}
static public class RemoveTopicActionListener extends BaseEventListener<UITopicsTag> {
public void onEvent(Event<UITopicsTag> event, UITopicsTag topicsTag, final String objectId) throws Exception {
UIForumPortlet forumPortlet = topicsTag.getParent();
boolean hasCheck = false;
String topicPath = ForumUtils.EMPTY_STR;
try {
String userId = topicsTag.getUserProfile().getUserId();
for (String topicId : (List<String>) topicsTag.getIdSelected()) {
topicPath = topicsTag.getTopic(topicId).getPath();
try {
topicsTag.getForumService().unTag(topicsTag.tagId, userId, topicPath);
} catch (Exception e) {
}
hasCheck = true;
}
} catch (Exception e) {
}
if (!hasCheck) {
warning("UITopicContainer.sms.notCheckMove");
} else {
topicsTag.isUpdateTag = true;
Tag tag = topicsTag.getTagById();
if (tag == null || tag.getUserTag() == null || tag.getUserTag().length == 0) {
forumPortlet.rederForumHome();
}
topicsTag.isUpdateTag = false;
}
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
}
}
static public class AddBookMarkActionListener extends BaseEventListener<UITopicsTag> {
public void onEvent(Event<UITopicsTag> event, UITopicsTag topicTag, final String topicId) throws Exception {
;
if (!ForumUtils.isEmpty(topicId)) {
Topic topic = topicTag.getTopic(topicId);
String path = topic.getPath();
path = path.substring(path.indexOf(Utils.CATEGORY));
StringBuffer buffer = new StringBuffer();
buffer.append("ThreadNoNewPost//").append(topic.getTopicName()).append("//").append(path);
String userName = topicTag.userProfile.getUserId();
topicTag.getForumService().saveUserBookmark(userName, buffer.toString(), true);
UIForumPortlet forumPortlet = topicTag.getAncestorOfType(UIForumPortlet.class);
forumPortlet.updateUserProfileInfo();
}
}
}
static public class RSSActionListener extends BaseEventListener<UITopicsTag> {
public void onEvent(Event<UITopicsTag> event, UITopicsTag uiForm, final String forumId) throws Exception {
if (!uiForm.getUserProfile().getUserId().equals(UserProfile.USER_GUEST)) {
uiForm.getForumService().addWatch(-1, forumId, null, uiForm.getUserProfile().getUserId());
}
}
}
static public class AddWatchingActionListener extends BaseEventListener<UITopicsTag> {
public void onEvent(Event<UITopicsTag> event, UITopicsTag topicTag, final String topicId) throws Exception {
if (!ForumUtils.isEmpty(topicId)) {
try {
Topic topic = topicTag.getTopic(topicId);
String path = topic.getPath();
path = path.substring(path.indexOf(Utils.CATEGORY));
List<String> values = new ArrayList<String>();
values.add(topicTag.userProfile.getEmail());
topicTag.getForumService().addWatch(1, path, values, topicTag.userProfile.getUserId());
topicTag.setListWatches();
info("UIAddWatchingForm.msg.successfully");
} catch (Exception e) {
warning("UIAddWatchingForm.msg.fall");
}
event.getRequestContext().addUIComponentToUpdateByAjax(topicTag);
}
}
}
static public class UnWatchActionListener extends BaseEventListener<UITopicsTag> {
public void onEvent(Event<UITopicsTag> event, UITopicsTag topicTag, final String path) throws Exception {
try {
topicTag.getForumService().removeWatch(1, path, topicTag.userProfile.getUserId() + ForumUtils.SLASH + topicTag.getEmailWatching(path));
info("UIAddWatchingForm.msg.UnWatchSuccessfully");
} catch (Exception e) {
warning("UIAddWatchingForm.msg.UnWatchfall");
}
event.getRequestContext().addUIComponentToUpdateByAjax(topicTag);
}
}
static public class SetOrderByActionListener extends EventListener<UITopicsTag> {
public void execute(Event<UITopicsTag> event) throws Exception {
UITopicsTag uiContainer = event.getSource();
String path = event.getRequestContext().getRequestParameter(OBJECTID);
uiContainer.strOrderBy = ForumUtils.getOrderBy(uiContainer.strOrderBy, path);
event.getRequestContext().addUIComponentToUpdateByAjax(uiContainer);
}
}
}