/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content.category; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.store.dao.GroupDao; class MoveCategoryCommandProcessor { private UserEntity user; private CategoryEntity categoryToMove; private CategoryEntity destinationCategory; private CategoryAccessResolver accessResolver; MoveCategoryCommandProcessor( GroupDao groupDao ) { this.accessResolver = new CategoryAccessResolver( groupDao ); } void setUser( UserEntity user ) { this.user = user; } void setCategoryToMove( CategoryEntity categoryToMove ) { this.categoryToMove = categoryToMove; } void setDestinationCategory( CategoryEntity destinationCategory ) { this.destinationCategory = destinationCategory; } void moveCategory() { if ( !accessResolver.hasDeleteCategoryAccess( user, categoryToMove.getParent() ) ) { throw new CategoryAccessException( "Cannot delete sub-categories in category", user.getQualifiedName(), CategoryAccessType.ADMINISTRATE, categoryToMove.getParent().getKey() ); } if ( !accessResolver.hasAdministrateCategoryAccess( user, destinationCategory ) ) { throw new CategoryAccessException( "Cannot create sub-categories in category", user.getQualifiedName(), CategoryAccessType.ADMINISTRATE, destinationCategory.getKey() ); } if ( destinationCategory.isSubCategoryOf( categoryToMove ) ) { throw new IllegalArgumentException( "Cannot move a category to a subcategory" ); } doMoveCategory(); } private void doMoveCategory() { // 1. remove child from existing parent CategoryEntity oldParent = categoryToMove.getParent(); oldParent.removeChild( categoryToMove ); // 2. add reference to new parent categoryToMove.setParent( destinationCategory ); UnitEntity unit = destinationCategory.getUnitExcludeDeleted(); categoryToMove.setUnitOnDescendants( unit ); } }