View Javadoc
1   /*
2    * Copyright (C) 2003-2011 eXo Platform SAS.
3    *
4    * This program is free software: you can redistribute it and/or modify
5    * it under the terms of the GNU Affero General Public License as published by
6    * the Free Software Foundation, either version 3 of the License, or
7    * (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 Affero General Public License for more details.
13   *
14   * You should have received a copy of the GNU Affero General Public License
15   * along with this program. If not, see <http://www.gnu.org/licenses/>.
16   */
17  
18  package org.exoplatform.social.core.storage.impl;
19  
20  import org.exoplatform.container.xml.InitParams;
21  import org.exoplatform.social.core.BaseActivityProcessorPlugin;
22  import org.exoplatform.social.core.activity.model.ExoSocialActivity;
23  import org.exoplatform.social.core.activity.model.ExoSocialActivityImpl;
24  import org.exoplatform.social.core.application.RelationshipPublisher.TitleId;
25  import org.exoplatform.social.core.identity.model.Identity;
26  import org.exoplatform.social.core.identity.provider.SpaceIdentityProvider;
27  import org.exoplatform.social.core.space.impl.DefaultSpaceApplicationHandler;
28  import org.exoplatform.social.core.space.model.Space;
29  import org.exoplatform.social.core.storage.ActivityStorageException;
30  import org.exoplatform.social.core.storage.api.IdentityStorage;
31  import org.exoplatform.social.core.storage.api.SpaceStorage;
32  import org.exoplatform.social.core.test.AbstractCoreTest;
33  import org.exoplatform.social.core.test.MaxQueryNumber;
34  import org.exoplatform.social.core.test.QueryNumberTest;
35  import org.junit.FixMethodOrder;
36  import org.junit.runners.MethodSorters;
37  
38  import java.util.ArrayList;
39  import java.util.Arrays;
40  import java.util.Calendar;
41  import java.util.HashMap;
42  import java.util.Iterator;
43  import java.util.LinkedHashMap;
44  import java.util.List;
45  import java.util.Map;
46  
47  /**
48   * @author <a href="mailto:alain.defrance@exoplatform.com">Alain Defrance</a>
49   * @version $Revision$
50   */
51  // TODO :
52  // * Fix tests to not have to specify the order of execution like this
53  // * The order of tests execution changed in Junit 4.11 (https://github.com/KentBeck/junit/blob/master/doc/ReleaseNotes4.11.md)
54  @FixMethodOrder(MethodSorters.NAME_ASCENDING)
55  @QueryNumberTest
56  public class ActivityStorageImplTestCase extends AbstractCoreTest {
57    private IdentityStorage identityStorage;
58    private ActivityStorageImpl activityStorage;
59    private RelationshipStorageImpl relationshipStorage;
60    private List<ExoSocialActivity> tearDownActivityList;
61    private List<Space>  tearDownSpaceList;
62    private SpaceStorage spaceStorage;
63  
64    private Identity rootIdentity;
65    private Identity johnIdentity;
66    private Identity maryIdentity;
67    private Identity demoIdentity;
68  
69    @Override
70    protected void setUp() throws Exception {
71      super.setUp();
72  
73      identityStorage = (IdentityStorage) getContainer().getComponentInstanceOfType(IdentityStorage.class);
74      activityStorage = (ActivityStorageImpl) getContainer().getComponentInstanceOfType(ActivityStorageImpl.class);
75      relationshipStorage = (RelationshipStorageImpl) getContainer().getComponentInstanceOfType(RelationshipStorageImpl.class);
76      spaceStorage = (SpaceStorage) this.getContainer().getComponentInstanceOfType(SpaceStorage.class);
77      
78      assertNotNull(identityStorage);
79      assertNotNull(activityStorage);
80      assertNotNull(relationshipStorage);
81  
82      rootIdentity = new Identity("organization", "root");
83      johnIdentity = new Identity("organization", "john");
84      maryIdentity = new Identity("organization", "mary");
85      demoIdentity = new Identity("organization", "demo");
86  
87      identityStorage.saveIdentity(rootIdentity);
88      identityStorage.saveIdentity(johnIdentity);
89      identityStorage.saveIdentity(maryIdentity);
90      identityStorage.saveIdentity(demoIdentity);
91  
92      assertNotNull(rootIdentity.getId());
93      assertNotNull(johnIdentity.getId());
94      assertNotNull(maryIdentity.getId());
95      assertNotNull(demoIdentity.getId());
96  
97      tearDownActivityList = new ArrayList<ExoSocialActivity>();
98      tearDownSpaceList = new ArrayList<Space>();
99    }
100 
101   @Override
102   protected void tearDown() throws Exception {
103 
104     for (ExoSocialActivity activity : tearDownActivityList) {
105       activityStorage.deleteActivity(activity.getId());
106     }
107 
108     for (Space sp : tearDownSpaceList) {
109       spaceStorage.deleteSpace(sp.getId());
110     }
111 
112     identityStorage.deleteIdentity(rootIdentity);
113     identityStorage.deleteIdentity(johnIdentity);
114     identityStorage.deleteIdentity(maryIdentity);
115     identityStorage.deleteIdentity(demoIdentity);
116 
117     super.tearDown();
118   }
119 
120   @MaxQueryNumber(273)
121   public void testSaveActivity() throws Exception {
122 
123     //
124     ExoSocialActivity activity = new ExoSocialActivityImpl();
125     activity.setTitle("title ");
126     activityStorage.saveActivity(rootIdentity, activity);
127     assertNotNull(activity.getId());
128 
129     //
130     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
131     assertEquals(activity.getId(), got.getId());
132     assertEquals(activity.getTitle(), got.getTitle());
133 
134     //
135     ExoSocialActivity act = new ExoSocialActivityImpl();
136     act.setTitle("@#$%^&*(()_+:<>?");
137     activityStorage.saveActivity(rootIdentity, act);
138     assertNotNull(act.getId());
139   }
140 
141   /**
142    * This is for the requirement from I18N activity type
143    * <pre>
144    *  if that resource bundle message is a compound resource bundle message, provide templateParams. The argument number will
145    *  be counted as it appears on the map.
146    *  For example: templateParams = {"key1": "value1", "key2": "value2"} => message bundle arguments = ["value1", "value2"].
147    * </pre>
148    */
149   @MaxQueryNumber(162)
150   public void testTemplateParams() throws Exception {
151     ExoSocialActivity activity = new ExoSocialActivityImpl();
152     activity.setTitle("title ");
153     Map<String, String> templateParams = new LinkedHashMap<String, String>();
154     templateParams.put("key1", "value1");
155     templateParams.put("key2", "value2");
156     templateParams.put("key3", "value3");
157     activity.setTemplateParams(templateParams);
158     activityStorage.saveActivity(rootIdentity, activity);
159     assertNotNull(activity.getId());
160 
161     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
162     Map<String, String> gotTemplateParams = got.getTemplateParams();
163     List<String> arrayList = new ArrayList(gotTemplateParams.values());
164     assertEquals("value1", arrayList.get(0));
165     assertEquals("value2", arrayList.get(1));
166     assertEquals("value3", arrayList.get(2));
167 
168   }
169 
170   @MaxQueryNumber(248)
171   public void testUpdateActivity() throws Exception {
172 
173     //
174     ExoSocialActivity activity = new ExoSocialActivityImpl();
175     activity.setTitle("&");
176     activity.setBody("test&amp;");
177     activityStorage.saveActivity(rootIdentity, activity);
178     assertNotNull(activity.getId());
179 
180     //
181     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
182     
183     got.setBody(null);
184     got.setTitle(null);
185     
186     activityStorage.updateActivity(got);
187     
188     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
189     
190     assertEquals(activity.getId(), got.getId());
191     assertEquals(activity.getTitle(), got.getTitle());
192 
193   }
194 
195   @MaxQueryNumber(428)
196   public void testUpdateActivityForLike() throws Exception {
197 
198     //
199     ExoSocialActivity activity = new ExoSocialActivityImpl();
200     activity.setTitle("a");
201     activity.setBody("test");
202     activityStorage.saveActivity(rootIdentity, activity);
203     assertNotNull(activity.getId());
204 
205     //
206     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
207     
208     got.setBody(null);
209     got.setTitle(null);
210     got.setLikeIdentityIds(new String[] {maryIdentity.getId()});
211     activityStorage.updateActivity(got);
212     
213     
214     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
215     
216     assertEquals(got.getId(), updatedActivity.getId());
217     assertEquals(got.getTitle(), updatedActivity.getTitle());
218     assertEquals(got.getBody(), updatedActivity.getBody());
219 
220   }
221 
222   /**
223    * Wrong due to not set:
224    *                   got.setBody(null);
225    *                   got.setTitle(null);
226    * before invokes: activityStorage.updateActivity(got);
227    * @throws Exception
228    */
229   @MaxQueryNumber(428)
230   public void testUpdateActivityForWrong() throws Exception {
231 
232     //
233     ExoSocialActivity activity = new ExoSocialActivityImpl();
234     activity.setTitle("&");
235     activity.setBody("test&amp;");
236     activityStorage.saveActivity(rootIdentity, activity);
237     assertNotNull(activity.getId());
238 
239     //
240     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
241     
242     got.setLikeIdentityIds(new String[] {maryIdentity.getId()});
243     activityStorage.updateActivity(got);
244     
245     
246     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
247     
248     assertEquals(got.getId(), updatedActivity.getId());
249     assertNotSame(got.getTitle(), updatedActivity.getTitle());
250     assertNotSame(got.getBody(), updatedActivity.getBody());
251 
252   }
253 
254   @MaxQueryNumber(428)
255   public void testUpdateActivityForUnLike() throws Exception {
256 
257     //
258     ExoSocialActivity activity = new ExoSocialActivityImpl();
259     activity.setTitle("title ");
260     activity.setLikeIdentityIds(new String[] {maryIdentity.getId()});
261     activityStorage.saveActivity(rootIdentity, activity);
262     assertNotNull(activity.getId());
263 
264     //
265     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
266     
267     got.setBody(null);
268     got.setTitle(null);
269     got.setLikeIdentityIds(new String[] {});
270     activityStorage.updateActivity(got);
271     
272     
273     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
274     
275     assertEquals(got.getId(), updatedActivity.getId());
276     assertEquals(got.getTitle(), updatedActivity.getTitle());
277     assertEquals(got.getBody(), updatedActivity.getBody());
278 
279   }
280   
281   /**
282    * Wrong due to not set:
283    *                   got.setBody(null);
284    *                   got.setTitle(null);
285    * before invokes: activityStorage.updateActivity(got);
286    * @throws Exception
287    */
288   @MaxQueryNumber(428)
289   public void testUpdateActivityForUnLikeWrong() throws Exception {
290 
291     //
292     ExoSocialActivity activity = new ExoSocialActivityImpl();
293     activity.setTitle("&");
294     activity.setBody("test&amp;");
295     activity.setLikeIdentityIds(new String[] {maryIdentity.getId()});
296     activityStorage.saveActivity(rootIdentity, activity);
297     assertNotNull(activity.getId());
298 
299     //
300     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
301     
302     
303     got.setLikeIdentityIds(new String[] {});
304     activityStorage.updateActivity(got);
305     
306     
307     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
308     
309     assertEquals(got.getId(), updatedActivity.getId());
310     assertNotSame(got.getTitle(), updatedActivity.getTitle());
311     assertNotSame(got.getBody(), updatedActivity.getBody());
312 
313   }
314 
315   @MaxQueryNumber(366)
316   public void testSaveComment() throws Exception {
317 
318     //
319     ExoSocialActivity activity = new ExoSocialActivityImpl();
320     activity.setTitle("activity ");
321     activityStorage.saveActivity(rootIdentity, activity);
322     assertNotNull(activity.getId());
323 
324     //
325     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
326     assertEquals(activity.getId(), got.getId());
327     assertEquals(activity.getTitle(), got.getTitle());
328 
329     //
330     ExoSocialActivity comment = new ExoSocialActivityImpl();
331     comment.setTitle("comment");
332     comment.setUserId(rootIdentity.getId());
333     activityStorage.saveComment(activity, comment);
334     assertNotNull(comment.getId());
335 
336     //
337     ExoSocialActivity gotComment = activityStorage.getActivity(comment.getId());
338     assertEquals(comment.getId(), gotComment.getId());
339     assertEquals(comment.getTitle(), gotComment.getTitle());
340 
341     //
342     ExoSocialActivity gotParentActivity = activityStorage.getParentActivity(comment);
343     assertEquals(activity.getId(), gotParentActivity.getId());
344     assertEquals(activity.getTitle(), gotParentActivity.getTitle());
345     assertEquals(1, activity.getReplyToId().length);
346     assertEquals(comment.getId(), activity.getReplyToId()[0]);
347 
348   }
349 
350   @MaxQueryNumber(2685)
351   public void testActivityCount() throws Exception {
352 
353     // fill 10 activities
354     for (int i = 0; i < 10; ++i) {
355       ExoSocialActivity activity = new ExoSocialActivityImpl();
356       activity.setTitle("title " + i);
357       activityStorage.saveActivity(rootIdentity, activity);
358     }
359 
360     //
361     assertEquals(10, activityStorage.getNumberOfUserActivities(rootIdentity));
362 
363     // remove 5 activities
364     Iterator<ExoSocialActivity> it = activityStorage.getUserActivities(rootIdentity, 0, 100).iterator();
365 
366     for (int i = 0; i < 5; ++i) {
367       activityStorage.deleteActivity(it.next().getId());
368     }
369     
370     it = activityStorage.getUserActivities(rootIdentity, 0, 100).iterator();
371     
372     //
373     assertEquals(5, activityStorage.getNumberOfUserActivities(rootIdentity));
374     
375     while(it.hasNext()) {
376       tearDownActivityList.add(it.next());
377     }
378 
379 
380   }
381 
382   /**
383    * Test {@link org.exoplatform.social.core.storage.impl.ActivityStorageImpl#getActivity(String)}
384    */
385   @MaxQueryNumber(888)
386   public void testUserPostActivityToSpace() throws ActivityStorageException {
387     // Create new Space and its Identity
388     Space space = getSpaceInstance();
389     SpaceIdentityProvider spaceIdentityProvider = (SpaceIdentityProvider) getContainer().getComponentInstanceOfType(SpaceIdentityProvider.class);
390     Identity spaceIdentity = spaceIdentityProvider.createIdentity(space);
391     identityStorage.saveIdentity(spaceIdentity);
392     
393     // john posted activity on created Space
394     ExoSocialActivity activity = new ExoSocialActivityImpl();
395     activity.setTitle("Space's Activity");
396     activity.setUserId(johnIdentity.getId());
397 
398     activityStorage.saveActivity(spaceIdentity, activity);
399     
400     // Get posted Activity and check
401     ExoSocialActivity gotActivity = activityStorage.getActivity(activity.getId());
402     
403     assertEquals("userId must be " + johnIdentity.getId(), johnIdentity.getId(), gotActivity.getUserId());
404     
405     //
406     List<ExoSocialActivity> gotActivities = activityStorage.getUserActivities(johnIdentity, 0, 20);
407     assertEquals(1, gotActivities.size());
408     assertEquals(johnIdentity.getId(), gotActivities.get(0).getUserId());
409     
410     identityStorage.deleteIdentity(spaceIdentity);
411   }
412 
413   @MaxQueryNumber(1527)
414   public void testActivityOrder() throws Exception {
415     // fill 10 activities
416     for (int i = 0; i < 10; ++i) {
417       ExoSocialActivity activity = new ExoSocialActivityImpl();
418       activity.setTitle("title " + i);
419       activityStorage.saveActivity(rootIdentity, activity);
420       tearDownActivityList.add(activity);
421     }
422 
423     int i = 9;
424     for (ExoSocialActivity activity : activityStorage.getUserActivities(rootIdentity)) {
425       assertEquals("title " + i, activity.getTitle());
426       --i;
427     }
428   }
429 
430   @MaxQueryNumber(1500)
431   public void testActivityOrderByPostedTime() throws Exception {
432     // fill 10 activities
433     Calendar cal = Calendar.getInstance();
434     long today = cal.getTime().getTime();
435     cal.add(Calendar.DATE, -1);
436     long yesterday = cal.getTime().getTime();
437     //i > 5 PostedTime = currentDate + i;
438     //else yesterdayDate = currentDate + i;
439     for (int i = 0; i < 10; ++i) {
440       ExoSocialActivity activity = new ExoSocialActivityImpl();
441       activity.setTitle("title " + i);
442       activity.setPostedTime(i> 5 ? today + i : yesterday + i);
443       activityStorage.saveActivity(rootIdentity, activity);
444     }
445 
446     int i = 9;
447     for (ExoSocialActivity activity : activityStorage.getUserActivities(rootIdentity)) {
448       assertEquals("title " + i, activity.getTitle());
449       
450       if (i>5) {
451         assertEquals(today + i, activity.getPostedTime().longValue());        
452       } else {
453         assertEquals(yesterday + i, activity.getPostedTime().longValue());
454       }
455       
456       --i;
457     }
458   }
459 
460   /* Today: the 1st of this month
461      Yesterday: the last day of last month
462   */
463   @MaxQueryNumber(1494)
464   public void testActivityOrderByPostedTime2() throws Exception {
465     // fill 10 activities
466     Calendar cal = Calendar.getInstance();
467     cal.set(Calendar.DATE, 1);
468     long today = cal.getTime().getTime();
469     cal.add(Calendar.DATE, -1);
470     long yesterday = cal.getTime().getTime();
471     //i >= 5 PostedTime = currentDate + i;
472     //else PostedTime = yesterdayDate + i;
473     for (int i = 0; i < 10; ++i) {
474       ExoSocialActivity activity = new ExoSocialActivityImpl();
475       activity.setTitle("title " + i);
476       activity.setPostedTime(i >= 5 ? today + i : yesterday + i);
477       activityStorage.saveActivity(rootIdentity, activity);
478     }
479 
480     int i = 9;
481     for (ExoSocialActivity activity : activityStorage.getUserActivities(rootIdentity)) {
482       assertEquals("title " + i, activity.getTitle());
483       
484       if (i>= 5) {
485         assertEquals(today + i, activity.getPostedTime().longValue());        
486       } else {
487         assertEquals(yesterday + i, activity.getPostedTime().longValue());
488       }
489       
490       --i;
491     }
492   }
493 
494   @MaxQueryNumber(4155)
495   public void testActivityOrder2() throws Exception {
496     // fill 10 activities
497     for (int i = 0; i < 10; ++i) {
498       ExoSocialActivity activity = new ExoSocialActivityImpl();
499       activity.setTitle("title " + i);
500       activityStorage.saveActivity(rootIdentity, activity);
501       
502     }
503 
504     // remove 5 activities
505     Iterator<ExoSocialActivity> it = activityStorage.getUserActivities(rootIdentity).iterator();
506 
507     for (int i = 0; i < 5; ++i) {
508       activityStorage.deleteActivity(it.next().getId());
509     }
510     
511     while (it.hasNext()) {
512       tearDownActivityList.add(it.next());
513     }
514 
515     // fill 10 others
516     for (int i = 0; i < 10; ++i) {
517       ExoSocialActivity activity = new ExoSocialActivityImpl();
518       activity.setTitle("title " + i);
519       activityStorage.saveActivity(rootIdentity, activity);
520       tearDownActivityList.add(activity);
521     }
522 
523     List<ExoSocialActivity> activityies = activityStorage.getUserActivities(rootIdentity);
524     int i = 0;
525     int[] values = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4, 3, 2, 1, 0};
526     for (ExoSocialActivity activity : activityies) {
527       assertEquals("title " + values[i], activity.getTitle());
528       ++i;
529     }
530   }
531   
532   @MaxQueryNumber(318)
533   public void testActivityHidden() throws Exception {
534 
535     //
536     ExoSocialActivity activity = new ExoSocialActivityImpl();
537     activity.setTitle("title");
538     activity.setBody("body");
539     activity.isHidden(false);
540     activityStorage.saveActivity(rootIdentity, activity);
541     assertNotNull(activity.getId());
542 
543     //
544     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
545     got.isHidden(true);
546 
547     activityStorage.updateActivity(got);
548 
549     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
550     assertEquals(true, updatedActivity.isHidden());
551   }
552   
553   @MaxQueryNumber(366)
554   public void testActivityUnHidden() throws Exception {
555 
556     //
557     ExoSocialActivity activity = new ExoSocialActivityImpl();
558     activity.setTitle("title");
559     activity.setBody("body");
560     activity.isHidden(true);
561     activityStorage.saveActivity(rootIdentity, activity);
562     assertNotNull(activity.getId());
563 
564     //
565     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
566     got.isHidden(false);
567 
568     activityStorage.updateActivity(got);
569 
570     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
571     assertEquals(false, updatedActivity.isHidden());
572   }
573   
574   @MaxQueryNumber(248)
575   public void testActivityLock() throws Exception {
576 
577     //
578     ExoSocialActivity activity = new ExoSocialActivityImpl();
579     activity.setTitle("title");
580     activity.setBody("body");
581     activity.isLocked(false);
582     activityStorage.saveActivity(rootIdentity, activity);
583     assertNotNull(activity.getId());
584 
585     //
586     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
587     got.isLocked(true);
588 
589     activityStorage.updateActivity(got);
590 
591     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
592     assertEquals(true, updatedActivity.isLocked());
593   }
594   
595   @MaxQueryNumber(248)
596   public void testActivityUnLock() throws Exception {
597 
598     //
599     ExoSocialActivity activity = new ExoSocialActivityImpl();
600     activity.setTitle("title");
601     activity.setBody("body");
602     activity.isLocked(true);
603     activityStorage.saveActivity(rootIdentity, activity);
604     assertNotNull(activity.getId());
605 
606     //
607     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
608     got.isLocked(false);
609 
610     activityStorage.updateActivity(got);
611 
612     ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId());
613     assertEquals(false, updatedActivity.isLocked());
614   }
615 
616   @MaxQueryNumber(32430)
617   public void testCommentOrder() throws Exception {
618     // fill 10 activities
619     for (int i = 0; i < 10; ++i) {
620       Thread.sleep(10);
621       ExoSocialActivity activity = new ExoSocialActivityImpl();
622       activity.setTitle("title " + i);
623       activityStorage.saveActivity(rootIdentity, activity);
624       tearDownActivityList.add(activity);
625 
626       // fill 10 comments for each activity
627       for(int j = 0; j < 10; ++j) {
628         Thread.sleep(10);
629         ExoSocialActivity comment = new ExoSocialActivityImpl();
630         comment.setTitle("title " + i + j);
631         comment.setUserId(rootIdentity.getId());
632         activityStorage.saveComment(activity, comment);
633       }
634     }
635 
636     int i = 9;
637     for (ExoSocialActivity activity : activityStorage.getUserActivities(rootIdentity)) {
638       int j = 0;
639       for (String commentId : activity.getReplyToId()) {
640         if (!"".equals(commentId)) {
641           assertEquals("title " + i + j, activityStorage.getActivity(commentId).getTitle());
642           ++j;
643         }
644       }
645       --i;
646     }
647   }
648 
649   @MaxQueryNumber(3180)
650   public void testDeleteComment() throws Exception {
651     ExoSocialActivity activity = new ExoSocialActivityImpl();
652     activity.setTitle("activity title");
653 
654     activityStorage.saveActivity(rootIdentity, activity);
655     tearDownActivityList.add(activity);
656 
657     activity = activityStorage.getActivity(activity.getId());
658 
659     for (int i = 0; i < 10; ++i) {
660       Thread.sleep(10);
661       
662       ExoSocialActivity comment = new ExoSocialActivityImpl();
663       comment.setTitle("comment title " + i);
664       comment.setUserId(rootIdentity.getId());
665 
666       activityStorage.saveComment(activity, comment);
667     }
668 
669     assertEquals(10, activityStorage.getActivity(activity.getId()).getReplyToId().length);
670 
671     int i = 0;
672     activity = activityStorage.getActivity(activity.getId());
673     for (String commentId : activity.getReplyToId()) {
674       if (!"".equals(commentId) && i < 5) {
675         activityStorage.deleteActivity(commentId);
676         ++i;
677       }
678     }
679 
680     assertEquals(5, activityStorage.getActivity(activity.getId()).getReplyToId().length);
681   }
682 
683   @MaxQueryNumber(630)
684   public void testLike() throws Exception {
685     ExoSocialActivity activity = new ExoSocialActivityImpl();
686     activity.setTitle("activity title");
687 
688     activityStorage.saveActivity(rootIdentity, activity);
689 
690     activity.setLikeIdentityIds(new String[] {rootIdentity.getId(), johnIdentity.getId(), demoIdentity.getId()});
691 
692     activityStorage.saveActivity(rootIdentity, activity);
693 
694     List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity);
695 
696     assertEquals(1, activities.size());
697     assertEquals(3, activities.get(0).getLikeIdentityIds().length);
698 
699     List<String> ids = Arrays.asList(activities.get(0).getLikeIdentityIds());
700 
701     assertTrue(ids.contains(rootIdentity.getId()));
702     assertTrue(ids.contains(johnIdentity.getId()));
703     assertTrue(ids.contains(demoIdentity.getId()));
704     assertTrue(!ids.contains(maryIdentity.getId()));
705   }
706 
707   @MaxQueryNumber(4263)
708   public void testContactActivities() throws Exception {
709 
710     //
711     assertEquals(0, activityStorage.getActivitiesOfIdentities(Arrays.asList(rootIdentity, johnIdentity), 0, 100).size());
712 
713     for (int i = 0; i < 10; ++i) {
714 
715       ExoSocialActivity activity = new ExoSocialActivityImpl();
716       activity.setTitle("root activity " + i);
717       activityStorage.saveActivity(rootIdentity, activity);
718 
719       ExoSocialActivity activity2 = new ExoSocialActivityImpl();
720       activity2.setTitle("john activity " + i);
721       activityStorage.saveActivity(johnIdentity, activity2);
722 
723       ExoSocialActivity activity3 = new ExoSocialActivityImpl();
724       activity3.setTitle("mary activity " + i);
725       activityStorage.saveActivity(maryIdentity, activity3);
726     }
727 
728     //
729     List<ExoSocialActivity> activities = activityStorage.getActivitiesOfIdentities(Arrays.asList(rootIdentity, johnIdentity), 0, 100);
730     assertEquals(20, activities.size());
731 
732     int i = 9;
733     Iterator<ExoSocialActivity> it = activities.iterator();
734     while (it.hasNext()) {
735 
736       ExoSocialActivity activity = it.next();
737       assertEquals("john activity " + i, activity.getTitle());
738 
739       activity = it.next();
740       assertEquals("root activity " + i, activity.getTitle());
741       --i;
742     }
743 
744   }
745 
746   @MaxQueryNumber(372)
747   public void testTimeStamp() throws Exception {
748     ExoSocialActivity activity = new ExoSocialActivityImpl();
749     activity.setTitle("activity title");
750     activityStorage.saveActivity(rootIdentity, activity);
751 
752     ExoSocialActivity comment = new ExoSocialActivityImpl();
753     comment.setUserId(rootIdentity.getId());
754     comment.setTitle("comment title");
755 
756     activityStorage.saveComment(activity, comment);
757 
758     List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity);
759 
760     assertEquals(1, activities.size());
761     assertFalse(activities.get(0).getPostedTime() == 0);
762     assertEquals(1, activities.get(0).getReplyToId().length);
763 
764     ExoSocialActivity gotComment = activityStorage.getActivity(activities.get(0).getReplyToId()[0]);
765     assertFalse(gotComment.getPostedTime() == 0);
766 
767   }
768 
769   @MaxQueryNumber(1347)
770   public void testManyDays() throws Exception {
771 
772     long timestamp111 = timestamp(2001, 1, 1);
773     long timestamp112 = timestamp(2001, 1, 2);
774     long timestamp121 = timestamp(2001, 2, 1);
775     long timestamp122 = timestamp(2001, 2, 2);
776     long timestamp211 = timestamp(2002, 1, 1);
777     long timestamp212 = timestamp(2002, 1, 2);
778     long timestamp221 = timestamp(2002, 2, 1);
779     long timestamp222 = timestamp(2002, 2, 2);
780 
781     addActivity(rootIdentity, timestamp111);
782     addActivity(rootIdentity, timestamp112);
783     addActivity(rootIdentity, timestamp121);
784     addActivity(rootIdentity, timestamp122);
785     addActivity(rootIdentity, timestamp211);
786     addActivity(rootIdentity, timestamp212);
787     addActivity(rootIdentity, timestamp221);
788     addActivity(rootIdentity, timestamp222);
789 
790     List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity);
791     assertEquals(8, activities.size());
792     assertEquals(timestamp111, activities.get(7).getPostedTime().longValue());
793     assertEquals(timestamp112, activities.get(6).getPostedTime().longValue());
794     assertEquals(timestamp121, activities.get(5).getPostedTime().longValue());
795     assertEquals(timestamp122, activities.get(4).getPostedTime().longValue());
796     assertEquals(timestamp211, activities.get(3).getPostedTime().longValue());
797     assertEquals(timestamp212, activities.get(2).getPostedTime().longValue());
798     assertEquals(timestamp221, activities.get(1).getPostedTime().longValue());
799     assertEquals(timestamp222, activities.get(0).getPostedTime().longValue());
800 
801   }
802 
803   @MaxQueryNumber(561)
804   public void testManyDaysNoActivityOnDay() throws Exception {
805 
806     long timestamp1 = timestamp(2001, 1, 1);
807     long timestamp2 = timestamp(2001, 1, 2);
808 
809     addActivity(rootIdentity, timestamp1);
810     ExoSocialActivity activity2 = addActivity(rootIdentity, timestamp2);
811 
812     activityStorage.deleteActivity(activity2.getId());
813 
814     List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity);
815     assertEquals(1, activities.size());
816     assertEquals(timestamp1, activities.get(0).getPostedTime().longValue());
817 
818   }
819 
820   @MaxQueryNumber(1131)
821   public void testManyDaysNoActivityOnMonth() throws Exception {
822 
823     long timestamp11 = timestamp(2001, 1, 1);
824     long timestamp12 = timestamp(2001, 1, 2);
825     long timestamp21 = timestamp(2001, 2, 1);
826     long timestamp22 = timestamp(2001, 2, 2);
827 
828     addActivity(rootIdentity, timestamp11);
829     addActivity(rootIdentity, timestamp12);
830     ExoSocialActivity activity21 = addActivity(rootIdentity, timestamp21);
831     ExoSocialActivity activity22 = addActivity(rootIdentity, timestamp22);
832 
833     activityStorage.deleteActivity(activity21.getId());
834     activityStorage.deleteActivity(activity22.getId());
835 
836     List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity);
837     assertEquals(2, activities.size());
838     assertEquals(timestamp11, activities.get(1).getPostedTime().longValue());
839     assertEquals(timestamp12, activities.get(0).getPostedTime().longValue());
840 
841   }
842 
843   @MaxQueryNumber(2271)
844   public void testManyDaysNoActivityOnYear() throws Exception {
845 
846     long timestamp111 = timestamp(2001, 1, 1);
847     long timestamp112 = timestamp(2001, 1, 2);
848     long timestamp121 = timestamp(2001, 2, 1);
849     long timestamp122 = timestamp(2001, 2, 2);
850     long timestamp211 = timestamp(2002, 1, 1);
851     long timestamp212 = timestamp(2002, 1, 2);
852     long timestamp221 = timestamp(2002, 2, 1);
853     long timestamp222 = timestamp(2002, 2, 2);
854 
855     addActivity(rootIdentity, timestamp111);
856     addActivity(rootIdentity, timestamp112);
857     addActivity(rootIdentity, timestamp121);
858     addActivity(rootIdentity, timestamp122);
859     ExoSocialActivity activity211 = addActivity(rootIdentity, timestamp211);
860     ExoSocialActivity activity212 = addActivity(rootIdentity, timestamp212);
861     ExoSocialActivity activity221 = addActivity(rootIdentity, timestamp221);
862     ExoSocialActivity activity222 = addActivity(rootIdentity, timestamp222);
863 
864     activityStorage.deleteActivity(activity211.getId());
865     activityStorage.deleteActivity(activity212.getId());
866     activityStorage.deleteActivity(activity221.getId());
867     activityStorage.deleteActivity(activity222.getId());
868 
869     List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity);
870     assertEquals(4, activities.size());
871     assertEquals(timestamp111, activities.get(3).getPostedTime().longValue());
872     assertEquals(timestamp112, activities.get(2).getPostedTime().longValue());
873     assertEquals(timestamp121, activities.get(1).getPostedTime().longValue());
874     assertEquals(timestamp122, activities.get(0).getPostedTime().longValue());
875 
876   }
877 
878   @MaxQueryNumber(3207)
879   public void testManyDaysNoActivityOnAll() throws Exception {
880 
881     long timestamp111 = timestamp(2001, 1, 1);
882     long timestamp112 = timestamp(2001, 1, 2);
883     long timestamp121 = timestamp(2001, 2, 1);
884     long timestamp122 = timestamp(2001, 2, 2);
885     long timestamp211 = timestamp(2002, 1, 1);
886     long timestamp212 = timestamp(2002, 1, 2);
887     long timestamp221 = timestamp(2002, 2, 1);
888     long timestamp222 = timestamp(2002, 2, 2);
889 
890     ExoSocialActivity activity111 = addActivity(rootIdentity, timestamp111);
891     ExoSocialActivity activity112 = addActivity(rootIdentity, timestamp112);
892     ExoSocialActivity activity121 = addActivity(rootIdentity, timestamp121);
893     ExoSocialActivity activity122 = addActivity(rootIdentity, timestamp122);
894     ExoSocialActivity activity211 = addActivity(rootIdentity, timestamp211);
895     ExoSocialActivity activity212 = addActivity(rootIdentity, timestamp212);
896     ExoSocialActivity activity221 = addActivity(rootIdentity, timestamp221);
897     ExoSocialActivity activity222 = addActivity(rootIdentity, timestamp222);
898 
899     activityStorage.deleteActivity(activity111.getId());
900     activityStorage.deleteActivity(activity112.getId());
901     activityStorage.deleteActivity(activity121.getId());
902     activityStorage.deleteActivity(activity122.getId());
903     activityStorage.deleteActivity(activity211.getId());
904     activityStorage.deleteActivity(activity212.getId());
905     activityStorage.deleteActivity(activity221.getId());
906     activityStorage.deleteActivity(activity222.getId());
907 
908     List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity);
909     assertEquals(0, activities.size());
910 
911   }
912 
913   @MaxQueryNumber(165)
914   public void testRelationshipActivity() throws Exception {
915     ExoSocialActivity activity = new ExoSocialActivityImpl();
916     activity.setTitle("I am now connected with @receiverRemoteId");
917     activity.setType("exosocial:relationship");
918     //Shindig's Activity's fields
919     activity.setAppId("appId");
920     activity.setBody("body");
921     activity.setBodyId("bodyId");
922     activity.setTitleId(TitleId.CONNECTION_REQUESTED.toString());
923     activity.setExternalId("externalId");
924     //activity.setId("id");
925     activity.setUrl("http://www.exoplatform.org");
926     
927     Map<String,String> params = new HashMap<String,String>();
928     params.put("SENDER", "senderRemoteId");
929     params.put("RECEIVER", "receiverRemoteId");
930     params.put("RELATIONSHIP_UUID", "relationship_id");
931     activity.setTemplateParams(params);
932     
933     activityStorage.saveActivity(rootIdentity, activity);
934     
935     List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity);
936     assertNotNull(activities);
937     assertEquals(1, activities.size());
938     
939     for(ExoSocialActivity element : activities) {
940      
941       //title
942       assertNotNull(element.getTitle());
943       //type
944       assertNotNull(element.getType());
945       //appId
946       assertNotNull(element.getAppId());
947       //body
948       assertNotNull(element.getBody());
949       //bodyId
950       assertNotNull(element.getBodyId());
951       //titleId
952       assertEquals(TitleId.CONNECTION_REQUESTED.toString(), element.getTitleId());
953       //externalId
954       assertNotNull(element.getExternalId());
955       //id
956       //assertNotNull(element.getId());
957       //url
958       assertEquals("http://www.exoplatform.org", element.getUrl());
959       //id
960       assertNotNull(element.getUserId());
961       //templateParams
962       assertNotNull(element.getTemplateParams());
963       
964     }
965     
966     
967   }
968 
969   @MaxQueryNumber(366)
970   public void testActivityProcessing() throws Exception {
971 
972     //
973     BaseActivityProcessorPlugin processor = new DummyProcessor(null);
974     activityStorage.getActivityProcessors().add(processor);
975 
976     //
977     ExoSocialActivity activity = new ExoSocialActivityImpl();
978     activity.setTitle("activity");
979     activityStorage.saveActivity(rootIdentity, activity);
980     assertNotNull(activity.getId());
981 
982     //
983     ExoSocialActivity got = activityStorage.getActivity(activity.getId());
984     assertEquals(activity.getId(), got.getId());
985     assertEquals("edited", got.getTitle());
986 
987     //
988     ExoSocialActivity comment = new ExoSocialActivityImpl();
989     comment.setTitle("comment");
990     comment.setUserId(rootIdentity.getId());
991     activityStorage.saveComment(activity, comment);
992     assertNotNull(comment.getId());
993 
994     //
995     ExoSocialActivity gotComment = activityStorage.getActivity(comment.getId());
996     assertEquals(comment.getId(), gotComment.getId());
997     assertEquals("edited", gotComment.getTitle());
998 
999     //
1000     ExoSocialActivity gotParentActivity = activityStorage.getParentActivity(comment);
1001     assertEquals(activity.getId(), gotParentActivity.getId());
1002     assertEquals("edited", gotParentActivity.getTitle());
1003     assertEquals(1, activity.getReplyToId().length);
1004     assertEquals(comment.getId(), activity.getReplyToId()[0]);
1005 
1006     //
1007     activityStorage.getActivityProcessors().remove(processor);
1008 
1009   }
1010   
1011   /**
1012    * Gets an instance of Space.
1013    *
1014    * @return an instance of space
1015    */
1016   private Space getSpaceInstance() {
1017     Space space = new Space();
1018     space.setDisplayName("myspace");
1019     space.setPrettyName(space.getDisplayName());
1020     space.setRegistration(Space.OPEN);
1021     space.setDescription("add new space");
1022     space.setType(DefaultSpaceApplicationHandler.NAME);
1023     space.setVisibility(Space.PUBLIC);
1024     space.setPriority(Space.INTERMEDIATE_PRIORITY);
1025     space.setGroupId("/space/space");
1026     space.setUrl(space.getPrettyName());
1027     String[] managers = new String[] {"john", "demo"};
1028     space.setManagers(managers);
1029     return space;
1030   }
1031 
1032   private ExoSocialActivity addActivity(Identity identity, long timestamp) {
1033 
1034     ExoSocialActivity activity = new ExoSocialActivityImpl();
1035     activity.setTitle("activity title");
1036     activity.setPostedTime(timestamp);
1037     activityStorage.saveActivity(identity, activity);
1038 
1039     return activity;
1040 
1041   }
1042 
1043   private long timestamp(int year, int month, int day) {
1044 
1045     Calendar cal = Calendar.getInstance();
1046     cal.set(year, month, day, 0, 0, 0);
1047     return cal.getTime().getTime();
1048 
1049   }
1050 
1051   class DummyProcessor extends BaseActivityProcessorPlugin {
1052 
1053     DummyProcessor(final InitParams params) {
1054       super(params);
1055     }
1056 
1057     @Override
1058     public void processActivity(final ExoSocialActivity activity) {
1059       activity.setTitle("edited");
1060     }
1061   }
1062 
1063   private Space getSpaceInstance(int number) {
1064     Space space = new Space();
1065     space.setApp("app");
1066     space.setDisplayName("myspace " + number);
1067     space.setPrettyName(space.getDisplayName());
1068     space.setRegistration(Space.OPEN);
1069     space.setDescription("add new space " + number);
1070     space.setType(DefaultSpaceApplicationHandler.NAME);
1071     space.setVisibility(Space.PUBLIC);
1072     space.setPriority(Space.INTERMEDIATE_PRIORITY);
1073     space.setGroupId("/spaces/space" + number);
1074     String[] managers = new String[] {"demo", "tom"};
1075     String[] members = new String[] {"raul", "ghost", "dragon"};
1076     String[] invitedUsers = new String[] {"register1", "mary"};
1077     String[] pendingUsers = new String[] {"jame", "paul", "hacker"};
1078     space.setInvitedUsers(invitedUsers);
1079     space.setPendingUsers(pendingUsers);
1080     space.setManagers(managers);
1081     space.setMembers(members);
1082     space.setUrl(space.getPrettyName());
1083     return space;
1084   }
1085   
1086   private long getSinceTime() {
1087     Calendar cal = Calendar.getInstance();
1088     return cal.getTimeInMillis();
1089   }
1090 }