/*************************************************************************** * Copyright (C) 2003-2007 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. ***************************************************************************/ package org.exoplatform.forum.service.impl; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Calendar; import java.util.Iterator; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CopyOnWriteArrayList; import javax.jcr.NodeIterator; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.container.component.ComponentPlugin; import org.exoplatform.container.xml.InitParams; import org.exoplatform.forum.service.Category; import org.exoplatform.forum.service.DataStorage; import org.exoplatform.forum.service.Forum; import org.exoplatform.forum.service.ForumAdministration; import org.exoplatform.forum.service.ForumAttachment; import org.exoplatform.forum.service.ForumEventLifeCycle; import org.exoplatform.forum.service.ForumEventListener; import org.exoplatform.forum.service.ForumEventQuery; import org.exoplatform.forum.service.ForumLinkData; import org.exoplatform.forum.service.ForumPrivateMessage; import org.exoplatform.forum.service.ForumSearch; import org.exoplatform.forum.service.ForumService; import org.exoplatform.forum.service.ForumStatistic; import org.exoplatform.forum.service.ForumStatisticsService; import org.exoplatform.forum.service.ForumSubscription; import org.exoplatform.forum.service.InitializeForumPlugin; import org.exoplatform.forum.service.JCRPageList; import org.exoplatform.forum.service.LazyPageList; import org.exoplatform.forum.service.MessageBuilder; import org.exoplatform.forum.service.Post; import org.exoplatform.forum.service.PruneSetting; import org.exoplatform.forum.service.SendMessageInfo; import org.exoplatform.forum.service.Tag; import org.exoplatform.forum.service.Topic; import org.exoplatform.forum.service.TopicType; import org.exoplatform.forum.service.UserLoginLogEntry; import org.exoplatform.forum.service.UserProfile; import org.exoplatform.forum.service.Utils; import org.exoplatform.forum.service.Watch; import org.exoplatform.ks.common.conf.RoleRulesPlugin; import org.exoplatform.management.annotations.ManagedBy; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.organization.User; import org.exoplatform.services.scheduler.JobSchedulerService; import org.picocontainer.Startable; import org.quartz.JobDetail; /** * Created by The eXo Platform SARL * Author : Hung Nguyen Quang * hung.nguyen@exoplatform.com * Jul 10, 2007 */ @ManagedBy(ForumServiceManaged.class) public class ForumServiceImpl implements ForumService, Startable { private static final Log log = ExoLogger.getLogger(ForumServiceImpl.class); private DataStorage storage; private ForumServiceManaged managementView; // will be automatically set at @ManagedBy processing final List<String> onlineUserList_ = new CopyOnWriteArrayList<String>(); final Queue<UserLoginLogEntry> queue = new ConcurrentLinkedQueue<UserLoginLogEntry>(); private String lastLogin_ = ""; private ForumStatisticsService forumStatisticsService; private JobSchedulerService jobSchedulerService; protected List<ForumEventListener> listeners_ = new ArrayList<ForumEventListener>(3); public ForumServiceImpl(InitParams params, ExoContainerContext context, DataStorage dataStorage, ForumStatisticsService forumStatisticsService, JobSchedulerService jobSchedulerService) { this.storage = dataStorage; this.forumStatisticsService = forumStatisticsService; this.jobSchedulerService = jobSchedulerService; } /** * {@inheritDoc} */ public void addPlugin(ComponentPlugin plugin) throws Exception { storage.addPlugin(plugin); } /** * {@inheritDoc} */ public void addRolePlugin(ComponentPlugin plugin) throws Exception { storage.addRolePlugin(plugin); } /** * {@inheritDoc} */ public void addInitialDefaultDataPlugin(ComponentPlugin plugin) throws Exception { storage.addInitialDefaultDataPlugin(plugin); } public void addInitialDataPlugin(ComponentPlugin plugin) throws Exception { storage.addInitialDataPlugin(plugin); } public void start() { try { log.info("initializing category listeners..."); storage.initCategoryListener(); } catch (Exception e) { log.error("Error while updating category listeners " + e.getMessage()); } try { log.info("initializing default data..."); storage.initDefaultData(); } catch (Exception e) { log.error("Error while initializing default data: " + e.getMessage()); } try { log.info("initializing data..."); storage.initDataPlugin(); } catch (Exception e) { log.error("Error while initializing data plugin: " + e.getMessage()); } try { log.info("Calculating active users..."); storage.evaluateActiveUsers(""); } catch (Exception e) { log.error("Error while calculating active users: " + e.getMessage()); } // init Calculate Moderators listeners try { log.info("initializing Calculate Moderators listeners..."); storage.addCalculateModeratorEventListener(); } catch (Exception e) { log.error("Error while initializing Moderators listeners: " + e.getMessage()); } // initialize auto prune schedules try { log.info("initializing prune schedulers..."); storage.initAutoPruneSchedules(); } catch (Exception e) { log.error("Error while initializing Prune schedulers: " + e.getMessage()); } // init deleted user listeners try { log.info("initializing deleted user listener..."); storage.addDeletedUserCalculateListener(); } catch (Exception e) { log.error("Error while initializing Prune schedulers: " + e.getMessage()); } // management views try { log.info("initializing management view..."); managePlugins(); manageStorage(); manageJobs(); } catch (Exception e) { log.error("Error while initializing Management view: " + e.getMessage()); } } private void manageStorage() { managementView.registerStorageManager(storage); } @SuppressWarnings("unchecked") private void manageJobs() { try { List<JobDetail> jobs = jobSchedulerService.getAllJobs(); for (JobDetail jobDetail : jobs) { managementView.registerJobManager(new JobManager(jobDetail)); } } catch (Exception e) { log.error("failed to register jobs manager", e); } } private void managePlugins() { List<RoleRulesPlugin> plugins = storage.getRulesPlugins(); for (RoleRulesPlugin plugin2 : plugins) { managementView.registerPlugin(plugin2); } List<InitializeForumPlugin> defaultPlugins = storage.getDefaultPlugins(); for (InitializeForumPlugin plugin2 : defaultPlugins) { managementView.registerPlugin(plugin2); } } public void stop() { } public void addMember(User user, UserProfile profileTemplate) throws Exception { boolean added = storage.populateUserProfile(user, profileTemplate, true); if (added) { forumStatisticsService.addMember(user.getUserName()); } } public void calculateDeletedUser(String userName) throws Exception { storage.calculateDeletedUser(userName); } /** * {@inheritDoc} */ public void removeMember(User user) throws Exception { if (storage.deleteUserProfile(user.getUserName())) forumStatisticsService.removeMember(user.getUserName()); } public void createUserProfile(User user) throws Exception { } /** * {@inheritDoc} */ public void updateUserProfile(User user) throws Exception { storage.populateUserProfile(user, null, false); } /** * @deprecated use {@link #updateUserProfile(User)} */ public void saveEmailUserProfile(String userId, String email) throws Exception { } /** * {@inheritDoc} */ public void saveCategory(Category category, boolean isNew) throws Exception { storage.saveCategory(category, isNew); for (ForumEventLifeCycle f : listeners_) { f.saveCategory(category); } } /** * {@inheritDoc} */ public void calculateModerator(String categoryPath, boolean isNew) throws Exception { storage.calculateModerator(categoryPath, false); } /** * {@inheritDoc} */ public Category getCategory(String categoryId) throws Exception { return storage.getCategory(categoryId); } /** * {@inheritDoc} */ public String[] getPermissionTopicByCategory(String categoryId, String type) throws Exception { return storage.getPermissionTopicByCategory(categoryId, type); } /** * {@inheritDoc} */ public List<Category> getCategories() throws Exception { return storage.getCategories(); } /** * {@inheritDoc} */ public Category removeCategory(String categoryId) throws Exception { return storage.removeCategory(categoryId); } /** * {@inheritDoc} */ public void saveModOfCategory(List<String> moderatorCate, String userId, boolean isAdd) { storage.saveModOfCategory(moderatorCate, userId, isAdd); } /** * {@inheritDoc} */ public void modifyForum(Forum forum, int type) throws Exception { storage.modifyForum(forum, type); } /** * {@inheritDoc} */ public void saveForum(String categoryId, Forum forum, boolean isNew) throws Exception { storage.saveForum(categoryId, forum, isNew); for (ForumEventLifeCycle f : listeners_) { f.saveForum(forum); } } /** * {@inheritDoc} */ public void saveModerateOfForums(List<String> forumPaths, String userName, boolean isDelete) throws Exception { storage.saveModerateOfForums(forumPaths, userName, isDelete); } /** * {@inheritDoc} */ public void moveForum(List<Forum> forums, String destCategoryPath) throws Exception { storage.moveForum(forums, destCategoryPath); } /** * {@inheritDoc} */ public Forum getForum(String categoryId, String forumId) throws Exception { return storage.getForum(categoryId, forumId); } /** * {@inheritDoc} */ public List<Forum> getForums(String categoryId, String strQuery) throws Exception { return storage.getForums(categoryId, strQuery); } /** * {@inheritDoc} */ public List<Forum> getForumSummaries(String categoryId, String strQuery) throws Exception { return storage.getForumSummaries(categoryId, strQuery); } /** * {@inheritDoc} */ public Forum removeForum(String categoryId, String forumId) throws Exception { return storage.removeForum(categoryId, forumId); } /** * {@inheritDoc} */ public void modifyTopic(List<Topic> topics, int type) throws Exception { storage.modifyTopic(topics, type); } /** * * @deprecated use {@link #saveTopic(String, String, Topic, boolean, boolean, MessageBuilder)} */ @Deprecated public void saveTopic(String categoryId, String forumId, Topic topic, boolean isNew, boolean isMove, String defaultEmailContent) throws Exception { saveTopic(categoryId, forumId, topic, isNew, isMove, new MessageBuilder()); } public void saveTopic(String categoryId, String forumId, Topic topic, boolean isNew, boolean isMove, MessageBuilder messageBuilder) throws Exception { storage.saveTopic(categoryId, forumId, topic, isNew, isMove, messageBuilder); for (ForumEventLifeCycle f : listeners_) { if (isNew) f.addTopic(topic, categoryId, forumId); else f.updateTopic(topic, categoryId, forumId); } } /** * {@inheritDoc} */ public Topic getTopic(String categoryId, String forumId, String topicId, String userRead) throws Exception { return storage.getTopic(categoryId, forumId, topicId, userRead); } /** * {@inheritDoc} */ public void setViewCountTopic(String path, String userRead) throws Exception { storage.setViewCountTopic(path, userRead); } /** * {@inheritDoc} */ public Topic getTopicSummary(String topicPath) throws Exception { return storage.getTopicSummary(topicPath, true); } /** * {@inheritDoc} */ public Topic getTopicByPath(String topicPath, boolean isLastPost) throws Exception { return storage.getTopicByPath(topicPath, isLastPost); } public Topic getTopicUpdate(Topic topic, boolean isSummary) throws Exception { return storage.getTopicUpdate(topic, isSummary); } /** * {@inheritDoc} */ public LazyPageList<Topic> getTopicList(String categoryId, String forumId, String strQuery, String strOrderBy, int pageSize) throws Exception { return storage.getTopicList(categoryId, forumId, strQuery, strOrderBy, pageSize); } /** * {@inheritDoc} */ public JCRPageList getPageTopic(String categoryId, String forumId, String strQuery, String strOrderBy) throws Exception { return storage.getPageTopic(categoryId, forumId, strQuery, strOrderBy); } /** * {@inheritDoc} */ public List<Topic> getTopics(String categoryId, String forumId) throws Exception { return storage.getTopics(categoryId, forumId); } /** * {@inheritDoc} */ public void moveTopic(List<Topic> topics, String destForumPath, String mailContent, String link) throws Exception { storage.moveTopic(topics, destForumPath, mailContent, link); } /** * {@inheritDoc} */ public Topic removeTopic(String categoryId, String forumId, String topicId) throws Exception { return storage.removeTopic(categoryId, forumId, topicId); } /** * {@inheritDoc} */ public Post getPost(String categoryId, String forumId, String topicId, String postId) throws Exception { return storage.getPost(categoryId, forumId, topicId, postId); } /** * {@inheritDoc} */ public long getLastReadIndex(String path, String isApproved, String isHidden, String userLogin) throws Exception { return storage.getLastReadIndex(path, isApproved, isHidden, userLogin); } /** * {@inheritDoc} */ public JCRPageList getPostForSplitTopic(String topicPath) throws Exception { return storage.getPostForSplitTopic(topicPath); } /** * {@inheritDoc} */ public JCRPageList getPosts(String categoryId, String forumId, String topicId, String isApproved, String isHidden, String strQuery, String userLogin) throws Exception { return storage.getPosts(categoryId, forumId, topicId, isApproved, isHidden, strQuery, userLogin); } /** * {@inheritDoc} */ public long getAvailablePost(String categoryId, String forumId, String topicId, String isApproved, String isHidden, String userLogin) throws Exception { return storage.getAvailablePost(categoryId, forumId, topicId, isApproved, isHidden, userLogin); } /** * * @deprecated use {@link #savePost(String, String, String, Post, boolean, MessageBuilder)} */ @Deprecated public void savePost(String categoryId, String forumId, String topicId, Post post, boolean isNew, String defaultEmailContent) throws Exception { savePost(categoryId, forumId, topicId, post, isNew, new MessageBuilder()); } public void savePost(String categoryId, String forumId, String topicId, Post post, boolean isNew, MessageBuilder messageBuilder) throws Exception { storage.savePost(categoryId, forumId, topicId, post, isNew, messageBuilder); for (ForumEventLifeCycle f : listeners_) { if (isNew) f.addPost(post, categoryId, forumId, topicId); else f.updatePost(post, categoryId, forumId, topicId); } } /** * {@inheritDoc} */ public void modifyPost(List<Post> posts, int type) throws Exception { storage.modifyPost(posts, type); } /** * {@inheritDoc} */ public void movePost(List<Post> posts, String destTopicPath, boolean isCreatNewTopic, String mailContent, String link) throws Exception { String[] postPaths = new String[posts.size()]; int i = 0; for (Post p : posts) { postPaths[i] = p.getPath(); ++i; } movePost(postPaths, destTopicPath, isCreatNewTopic, mailContent, link); } /** * {@inheritDoc} */ public void movePost(String[] postPaths, String destTopicPath, boolean isCreatNewTopic, String mailContent, String link) throws Exception { storage.movePost(postPaths, destTopicPath, isCreatNewTopic, mailContent, link); } /** * {@inheritDoc} */ public void mergeTopic(String srcTopicPath, String destTopicPath, String mailContent, String link) throws Exception { storage.mergeTopic(srcTopicPath, destTopicPath, mailContent, link); } /** * {@inheritDoc} */ public Post removePost(String categoryId, String forumId, String topicId, String postId) throws Exception { return storage.removePost(categoryId, forumId, topicId, postId); } /** * {@inheritDoc} */ public Object getObjectNameByPath(String path) throws Exception { return storage.getObjectNameByPath(path); } /** * {@inheritDoc} */ public Object getObjectNameById(String path, String type) throws Exception { return storage.getObjectNameById(path, type); } /** * {@inheritDoc} */ public List<ForumLinkData> getAllLink(String strQueryCate, String strQueryForum) throws Exception { return storage.getAllLink(strQueryCate, strQueryForum); } /** * {@inheritDoc} */ public String getForumHomePath() throws Exception { return storage.getDataLocation().getForumHomeLocation(); } /** * {@inheritDoc} */ /* * public Poll getPoll(String categoryId, String forumId, String topicId) throws Exception { return storage.getPoll(categoryId, forumId, topicId) ; } *//** * {@inheritDoc} */ /* * public Poll removePoll(String categoryId, String forumId, String topicId) throws Exception { return storage.removePoll(categoryId, forumId, topicId); } *//** * {@inheritDoc} */ /* * public void savePoll(String categoryId, String forumId, String topicId, Poll poll, boolean isNew, boolean isVote) throws Exception { storage.savePoll(categoryId, forumId, topicId, poll, isNew, isVote) ; } *//** * {@inheritDoc} */ /* * public void setClosedPoll(String categoryId, String forumId, String topicId, Poll poll) throws Exception { storage.setClosedPoll(categoryId, forumId, topicId, poll) ; } */ /** * {@inheritDoc} */ public void addTag(List<Tag> tags, String userName, String topicPath) throws Exception { storage.addTag(tags, userName, topicPath); } /** * {@inheritDoc} */ public List<Tag> getAllTags() throws Exception { return storage.getAllTags(); } /** * {@inheritDoc} */ public List<Tag> getMyTagInTopic(String[] tagIds) throws Exception { return storage.getMyTagInTopic(tagIds); } /** * {@inheritDoc} */ public Tag getTag(String tagId) throws Exception { return storage.getTag(tagId); } /** * {@inheritDoc} */ public List<String> getAllTagName(String strQuery, String userAndTopicId) throws Exception { return storage.getAllTagName(strQuery, userAndTopicId); } /** * {@inheritDoc} */ public List<String> getTagNameInTopic(String userAndTopicId) throws Exception { return storage.getTagNameInTopic(userAndTopicId); } /** * {@inheritDoc} */ public JCRPageList getTopicByMyTag(String userIdAndtagId, String strOrderBy) throws Exception { return storage.getTopicByMyTag(userIdAndtagId, strOrderBy); } /** * {@inheritDoc} */ public void saveTag(Tag newTag) throws Exception { storage.saveTag(newTag); } /** * {@inheritDoc} */ public void unTag(String tagId, String userName, String topicPath) throws Exception { storage.unTag(tagId, userName, topicPath); } /** * {@inheritDoc} */ public void saveUserModerator(String userName, List<String> ids, boolean isModeCate) throws Exception { storage.saveUserModerator(userName, ids, isModeCate); } /** * {@inheritDoc} */ public void saveUserProfile(UserProfile userProfile, boolean isOption, boolean isBan) throws Exception { storage.saveUserProfile(userProfile, isOption, isBan); } /** * {@inheritDoc} */ public UserProfile getUserInfo(String userName) throws Exception { return storage.getUserInfo(userName); } /** * {@inheritDoc} */ public List<String> getUserModerator(String userName, boolean isModeCate) throws Exception { return storage.getUserModerator(userName, isModeCate); } /** * {@inheritDoc} */ public UserProfile getUserProfileManagement(String userName) throws Exception { return storage.getUserProfileManagement(userName); } /** * {@inheritDoc} */ public void saveLastPostIdRead(String userId, String[] lastReadPostOfForum, String[] lastReadPostOfTopic) throws Exception { storage.saveLastPostIdRead(userId, lastReadPostOfForum, lastReadPostOfTopic); } /** * {@inheritDoc} */ public void saveUserBookmark(String userName, String bookMark, boolean isNew) throws Exception { storage.saveUserBookmark(userName, bookMark, isNew); } /** * {@inheritDoc} */ public void saveCollapsedCategories(String userName, String categoryId, boolean isAdd) throws Exception { storage.saveCollapsedCategories(userName, categoryId, isAdd); } /** * {@inheritDoc} */ public JCRPageList getPageListUserProfile() throws Exception { return storage.getPageListUserProfile(); } /** * {@inheritDoc} */ public JCRPageList getPrivateMessage(String userName, String type) throws Exception { return storage.getPrivateMessage(userName, type); } /** * {@inheritDoc} */ public long getNewPrivateMessage(String userName) throws Exception { return storage.getNewPrivateMessage(userName); } /** * {@inheritDoc} */ public void removePrivateMessage(String messageId, String userName, String type) throws Exception { storage.removePrivateMessage(messageId, userName, type); } /** * {@inheritDoc} */ public void saveReadMessage(String messageId, String userName, String type) throws Exception { storage.saveReadMessage(messageId, userName, type); } /** * {@inheritDoc} */ public void savePrivateMessage(ForumPrivateMessage privateMessage) throws Exception { storage.savePrivateMessage(privateMessage); } /** * {@inheritDoc} */ public ForumSubscription getForumSubscription(String userId) throws Exception { return storage.getForumSubscription(userId); } /** * {@inheritDoc} */ public void saveForumSubscription(ForumSubscription forumSubscription, String userId) throws Exception { storage.saveForumSubscription(forumSubscription, userId); } /** * {@inheritDoc} */ public JCRPageList getPageTopicOld(long date, String forumPatch) throws Exception { return storage.getPageTopicOld(date, forumPatch); } /** * {@inheritDoc} */ public List<Topic> getAllTopicsOld(long date, String forumPatch) throws Exception { return storage.getAllTopicsOld(date, forumPatch); } /** * {@inheritDoc} */ public long getTotalTopicOld(long date, String forumPatch) { return storage.getTotalTopicOld(date, forumPatch); } /** * {@inheritDoc} */ public JCRPageList getPageTopicByUser(String userName, boolean isMod, String strOrderBy) throws Exception { return storage.getPageTopicByUser(userName, isMod, strOrderBy); } /** * {@inheritDoc} */ public JCRPageList getPagePostByUser(String userName, String userId, boolean isMod, String strOrderBy) throws Exception { return storage.getPagePostByUser(userName, userId, isMod, strOrderBy); } /** * {@inheritDoc} */ public ForumStatistic getForumStatistic() throws Exception { return storage.getForumStatistic(); } /** * {@inheritDoc} */ public void saveForumStatistic(ForumStatistic forumStatistic) throws Exception { storage.saveForumStatistic(forumStatistic); } /** * {@inheritDoc} */ public void updateStatisticCounts(long topicCount, long postCount) throws Exception { storage.updateStatisticCounts(topicCount, postCount); } /** * {@inheritDoc} */ public List<ForumSearch> getQuickSearch(String textQuery, String type, String pathQuery, String userId, List<String> listCateIds, List<String> listForumIds, List<String> forumIdsOfModerator) throws Exception { return storage.getQuickSearch(textQuery, type, pathQuery, userId, listCateIds, listForumIds, forumIdsOfModerator); } /** * {@inheritDoc} */ public List<ForumSearch> getAdvancedSearch(ForumEventQuery eventQuery, List<String> listCateIds, List<String> listForumIds) throws Exception { return storage.getAdvancedSearch(eventQuery, listCateIds, listForumIds); } /** * {@inheritDoc} */ public ForumAdministration getForumAdministration() throws Exception { return storage.getForumAdministration(); } /** * {@inheritDoc} */ public void saveForumAdministration(ForumAdministration forumAdministration) throws Exception { storage.saveForumAdministration(forumAdministration); } /** * {@inheritDoc} */ public void addWatch(int watchType, String path, List<String> values, String currentUser) throws Exception { storage.addWatch(watchType, path, values, currentUser); } /** * {@inheritDoc} */ public void removeWatch(int watchType, String path, String values) throws Exception { storage.removeWatch(watchType, path, values); } /** * {@inheritDoc} */ public List<ForumSearch> getJobWattingForModerator(String[] paths) throws Exception { return storage.getJobWattingForModerator(paths); } /** * {@inheritDoc} */ public int getJobWattingForModeratorByUser(String userId) throws Exception { return storage.getJobWattingForModeratorByUser(userId); } /** * {@inheritDoc} */ public void updateLoggedinUsers() throws Exception { UserLoginLogEntry loginEntry = queue.poll(); if (loginEntry == null) return; int maxOnline = loginEntry.totalOnline; Calendar timestamp = loginEntry.loginTime; while (loginEntry != null) { try { storage.updateLastLoginDate(loginEntry.userName); if (loginEntry.totalOnline > maxOnline) { maxOnline = loginEntry.totalOnline; timestamp = loginEntry.loginTime; } } catch (Exception e) { log.warn("Can not log information for user '" + loginEntry.userName + "'"); } loginEntry = queue.poll(); } ForumStatistic stats = storage.getForumStatistic(); int mostOnline = 0; String mostUsersOnline = stats.getMostUsersOnline(); if (mostUsersOnline != null && mostUsersOnline.length() > 0) { String[] array = mostUsersOnline.split(","); // OMG responsible of this should loose a finger! try { mostOnline = Integer.parseInt(array[0].trim()); } catch (Exception e) { } } if (maxOnline > mostOnline) { stats.setMostUsersOnline(maxOnline + ", at " + timestamp.getTimeInMillis()); } else if (mostOnline == 0) { // this case is expected to appear when the first user logins to system and the statistic is not activated before. // the maximum number of online users will jump from N/A to 1 stats.setMostUsersOnline("1, at " + timestamp.getTimeInMillis()); } storage.saveForumStatistic(stats); } /** * {@inheritDoc} */ public void userLogin(String userId) throws Exception { // Note: login and onlineUserlist shoudl be anaged by forumStatisticsService.memberIn(); lastLogin_ = userId; if (!onlineUserList_.contains(userId)) { onlineUserList_.add(userId); } UserLoginLogEntry loginEntry = new UserLoginLogEntry(userId, onlineUserList_.size(), org.exoplatform.ks.common.Utils.getGreenwichMeanTime()); queue.add(loginEntry); } /** * {@inheritDoc} */ public void userLogout(String userId) throws Exception { if (onlineUserList_.contains(userId)) { onlineUserList_.remove(userId); } } /** * {@inheritDoc} */ public boolean isOnline(String userId) throws Exception { try { if (onlineUserList_.contains(userId)) return true; } catch (Exception e) { log.error("could not determine if user " + userId + " is online", e); } return false; } /** * {@inheritDoc} */ public List<String> getOnlineUsers() throws Exception { return onlineUserList_; } /** * {@inheritDoc} */ public String getLastLogin() throws Exception { return lastLogin_; } /** * {@inheritDoc} */ public SendMessageInfo getMessageInfo(String name) throws Exception { return storage.getMessageInfo(name); } /** * {@inheritDoc} */ public Iterator<SendMessageInfo> getPendingMessages() throws Exception { return storage.getPendingMessages(); } /** * {@inheritDoc} */ public JCRPageList searchUserProfile(String userSearch) throws Exception { return storage.searchUserProfile(userSearch); } /** * {@inheritDoc} */ public boolean isAdminRole(String userName) throws Exception { return storage.isAdminRole(userName); } /** * {@inheritDoc} */ public List<Post> getNewPosts(int number) throws Exception { return storage.getNewPosts(number); } /** * {@inheritDoc} */ public List<Post> getRecentPostsForUser(String userName, int number) throws Exception { return storage.getRecentPostsForUser(userName, number); } public NodeIterator search(String queryString) throws Exception { return storage.search(queryString); } /** * {@inheritDoc} */ public void evaluateActiveUsers(String query) throws Exception { storage.evaluateActiveUsers(query); } /** * {@inheritDoc} */ public void updateTopicAccess(String userId, String topicId) throws Exception { storage.updateTopicAccess(userId, topicId); } /** * {@inheritDoc} */ public void updateForumAccess(String userId, String forumId) throws Exception { storage.updateForumAccess(userId, forumId); } /** * {@inheritDoc} */ public Object exportXML(String categoryId, String forumId, List<String> objectIds, String nodePath, ByteArrayOutputStream bos, boolean isExportAll) throws Exception { return storage.exportXML(categoryId, forumId, objectIds, nodePath, bos, isExportAll); } /** * {@inheritDoc} */ public List<UserProfile> getQuickProfiles(List<String> userList) throws Exception { return storage.getQuickProfiles(userList); } /** * {@inheritDoc} */ public UserProfile getQuickProfile(String userName) throws Exception { return storage.getQuickProfile(userName); } /** * {@inheritDoc} */ public String getScreenName(String userName) throws Exception { return storage.getScreenName(userName); } /** * {@inheritDoc} */ public UserProfile getUserInformations(UserProfile userProfile) throws Exception { return storage.getUserInformations(userProfile); } /** * {@inheritDoc} */ public UserProfile getDefaultUserProfile(String userName, String ip) throws Exception { return storage.getDefaultUserProfile(userName, ip); } /** * {@inheritDoc} */ public UserProfile updateUserProfileSetting(UserProfile userProfile) throws Exception { return storage.updateUserProfileSetting(userProfile); } /** * {@inheritDoc} */ public List<String> getBookmarks(String userName) throws Exception { return storage.getBookmarks(userName); } /** * {@inheritDoc} */ public UserProfile getUserSettingProfile(String userName) throws Exception { return storage.getUserSettingProfile(userName); } /** * {@inheritDoc} */ public void saveUserSettingProfile(UserProfile userProfile) throws Exception { storage.saveUserSettingProfile(userProfile); } /** * {@inheritDoc} */ public void importXML(String nodePath, ByteArrayInputStream bis, int typeImport) throws Exception { storage.importXML(nodePath, bis, typeImport); } /** * {@inheritDoc} public void updateDataImported() throws Exception{ storage.updateDataImported(); } */ /** * {@inheritDoc} */ public void updateForum(String path) throws Exception { storage.updateForum(path); } /** * {@inheritDoc} */ public List<String> getBanList() throws Exception { return storage.getBanList(); } /** * {@inheritDoc} */ public boolean addBanIP(String ip) throws Exception { return storage.addBanIP(ip); } /** * {@inheritDoc} */ public void removeBan(String ip) throws Exception { storage.removeBan(ip); } /** * {@inheritDoc} */ public JCRPageList getListPostsByIP(String ip, String strOrderBy) throws Exception { return storage.getListPostsByIP(ip, strOrderBy); } /** * {@inheritDoc} */ public List<String> getForumBanList(String forumId) throws Exception { return storage.getForumBanList(forumId); } /** * {@inheritDoc} */ public boolean addBanIPForum(String ip, String forumId) throws Exception { return storage.addBanIPForum(ip, forumId); } /** * {@inheritDoc} */ public void removeBanIPForum(String ip, String forumId) throws Exception { storage.removeBanIPForum(ip, forumId); } /** * {@inheritDoc} */ public void registerListenerForCategory(String categoryId) throws Exception { storage.registerListenerForCategory(categoryId); } /** * {@inheritDoc} */ public void unRegisterListenerForCategory(String path) throws Exception { storage.unRegisterListenerForCategory(path); } /** * {@inheritDoc} */ public ForumAttachment getUserAvatar(String userName) throws Exception { return storage.getUserAvatar(userName); } /** * {@inheritDoc} */ public void saveUserAvatar(String userId, ForumAttachment fileAttachment) throws Exception { storage.saveUserAvatar(userId, fileAttachment); } /** * {@inheritDoc} */ public void setDefaultAvatar(String userName) throws Exception { storage.setDefaultAvatar(userName); } /** * {@inheritDoc} */ public List<Watch> getWatchByUser(String userId) throws Exception { return storage.getWatchByUser(userId); } /** * {@inheritDoc} */ public void updateEmailWatch(List<String> listNodeId, String newEmailAdd, String userId) throws Exception { storage.updateEmailWatch(listNodeId, newEmailAdd, userId); } /** * {@inheritDoc} */ public List<PruneSetting> getAllPruneSetting() throws Exception { return storage.getAllPruneSetting(); } /** * {@inheritDoc} */ public void savePruneSetting(PruneSetting pruneSetting) throws Exception { storage.savePruneSetting(pruneSetting); } /** * {@inheritDoc} */ public PruneSetting getPruneSetting(String forumPath) throws Exception { return storage.getPruneSetting(forumPath); } /** * {@inheritDoc} */ public void runPrune(PruneSetting pSetting) throws Exception { storage.runPrune(pSetting); } /** * {@inheritDoc} */ public void runPrune(String forumPath) throws Exception { storage.runPrune(forumPath); } /** * {@inheritDoc} */ public long checkPrune(PruneSetting pSetting) throws Exception { return storage.checkPrune(pSetting); } /** * {@inheritDoc} */ public JCRPageList getPageTopicByType(String type) throws Exception { return storage.getPageTopicByType(type); } /** * {@inheritDoc} */ public TopicType getTopicType(String Id) throws Exception { return storage.getTopicType(Id); } /** * {@inheritDoc} */ public List<TopicType> getTopicTypes() throws Exception { return storage.getTopicTypes(); } /** * {@inheritDoc} */ public void removeTopicType(String topicTypeId) throws Exception { storage.removeTopicType(topicTypeId); } /** * {@inheritDoc} */ public void saveTopicType(TopicType topicType) throws Exception { storage.saveTopicType(topicType); } /** * {@inheritDoc} */ public void updateUserProfileInfo(String name) throws Exception { storage.updateUserProfileInfo(name); } public DataStorage getStorage() { return storage; } public void setStorage(DataStorage storage) { this.storage = storage; } public ForumServiceManaged getManagementView() { return managementView; } public void setManagementView(ForumServiceManaged managementView) { this.managementView = managementView; } public ForumStatisticsService getForumStatisticsService() { return forumStatisticsService; } public void setForumStatisticsService(ForumStatisticsService forumStatisticsService) { this.forumStatisticsService = forumStatisticsService; } public JobSchedulerService getJobSchedulerService() { return jobSchedulerService; } public void setJobSchedulerService(JobSchedulerService jobSchedulerService) { this.jobSchedulerService = jobSchedulerService; } public InputStream createForumRss(String objectId, String link) throws Exception { return storage.createForumRss(objectId, link); } public InputStream createUserRss(String userId, String link) throws Exception { return storage.createUserRss(userId, link); } public void addListenerPlugin(ForumEventListener listener) throws Exception { listeners_.add(listener); } }