CCM NG: CategoryManager: Only method signatures and JavaDoc, tests and implementations will follow.
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3491 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
619a0abadf
commit
d1baf9e8e7
|
|
@ -0,0 +1,285 @@
|
|||
/*
|
||||
* Copyright (C) 2015 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.categorization;
|
||||
|
||||
import org.libreccm.core.CcmObject;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
|
||||
/**
|
||||
* The {@code CategoryManager} provides several helper methods for managing
|
||||
* categories, their sub categories and the objects assigned to a categories.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
public class CategoryManager {
|
||||
|
||||
/**
|
||||
* A {@link CategoryRepository} instance used to interact with the database.
|
||||
*/
|
||||
@Inject
|
||||
private transient CategoryRepository categoryRepo;
|
||||
|
||||
/**
|
||||
* Assigns an category to an object. The object is added at the position
|
||||
* specified by the {@code order} parameter. If that position is already
|
||||
* occupied the object currently assigned to that position and the objects
|
||||
* after that object are moved one position down (the value of their
|
||||
* {@code order} property is increased by one).
|
||||
*
|
||||
* If the position provided by the {@code order} parameter is larger than
|
||||
* the value of the {@code order} property of the last object plus 1 the
|
||||
* order property is set the the value of the {@code order} property of the
|
||||
* last object plus one.
|
||||
*
|
||||
* If the order property is less than 0, the object is inserted at first
|
||||
* position and the value of the {@code order} property is set to {@code 0}.
|
||||
* The value of the {@code order} property of all other objects is increased
|
||||
* by one.
|
||||
*
|
||||
* If the object is already assigned to the category and the value of the
|
||||
* {@code order} property is different than the provided value the
|
||||
* {@code order} property is set the provided value. No further action will
|
||||
* executed.
|
||||
*
|
||||
* Please note: Because the association between {@link Category} and {@code
|
||||
* CcmObject} is a many-to-many association we use an association object to
|
||||
* store the additional attributes of the association. The
|
||||
* {@link Categorization} entity is completely managed by this class.
|
||||
*
|
||||
* If either {@code object} or the {@code category} parameter are
|
||||
* {@code null} an {@link IllegalArgumentException} is thrown because
|
||||
* passing {@code null} to this method indicates a programming error.
|
||||
*
|
||||
* @param object The object to assign to the category. Can never be
|
||||
* {@code null}.
|
||||
* @param category The category to which the object should be assigned. Can
|
||||
* never be {@code null}.
|
||||
* @param order Order value specifying the sort order of the objects
|
||||
* assigned to category.
|
||||
*/
|
||||
public void addObjectToCategory(final CcmObject object,
|
||||
final Category category,
|
||||
final long order) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a object from a category. Additionally to removing the object
|
||||
* from the category this method also upgrades the order of all objects
|
||||
* sorted in after the removed object so that the values are consistent
|
||||
* without gaps (which may cause trouble).
|
||||
*
|
||||
* If either the {@code object} or the {@code category} parameter are
|
||||
* {@code null} an {@link IllegalArgumentException} exception is thrown
|
||||
* because passing {@code null} to either parameter indicates a programming
|
||||
* error.
|
||||
*
|
||||
* @param object The object to remove from the category. Can never be
|
||||
* {@code null}.
|
||||
* @param category The category from which the object should be removed. Can
|
||||
* never be {@code null}.
|
||||
*
|
||||
* @throws ObjectNotAssignedToCategoryException Thrown is the provided
|
||||
* object is <em>not</em>
|
||||
* assigned to the provided category.
|
||||
*/
|
||||
public void removeObjectFromCategory(final CcmObject object,
|
||||
final Category category)
|
||||
throws ObjectNotAssignedToCategoryException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Increases the value of the {@code order} property of the provided object.
|
||||
* The value of the {@code order} property of the object after the provided
|
||||
* is decreased by one. Effectively the two objects are swapped.
|
||||
*
|
||||
* @param object The object which {@code order} property is decreased.
|
||||
* Can't be {@code null}.
|
||||
* @param category The category to which the object is assigned. Can't be
|
||||
* {@code null}.
|
||||
*
|
||||
* @throws ObjectNotAssignedToCategoryException Throws if the provided
|
||||
* object is not assigned to
|
||||
* the provided category.
|
||||
*/
|
||||
public void increaseObjectOrder(final CcmObject object,
|
||||
final Category category)
|
||||
throws ObjectNotAssignedToCategoryException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Decreases the value of the {@code order} property of the provided object.
|
||||
* The value of the {@code order} property of the object before the provided
|
||||
* is increased by one. Effectively the two objects are swapped.
|
||||
*
|
||||
* @param object The object which {@code order} property is decreased.
|
||||
* Can't be {@code null}.
|
||||
* @param category The category to which the object is assigned. Can't be
|
||||
* {@code null}.
|
||||
*
|
||||
* @throws ObjectNotAssignedToCategoryException Throws if the provided
|
||||
* object is not assigned to
|
||||
* the provided category.
|
||||
*/
|
||||
public void decreaseObjectOrder(final CcmObject object,
|
||||
final Category category)
|
||||
throws ObjectNotAssignedToCategoryException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Swaps two objects assigned to the same category. More exactly the values
|
||||
* of the {@code order} property of the {@link Categorization} of the
|
||||
* provided objects are swapped.
|
||||
*
|
||||
* @param objectA Th first object. Can't be {@code null}.
|
||||
* @param objectB The second object. Can't be {@code null}.
|
||||
* @param category Can't be {@code null}. The category to which both objects
|
||||
* are assigned. Can't be {@code null}.
|
||||
*
|
||||
* @throws ObjectNotAssignedToCategoryException Thrown if one or both of the
|
||||
* provided objects are not
|
||||
* assigned to the provided
|
||||
* category.
|
||||
*/
|
||||
public void swapObjects(final CcmObject objectA,
|
||||
final CcmObject objectB,
|
||||
final Category category)
|
||||
throws ObjectNotAssignedToCategoryException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a category as an subcategory to another category. If the category is
|
||||
* assigned to another category that association is removed.
|
||||
*
|
||||
* The method will ensure that values of the {@code order} properties of all
|
||||
* subcategories will remain consistent. If the provided position is already
|
||||
* occupied a the values of the {@code order} properties of the object
|
||||
* occupying the provided positions and of all following objects are
|
||||
* increased by one.
|
||||
*
|
||||
* If the provided value is larger than the value of the {@code order}
|
||||
* property of the last object the value of the {@code property} is set the
|
||||
* value of the of the {@code order} property of the last object plus one.
|
||||
*
|
||||
* The provided value is less than {@code 0} the object will be the first
|
||||
* one and the value of the {@code order} property will be set to {@code 0}.
|
||||
*
|
||||
* If the provided category is already assigned to the provided parent
|
||||
* category only the value of the {@code order} property is updated.
|
||||
*
|
||||
* @param subCategory The category to add as subcategory. Can't be
|
||||
* {@code null}.
|
||||
* @param parentCategory The category to which the category is added as
|
||||
* subcategory. Can't be {@code null}.
|
||||
* @param order The value for the {@code order} property of the
|
||||
* association.
|
||||
*/
|
||||
public void addSubCategoryToCategory(final Category subCategory,
|
||||
final Category parentCategory,
|
||||
final long order) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a sub category from its parent category. If the category is not
|
||||
* assigned to another parent category (or as root category to a
|
||||
* {@link Domain} the category becomes orphaned.
|
||||
*
|
||||
* @param subCategory The subcategory to remove from the parent category.
|
||||
* Can't be {@code null}.
|
||||
* @param parentCategory The parent category. Can't be {@code null}.
|
||||
*
|
||||
* @throws NotASubCategoryException If the provided subcategory is not
|
||||
* assigned to the provided parent
|
||||
* category.
|
||||
*/
|
||||
public void removeSubCategoryFromCategory(final Category subCategory,
|
||||
final Category parentCategory)
|
||||
throws NotASubCategoryException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Increases the value of the {@code order} property of the provided
|
||||
* category by one. The value of the {@code order} property of the following
|
||||
* objects is decreased by one. If the object is the last one this method
|
||||
* has not effect.
|
||||
*
|
||||
* @param subCategory The category which order property is increased.
|
||||
* Can't be {@code null}.
|
||||
* @param parentCategory The parent category of the category. Can't be
|
||||
* {@code null}.
|
||||
*
|
||||
* @throws NotASubCategoryException If the provided subcategory is not a
|
||||
* subcategory of the provided parent
|
||||
* category.
|
||||
*/
|
||||
public void increaseCategoryOrder(final Category subCategory,
|
||||
final Category parentCategory)
|
||||
throws NotASubCategoryException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Decreases the value of the {@code order} property of the provided
|
||||
* category by one. The value of the {@code order} property of the
|
||||
* preceeding objects is increased by one. If the object is the last one
|
||||
* this method has not effect.
|
||||
*
|
||||
* @param subCategory The category which order property is increased.
|
||||
* Can't be {@code null}.
|
||||
* @param parentCategory The parent category of the category. Can't be
|
||||
* {@code null}.
|
||||
*
|
||||
* @throws NotASubCategoryException If the provided subcategory is not a
|
||||
* subcategory of the provided parent
|
||||
* category.
|
||||
*/
|
||||
public void decreaseCategoryOrder(final Category subCategory,
|
||||
final Category parentCategory)
|
||||
throws NotASubCategoryException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Swaps the values of the {@code order} properties of two categories.
|
||||
*
|
||||
* @param subCategoryA The first category. Can't be {@code null}.
|
||||
* @param subCategoryB The second category. Can't be {@code null}.
|
||||
* @param parentCategory The parent category of both subcategories. Can't be
|
||||
* {@code null}.
|
||||
*
|
||||
* @throws NotASubCategoryException If one or both categories are not
|
||||
* subcategories of the provided parent category.
|
||||
*/
|
||||
public void swapCategories(final Category subCategoryA,
|
||||
final Category subCategoryB,
|
||||
final Category parentCategory)
|
||||
throws NotASubCategoryException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -54,5 +54,16 @@ public class CategoryRepository extends AbstractEntityRepository<Long, Category>
|
|||
|
||||
return query.getResultList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all categories which are not assigned to another category as
|
||||
* subcategory or the an {@link Domain} as root category.
|
||||
*
|
||||
* @return A list of all orphaned categories. Normally this list should be
|
||||
* empty.
|
||||
*/
|
||||
public List<Category> getOrphanedCategories() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Copyright (C) 2015 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package org.libreccm.categorization;
|
||||
|
||||
/**
|
||||
* Indicates that a category passed to a method is not a sub category of another
|
||||
* category also passed to the method.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class NotASubCategoryException extends Exception {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* Creates a new instance of <code>NotASubCategoryException</code> without detail message.
|
||||
*/
|
||||
public NotASubCategoryException() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>NotASubCategoryException</code> with the specified detail message.
|
||||
*
|
||||
* @param msg The detail message.
|
||||
*/
|
||||
public NotASubCategoryException(final String msg) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>NotASubCategoryException</code> which wraps the
|
||||
* specified exception.
|
||||
*
|
||||
* @param exception The exception to wrap.
|
||||
*/
|
||||
public NotASubCategoryException(final Exception exception) {
|
||||
super(exception);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>NotASubCategoryException</code> with the specified message which also wraps the
|
||||
* specified exception.
|
||||
*
|
||||
* @param msg The detail message.
|
||||
* @param exception The exception to wrap.
|
||||
*/
|
||||
public NotASubCategoryException(final String msg, final Exception exception) {
|
||||
super(msg, exception);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* Copyright (C) 2015 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package org.libreccm.categorization;
|
||||
|
||||
import org.libreccm.core.CcmObject;
|
||||
|
||||
/**
|
||||
* This exception indicates that an {@link CcmObject} passed to a method is not
|
||||
* assigned to an {@link Category} which is also passed to the method.
|
||||
*
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ObjectNotAssignedToCategoryException extends Exception {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* Creates a new instance of <code>ObjectNotAssignedToCategoryException</code> without detail message.
|
||||
*/
|
||||
public ObjectNotAssignedToCategoryException() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>ObjectNotAssignedToCategoryException</code> with the specified detail message.
|
||||
*
|
||||
* @param msg The detail message.
|
||||
*/
|
||||
public ObjectNotAssignedToCategoryException(final String msg) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>ObjectNotAssignedToCategoryException</code> which wraps the
|
||||
* specified exception.
|
||||
*
|
||||
* @param exception The exception to wrap.
|
||||
*/
|
||||
public ObjectNotAssignedToCategoryException(final Exception exception) {
|
||||
super(exception);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>ObjectNotAssignedToCategoryException</code> with the specified message which also wraps the
|
||||
* specified exception.
|
||||
*
|
||||
* @param msg The detail message.
|
||||
* @param exception The exception to wrap.
|
||||
*/
|
||||
public ObjectNotAssignedToCategoryException(final String msg, final Exception exception) {
|
||||
super(msg, exception);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue