/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.preference;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.security.user.UserKey;
import com.enonic.cms.store.dao.PreferenceDao;
import com.enonic.cms.store.dao.UserDao;
@Component("preferenceService")
public class PreferenceServiceImpl
implements PreferenceService
{
@Autowired
private UserDao userDao;
@Autowired
private PreferenceDao preferenceDao;
private PreferenceAccessResolver preferenceAccessResolver = new PreferenceAccessResolver();
/**
* @inheritDoc
*/
public PreferenceEntity getPreference( PreferenceKey key )
{
UserEntity user = checkUserExist( key.getUserKey() );
if ( !preferenceAccessResolver.hasReadAccess( user ) )
{
throw new PreferenceAccessException( "User: '" + user.getName() + "' not allowed to read preference: " );
}
return preferenceDao.findByKey( key );
}
public List<PreferenceEntity> getPreferences( PreferenceSpecification spec )
{
return preferenceDao.findBy( spec );
}
/**
* @inheritDoc
*/
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public PreferenceEntity setPreference( PreferenceEntity preference )
{
PreferenceKey preferenceKey = preference.getKey();
UserEntity user = checkUserExist( preferenceKey.getUserKey() );
if ( !preferenceAccessResolver.hasWriteAccess( user ) )
{
throw new PreferenceAccessException( "User '" + user.getName() + "' not allowed to write preference: " );
}
preferenceDao.store( preference );
return preference;
}
/**
* Removes the preference entry from data source.
*/
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void removePreference( PreferenceEntity preference )
{
preferenceDao.delete( preference );
}
private UserEntity checkUserExist( UserKey userKey )
{
UserEntity user = userDao.findByKey( userKey.toString() );
if ( user == null )
{
throw new IllegalArgumentException( "User does not exist: " + userKey );
}
return user;
}
}