/*************************************************************************** * 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.forum.webui.popup; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.exoplatform.forum.ForumSessionUtils; import org.exoplatform.forum.ForumUtils; import org.exoplatform.forum.TimeConvertUtils; import org.exoplatform.forum.common.CommonUtils; import org.exoplatform.forum.common.TransformHTML; import org.exoplatform.forum.common.webui.UIPopupAction; import org.exoplatform.forum.common.webui.UIPopupContainer; import org.exoplatform.forum.common.webui.WebUIUtils; import org.exoplatform.forum.rendering.RenderHelper; import org.exoplatform.forum.rendering.RenderingException; import org.exoplatform.forum.service.ForumAttachment; import org.exoplatform.forum.service.JCRPageList; import org.exoplatform.forum.service.Post; import org.exoplatform.forum.service.Topic; import org.exoplatform.forum.service.UserProfile; import org.exoplatform.forum.service.Utils; import org.exoplatform.forum.webui.BaseForumForm; import org.exoplatform.forum.webui.UIForumPageIterator; import org.exoplatform.forum.webui.UIForumPortlet; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; 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.UIPopupComponent; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIForm; @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/templates/forum/webui/popup/UIViewTopic.gtmpl", events = { @EventConfig(listeners = UIViewTopic.ApproveActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIViewTopic.DeleteTopicActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIViewTopic.CloseActionListener.class, phase = Phase.DECODE) } ) public class UIViewTopic extends BaseForumForm implements UIPopupComponent { public static final String SIGNATURE = "SignatureTypeID"; private Topic topic; protected JCRPageList pageList; private int pageSelect; private Map<String, UserProfile> mapUserProfile = new HashMap<String, UserProfile>(); RenderHelper renderHelper = new RenderHelper(); private static Log log = ExoLogger.getLogger(UIViewTopic.class); public UIViewTopic() throws Exception { addChild(UIForumPageIterator.class, null, "ViewTopicPageIterator"); } public void activate() { } public void deActivate() { } public Topic getTopic() { return topic; } public void setTopic(Topic topic) { this.topic = topic; } public void setActionForm(String[] actions) { this.setActions(actions); } public String renderPost(Post post) throws RenderingException { if (SIGNATURE.equals(post.getId())) { post.setMessage(TransformHTML.enCodeViewSignature(post.getMessage())); } return renderHelper.renderPost(post); } protected void initPage() throws Exception { this.userProfile = this.getAncestorOfType(UIForumPortlet.class).getUserProfile(); String userLogin = this.userProfile.getUserId(); Topic topic = this.topic; String id[] = topic.getPath().split(ForumUtils.SLASH); int l = id.length; pageList = getForumService().getPosts(id[l - 3], id[l - 2], topic.getId(), ForumUtils.EMPTY_STR, ForumUtils.EMPTY_STR, ForumUtils.EMPTY_STR, userLogin); long maxPost = this.userProfile.getMaxPostInPage(); if (maxPost <= 0) maxPost = 10; pageList.setPageSize((int) maxPost); UIForumPageIterator forumPageIterator = this.getChild(UIForumPageIterator.class); forumPageIterator.initPage(pageList.getPageSize(), pageList.getCurrentPage(), pageList.getAvailable(), pageList.getAvailablePage()); } private void updateUserProfiles(List<Post> posts) throws Exception { List<String> userNames = new ArrayList<String>(); for (Post post : posts) { if (!userNames.contains(post.getOwner())) { userNames.add(post.getOwner()); } } if (userNames.size() > 0) { try { List<UserProfile> profiles = getForumService().getQuickProfiles(userNames); for (UserProfile profile : profiles) { mapUserProfile.put(profile.getUserId(), profile); } } catch (Exception e) { log.warn("Failed load user info: " + e.getMessage(), e); } } } @SuppressWarnings("unchecked") protected List<Post> getPostPageList() throws Exception { if (this.pageList == null) return null; UIForumPageIterator forumPageIterator = this.getChild(UIForumPageIterator.class); this.pageSelect = forumPageIterator.getPageSelected(); int availablePage = this.pageList.getAvailablePage(); if (this.pageSelect > availablePage) { this.pageSelect = availablePage; forumPageIterator.setSelectPage(availablePage); } List<Post> posts = pageList.getPage(pageSelect); if (posts == null) posts = new ArrayList<Post>(); updateUserProfiles(posts); return posts; } protected boolean getIsRenderIter() { long availablePage = this.pageList.getAvailablePage(); if (availablePage > 1) return true; return false; } protected UserProfile getUserInfo(String userName) throws Exception { UserProfile profile = mapUserProfile.get(userName); if (profile == null) { profile = new UserProfile(); profile.setUserId(userName); profile.setUserTitle("User"); profile.setUserRole((long) 2); } return profile; } public String getImageUrl(String imagePath) throws Exception { String url = ForumUtils.EMPTY_STR; try { url = CommonUtils.getImageUrl(imagePath); } catch (Exception e) { log.warn(imagePath + " must exist: " + e.getCause()); } return url; } protected String getLastEditedBy(String userId, Date modifiedDate) throws Exception { UserProfile userEditByInfo = getUserInfo(userId); String editByScreeName = userEditByInfo.getScreenName(); editByScreeName = "<span class=\"textTitleProfile\">" + editByScreeName + "</span>"; // if (TimeConvertUtils.getGreenwichMeanTime().getTimeInMillis() - modifiedDate.getTime() > 60000) { String longDateFormat = getUserProfile().getLongDateFormat() + ", " + userProfile.getTimeFormat(); long setTime = (long) (userProfile.getTimeZone() * 3600000); String editDate = TimeConvertUtils.convertXTimeAgo(modifiedDate, longDateFormat, setTime); String editByLabel = WebUIUtils.getLabel(null, "UITopicDetail.label.LastEditedOnDate"); return editByLabel.replace("{0}", editByScreeName).replace("{1}", editDate); } // String editByLabel = WebUIUtils.getLabel(null, "UITopicDetail.label.LastEditedJustNow"); return editByLabel.replace("{0}", editByScreeName); } protected String getFileSource(ForumAttachment attachment) throws Exception { return ForumUtils.getFileSource(attachment); } protected String getAvatarUrl(String userId) throws Exception { return ForumSessionUtils.getUserAvatarURL(userId, getForumService()); } protected boolean isOnline(String userId) throws Exception { return this.getForumService().isOnline(userId); } static public class ApproveActionListener extends EventListener<UIViewTopic> { public void execute(Event<UIViewTopic> event) throws Exception { UIViewTopic uiForm = event.getSource(); Topic topic = uiForm.topic; topic.setIsApproved(true); topic.setIsWaiting(false); topic.setLink(ForumUtils.createdForumLink(ForumUtils.TOPIC, topic.getId(), false)); List<Topic> topics = new ArrayList<Topic>(); topics.add(topic); try { uiForm.getForumService().modifyTopic(topics, Utils.APPROVE); uiForm.getForumService().modifyTopic(topics, Utils.WAITING); } catch (Exception e) { log.debug("\nModify topic fail: ", e); } closePopup(event.getRequestContext(), uiForm); } } public static void closePopup(WebuiRequestContext context, UIForm uiForm) throws Exception { UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class); if (popupContainer != null) { UIPopupAction popupAction = popupContainer.getChild(UIPopupAction.class); popupAction.deActivate(); context.addUIComponentToUpdateByAjax(popupAction); UIModerationForum moderationForum = popupContainer.getChild(UIModerationForum.class); if (moderationForum != null) { moderationForum.setReloadPortlet(true); context.addUIComponentToUpdateByAjax(moderationForum); } } else { UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class); forumPortlet.cancelAction(); } } static public class DeleteTopicActionListener extends EventListener<UIViewTopic> { public void execute(Event<UIViewTopic> event) throws Exception { UIViewTopic uiForm = event.getSource(); Topic topic = uiForm.topic; try { String[] path = topic.getPath().split(ForumUtils.SLASH); int l = path.length; uiForm.getForumService().removeTopic(path[l - 3], path[l - 2], topic.getId()); } catch (Exception e) { log.debug("Removing " + topic.getId() + " topic fail: " + e.getCause()); } closePopup(event.getRequestContext(), uiForm); } } static public class CloseActionListener extends EventListener<UIViewTopic> { public void execute(Event<UIViewTopic> event) throws Exception { UIViewTopic uiForm = event.getSource(); UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class); if (popupContainer != null) { UIPopupAction popupAction = popupContainer.getChild(UIPopupAction.class); popupAction.deActivate(); event.getRequestContext().addUIComponentToUpdateByAjax(popupAction); } else { UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class); forumPortlet.cancelAction(); } } } }