/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content.category; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.google.common.base.Preconditions; import com.enonic.cms.core.content.ContentACLSynchronizer; import com.enonic.cms.core.content.ContentMap; import com.enonic.cms.core.content.ContentStorer; import com.enonic.cms.core.content.contenttype.ContentTypeEntity; import com.enonic.cms.core.content.contenttype.ContentTypeKey; import com.enonic.cms.core.language.LanguageEntity; import com.enonic.cms.core.language.LanguageKey; import com.enonic.cms.core.search.IndexTransactionService; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.security.user.UserKey; import com.enonic.cms.core.security.userstore.MemberOfResolver; import com.enonic.cms.core.time.TimeService; import com.enonic.cms.store.dao.CategoryDao; import com.enonic.cms.store.dao.ContentDao; import com.enonic.cms.store.dao.ContentEagerFetches; import com.enonic.cms.store.dao.ContentTypeDao; import com.enonic.cms.store.dao.FindContentByKeysCommand; import com.enonic.cms.store.dao.GroupDao; import com.enonic.cms.store.dao.LanguageDao; import com.enonic.cms.store.dao.UserDao; @Component public class CategoryCommandProcessorFactory { @Autowired private ContentStorer contentStorer; @Autowired private UnitFactory unitFactory; @Autowired private ContentDao contentDao; @Autowired private UserDao userDao; @Autowired private GroupDao groupDao; @Autowired private CategoryDao categoryDao; @Autowired private LanguageDao languageDao; @Autowired private ContentTypeDao contentTypeDao; @Autowired private MemberOfResolver memberOfResolver; @Autowired private TimeService timeService; @Autowired private IndexTransactionService indexTransactionService; CreateCategoryCommandProcessor createStoreNewCategoryCommandProcessor( final StoreNewCategoryCommand command ) { Preconditions.checkNotNull( command.getCreator(), "Creator in command must be specified" ); final UserEntity creator = resolveUser( command.getCreator(), "creator" ); final CategoryEntity parentCategory = resolveCategory( command.getParentCategory() ); final ContentTypeEntity contentType = resolveContentType( command.getContentType() ); final CategoryAccessStorer categoryAccessStorer = new CategoryAccessStorer( groupDao ); final CategoryAccessResolver categoryAccessResolver = new CategoryAccessResolver( groupDao ); final CreateCategoryAccessChecker createCategoryAccessChecker = new CreateCategoryAccessChecker( memberOfResolver, categoryAccessResolver ).creator( creator ); final CreateCategoryCommandProcessor createCategoryCommandProcessor = new CreateCategoryCommandProcessor( timeService, categoryDao, unitFactory, categoryAccessStorer, createCategoryAccessChecker ); createCategoryCommandProcessor.setCreator( creator ); createCategoryCommandProcessor.setParentCategory( parentCategory ); createCategoryCommandProcessor.setContentType( contentType ); return createCategoryCommandProcessor; } UpdateCategoryCommandProcessor createUpdateCategoryCommandProcessor( final UpdateCategoryCommand command ) { Preconditions.checkNotNull( command.getUpdater(), "Updater in command must be specified" ); final UserEntity updater = resolveUser( command.getUpdater(), "updater" ); final CategoryEntity category = resolveCategory( command.getCategory() ); final LanguageEntity language = resolveLanguage( command.getLanguage() ); final ContentTypeEntity contentType = resolveContentType( command.getContentType() ); final Set<ContentTypeEntity> allowedContentTypes = resolveAllowedContentTypes( command.getAllowedContentTypes() ); final CategoryAccessResolver categoryAccessResolver = new CategoryAccessResolver( groupDao ); final UpdateCategoryAccessChecker updateCategoryAccessChecker = new UpdateCategoryAccessChecker( memberOfResolver, categoryAccessResolver ).updater( updater ); final UpdateCategoryCommandProcessor processor = new UpdateCategoryCommandProcessor( timeService, contentDao, updateCategoryAccessChecker ); processor.setUpdater( updater ); processor.setCategoryToUpdate( category ); processor.setContentType( contentType ); processor.setLanguage( language ); processor.setAllowedContentTypes( allowedContentTypes ); return processor; } DeleteCategoryCommandProcessor createDeleteCategoryCommandProcessor( final DeleteCategoryCommand command ) { Preconditions.checkNotNull( command.getDeleter(), "deleter must be specified" ); Preconditions.checkNotNull( command.getCategoryKey(), "categoryKey must be specified" ); final UserEntity deleter = resolveUser( command.getDeleter(), "deleter" ); final CategoryEntity categoryToDelete = resolveCategory( command.getCategoryKey() ); final DeleteCategoryCommandProcessor processor = new DeleteCategoryCommandProcessor( groupDao, contentDao, categoryDao, contentStorer ); processor.setDeleter( deleter ); processor.setCategoryToDelete( categoryToDelete ); processor.setIncludeContent( command.isIncludeContent() ); processor.setRecursive( command.isRecursive() ); return processor; } MoveCategoryCommandProcessor createMoveCategoryCommandProcessor( final MoveCategoryCommand command ) { Preconditions.checkNotNull( command.getUser(), "user must be specified" ); Preconditions.checkNotNull( command.getCategoryToMove(), "categoryKey must be specified" ); Preconditions.checkNotNull( command.getDestinationCategory(), "destination categoryKey must be specified" ); final UserEntity user = resolveUser( command.getUser(), "user" ); final CategoryEntity movedCategory = resolveCategory( command.getCategoryToMove() ); final CategoryEntity destCategory = resolveCategory( command.getDestinationCategory() ); final MoveCategoryCommandProcessor processor = new MoveCategoryCommandProcessor( groupDao ); processor.setUser( user ); processor.setCategoryToMove( movedCategory ); processor.setDestinationCategory( destCategory ); return processor; } SynchronizeCategoryACLCommandProcessor createSynchronizeCategoryACLProcessor( final SynchronizeCategoryACLCommand command ) { Preconditions.checkNotNull( command.getUpdater(), "Updater in command must be specified" ); final UserEntity updater = resolveUser( command.getUpdater(), "updater" ); final CategoryAccessResolver categoryAccessResolver = new CategoryAccessResolver( groupDao ); final UpdateCategoryAccessChecker updateCategoryAccessChecker = new UpdateCategoryAccessChecker( memberOfResolver, categoryAccessResolver ).updater( updater ); final CategoryMap categoryMapBykey = resolveCategories( command.getCategoriesToUpdate() ); final SynchronizeCategoryACLCommandProcessor processor = new SynchronizeCategoryACLCommandProcessor( groupDao, updateCategoryAccessChecker, indexTransactionService, contentDao ); processor.setCategoriesToUpdate( categoryMapBykey ); return processor; } SynchronizeContentACLProcessor createSynchronizeContentACLCommandProcessor( final SynchronizeContentACLCommand command ) { final ContentMap contentToSynchronize = contentDao.findByKeys( new FindContentByKeysCommand().fetchEntitiesAsReadOnly( false ).contentKeys( command.getContentToUpdate() ).eagerFetches( ContentEagerFetches.PRESET_FOR_APPLYING_CONTENT_ACCESS ).byPassCache( true ) ); final SynchronizeContentACLProcessor processor = new SynchronizeContentACLProcessor( new ContentACLSynchronizer( groupDao ), indexTransactionService ); processor.setContentToSynchronize( contentToSynchronize ); return processor; } ModifyCategoryACLCommandProcessor createModifyCategoryACLCommand( final ModifyCategoryACLCommand command ) { Preconditions.checkNotNull( command.getUpdater(), "Updater in command must be specified" ); final UserEntity updater = resolveUser( command.getUpdater(), "updater" ); final CategoryAccessResolver categoryAccessResolver = new CategoryAccessResolver( groupDao ); final UpdateCategoryAccessChecker updateCategoryAccessChecker = new UpdateCategoryAccessChecker( memberOfResolver, categoryAccessResolver ).updater( updater ); final CategoryMap categoryMapBykey = resolveCategories( command.getCategoriesToUpdate() ); final ModifyCategoryACLCommandProcessor processor = new ModifyCategoryACLCommandProcessor( groupDao, updateCategoryAccessChecker, indexTransactionService, contentDao ); processor.setCategoriesToUpdate( categoryMapBykey ); return processor; } ModifyContentACLCommandProcessor createModifyContentACLCommandProcessor( final ModifyContentACLCommand command ) { final ContentMap contentToSynchronize = contentDao.findByKeys( new FindContentByKeysCommand().fetchEntitiesAsReadOnly( false ).contentKeys( command.getContentToUpdate() ).eagerFetches( ContentEagerFetches.PRESET_FOR_APPLYING_CONTENT_ACCESS ).byPassCache( true ) ); final ModifyContentACLCommandProcessor prosessor = new ModifyContentACLCommandProcessor( groupDao, indexTransactionService ); prosessor.setContentToSynchronize( contentToSynchronize ); return prosessor; } private CategoryEntity resolveCategory( final CategoryKey key ) { if ( key != null ) { CategoryEntity category = categoryDao.findByKey( key ); Preconditions.checkNotNull( category, "given category does not exist: " + key ); return category; } return null; } private LanguageEntity resolveLanguage( final LanguageKey key ) { if ( key != null ) { LanguageEntity language = languageDao.findByKey( key ); Preconditions.checkNotNull( language, "given language does not exist: " + key ); return language; } return null; } private CategoryMap resolveCategories( final List<CategoryKey> keys ) { return categoryDao.findByKeys( keys ); } private UserEntity resolveUser( final UserKey key, final String subject ) { if ( key != null ) { UserEntity user = userDao.findByKey( key ); Preconditions.checkNotNull( user, "given " + subject + " does not exist: " + key ); return user; } return null; } private ContentTypeEntity resolveContentType( final ContentTypeKey key ) { if ( key != null ) { ContentTypeEntity contentType = contentTypeDao.findByKey( key ); Preconditions.checkNotNull( contentType, "given content type does not exist: " + key ); return contentType; } return null; } private Set<ContentTypeEntity> resolveAllowedContentTypes( final List<ContentTypeKey> allowedContentTypes ) { if ( allowedContentTypes != null ) { final Set<ContentTypeEntity> list = new LinkedHashSet<ContentTypeEntity>(); for ( final ContentTypeKey allowedContentTypeKey : allowedContentTypes ) { final ContentTypeEntity allowedContentType = contentTypeDao.findByKey( allowedContentTypeKey ); Preconditions.checkNotNull( allowedContentType, "Specified content type to allow does not exist: " + allowedContentTypeKey ); list.add( allowedContentType ); } return list; } return null; } }