/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.category;
import java.util.Map;
import com.enonic.cms.core.security.group.GroupEntity;
import com.enonic.cms.core.security.group.GroupKey;
import com.enonic.cms.store.dao.GroupDao;
class CategoryAccessStorer
{
private GroupDao groupDao;
private final GroupEntity administrator;
CategoryAccessStorer( GroupDao groupDao )
{
this.groupDao = groupDao;
this.administrator = groupDao.findBuiltInAdministrator();
}
void applyAccessRightsFromParent( final CategoryEntity parentCategory, final CategoryEntity category )
{
Map<GroupKey, CategoryAccessEntity> accessRights = parentCategory.getAccessRights();
for ( GroupKey group : accessRights.keySet() )
{
CategoryAccessEntity parentAccessRight = accessRights.get( group );
CategoryAccessEntity accessRight =
CategoryAccessEntity.create( category.getKey(), parentAccessRight.getGroup(), parentAccessRight.toAccessRights() );
accessRight.setKey( new CategoryAccessKey( category.getKey(), group ) );
accessRight.setGroup( parentAccessRight.getGroup() );
accessRight.setAdminAccess( parentAccessRight.isAdminAccess() );
accessRight.setAdminBrowseAccess( parentAccessRight.isAdminBrowseAccess() );
accessRight.setCreateAccess( parentAccessRight.isCreateAccess() );
accessRight.setPublishAccess( parentAccessRight.isPublishAccess() );
accessRight.setReadAccess( parentAccessRight.isReadAccess() );
category.addAccessRight( accessRight );
}
ensureAccessRightForAdministratorGroup( category );
}
void applyGivenAccessRights( final CategoryACL categoryACL, final CategoryEntity category )
{
for ( CategoryAccessControl aRight : categoryACL )
{
GroupEntity group = groupDao.findByKey( aRight.getGroupKey() );
CategoryAccessEntity accessRight = CategoryAccessEntity.create( category.getKey(), group, aRight );
category.addAccessRight( accessRight );
}
ensureAccessRightForAdministratorGroup( category );
}
void ensureAccessRightForAdministratorGroup( final CategoryEntity category )
{
if ( category.getAccessRights() == null || category.getAccessRights().isEmpty() )
{
CategoryAccessEntity accessRight = new CategoryAccessEntity();
accessRight.setKey( new CategoryAccessKey( category.getKey(), administrator.getGroupKey() ) );
accessRight.setGroup( administrator );
accessRight.setAll( true );
category.addAccessRight( accessRight );
}
else if ( category.getAccessRights().size() > 0 )
{
boolean isAdministratorAccessRightsExist = false;
for ( CategoryAccessEntity categoryAccess : category.getAccessRights().values() )
{
if ( categoryAccess.getKey().getGroupKey().equals( administrator.getGroupKey() ) )
{
categoryAccess.setAll( true );
isAdministratorAccessRightsExist = true;
}
}
if ( !isAdministratorAccessRightsExist )
{
CategoryAccessEntity accessRight = new CategoryAccessEntity();
accessRight.setGroup( administrator );
accessRight.setKey( new CategoryAccessKey( category.getKey(), administrator.getGroupKey() ) );
accessRight.setAll( true );
category.addAccessRight( accessRight );
}
}
}
}