/*
* Copyright (C) 2003-2012 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.exoplatform.forum.service.cache;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Session;
import org.exoplatform.forum.base.BaseForumServiceTestCase;
import org.exoplatform.forum.common.jcr.KSDataLocation;
import org.exoplatform.forum.service.Category;
import org.exoplatform.forum.service.DataStorage;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.service.ForumNodeTypes;
import org.exoplatform.forum.service.MessageBuilder;
import org.exoplatform.forum.service.Post;
import org.exoplatform.forum.service.PruneSetting;
import org.exoplatform.forum.service.Topic;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.service.Watch;
import org.exoplatform.forum.service.impl.model.PostFilter;
import org.exoplatform.forum.service.impl.model.TopicFilter;
import org.exoplatform.forum.service.impl.model.TopicListAccess;
public class TestCacheDataStrorage extends BaseForumServiceTestCase {
private CachedDataStorage cacheDataStorage = null;
public TestCacheDataStrorage() throws Exception {
}
public void setUp() throws Exception {
super.setUp();
if (cacheDataStorage == null) {
cacheDataStorage = (CachedDataStorage)getService(DataStorage.class);
}
}
public void testPostListAccess() throws Exception {
// set Data
initDefaultData();
//create 26 posts
List<Post> posts = new ArrayList<Post>();
for (int i = 0; i < 25; ++i) {
Post post = createdPost();
posts.add(post);
cacheDataStorage.savePost(categoryId, forumId, topicId, post, true, new MessageBuilder());
}
// getPost
assertNotNull(cacheDataStorage.getPost(categoryId, forumId, topicId, posts.get(0).getId()));
assertEquals(25, cacheDataStorage.getTopic(categoryId, forumId, topicId, "").getPostCount());
// get Page 1
List<Post> gotList = cacheDataStorage.getPosts(new PostFilter(categoryId, forumId, topicId, "", "", "", "root"), 0, 10);
assertEquals(10, gotList.size());// size = 10: page 1
//Page 2
gotList = cacheDataStorage.getPosts(new PostFilter(categoryId, forumId, topicId, "", "", "", "root"), 10, 10);
assertEquals(10, gotList.size());// size = 10: page 2
//Page 3
gotList = cacheDataStorage.getPosts(new PostFilter(categoryId, forumId, topicId, "", "", "", "root"), 20, 10);
assertEquals(6, gotList.size());// size = 6: page 2
}
public void testPostListCount() throws Exception {
// set Data
initDefaultData();
//create 25 + 1 post default post when created topic
List<Post> posts = new ArrayList<Post>();
for (int i = 0; i < 25; ++i) {
Post post = createdPost();
posts.add(post);
cacheDataStorage.savePost(categoryId, forumId, topicId, post, true, new MessageBuilder());
}
// getPost
assertNotNull(cacheDataStorage.getPost(categoryId, forumId, topicId, posts.get(0).getId()));
//isApproved = true
assertEquals(26, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "true", "false", "false", "root")));
//isApproved = false
assertEquals(0, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "false", "false", "false", "root")));
//isHidden = true
assertEquals(0, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "false", "true", "false", "root")));
//isWaiting = true
assertEquals(0, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "false", "false", "true", "root")));
{ //add more posts
//add more 25 posts
for (int i = 0; i < 25; ++i) {
Post post = createdPost();
posts.add(post);
cacheDataStorage.savePost(categoryId, forumId, topicId, post, true, new MessageBuilder());
}
//isApproved = true
assertEquals(51, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "true", "false", "false", "root")));
//isApproved = false
assertEquals(0, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "false", "false", "false", "root")));
//isHidden = true
assertEquals(0, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "false", "true", "false", "root")));
//isWaiting = true
assertEquals(0, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "false", "false", "true", "root")));
}
//check whether postsCount is decremented after post removal
{
int oldPostListCount = cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "true", "false", "false", "root"));
cacheDataStorage.removePost(this.categoryId,this.forumId,this.topicId,posts.get(0).getId());
assertEquals( --oldPostListCount, cacheDataStorage.getPostsCount(new PostFilter(this.categoryId, this.forumId, topicId, "true", "false", "false", "root")));
}
}
public void testTopicListAccess() throws Exception {
// initialize default data (1 category, 1 forum and 1 topic)
initDefaultData();
Topic topic;
for (int i = 0; i < 9; i++) {
topic = createdTopic(USER_ROOT);
topic.setTopicType("Topic_test_" + i);
topic.setCanView(new String[] { USER_JOHN, "*:/foo/zed" });
cacheDataStorage.saveTopic(categoryId, forumId, topic, true, false, new MessageBuilder());
}
TopicFilter filter = new TopicFilter(categoryId, forumId);
filter.isAdmin(true);
TopicListAccess listAccess = (TopicListAccess) forumService_.getTopics(filter);
assertEquals(10, listAccess.getSize());
//
listAccess.initialize(5, 1);
assertEquals(5, listAccess.getPageSize());
assertEquals(2, listAccess.getTotalPages());
List<Topic> gotList = cacheDataStorage.getTopics(filter, 0, 5);
assertEquals(5, gotList.size());
gotList = cacheDataStorage.getTopics(filter, 5, 10);
assertEquals(5, gotList.size());
Topic update = gotList.get(0);
Topic sum = cacheDataStorage.getTopicSummary(update.getPath(), false);
assertNotNull(sum);
update.setTopicName("New topic name");
cacheDataStorage.saveTopic(categoryId, forumId, update, false, false, new MessageBuilder());
// check update
Topic got_ = cacheDataStorage.getTopic(categoryId, forumId, update.getId(), USER_ROOT);
assertEquals(update.getTopicName(), got_.getTopicName());
got_ = cacheDataStorage.getTopicSummary(update.getPath(), false);
assertEquals(update.getTopicName(), got_.getTopicName());
got_ = cacheDataStorage.getTopicByPath(update.getPath(), false);
assertEquals(update.getTopicName(), got_.getTopicName());
for (Topic top : listAccess.load(5, 10)) {
if (top.getId().equals(update.getId())) {
assertEquals(update.getTopicName(), top.getTopicName());
}
}
gotList = cacheDataStorage.getTopics(filter, 5, 10);
got_ = gotList.get(0);
assertEquals(update.getTopicName(), got_.getTopicName());
// test permission
for (int i = 0; i < 9; i++) {
topic = createdTopic(USER_JOHN);
topic.setTopicType("Topic_test_" + USER_JOHN + i);
topic.setCanView(new String[] { USER_DEMO, "ghost", "*:/foo/zed" });
cacheDataStorage.saveTopic(categoryId, forumId, topic, true, false, new MessageBuilder());
}
for (int i = 0; i < 9; i++) {
topic = createdTopic(USER_ROOT);
topic.setTopicType("Topic_test_" + USER_ROOT + i);
cacheDataStorage.saveTopic(categoryId, forumId, topic, true, false, new MessageBuilder());
}
filter = new TopicFilter(categoryId, forumId);
filter.isAdmin(false);
filter.userLogin(USER_DEMO);
loginUser(USER_DEMO);
// parent public
assertEquals(19, cacheDataStorage.getTopicsCount(filter));
// has not permission from parent
filter.viewers(new String[]{"mary"});
filter.userLogin("ghost");
loginUser("ghost");
assertEquals(9, cacheDataStorage.getTopicsCount(filter));
// has permission from parent
filter.userLogin("mary");
loginUser("mary");
assertEquals(28, cacheDataStorage.getTopicsCount(filter));
filter.userLogin("raul");
loginUser("raul");
assertEquals(0, cacheDataStorage.getTopicsCount(filter));
}
public void testTopicHasPoll() throws Exception {
// set Data
initDefaultData();
// get from data storage
Topic topic = cacheDataStorage.getTopic(categoryId, forumId, topicId, null);
String oldName = topic.getTopicName();
// get by path
Topic topicByPath = cacheDataStorage.getTopicByPath(topic.getPath(), false);
assertFalse(topicByPath.getIsPoll());
assertEquals(oldName, topicByPath.getTopicName());
// get summary
Topic topicSummary = cacheDataStorage.getTopicSummary(topic.getPath());
assertFalse(topicSummary.getIsPoll());
assertEquals(oldName, topicSummary.getTopicName());
// save new data for topic and clear topic cached
String newName = "Topic Rename";
topic.setTopicName(newName);
cacheDataStorage.saveTopic(categoryId, forumId, topic, false, false, new MessageBuilder());
saveHasPoll(topic.getPath(), true);
//
topicByPath = cacheDataStorage.getTopicByPath(topic.getPath(), false);
assertTrue(topicByPath.getIsPoll());
assertEquals(newName, topicByPath.getTopicName());
//
topicSummary = cacheDataStorage.getTopicSummary(topic.getPath());
assertTrue(topicSummary.getIsPoll());
// Remove has poll
saveHasPoll(topic.getPath(), false);
assertFalse(cacheDataStorage.getTopicByPath(topic.getPath(), false).getIsPoll());
cacheDataStorage.removeTopic(categoryId, forumId, topic.getId());
}
public void testClearWatchedCategory() throws Exception {
// set Data
initDefaultData();
List<String> values = new ArrayList<String>();
values.add("huongnt@exoplatform.com");
// Add watch for category with pullPath
Category category = cacheDataStorage.getCategory(categoryId);
cacheDataStorage.addWatch(1, category.getPath(), values, "root");
// Check watch's list for category
List<Watch> watchedList = cacheDataStorage.getWatchByUser("root");
assertEquals(watchedList.get(0).getEmail(), values.get(0));
// Delete email in watch's list
cacheDataStorage.removeWatch(1, category.getPath(), "/" + values.get(0));
// Check watch's list after deleting
watchedList = cacheDataStorage.getWatchByUser("root");
assertEquals(watchedList.size(), 0);
// Add watch for forum with forumPath
Forum forum = cacheDataStorage.getForum(categoryId, forumId);
cacheDataStorage.addWatch(1, forum.getPath(), values, "root");
// Check watch's list for forum
watchedList = cacheDataStorage.getWatchByUser("root");
assertEquals(watchedList.get(0).getEmail(), values.get(0));
// Delete email in watch's list
cacheDataStorage.removeWatch(1, forum.getPath(), "/" + values.get(0));
// Check watch's list after deleting
watchedList = cacheDataStorage.getWatchByUser("root");
assertEquals(watchedList.size(), 0);
// Add watch for topic with fullPath
Topic topic = cacheDataStorage.getTopic(categoryId, forumId, topicId, null);
cacheDataStorage.addWatch(1, topic.getPath(), values, "root");
// Check watch's list for topic
watchedList = cacheDataStorage.getWatchByUser("root");
assertEquals(watchedList.get(0).getEmail(), values.get(0));
// Delete email in watch's list
cacheDataStorage.removeWatch(1, topic.getPath(), "/" + values.get(0));
// Check watch's list after deleting
watchedList = cacheDataStorage.getWatchByUser("root");
assertEquals(watchedList.size(), 0);
}
public void testClearWatchedCategoryWithSubPath() throws Exception {
// set Data
initDefaultData();
List<String> values = new ArrayList<String>();
values.add("john@exoplatform.com");
// Add watch for category with subpath
cacheDataStorage.addWatch(1, categoryId, values, "john");
List<Watch> watchedList = cacheDataStorage.getWatchByUser("john");
// Check category watch's list
assertEquals(watchedList.size(), 1);
cacheDataStorage.removeWatch(1, categoryId, "/" + values.get(0));
watchedList = cacheDataStorage.getWatchByUser("john");
// Check category watch's list after deleting
assertEquals(watchedList.size(), 0);
// Add watch for forum with subpath
cacheDataStorage.addWatch(1, categoryId + "/" + forumId, values, "john");
watchedList = cacheDataStorage.getWatchByUser("john");
// Check forum watch's list
assertEquals(watchedList.size(), 1);
cacheDataStorage.removeWatch(1, categoryId + "/" + forumId, "/" + values.get(0));
watchedList = cacheDataStorage.getWatchByUser("john");
// Check forum watch's list after deleting
assertEquals(watchedList.size(), 0);
// Add watch for topic with subpath
cacheDataStorage.addWatch(1, categoryId + "/" + forumId + "/" + topicId, values, "john");
watchedList = cacheDataStorage.getWatchByUser("john");
// Check topic watch's list
assertEquals(watchedList.size(), 1);
cacheDataStorage.removeWatch(1, categoryId + "/" + forumId + "/" + topicId, "/" + values.get(0));
// Check topic watch's list after deleting
watchedList = cacheDataStorage.getWatchByUser("john");
assertEquals(watchedList.size(), 0);
//
cacheDataStorage.removeCategory(categoryId);
}
public void testRunPruneForum() throws Exception {
// default data
initDefaultData();
loginUser(USER_DEMO);
//
Topic topic = createdTopic(USER_DEMO);
forumService_.saveTopic(categoryId, forumId, topic, true, false, new MessageBuilder());
Post post = createdPost();
forumService_.savePost(categoryId, forumId, topicId, post, true, new MessageBuilder());
//
Calendar lastPost = Calendar.getInstance();
long twoDays = 48*60*60*1000;
lastPost.setTimeInMillis(lastPost.getTimeInMillis() - twoDays);
Session session = getSession();
Node topicNode = (Node) session.getItem(topic.getPath());
topicNode.setProperty(Utils.EXO_LAST_POST_DATE, lastPost);
session.save();
session.logout();
//
PruneSetting pruneSetting = new PruneSetting();
pruneSetting.setId(Utils.PRUNESETTING);
pruneSetting.setActive(true);
pruneSetting.setForumPath(cacheDataStorage.getForum(categoryId, forumId).getPath());
pruneSetting.setInActiveDay(1);
// check Prune
assertEquals(1, cacheDataStorage.checkPrune(pruneSetting));
// check before prune
TopicFilter filter = new TopicFilter(categoryId, forumId);
filter.isAdmin(false).isApproved(true);
long count = cacheDataStorage.getTopicsCount(filter);
assertEquals(2, count);
topic = cacheDataStorage.getTopic(categoryId, forumId, topic.getId(), null);
assertTrue(topic.getIsActive());
// run prune
cacheDataStorage.runPrune(pruneSetting);
// check before run pruned
count = cacheDataStorage.getTopicsCount(filter);
assertEquals(1, count);
topic = cacheDataStorage.getTopic(categoryId, forumId, topic.getId(), null);
assertFalse(topic.getIsActive());
}
private Session getSession() throws Exception {
KSDataLocation dataLocation = getService(KSDataLocation.class);
return dataLocation.getSessionManager().createSession();
}
private void saveHasPoll(String topicPath, boolean status) throws Exception {
Session session = getSession();
Node node = (Node) session.getItem(topicPath);
node.setProperty(ForumNodeTypes.EXO_IS_POLL, status);
session.save();
session.logout();
}
}