/*
* Copyright (c) JForum Team. All rights reserved.
*
* The software in this package is published under the terms of the LGPL
* license a copy of which has been included with this distribution in the
* license.txt file.
*
* The JForum Project
* http://www.jforum.net
*/
package net.jforum.services;
import java.util.List;
import net.jforum.core.exceptions.ValidationException;
import net.jforum.entities.Forum;
import net.jforum.repository.ForumRepository;
import org.apache.commons.lang.StringUtils;
import br.com.caelum.vraptor.ioc.Component;
/**
* @author Rafael Steil
*/
@Component
public class ForumService {
private ForumRepository repository;
public ForumService(ForumRepository repository) {
this.repository = repository;
}
/**
* Add a new forum
* @param forum
*/
public void add(Forum forum) {
this.applyCommonConstraints(forum);
if (forum.getId() > 0) {
throw new ValidationException("This appears to be an existing forum (id > 0). Please use update() instead.");
}
this.repository.add(forum);
}
/**
* Updates the information of an existing forum
* @param forum
*/
public void update(Forum forum) {
this.applyCommonConstraints(forum);
if (forum.getId() == 0) {
throw new ValidationException("update() expects a forum with an existing id");
}
Forum currentForum = this.repository.get(forum.getId());
currentForum.setName(forum.getName());
currentForum.setDescription(forum.getDescription());
currentForum.setModerated(forum.isModerated());
currentForum.setAllowAnonymousPosts(forum.isAllowAnonymousPosts());
currentForum.setCategory(forum.getCategory());
this.repository.update(currentForum);
}
/**
* Deletes on or more forums
* @param ids
*/
public void delete(int... ids) {
if (ids != null) {
for (int id : ids) {
Forum forum = this.repository.get(id);
this.repository.remove(forum);
}
}
}
/**
* Changes the forum order one level up
* @param forumId
*/
public void upForumOrder(int forumId) {
this.processOrdering(true, forumId);
}
/**
* Changes the forum order one level down
* @param forumId
*/
public void downForumOrder(int forumId) {
this.processOrdering(false, forumId);
}
/**
* Changes the order of the specified forum, adding it one level or one level down
* @param up if true, sets the forum one level up. If false, one level down
* @param forumId the id of the category to change
*/
private void processOrdering(boolean up, int forumId) {
Forum toChange = this.repository.get(forumId);
List<Forum> forums = toChange.getCategory().getForums();
int index = forums.indexOf(toChange);
if (index > -1 && (up && index > 0) || (!up && index + 1 < forums.size())) {
Forum otherForum = up ? forums.get(index - 1) : forums.get(index + 1);
int oldOrder = toChange.getDisplayOrder();
toChange.setDisplayOrder(otherForum.getDisplayOrder());
otherForum.setDisplayOrder(oldOrder);
this.repository.update(toChange);
this.repository.update(otherForum);
}
}
private void applyCommonConstraints(Forum forum) {
if (forum == null) {
throw new NullPointerException("Cannot save a null forum");
}
if (forum.getCategory() == null || forum.getCategory().getId() == 0) {
throw new ValidationException("A forum must be associated to a category");
}
if (StringUtils.isEmpty(forum.getName())) {
throw new ValidationException("A forum must have a name");
}
}
}