/* * Copyright (C) 2003-2010 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.ks.ext.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.exoplatform.container.ExoContainer; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.forum.service.Category; import org.exoplatform.forum.service.Forum; import org.exoplatform.forum.service.ForumEventListener; import org.exoplatform.forum.service.ForumService; import org.exoplatform.forum.service.Post; import org.exoplatform.forum.service.Topic; import org.exoplatform.forum.service.Utils; import org.exoplatform.ks.bbcode.core.ExtendedBBCodeProvider; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; 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.identity.provider.SpaceIdentityProvider; import org.exoplatform.social.core.manager.ActivityManager; import org.exoplatform.social.core.manager.IdentityManager; import org.exoplatform.social.core.space.model.Space; import org.exoplatform.social.core.space.spi.SpaceService; /** * @author <a href="mailto:patrice.lamarque@exoplatform.com">Patrice Lamarque</a> * @version $Revision$ */ public class ForumSpaceActivityPublisher extends ForumEventListener { public static final String FORUM_APP_ID = "ks-forum:spaces"; public static final String FORUM_ID_KEY = "ForumId"; public static final String CATE_ID_KEY = "CateId"; public static final String ACTIVITY_TYPE_KEY = "ActivityType"; public static final String POST_ID_KEY = "PostId"; public static final String POST_OWNER_KEY = "PostOwner"; public static final String POST_LINK_KEY = "PostLink"; public static final String POST_NAME_KEY = "PostName"; public static final String TOPIC_ID_KEY = "TopicId"; public static final String TOPIC_OWNER_KEY = "TopicOwner"; public static final String TOPIC_LINK_KEY = "TopicLink"; public static final String TOPIC_NAME_KEY = "TopicName"; private static final int TYPE_PRIVATE = 2; private static Log LOG = ExoLogger.getExoLogger(ForumSpaceActivityPublisher.class); @Override public void saveCategory(Category category) { } @Override public void saveForum(Forum forum) { } public static enum ACTIVITYTYPE { AddPost, AddTopic, UpdatePost, UpdateTopic } private void saveActivity(String categoryId, String forumId, ACTIVITYTYPE type, Topic topic, Post post) throws Exception { ExoContainer exoContainer = ExoContainerContext.getCurrentContainer(); IdentityManager identityM = (IdentityManager) exoContainer.getComponentInstanceOfType(IdentityManager.class); ActivityManager activityM = (ActivityManager) exoContainer.getComponentInstanceOfType(ActivityManager.class); SpaceService spaceS = (SpaceService) exoContainer.getComponentInstanceOfType(SpaceService.class); Identity userIdentity = identityM.getOrCreateIdentity(OrganizationIdentityProvider.NAME, post.getOwner(), false); String spaceId = forumId.split(Utils.FORUM_SPACE_ID_PREFIX)[1]; Space space = spaceS.getSpaceById(spaceId); Identity spaceIdentity = identityM.getOrCreateIdentity(SpaceIdentityProvider.NAME, space.getPrettyName(), false); ExoSocialActivity activity = new ExoSocialActivityImpl(); String body = ForumTransformHTML.getTitleInHTMLCode(post.getMessage(), new ArrayList<String>((new ExtendedBBCodeProvider()).getSupportedBBCodes())); activity.setUserId(userIdentity.getId()); activity.setTitle(post.getOwner()); activity.setBody(body); activity.setType(FORUM_APP_ID); Map<String, String> templateParams = new HashMap<String, String>(); templateParams.put(FORUM_ID_KEY, forumId); templateParams.put(CATE_ID_KEY, categoryId); templateParams.put(TOPIC_ID_KEY, topic.getId()); templateParams.put(ACTIVITY_TYPE_KEY, type.toString()); activity.setTemplateParams(createActivity(templateParams, topic, post, type)); activityM.saveActivityNoReturn(spaceIdentity, activity); } private Map<String, String> createActivity(Map<String, String> templateParams, Topic topic, Post post, ACTIVITYTYPE type) throws Exception { if (type.toString().indexOf("Post") > 0) { templateParams.put(POST_ID_KEY, post.getId()); templateParams.put(POST_LINK_KEY, post.getLink()); templateParams.put(POST_NAME_KEY, post.getName()); templateParams.put(POST_OWNER_KEY, post.getOwner()); } else { templateParams.put(TOPIC_LINK_KEY, topic.getLink()); templateParams.put(TOPIC_NAME_KEY, topic.getTopicName()); templateParams.put(TOPIC_OWNER_KEY, topic.getOwner()); } return templateParams; } private Post convertTopicToPost(Topic topic) { Post post = new Post(); post.setOwner(topic.getOwner()); post.setMessage(topic.getDescription()); return post; } private Topic getTopicIfPublic (Post post, Topic topic, String categoryId, String forumId, String topicId) { if(topic == null && post == null) return null ; try { if(topic == null) { ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); topic = forumService.getTopic(categoryId, forumId, topicId, ""); } if (topic == null || !topic.getIsActive() || !topic.getIsApproved() || topic.getIsWaiting() || topic.getIsClosed() || !Utils.isEmpty(topic.getCanView())) { // check permission of topic // if the topic is not active or waiting or closed or restricts users, return null return null; } if (post != null && (post.getUserPrivate().length == TYPE_PRIVATE || post.getIsHidden() || !post.getIsActiveByTopic() || !post.getIsApproved())) { // check permission of the post // if the post is private or hidden by censored words or not active by topic or waiting for approving, return null. return null; } return topic; } catch (Exception e) { LOG.debug("Failed to check public", e); } return null; } private boolean hasSocial() throws Exception { try { Class.forName("org.exoplatform.social.core.manager.IdentityManager"); return true; } catch (ClassNotFoundException e) { LOG.debug("Please check the integrated project does the social deploy? " + e.getMessage()); return false; } } private boolean hasSpace(String forumId) throws Exception { if(hasSocial()) { if (!Utils.isEmpty(forumId) && forumId.indexOf(Utils.FORUM_SPACE_ID_PREFIX) >= 0) { return true; } } return false; } private void saveActivityForPost(Post post, String categoryId, String forumId, String topicId, ACTIVITYTYPE type) { try { if(hasSpace(forumId)) { Topic topic = getTopicIfPublic(post, null, categoryId, forumId, topicId); if (topic != null) { saveActivity(categoryId, forumId, type, topic, post); } } } catch (Exception e) { LOG.error("Can not record Activity for space when post ", e); } } private void saveActivityForTopic(Topic topic, String categoryId, String forumId, ACTIVITYTYPE type) { try { if(hasSpace(forumId)) { topic = getTopicIfPublic(null, topic, categoryId, forumId, topic.getId()); if(topic != null) { saveActivity(categoryId, forumId, type, topic, convertTopicToPost(topic)); } } } catch (Exception e) { LOG.error("Can not record Activity for space when add topic " + e.getMessage()); } } @Override public void addPost(Post post, String categoryId, String forumId, String topicId) { saveActivityForPost(post, categoryId, forumId, topicId, ACTIVITYTYPE.AddPost) ; } @Override public void addTopic(Topic topic, String categoryId, String forumId) { saveActivityForTopic(topic, categoryId, forumId, ACTIVITYTYPE.AddTopic); } @Override public void updatePost(Post post, String categoryId, String forumId, String topicId) { saveActivityForPost(post, categoryId, forumId, topicId, ACTIVITYTYPE.UpdatePost); } @Override public void updateTopic(Topic topic, String categoryId, String forumId) { saveActivityForTopic(topic, categoryId, forumId, ACTIVITYTYPE.UpdateTopic); } }