net.jforum.services.CategoryService.java Source code

Java tutorial

Introduction

Here is the source code for net.jforum.services.CategoryService.java

Source

/*
 * 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.Category;
import net.jforum.repository.CategoryRepository;

import org.apache.commons.lang.StringUtils;

import br.com.caelum.vraptor.ioc.Component;

/**
 * @author Rafael Steil
 */
@Component
public class CategoryService {
    private CategoryRepository repository;

    public CategoryService(CategoryRepository repository) {
        this.repository = repository;
    }

    /**
     * Adds a new category
     * @param category
     * @throws ValidationException if the instance is not good for saving
     */
    public void add(Category category) {
        this.applyCommonConstraints(category);

        if (category.getId() > 0) {
            throw new ValidationException(
                    "This appears to be an existing category (id > 0). Please use update() instead");
        }

        this.repository.add(category);
    }

    /**
     * Deletes on or more categories
     * @param ids
     */
    public void delete(int... ids) {
        if (ids != null) {
            for (int id : ids) {
                Category c = this.repository.get(id);
                this.repository.remove(c);
            }
        }
    }

    /**
     * Updates an existing category
     * @param category
     */
    public void update(Category category) {
        this.applyCommonConstraints(category);

        if (category.getId() == 0) {
            throw new ValidationException("update() expects a category with an existing id");
        }

        this.repository.update(category);
    }

    /**
     * Changes the category order one level up
     * @param categoryId
     */
    public void upCategoryOrder(int categoryId) {
        this.processOrdering(true, categoryId);
    }

    /**
     * Changes the category order one level down
     * @param categoryId
     */
    public void downCategoryOrder(int categoryId) {
        this.processOrdering(false, categoryId);
    }

    /**
     * Changes the order of the specified category, adding it
     * one level or one level down
     * @param up if true, sets the category one level up. If false, one level down
     * @param categoryId the id of the category to change
     */
    private void processOrdering(boolean up, int categoryId) {
        Category toChange = this.repository.get(categoryId);
        List<Category> categories = this.repository.getAllCategories();

        int index = categories.indexOf(toChange);

        if (index > -1 && (up && index > 0) || (!up && index + 1 < categories.size())) {
            Category otherCategory = up ? categories.get(index - 1) : categories.get(index + 1);

            int oldOrder = toChange.getDisplayOrder();

            toChange.setDisplayOrder(otherCategory.getDisplayOrder());
            otherCategory.setDisplayOrder(oldOrder);

            this.repository.update(toChange);
            this.repository.update(otherCategory);
        }
    }

    private void applyCommonConstraints(Category c) {
        if (c == null) {
            throw new NullPointerException("Cannot save a null category");
        }

        if (StringUtils.isEmpty(c.getName())) {
            throw new ValidationException("Category name cannot be blank or null");
        }
    }
}