package org.exoplatform.forum.bench; import java.text.MessageFormat; import java.util.List; import org.exoplatform.container.xml.InitParams; import org.exoplatform.forum.service.Category; import org.exoplatform.forum.service.Forum; import org.exoplatform.forum.service.ForumService; import org.exoplatform.forum.service.MessageBuilder; import org.exoplatform.forum.service.Post; import org.exoplatform.forum.service.Topic; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.picocontainer.Startable; public class ForumDataInitializer implements Startable { private static Log log = ExoLogger.getLogger(ForumDataInitializer.class); private ForumService forumService; private ForumDataProvider provider; public ForumDataInitializer(InitParams initParams, ForumService forumService, ForumDataProvider provider) { this.provider = provider; this.forumService = forumService; } public void start() { log.info("Initializing Forum data loader..."); try { initCategories(); } catch (Exception e) { log.error("Failed to init : ", e); } log.info("Forum data loaded!"); } private void initCategories() throws Exception { if (provider.isInitialized()) { log.info("Categories seem to be already initialized. Skipping."); return; } long topicsCount = 0; long forumsCount = 0; long postCount = 0; long categoriesWeight = 0; List<Category> categories = provider.findCategories(); long categoriesCount = 0; for (Category category : categories) { forumService.saveCategory(category, true); categoriesCount++; String categoryId = category.getId(); List<Forum> forums = provider.findForumsByCategory(categoryId); log.info("Category " + categoriesCount + "/" + categories.size() + " with " + forums.size() + " forums"); long forumsWeight = 0; forumsCount += forums.size(); int forumNum = 0; for (Forum forum : forums) { forumService.saveForum(categoryId, forum, true); String forumId = forum.getId(); long topicsWeight = 0; List<Topic> topics = provider.findTopicsByForum(forum); log.info("\tForum " + (++forumNum) + "/" + forums.size() + " with " + topics.size() + " topics"); int topicNum = 0; for (Topic topic : topics) { forumService.saveTopic(categoryId, forumId, topic, true, false, new MessageBuilder()); // log.info("Created topic " + topic.getTopicName()); String topicId = topic.getId(); List<Post> posts = provider.fingPostsByTopic(topic); // log.info("Initializing new topic with "+ posts.size()+ " posts"); postCount += posts.size(); long postsWeight = 0; long t1 = System.currentTimeMillis(); for (Post post : posts) { forumService.savePost(categoryId, forumId, topicId, post, true, new MessageBuilder()); long messageWeight = post.getMessage().length() * 2; // in bytes postsWeight += messageWeight; } double elapsed = (System.currentTimeMillis() - t1); double rate = ((postsWeight / 1024) / (elapsed / 1000)); String srate = MessageFormat.format("({0,number,#.#} K/s)", rate); log.info("\t\tTopic " + (++topicNum) + "/" + topics.size() + "\t" + posts.size() + " posts in " + elapsed + "ms " + srate); topicsWeight += postsWeight; } // end topics loop log.info("\t\t " + topics.size() + " topics " + MessageFormat.format("({0,number,#.#} K)", (topicsWeight / 1024)) + " total posts=" + postCount); forumsWeight += topicsWeight; topicsCount += topics.size(); } log.info("\t" + forums.size() + " forums " + MessageFormat.format("({0,number,#.#} K)", (forumsWeight / 1024)) + " total posts=" + postCount); categoriesWeight += forumsWeight; } log.info("INITIALIZED : categories=" + categories.size() + " / forums=" + forumsCount + " / topics=" + topicsCount + " / posts=" + postCount + MessageFormat.format(" ({0,number,#.#} K)", (categoriesWeight / 1024))); } public void stop() { } }