View Javadoc
1   /*
2    * Copyright (C) 2003-2010 eXo Platform SAS.
3    *
4    * This program is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Affero General Public License
6    * as published by the Free Software Foundation; either version 3
7    * of the License, or (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with this program; if not, see<http://www.gnu.org/licenses/>.
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   * Displays user's activities
55   *
56   * @author <a href="http://hoatle.net">hoatle (hoatlevan at gmail dot com)</a>
57   * @since Jul 30, 2010
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    * constructor
104    * @throws Exception 
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     // TODO: init() run two time when initiation this form.
123     //String remoteId = Utils.getOwnerRemoteId();
124     //this.setOwnerName(remoteId);
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     // set lastUpdatedNumber after init() method invoked inside setSelectedDisplayMode() method
132     //int numberOfUpdates = this.getNumberOfUpdatedActivities();
133     //setLastUpdatedNum(selectedDisplayMode.toString(), "" + numberOfUpdates);
134     //
135   }
136 
137   public UIActivitiesLoader getActivitiesLoader() {
138     return activitiesLoader;
139   }
140   
141   /**
142    * Checks the Stream Context to make 
143    * the decision Share button shows or not.
144    * @return TRUE/FALSE
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       //init();
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    * initialize
196    *
197    * @throws Exception
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     // Check if current display page is My Activity Stream
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 //    UIActivitiesContainer activitiesContainer = activitiesLoader.getChild(UIActivitiesContainer.class);
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     //setNumberOfUpdatedActivities(getActivigetActivitiesUpdatedNumtiesUpdatedNum(notChangedMode));
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        //int numberOfUpdates = uiUserActivities.getNumberOfUpdatedActivities();
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 //       event.getRequestContext().getJavascriptManager()
353 //       .require("SHARED/social-ui-activity-updates", "activityUpdates").addScripts("activityUpdates.resetCookie('" + String.format(Utils.LAST_UPDATED_ACTIVITIES_NUM, selectedDisplayMode, Utils.getViewerRemoteId()) + "','" + numberOfUpdates + "');");
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 }