/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import com.enonic.cms.core.content.access.ContentAccessEntity; import com.enonic.cms.core.security.group.GroupEntity; import com.enonic.cms.store.dao.GroupDao; public class ContentACLSynchronizer { private GroupDao groupDao; public ContentACLSynchronizer( GroupDao groupDao ) { this.groupDao = groupDao; } public boolean synchronize( final ContentEntity content, Map<String, ContentAccessEntity> bluePrint ) { final ContentACL contentACLBluePrint = new ContentACL(); for ( Map.Entry<String, ContentAccessEntity> contentAccessEntry : bluePrint.entrySet() ) { contentACLBluePrint.add( ContentAccessControl.create( contentAccessEntry.getValue() ) ); } return synchronize( content, contentACLBluePrint ); } public boolean synchronize( final ContentEntity content, final ContentACL bluePrint ) { final boolean anyRemoved = remove( content, bluePrint ); final boolean anyAddedOrModified = addOrModify( content, bluePrint ); return anyRemoved || anyAddedOrModified; } private boolean remove( final ContentEntity content, final ContentACL bluePrint ) { final List<ContentAccessEntity> accessRightsToRemove = new ArrayList<ContentAccessEntity>(); // remove content access rights that is no longer there final Collection<ContentAccessEntity> existingAccessRights = content.getContentAccessRights(); for ( ContentAccessEntity existingAccessRight : existingAccessRights ) { boolean remove = !bluePrint.containsKey( existingAccessRight.getGroup().getGroupKey() ); if ( remove ) { accessRightsToRemove.add( existingAccessRight ); } } for ( ContentAccessEntity accessRight : accessRightsToRemove ) { content.removeContentAccessRightByGroup( accessRight.getGroup().getGroupKey() ); } return accessRightsToRemove.size() > 0; } private boolean addOrModify( final ContentEntity content, final ContentACL bluePrint ) { boolean modified = false; for ( ContentAccessControl givenContentAccess : bluePrint ) { final ContentAccessEntity persistedContentAccess = content.getContentAccessRight( givenContentAccess.getGroup() ); if ( persistedContentAccess != null ) { boolean modifiedByUpdate = persistedContentAccess.overwriteRightsFrom( givenContentAccess ); if ( modifiedByUpdate ) { modified = true; } } else { final ContentAccessEntity newContentAccess = new ContentAccessEntity(); final GroupEntity group = groupDao.findByKey( givenContentAccess.getGroup() ); newContentAccess.setGroup( group ); newContentAccess.overwriteRightsFrom( givenContentAccess ); newContentAccess.setContent( content ); content.addContentAccessRight( newContentAccess ); modified = true; } } return modified; } }