/*
* 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 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.extras.injection.forum;
import java.util.HashMap;
import java.util.Random;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.forum.service.Category;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.service.ForumService;
import org.exoplatform.forum.service.Post;
import org.exoplatform.forum.service.Topic;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.service.impl.JCRDataStorage;
import org.exoplatform.forum.common.jcr.KSDataLocation;
import org.exoplatform.forum.common.jcr.PropertyReader;
import org.exoplatform.forum.extras.injection.utils.ExoNameGenerator;
import org.exoplatform.forum.extras.injection.utils.LoremIpsum4J;
import org.exoplatform.services.bench.DataInjector;
import org.exoplatform.services.jcr.util.IdGenerator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.UserHandler;
/**
* @author <a href="mailto:thanhvc@exoplatform.com">ThanhVu</a>
* @version $Revision$
*/
public abstract class AbstractForumInjector extends DataInjector {
/** . */
private static Log LOG = ExoLogger.getLogger(ForumInjector.class);
/** . */
private final static String DEFAULT_USER_BASE = "bench.user";
/** . */
private final static String DEFAULT_CATEGORY_BASE = "bench.cat";
/** . */
private final static String DEFAULT_FORUM_BASE = "bench.forum";
/** . */
private final static String DEFAULT_TOPIC_BASE = "bench.topic";
/** . */
private final static String DEFAULT_POST_BASE = "bench.post";
/** . */
private final static int DEFAULT_BYTE_SIZE_BASE = 100;
/** . */
protected final static String PASSWORD = "exo";
/** . */
protected final static String DOMAIN = "exoplatform.int";
/** . */
protected String userBase;
/** . */
protected String categoryBase;
/** . */
protected String forumBase;
/** . */
protected String topicBase;
/** . */
protected String postBase;
/** . */
protected int byteSizeBase;
/** . */
protected int userNumber;
/** . */
protected int categoryNumber;
/** . */
protected int forumNumber;
/** . */
protected int topicNumber;
/** . */
protected int postNumber;
/** . */
protected final OrganizationService organizationService;
/** . */
protected final ForumService forumService;
/** . */
protected final KSDataLocation locator;
/** . */
protected final UserHandler userHandler;
/** . */
protected final Random random;
/** . */
protected ExoNameGenerator exoNameGenerator;
/** . */
protected LoremIpsum4J lorem;
public AbstractForumInjector() {
PortalContainer c = PortalContainer.getInstance();
this.forumService = (ForumService) c.getComponentInstanceOfType(ForumService.class);
this.organizationService = (OrganizationService) c.getComponentInstanceOfType(OrganizationService.class);
this.locator = (KSDataLocation) c.getComponentInstanceOfType(KSDataLocation.class);
//
this.userHandler = organizationService.getUserHandler();
this.exoNameGenerator = new ExoNameGenerator();
this.random = new Random();
this.lorem = new LoremIpsum4J();
}
public void init(String userPrefix, String categoryPrefix, String forumPrefix, String topicPrefix, String postPrefix, int byteSize) {
//
userBase = (userPrefix == null ? DEFAULT_USER_BASE : userPrefix);
categoryBase = (categoryPrefix == null ? DEFAULT_CATEGORY_BASE : categoryPrefix);
forumBase = (forumPrefix == null ? DEFAULT_FORUM_BASE : forumPrefix);
topicBase = (topicPrefix == null ? DEFAULT_TOPIC_BASE : topicPrefix);
postBase = (postPrefix == null ? DEFAULT_POST_BASE : postPrefix);
byteSizeBase = (byteSize == 0 ? DEFAULT_BYTE_SIZE_BASE : byteSize);
//
categoryNumber = 0;
forumNumber = 0;
topicNumber = 0;
postNumber = 0;
try {
userNumber = userNumber(userBase);
categoryNumber = categoryNumber(categoryBase);
forumNumber = forumNumber(forumBase);
topicNumber = topicNumber(topicBase);
postNumber = postNumber(postBase);
}
catch (Exception e) {
// If no user is existing, set keep 0 as value.
LOG.warn("Error when initilizing data.", e);
}
//
LOG.info("Initial user number : " + userNumber);
LOG.info("Initial category number : " + categoryNumber);
LOG.info("Initial forum number : " + forumNumber);
LOG.info("Initial topic number : " + topicNumber);
LOG.info("Initial post number : " + postNumber);
}
@Override
public Log getLog() {
return ExoLogger.getExoLogger(this.getClass());
}
@Override
public Object execute(HashMap<String, String> stringStringHashMap) throws Exception {
return null;
}
@Override
public void reject(HashMap<String, String> stringStringHashMap) throws Exception {
}
public int userNumber(String base) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getUserProfilesLocation()).append("/element(*,");
sb.append(Utils.USER_PROFILES_TYPE).append(")[jcr:like(exo:userId, '%").append(base).append("%')]");
return (int)forumService.search(sb.toString()).getSize();
}
public int categoryNumber(String base) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("/element(*,");
sb.append(Utils.EXO_FORUM_CATEGORY).append(")[jcr:like(exo:name, '%").append(base).append("%')]");
return (int)forumService.search(sb.toString()).getSize();
}
public int forumNumber(String base) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_FORUM).append(")[jcr:like(exo:name, '%").append(base).append("%')]");
return (int)forumService.search(sb.toString()).getSize();
}
public int topicNumber(String base) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_TOPIC).append(")[jcr:like(exo:name, '%").append(base).append("%')]");
return (int)forumService.search(sb.toString()).getSize();
}
public int postNumber(String base) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_POST).append(")[jcr:like(exo:name, '%").append(base).append("%')]");
return (int)forumService.search(sb.toString()).getSize();
}
public Category getCategoryByName(String catName) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("/element(*,");
sb.append(Utils.EXO_FORUM_CATEGORY).append(")[jcr:like(exo:name, '%").append(catName).append("%')]");
NodeIterator iter = forumService.search(sb.toString());
if (iter.hasNext()) {
Node cateNode = (Node)iter.next();
Category cat = new Category(cateNode.getName());
cat.setPath(cateNode.getPath());
PropertyReader reader = new PropertyReader(cateNode);
cat.setOwner(reader.string(Utils.EXO_OWNER));
cat.setCategoryName(reader.string(Utils.EXO_NAME));
cat.setViewer(reader.strings(Utils.EXO_VIEWER));
cat.setCreateTopicRole(reader.strings(Utils.EXO_CREATE_TOPIC_ROLE));
cat.setPoster(reader.strings(Utils.EXO_POSTER));
return cat;
}
return null;
}
public Forum getForumByName(String forumName) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_FORUM).append(")[jcr:like(exo:name, '%").append(forumName).append("%')]");
NodeIterator iter = forumService.search(sb.toString());
if (iter.hasNext()) {
Node forumNode = (Node)iter.next();
Forum forum = new Forum();
PropertyReader reader = new PropertyReader(forumNode);
forum.setId(forumNode.getName());
forum.setPath(forumNode.getPath());
forum.setOwner(reader.string(Utils.EXO_OWNER));
forum.setForumName(reader.string(Utils.EXO_NAME));
forum.setViewer(reader.strings(Utils.EXO_VIEWER));
return forum;
}
return null;
}
public Category getCategoryByForumName(String forumName) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_FORUM).append(")[jcr:like(exo:name, '%").append(forumName).append("%')]");
NodeIterator iter = forumService.search(sb.toString());
if (iter.hasNext()) {
Node forumNode = (Node)iter.next();
if (forumNode.getParent() != null) {
Node cateNode = forumNode.getParent();
Category cat = new Category(cateNode.getName());
cat.setPath(cateNode.getPath());
PropertyReader reader = new PropertyReader(cateNode);
cat.setOwner(reader.string(Utils.EXO_OWNER));
cat.setCategoryName(reader.string(Utils.EXO_NAME));
return cat;
}
}
return null;
}
public Topic getTopicByName(String topicName) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_TOPIC).append(")[jcr:like(exo:name, '%").append(topicName).append("%')]");
NodeIterator iter = forumService.search(sb.toString());
if (iter.hasNext()) {
Node topicNode = (Node)iter.next();
Topic topicNew = new Topic();
PropertyReader reader = new PropertyReader(topicNode);
topicNew.setId(topicNode.getName());
topicNew.setPath(topicNode.getPath());
topicNew.setTopicName(reader.string(Utils.EXO_NAME));
topicNew.setCanView(reader.strings(Utils.EXO_CAN_VIEW, new String[] {}));
return topicNew;
}
return null;
}
public Post getPostByName(String postName) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_POST).append(")[jcr:like(exo:name, '%").append(postName).append("%')]");
NodeIterator iter = forumService.search(sb.toString());
if (iter.hasNext()) {
Node postNode = (Node)iter.next();
Post post = new Post();
PropertyReader reader = new PropertyReader(postNode);
post.setId(postNode.getName());
post.setPath(postNode.getPath());
post.setMessage(reader.string(Utils.EXO_MESSAGE));
post.setName(reader.string(Utils.EXO_NAME));
post.setNumberAttach(reader.l(Utils.EXO_NUMBER_ATTACH));
if (post.getNumberAttach() > 0) {
post.setAttachments(JCRDataStorage.getAttachmentsByNode(postNode));
}
post.setUserPrivate(reader.strings(Utils.EXO_USER_PRIVATE));
return post;
}
return null;
}
public Topic getTopicByPostName(String postName) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_POST).append(")[jcr:like(exo:name, '%").append(postName).append("%')]");
NodeIterator iter = forumService.search(sb.toString());
if (iter.hasNext()) {
Node postNode = (Node)iter.next();
if (postNode.getParent() != null) {
Node topicNode = postNode.getParent();
Topic topicNew = new Topic();
PropertyReader reader = new PropertyReader(topicNode);
topicNew.setId(topicNode.getName());
topicNew.setPath(topicNode.getPath());
topicNew.setTopicName(reader.string(Utils.EXO_NAME));
return topicNew;
}
}
return null;
}
public Forum getForumByTopicName(String topicName) throws Exception {
StringBuffer sb = new StringBuffer(Utils.JCR_ROOT);
sb.append("/").append(locator.getForumCategoriesLocation()).append("//element(*,");
sb.append(Utils.EXO_TOPIC).append(")[jcr:like(exo:name, '%").append(topicName).append("%')]");
NodeIterator iter = forumService.search(sb.toString());
if (iter.hasNext()) {
Node topicNode = (Node)iter.next();
if (topicNode.getParent() != null) {
//
Node forumNode = topicNode.getParent();
Forum forum = new Forum();
PropertyReader reader = new PropertyReader(forumNode);
forum.setId(forumNode.getName());
forum.setPath(forumNode.getPath());
forum.setOwner(reader.string(Utils.EXO_OWNER));
forum.setForumName(reader.string(Utils.EXO_NAME));
return forum;
}
}
return null;
}
protected String userName() {
return userBase + userNumber;
}
protected String categoryName() {
return categoryBase + categoryNumber;
}
protected String forumName() {
return forumBase + forumNumber;
}
protected String topicName() {
return topicBase + topicNumber;
}
protected String postName() {
return postBase + postNumber;
}
protected String getId(String type) {
return type + IdGenerator.generate();
}
protected int param(HashMap<String, String> params, String name) {
//
if (params == null) {
throw new NullPointerException();
}
//
if (name == null) {
throw new NullPointerException();
}
//
try {
String value = params.get(name);
if (value != null) {
return Integer.valueOf(value);
}
} catch (NumberFormatException e) {
LOG.warn("Integer number expected for property " + name);
}
return 0;
}
}