/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content.category; import com.enonic.cms.core.content.ContentAccessControl; import com.enonic.cms.core.content.ContentEntity; import com.enonic.cms.core.content.ContentMap; import com.enonic.cms.core.content.access.ContentAccessEntity; import com.enonic.cms.core.search.IndexTransactionService; import com.enonic.cms.core.security.group.GroupEntity; import com.enonic.cms.core.security.group.GroupKey; import com.enonic.cms.store.dao.GroupDao; class ModifyContentACLCommandProcessor { private GroupDao groupDao; private ContentMap contentToSynchronize; private IndexTransactionService indexTransactionService; ModifyContentACLCommandProcessor( final GroupDao groupDao, final IndexTransactionService indexTransactionService ) { this.groupDao = groupDao; this.indexTransactionService = indexTransactionService; } void setContentToSynchronize( final ContentMap contentToSynchronize ) { this.contentToSynchronize = contentToSynchronize; } void process( final ModifyContentACLCommand command ) { for ( final ContentEntity content : contentToSynchronize ) { remove( command.getToBeRemoved(), content ); modify( command.getToBeModified(), content ); add( command.getToBeAdded(), content ); indexTransactionService.registerUpdate( content.getKey(), true ); } } private void remove( final Iterable<GroupKey> toBeRemoved, final ContentEntity content ) { for ( GroupKey groupKey : toBeRemoved ) { content.removeContentAccessRightByGroup( groupKey ); } } private void modify( final Iterable<ContentAccessControl> it, final ContentEntity content ) { for ( ContentAccessControl cac : it ) { overwriteOrAddNew( content, cac ); } } private void add( final Iterable<ContentAccessControl> it, final ContentEntity content ) { for ( ContentAccessControl cac : it ) { overwriteOrAddNew( content, cac ); } } private void overwriteOrAddNew( final ContentEntity content, final ContentAccessControl cac ) { ContentAccessEntity access = content.getContentAccessRight( cac.getGroup() ); if ( access != null ) { access.overwriteRightsFrom( cac ); } else { access = new ContentAccessEntity(); final GroupEntity group = groupDao.findByKey( cac.getGroup() ); if ( group == null ) { throw new IllegalArgumentException( "Group suddenly no longer exists: " + cac.getGroup() ); } access.setGroup( group ); access.setReadAccess( cac.isRead() ); access.setUpdateAccess( cac.isUpdate() ); access.setDeleteAccess( cac.isDelete() ); content.addContentAccessRight( access ); } } }