1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.exoplatform.social.core.application;
18
19 import java.util.HashMap;
20 import java.util.Map;
21
22 import org.exoplatform.container.PortalContainer;
23 import org.exoplatform.container.xml.InitParams;
24 import org.exoplatform.services.log.ExoLogger;
25 import org.exoplatform.services.log.Log;
26 import org.exoplatform.social.common.xmlprocessor.XMLProcessor;
27 import org.exoplatform.social.core.BaseActivityProcessorPlugin;
28 import org.exoplatform.social.core.activity.model.ExoSocialActivity;
29 import org.exoplatform.social.core.activity.model.ExoSocialActivityImpl;
30 import org.exoplatform.social.core.identity.model.Identity;
31 import org.exoplatform.social.core.identity.model.Profile;
32 import org.exoplatform.social.core.identity.provider.OrganizationIdentityProvider;
33 import org.exoplatform.social.core.manager.ActivityManager;
34 import org.exoplatform.social.core.manager.IdentityManager;
35 import org.exoplatform.social.core.manager.RelationshipManager;
36 import org.exoplatform.social.core.processor.I18NActivityUtils;
37 import org.exoplatform.social.core.relationship.RelationshipEvent;
38 import org.exoplatform.social.core.relationship.RelationshipListenerPlugin;
39 import org.exoplatform.social.core.relationship.model.Relationship;
40 import org.exoplatform.social.core.space.SpaceUtils;
41 import org.exoplatform.social.core.storage.api.IdentityStorage;
42
43
44
45
46
47
48 public class RelationshipPublisher extends RelationshipListenerPlugin {
49
50 public static enum TitleId {
51 CONNECTION_REQUESTED,
52 CONNECTION_CONFIRMED
53 }
54
55 public static final String USER_RELATION_CONFIRMED = "user_relation_confirmed";
56
57 public static final String SENDER_PARAM = "SENDER";
58 public static final String RECEIVER_PARAM = "RECEIVER";
59 public static final String RELATIONSHIP_UUID_PARAM = "RELATIONSHIP_UUID";
60 public static final String RELATIONSHIP_ACTIVITY_TYPE = "exosocial:relationship";
61 public static final String NUMBER_OF_CONNECTIONS = "NUMBER_OF_CONNECTIONS";
62 public static final String USER_ACTIVITIES_FOR_RELATIONSHIP = "USER_ACTIVITIES_FOR_RELATIONSHIP";
63 public static final String USER_COMMENTS_ACTIVITY_FOR_RELATIONSHIP = "USER_COMMENTS_ACTIVITY_FOR_RELATIONSHIP";
64 public static final String USER_DISPLAY_NAME_PARAM = "USER_DISPLAY_NAME_PARAM";
65
66 private static final Log LOG = ExoLogger.getLogger(RelationshipPublisher.class);
67 private ActivityManager activityManager;
68
69 private IdentityManager identityManager;
70
71 public RelationshipPublisher(InitParams params, ActivityManager activityManager, IdentityManager identityManager) {
72 this.activityManager = activityManager;
73 this.identityManager = identityManager;
74 }
75
76 private ExoSocialActivity createNewActivity(Identity identity, int nbOfConnections) {
77 ExoSocialActivity activity = new ExoSocialActivityImpl();
78 activity.setType(USER_ACTIVITIES_FOR_RELATIONSHIP);
79 updateActivity(activity, nbOfConnections);
80 return activity;
81 }
82
83 private ExoSocialActivity createNewComment(Identity userIdenity, String fullName) {
84 ExoSocialActivityImpl comment = new ExoSocialActivityImpl();
85 comment.setType(USER_COMMENTS_ACTIVITY_FOR_RELATIONSHIP);
86 String message = String.format("I'm now connected with %s", fullName);
87 comment.setTitle(message);
88 comment.setUserId(userIdenity.getId());
89
90 I18NActivityUtils.addResourceKeyToProcess(comment, USER_RELATION_CONFIRMED);
91 I18NActivityUtils.addResourceKey(comment, USER_RELATION_CONFIRMED, fullName);
92 return comment;
93 }
94
95 private void updateActivity(ExoSocialActivity activity, int numberOfConnections) {
96 String title = String.format("I'm now connected with %s user(s)", numberOfConnections);
97 String titleId = "user_relations";
98 Map<String,String> params = new HashMap<String,String>();
99 activity.setTitle(title);
100 activity.setTitleId(null);
101 activity.setTemplateParams(params);
102 I18NActivityUtils.addResourceKey(activity, titleId, "" + numberOfConnections);
103 }
104
105
106
107
108 public void confirmed(RelationshipEvent event) {
109 Relationship relationship = event.getPayload();
110 try {
111 Identity sender = identityManager.getOrCreateIdentity(OrganizationIdentityProvider.NAME, relationship.getSender().getRemoteId(), true);
112 Identity receiver = identityManager.getOrCreateIdentity(OrganizationIdentityProvider.NAME, relationship.getReceiver().getRemoteId(), true);
113
114 String activityIdSender = getIdentityStorage().getProfileActivityId(sender.getProfile(), Profile.AttachedActivityType.RELATIONSHIP);
115 int nbOfSenderConnections = getRelationShipManager().getConnections(sender).getSize();
116 String activityIdReceiver = getIdentityStorage().getProfileActivityId(receiver.getProfile(), Profile.AttachedActivityType.RELATIONSHIP);
117 int nbOfReceiverConnections = getRelationShipManager().getConnections(receiver).getSize();
118
119 String fullNameReceiver = receiver.getProfile().getFullName();
120 ExoSocialActivity senderComment = createNewComment(sender, fullNameReceiver);
121 String fullNameSender = sender.getProfile().getFullName();
122 ExoSocialActivity receiverComment = createNewComment(receiver, fullNameSender);
123
124 if (activityIdSender != null) {
125 ExoSocialActivity activitySender = activityManager.getActivity(activityIdSender);
126 if (activitySender != null) {
127 updateActivity(activitySender, nbOfSenderConnections);
128 activityManager.updateActivity(activitySender);
129 activityManager.saveComment(activitySender, senderComment);
130 } else {
131 activityIdSender = null;
132 }
133 }
134 if (activityIdSender == null) {
135 ExoSocialActivity newActivitySender = createNewActivity(sender, nbOfSenderConnections);
136 activityManager.saveActivityNoReturn(sender, newActivitySender);
137 getIdentityStorage().updateProfileActivityId(sender, newActivitySender.getId(), Profile.AttachedActivityType.RELATIONSHIP);
138 SpaceUtils.endRequest();
139 activityManager.saveComment(newActivitySender, senderComment);
140 }
141
142 if (activityIdReceiver != null) {
143 ExoSocialActivity activityReceiver = activityManager.getActivity(activityIdReceiver);
144 if (activityReceiver != null) {
145 updateActivity(activityReceiver, nbOfReceiverConnections);
146 activityManager.updateActivity(activityReceiver);
147 activityManager.saveComment(activityReceiver, receiverComment);
148 } else {
149 activityIdReceiver = null;
150 }
151 }
152 if (activityIdReceiver == null) {
153 ExoSocialActivity newActivityReceiver = createNewActivity(receiver, nbOfReceiverConnections);
154 activityManager.saveActivityNoReturn(receiver, newActivityReceiver);
155 getIdentityStorage().updateProfileActivityId(receiver, newActivityReceiver.getId(), Profile.AttachedActivityType.RELATIONSHIP);
156 SpaceUtils.endRequest();
157 activityManager.saveComment(newActivityReceiver, receiverComment);
158 }
159 } catch (Exception e) {
160 LOG.warn("Failed to publish event " + event + ": " + e.getMessage());
161 }
162 }
163
164 private void reloadIfNeeded(Identity identity) throws Exception {
165 if (identity.getId() == null || identity.getProfile().getFullName().length() == 0) {
166 identity = identityManager.getIdentity(identity.getGlobalId().toString(), true);
167 }
168 }
169
170 @Override
171 public void ignored(RelationshipEvent event) {
172 ;
173 }
174
175 @Override
176 public void removed(RelationshipEvent event) {
177 Relationship relationship = event.getPayload();
178 try {
179 Identity sender = identityManager.getOrCreateIdentity(OrganizationIdentityProvider.NAME, relationship.getSender().getRemoteId(), true);
180 Identity receiver = identityManager.getOrCreateIdentity(OrganizationIdentityProvider.NAME, relationship.getReceiver().getRemoteId(), true);
181
182 String activityIdSender = getIdentityStorage().getProfileActivityId(sender.getProfile(), Profile.AttachedActivityType.RELATIONSHIP);
183 int nbOfSenderConnections = getRelationShipManager().getConnections(sender).getSize();
184 String activityIdReceiver = getIdentityStorage().getProfileActivityId(receiver.getProfile(), Profile.AttachedActivityType.RELATIONSHIP);
185 int nbOfReceiverConnections = getRelationShipManager().getConnections(receiver).getSize();
186
187 if (activityIdSender != null) {
188 ExoSocialActivity activitySender = activityManager.getActivity(activityIdSender);
189 if (activitySender != null) {
190 updateActivity(activitySender, nbOfSenderConnections);
191 activityManager.updateActivity(activitySender);
192 }
193 }
194
195 if (activityIdReceiver != null) {
196 ExoSocialActivity activityReceiver = activityManager.getActivity(activityIdReceiver);
197 if (activityReceiver != null) {
198 updateActivity(activityReceiver, nbOfReceiverConnections);
199 activityManager.updateActivity(activityReceiver);
200 }
201 }
202
203 } catch (Exception e) {
204 LOG.debug("Failed to update relationship activity when remove connection : " + e.getMessage());
205 }
206 }
207
208 public void denied(RelationshipEvent event) {
209 ;
210
211 }
212
213
214
215
216 public void requested(RelationshipEvent event) {
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240 }
241
242
243
244
245
246
247
248
249 private Map<String,String> getParams(Relationship relationship) throws Exception {
250 Identity sender = relationship.getSender();
251 reloadIfNeeded(sender);
252 Identity receiver = relationship.getReceiver();
253 reloadIfNeeded(receiver);
254 String senderRemoteId = sender.getRemoteId();
255 String receiverRemoteId = receiver.getRemoteId();
256 Map<String,String> params = new HashMap<String,String>();
257 params.put(SENDER_PARAM, senderRemoteId);
258 params.put(RECEIVER_PARAM, receiverRemoteId);
259 params.put(RELATIONSHIP_UUID_PARAM, relationship.getId());
260 return params;
261 }
262
263 private IdentityStorage getIdentityStorage() {
264 return (IdentityStorage) PortalContainer.getInstance().getComponentInstanceOfType(IdentityStorage.class);
265 }
266
267 private RelationshipManager getRelationShipManager() {
268 return (RelationshipManager) PortalContainer.getInstance().getComponentInstanceOfType(RelationshipManager.class);
269 }
270 }