1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.exoplatform.social.webui.profile;
18
19 import org.apache.commons.lang.Validate;
20 import org.exoplatform.commons.utils.ListAccess;
21 import org.exoplatform.commons.utils.PrivilegedSystemHelper;
22 import org.exoplatform.portal.application.PortalRequestContext;
23 import org.exoplatform.portal.mop.SiteType;
24 import org.exoplatform.portal.webui.util.Util;
25 import org.exoplatform.services.log.ExoLogger;
26 import org.exoplatform.services.log.Log;
27 import org.exoplatform.social.core.activity.model.ExoSocialActivity;
28 import org.exoplatform.social.core.identity.model.Identity;
29 import org.exoplatform.social.core.identity.provider.OrganizationIdentityProvider;
30 import org.exoplatform.social.core.manager.ActivityManager;
31 import org.exoplatform.social.core.relationship.model.Relationship;
32 import org.exoplatform.social.webui.URLUtils;
33 import org.exoplatform.social.webui.Utils;
34 import org.exoplatform.social.webui.activity.AbstractActivitiesDisplay;
35 import org.exoplatform.social.webui.activity.UIActivitiesContainer;
36 import org.exoplatform.social.webui.activity.UIActivitiesLoader;
37 import org.exoplatform.social.webui.composer.UIComposer;
38 import org.exoplatform.social.webui.composer.UIComposer.PostContext;
39 import org.exoplatform.webui.application.WebuiRequestContext;
40 import org.exoplatform.webui.config.annotation.ComponentConfig;
41 import org.exoplatform.webui.config.annotation.ComponentConfigs;
42 import org.exoplatform.webui.config.annotation.EventConfig;
43 import org.exoplatform.webui.core.UIDropDownControl;
44 import org.exoplatform.webui.core.UIPortletApplication;
45 import org.exoplatform.webui.core.model.SelectItemOption;
46 import org.exoplatform.webui.event.Event;
47 import org.exoplatform.webui.event.EventListener;
48
49 import java.util.ArrayList;
50 import java.util.Calendar;
51 import java.util.List;
52
53
54
55
56
57
58
59 @ComponentConfigs({
60 @ComponentConfig(
61 template = "war:/groovy/social/webui/profile/UIUserActivitiesDisplay.gtmpl",
62 events = {
63 @EventConfig(listeners = UIUserActivitiesDisplay.RefreshStreamActionListener.class)
64 }
65 ),
66 @ComponentConfig(
67 type = UIDropDownControl.class,
68 id = "DisplayModesDropDown",
69 template = "system:/groovy/webui/core/UIDropDownControl.gtmpl",
70 events = {
71 @EventConfig(listeners = UIUserActivitiesDisplay.ChangeOptionActionListener.class)
72 }
73 )
74 })
75 public class UIUserActivitiesDisplay extends AbstractActivitiesDisplay {
76 private static final Log LOG = ExoLogger.getLogger(UIUserActivitiesDisplay.class);
77 private static final String SLASH = "/";
78 private static final String ACTIVITIES_PER_PAGE_KEY = "social.activities.display.per.page";
79 private static int ACTIVITY_PER_PAGE = 10;
80 public static final String ACTIVITY_STREAM_VISITED_PREFIX_COOKIED = "exo_social_activity_stream_%s_visited_%s";
81
82 private Object locker = new Object();
83 private boolean notChangedMode;
84 private boolean postActivity;
85 private int numberOfUpdatedActivities;
86
87 public enum DisplayMode {
88 OWNER_STATUS,
89 ALL_ACTIVITIES,
90 CONNECTIONS,
91 MY_SPACE,
92 MY_ACTIVITIES,
93 POSTER_ACTIVITIES
94 }
95
96 private DisplayMode selectedDisplayMode = DisplayMode.ALL_ACTIVITIES;
97 private boolean isActivityStreamOwner = false;
98 private UIActivitiesLoader activitiesLoader;
99 private String ownerName;
100 private String viewerName;
101
102
103
104
105
106 public UIUserActivitiesDisplay() throws Exception {
107 ACTIVITY_PER_PAGE = Integer.valueOf(PrivilegedSystemHelper.getProperty(ACTIVITIES_PER_PAGE_KEY, "10").trim());
108
109 List<SelectItemOption<String>> displayModes = new ArrayList<SelectItemOption<String>>(4);
110 displayModes.add(new SelectItemOption<String>("All_Updates", DisplayMode.ALL_ACTIVITIES.toString()));
111 displayModes.add(new SelectItemOption<String>("Space_Updates", DisplayMode.MY_SPACE.toString()));
112 displayModes.add(new SelectItemOption<String>("Network_Updates", DisplayMode.CONNECTIONS.toString()));
113 displayModes.add(new SelectItemOption<String>("My_Status", DisplayMode.MY_ACTIVITIES.toString()));
114
115 UIDropDownControl uiDropDownControl = addChild(UIDropDownControl.class, "DisplayModesDropDown", null);
116 uiDropDownControl.setOptions(displayModes);
117
118 setSelectedMode(uiDropDownControl);
119
120 addChild(uiDropDownControl);
121
122
123
124
125 String selectedDisplayMode = Utils.getCookies(String.format(Utils.ACTIVITY_STREAM_TAB_SELECTED_COOKIED, Utils.getViewerRemoteId()));
126 selectedDisplayMode = (selectedDisplayMode != null) ? selectedDisplayMode : DisplayMode.ALL_ACTIVITIES.name();
127
128
129 setSelectedDisplayMode(selectedDisplayMode);
130
131
132
133
134
135 }
136
137 public UIActivitiesLoader getActivitiesLoader() {
138 return activitiesLoader;
139 }
140
141
142
143
144
145
146 public boolean isSingleContext() {
147 return (getActivitiesLoader().getPostContext() == UIComposer.PostContext.SINGLE);
148 }
149
150 public boolean isActivityStreamOwner() {
151 return isActivityStreamOwner;
152 }
153
154 public void setNumberOfUpdatedActivities(int numberOfUpdatedActivities) {
155 this.numberOfUpdatedActivities = numberOfUpdatedActivities;
156 }
157
158 public int getNumberOfUpdatedActivities() {
159 return numberOfUpdatedActivities;
160 }
161
162 public void setSelectedDisplayMode(DisplayMode displayMode) {
163 selectedDisplayMode = displayMode;
164 getChild(UIDropDownControl.class).setValue(selectedDisplayMode.toString());
165 try {
166
167 } catch (Exception e) {
168 LOG.error("Failed to init()");
169 }
170 }
171
172 public void setSelectedDisplayMode(String selectedDisplayMode) {
173 DisplayMode[] displayModes = DisplayMode.values();
174 for (int i = 0; i < displayModes.length; ++i) {
175 if (displayModes[i].name().equals(selectedDisplayMode)) {
176 setSelectedDisplayMode(displayModes[i]);
177 break;
178 }
179 }
180 }
181
182 public DisplayMode getSelectedDisplayMode() {
183 return selectedDisplayMode;
184 }
185
186 public String getCookiesKey(String displayMode) {
187 return String.format(ACTIVITY_STREAM_VISITED_PREFIX_COOKIED, displayMode, Utils.getViewerRemoteId());
188 }
189
190 public String getOwnerName() {
191 return ownerName;
192 }
193
194
195
196
197
198
199 public void init() throws Exception {
200 viewerName = Utils.getViewerRemoteId();
201 ownerName = Utils.getOwnerRemoteId();
202
203 Validate.notNull(ownerName, "ownerName must not be null.");
204 Validate.notNull(viewerName, "viewerName must not be null.");
205
206
207 isActivityStreamOwner = viewerName.equals(ownerName);
208 if (!isActivityStreamOwner) {
209 selectedDisplayMode = DisplayMode.OWNER_STATUS;
210 }
211
212 synchronized (locker) {
213 removeChild(UIActivitiesLoader.class);
214 activitiesLoader = addChild(UIActivitiesLoader.class, null, "UIActivitiesLoader");
215 activitiesLoader.getChild(UIActivitiesContainer.class).setRenderFull(isRenderFull(), true);
216 }
217
218 String activityId = Utils.getActivityID();
219 if (activityId != null && activityId.length() > 0) {
220 activitiesLoader.setPostContext(PostContext.SINGLE);
221 } else {
222 activitiesLoader.setPostContext(PostContext.USER);
223 }
224
225
226 String currentUserName = URLUtils.getCurrentUser();
227 if (currentUserName != null) {
228 selectedDisplayMode = DisplayMode.OWNER_STATUS;
229 }
230
231 activitiesLoader.setLoadingCapacity(ACTIVITY_PER_PAGE);
232 activitiesLoader.setOwnerName(ownerName);
233 activitiesLoader.setSelectedDisplayMode(selectedDisplayMode.toString());
234
235
236
237
238
239 Identity ownerIdentity = Utils.getIdentityManager().getOrCreateIdentity(OrganizationIdentityProvider.NAME, ownerName, false);
240
241 ActivityManager activityManager = Utils.getActivityManager();
242 ListAccess<ExoSocialActivity> activitiesListAccess = null;
243
244 switch (this.selectedDisplayMode) {
245 case MY_ACTIVITIES :
246 activitiesListAccess = activityManager.getActivitiesWithListAccess(ownerIdentity);
247 activitiesLoader.setActivityListAccess(activitiesListAccess);
248 break;
249 case OWNER_STATUS :
250 if (isActivityStreamOwner == false) {
251 Identity viewerIdentity = Utils.getIdentityManager().getOrCreateIdentity(OrganizationIdentityProvider.NAME, viewerName, false);
252 activitiesListAccess = activityManager.getActivitiesWithListAccess(ownerIdentity, viewerIdentity);
253 activitiesLoader.setActivityListAccess(activitiesListAccess);
254 } else {
255 activitiesListAccess = activityManager.getActivitiesWithListAccess(ownerIdentity);
256 activitiesLoader.setActivityListAccess(activitiesListAccess);
257 }
258
259 break;
260 case CONNECTIONS :
261 activitiesListAccess = activityManager.getActivitiesOfConnectionsWithListAccess(ownerIdentity);
262 activitiesLoader.setActivityListAccess(activitiesListAccess);
263 break;
264 case MY_SPACE :
265 activitiesListAccess = activityManager.getActivitiesOfUserSpacesWithListAccess(ownerIdentity);
266 activitiesLoader.setActivityListAccess(activitiesListAccess);
267 break;
268 default :
269 activitiesListAccess = activityManager.getActivityFeedWithListAccess(ownerIdentity);
270 activitiesLoader.setActivityListAccess(activitiesListAccess);
271 break;
272 }
273
274
275 String lastVisitedModeCookieKey = String.format(Utils.ACTIVITY_STREAM_TAB_SELECTED_COOKIED,
276 Utils.getViewerRemoteId());
277 String lastVisitedMode = Utils.getCookies(lastVisitedModeCookieKey);
278
279 this.notChangedMode = lastVisitedMode == null ? true : this.selectedDisplayMode.toString().equals(lastVisitedMode.trim());
280
281
282 setNumberOfUpdatedActivities(0);
283
284
285 activitiesLoader.init();
286 }
287
288 private void setSelectedMode(UIDropDownControl uiDropDownControl) {
289 if (selectedDisplayMode != null) {
290 uiDropDownControl.setValue(selectedDisplayMode.toString());
291 }
292 }
293
294 public void setChangedMode(boolean changedMode) {
295 this.notChangedMode = changedMode;
296 }
297
298 protected long getCurrentServerTime() {
299 return Calendar.getInstance().getTimeInMillis();
300 }
301
302 protected String getSitePath() {
303 PortalRequestContext portalRequestContext = Util.getPortalRequestContext();
304 String siteName = portalRequestContext.getSiteName();
305 SiteType siteType = portalRequestContext.getSiteType();
306 return SLASH + siteType.getName() + SLASH + siteName + SLASH;
307 }
308
309 protected boolean hasActivities() {
310 try {
311 UIActivitiesLoader uiActivitiesLoader = getChild(UIActivitiesLoader.class);
312 UIActivitiesContainer activitiesContainer = uiActivitiesLoader.getChild(UIActivitiesContainer.class);
313 return (activitiesContainer != null && activitiesContainer.getChildren().size() > 0);
314 } catch (Exception e) {
315 return false;
316 }
317 }
318
319 public static class ChangeOptionActionListener extends EventListener<UIDropDownControl> {
320
321 public void execute(Event<UIDropDownControl> event) throws Exception {
322 UIDropDownControl uiDropDown = event.getSource();
323 UIUserActivitiesDisplay uiUserActivities = uiDropDown.getParent();
324 WebuiRequestContext requestContext = event.getRequestContext();
325 String selectedDisplayMode = requestContext.getRequestParameter(OBJECTID);
326
327 if (selectedDisplayMode.equals(DisplayMode.ALL_ACTIVITIES.toString())) {
328 uiUserActivities.setSelectedDisplayMode(DisplayMode.ALL_ACTIVITIES);
329 } else if (selectedDisplayMode.equals(DisplayMode.MY_ACTIVITIES.toString())) {
330 uiUserActivities.setSelectedDisplayMode(DisplayMode.MY_ACTIVITIES);
331 } else if (selectedDisplayMode.equals(DisplayMode.MY_SPACE.toString())) {
332 uiUserActivities.setSelectedDisplayMode(DisplayMode.MY_SPACE);
333 } else {
334 uiUserActivities.setSelectedDisplayMode(DisplayMode.CONNECTIONS);
335 }
336
337 if (selectedDisplayMode != null) {
338 uiUserActivities.setSelectedDisplayMode(selectedDisplayMode);
339 uiUserActivities.init();
340
341 uiUserActivities.setChangedMode(false);
342
343
344
345
346 event.getRequestContext().getJavascriptManager()
347 .require("SHARED/social-ui-activity-updates", "activityUpdates")
348 .require("SHARED/social-ui-activity", "activity")
349 .addScripts("activity.responsiveMobile('" + uiUserActivities.getAncestorOfType(UIPortletApplication.class).getId() + "');")
350 .addScripts("activityUpdates.resetCookie('" + String.format(Utils.ACTIVITY_STREAM_TAB_SELECTED_COOKIED, Utils.getViewerRemoteId()) + "','" + selectedDisplayMode + "');");
351
352
353
354
355 }
356
357 requestContext.addUIComponentToUpdateByAjax(uiUserActivities);
358
359 }
360 }
361
362 public static class RefreshStreamActionListener extends EventListener<UIUserActivitiesDisplay> {
363 public void execute(Event<UIUserActivitiesDisplay> event) throws Exception {
364 UIUserActivitiesDisplay uiUserActivities = event.getSource();
365 uiUserActivities.init();
366 event.getRequestContext().getJavascriptManager()
367 .require("SHARED/social-ui-activity", "activity")
368 .addScripts("activity.responsiveMobile('" + uiUserActivities.getAncestorOfType(UIPortletApplication.class).getId() + "');");
369 event.getRequestContext().addUIComponentToUpdateByAjax(uiUserActivities);
370 }
371 }
372
373 public void resetCookies() {
374 Utils.setLastVisited(this.selectedDisplayMode.toString());
375
376
377 if (this.selectedDisplayMode == DisplayMode.ALL_ACTIVITIES) {
378 Utils.setLastVisited(DisplayMode.CONNECTIONS.toString());
379
380
381 Utils.setLastVisited(DisplayMode.MY_ACTIVITIES.toString());
382
383
384 Utils.setLastVisited(DisplayMode.MY_SPACE.toString());
385 }
386 }
387
388
389
390 public void setPostActivity(boolean postActivity) {
391 this.postActivity = postActivity;
392 }
393
394 protected boolean isWelcomeActivity() {
395 viewerName = PortalRequestContext.getCurrentInstance().getRemoteUser();
396 if ( !viewerName.equals(ownerName) ) return false;
397
398 boolean hasActivities = getActivitiesLoader().getActivitiesContainer().getChildren().size() > 0;
399 boolean isAllActivitiesModeOnHomePage = DisplayMode.ALL_ACTIVITIES.equals(getSelectedDisplayMode());
400
401 return Utils.isHomePage() ? !hasActivities && isAllActivitiesModeOnHomePage : !hasActivities;
402 }
403
404 public boolean isRelationConfirmed() {
405 if (Utils.getViewerIdentity() != null && Utils.getOwnerIdentity() != null && !Utils.getViewerIdentity().getId().equals(Utils.getOwnerIdentity().getId())) {
406 Relationship relationship = Utils.getRelationshipManager().get(Utils.getViewerIdentity(), Utils.getOwnerIdentity());
407 if (relationship != null && (relationship.getStatus() == Relationship.Type.CONFIRMED)) {
408 return true;
409 }
410 }
411
412 return false;
413 }
414 }