/* * 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.social.core.application; import java.util.HashMap; import java.util.Map; import org.exoplatform.container.xml.InitParams; 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.manager.ActivityManager; import org.exoplatform.social.core.manager.IdentityManager; import org.exoplatform.social.core.relationship.RelationshipEvent; import org.exoplatform.social.core.relationship.RelationshipListenerPlugin; import org.exoplatform.social.core.relationship.model.Relationship; /** * Publish a status update in activity streams of 2 confirmed relations. * @author <a href="mailto:patrice.lamarque@exoplatform.com">Patrice Lamarque</a> * @version $Revision$ */ public class RelationshipPublisher extends RelationshipListenerPlugin { public static enum TitleId { CONNECTION_REQUESTED, CONNECTION_CONFIRMED } public static final String SENDER_PARAM = "SENDER"; public static final String RECEIVER_PARAM = "RECEIVER"; public static final String RELATIONSHIP_UUID_PARAM = "RELATIONSHIP_UUID"; public static final String RELATIONSHIP_ACTIVITY_TYPE = "exosocial:relationship"; private static final Log LOG = ExoLogger.getLogger(RelationshipPublisher.class); private ActivityManager activityManager; private IdentityManager identityManager; public RelationshipPublisher(InitParams params, ActivityManager activityManager, IdentityManager identityManager) { this.activityManager = activityManager; this.identityManager = identityManager; } /** * Publish an activity on both user's steam to indicate their new connection */ public void confirmed(RelationshipEvent event) { Relationship relationship = event.getPayload(); try { Map<String,String> params = this.getParams(relationship); ExoSocialActivity activity1 = new ExoSocialActivityImpl(relationship.getSender().getId(), RELATIONSHIP_ACTIVITY_TYPE, "I am now connected with @" + relationship.getReceiver().getRemoteId(), null); activity1.setTitleId(TitleId.CONNECTION_CONFIRMED.toString()); activity1.setTemplateParams(params); activityManager.saveActivity(relationship.getSender(), activity1); ExoSocialActivity activity2 = new ExoSocialActivityImpl(relationship.getReceiver().getId(), RELATIONSHIP_ACTIVITY_TYPE, "I am now connected with @" + relationship.getSender().getRemoteId(), null); activity2.setTitleId(TitleId.CONNECTION_CONFIRMED.toString()); activity2.setTemplateParams(params); activityManager.saveActivity(relationship.getReceiver(), activity2); } catch (Exception e) { LOG.warn("Failed to publish event " + event + ": " + e.getMessage()); } } private void reloadIfNeeded(Identity identity) throws Exception { if (identity.getId() == null || identity.getProfile().getFullName().length() == 0) { identity = identityManager.getIdentity(identity.getGlobalId().toString(), true); } } @Override public void ignored(RelationshipEvent event) { ;// void on purpose } @Override public void removed(RelationshipEvent event) { ;// void on purpose } public void denied(RelationshipEvent event) { ;// void on purpose } /** * Publish an activity on invited member to show the invitation to connect */ public void requested(RelationshipEvent event) { Relationship relationship = event.getPayload(); try { Map<String,String> params = this.getParams(relationship); ExoSocialActivity activity1 = new ExoSocialActivityImpl(relationship.getSender().getId(), RELATIONSHIP_ACTIVITY_TYPE, "@" + relationship.getSender().getRemoteId() + " has invited @" + relationship.getReceiver().getRemoteId() + " to connect", null); activity1.setTitleId(TitleId.CONNECTION_REQUESTED.toString()); activity1.setTemplateParams(params); activityManager.saveActivity(relationship.getSender(), activity1); //TODO hoatle a quick fix for activities gadget to allow deleting this activity ExoSocialActivity activity2 = new ExoSocialActivityImpl(relationship.getSender().getId(), RELATIONSHIP_ACTIVITY_TYPE, "@" + relationship.getSender().getRemoteId() + " has invited @" + relationship.getReceiver().getRemoteId() + " to connect", null); activity2.setTitleId(TitleId.CONNECTION_REQUESTED.toString()); activity2.setTemplateParams(params); activityManager.saveActivity(relationship.getReceiver(), activity2); } catch (Exception e) { LOG.warn("Failed to publish event " + event + ": " + e.getMessage()); } } /** * Gets params (sender, receiver, relationship uuid) from a provided relationship. * * @param relationship * @return * @since 1.2.0-GA */ private Map<String,String> getParams(Relationship relationship) throws Exception { Identity sender = relationship.getSender(); reloadIfNeeded(sender); Identity receiver = relationship.getReceiver(); reloadIfNeeded(receiver); String senderRemoteId = sender.getRemoteId(); String receiverRemoteId = receiver.getRemoteId(); Map<String,String> params = new HashMap<String,String>(); params.put(SENDER_PARAM, senderRemoteId); params.put(RECEIVER_PARAM, receiverRemoteId); params.put(RELATIONSHIP_UUID_PARAM, relationship.getId()); return params; } }