/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.util;
import java.sql.Types;
import java.util.List;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import com.google.common.base.Preconditions;
import com.enonic.cms.api.client.model.user.UserInfo;
import com.enonic.cms.core.content.ContentEntity;
import com.enonic.cms.core.content.ContentKey;
import com.enonic.cms.core.content.ContentVersionEntity;
import com.enonic.cms.core.content.ContentVersionKey;
import com.enonic.cms.core.content.RelatedContentEntity;
import com.enonic.cms.core.content.binary.BinaryDataEntity;
import com.enonic.cms.core.content.binary.BinaryDataKey;
import com.enonic.cms.core.content.category.CategoryEntity;
import com.enonic.cms.core.content.category.CategoryKey;
import com.enonic.cms.core.content.category.UnitEntity;
import com.enonic.cms.core.content.contenttype.ContentHandlerEntity;
import com.enonic.cms.core.content.contenttype.ContentHandlerKey;
import com.enonic.cms.core.content.contenttype.ContentTypeEntity;
import com.enonic.cms.core.language.LanguageEntity;
import com.enonic.cms.core.search.IndexTransactionService;
import com.enonic.cms.core.security.PortalSecurityHolder;
import com.enonic.cms.core.security.group.GroupEntity;
import com.enonic.cms.core.security.group.GroupKey;
import com.enonic.cms.core.security.group.GroupType;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.security.user.UserKey;
import com.enonic.cms.core.security.user.UserType;
import com.enonic.cms.core.security.userstore.UserStoreEntity;
import com.enonic.cms.core.structure.SiteEntity;
import com.enonic.cms.core.structure.menuitem.ContentHomeEntity;
import com.enonic.cms.core.structure.menuitem.ContentHomeKey;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
import com.enonic.cms.core.structure.page.template.PageTemplateEntity;
import com.enonic.cms.store.dao.GroupDao;
import com.enonic.cms.store.dao.UserDao;
import com.enonic.cms.store.hibernate.type.LazyInitializedJDOMDocumentUserType;
/**
* Nov 26, 2009
*/
@Component
@Scope("prototype")
public class DomainFixture
{
static
{
// prevent org.h2.jdbc.JdbcSQLException: Value too long for column "MEN_XMLDATA BINARY(255)"
LazyInitializedJDOMDocumentUserType.JDOM_DOCUMENT_TYPE = Types.LONGVARBINARY;
}
public IndexTransactionService getIndexTransactionService()
{
return indexTransactionService;
}
@Autowired
private HibernateTemplate hibernateTemplate;
private DomainFactory factory;
@Autowired
private UserDao userDao;
@Autowired
private GroupDao groupDao;
@Autowired
private IndexTransactionService indexTransactionService;
@Autowired
private Properties systemProperties;
public DomainFixture()
{
factory = new DomainFactory( this );
}
public DomainFactory getFactory()
{
return factory;
}
public DomainFixture( HibernateTemplate hibernateTemplate, GroupDao groupDao )
{
Preconditions.checkNotNull( hibernateTemplate );
Preconditions.checkNotNull( groupDao );
this.hibernateTemplate = hibernateTemplate;
this.groupDao = groupDao;
}
public DomainFixture( HibernateTemplate hibernateTemplate )
{
Preconditions.checkNotNull( hibernateTemplate );
this.hibernateTemplate = hibernateTemplate;
}
void setFactory( DomainFactory factory )
{
Preconditions.checkNotNull( factory );
this.factory = factory;
}
public void initSystemData()
{
systemProperties.setProperty( "cms.admin.password", "password" );
hibernateTemplate.clear();
indexTransactionService.clearJournal();
save( factory.createLanguage( "en" ) );
save( factory.createLanguage( "no" ) );
save( factory.createLanguage( "se" ) );
save( factory.createLanguage( "dk" ) );
if ( groupDao != null )
{
groupDao.invalidateCachedKeys();
}
save( factory.createGroup( GroupType.ENTERPRISE_ADMINS.getName(), GroupType.ENTERPRISE_ADMINS, true ) );
save( factory.createGroup( GroupType.ADMINS.getName(), GroupType.ADMINS, true ) );
save( factory.createGroup( GroupType.DEVELOPERS.getName(), GroupType.DEVELOPERS, true ) );
save( factory.createGroup( GroupType.EXPERT_CONTRIBUTORS.getName(), GroupType.EXPERT_CONTRIBUTORS, true ) );
save( factory.createGroup( GroupType.CONTRIBUTORS.getName(), GroupType.CONTRIBUTORS, true ) );
UserStoreEntity testuserstore = factory.createUserStore( "testuserstore" );
testuserstore.setDefaultStore( true );
storeAndSetupUserStore( testuserstore );
createAndStoreUserAndUserGroup( "anonymous", UserType.ANONYMOUS.getName(), UserType.ANONYMOUS, null );
save( factory.createUser( User.ROOT_UID, "Enterprise Admin", UserType.ADMINISTRATOR, null ) );
flushAndClearHibernateSession();
PortalSecurityHolder.setAnonUser( findUserByName( "anonymous" ).getKey() );
PortalSecurityHolder.setLoggedInUser( findUserByName( "anonymous" ).getKey() );
userDao.resetCachedValues();
}
public void storeAndSetupUserStore( UserStoreEntity userStore )
{
save( userStore );
save(
factory.createGroupInUserstore( GroupType.AUTHENTICATED_USERS.getName(), GroupType.AUTHENTICATED_USERS, userStore.getName() ) );
save( factory.createGroupInUserstore( GroupType.USERSTORE_ADMINS.getName(), GroupType.USERSTORE_ADMINS, userStore.getName() ) );
}
public UserEntity createAndStoreNormalUserWithUserGroup( String uid, String displayName, String userStoreName )
{
return createAndStoreUserAndUserGroup( uid, displayName, UserType.NORMAL, userStoreName );
}
public UserEntity createAndStoreNormalUserWithAllValuesAndWithUserGroup( String uid, String displayName, String userStoreName,
UserInfo userInfo )
{
GroupEntity userGroup = new GroupEntity();
userGroup.setName( uid );
userGroup.setSyncValue( uid );
userGroup.setDeleted( 0 );
userGroup.setType( GroupType.resolveAssociate( UserType.NORMAL ) );
userGroup.setRestricted( 1 );
hibernateTemplate.save( userGroup );
UserEntity user = factory.createUserWithAllValues( uid, displayName, UserType.NORMAL, userStoreName, userInfo );
user.encodePassword( null );
user.setUserGroup( userGroup );
hibernateTemplate.save( user );
hibernateTemplate.flush();
return user;
}
public UserEntity createAndStoreUserAndUserGroup( String uid, String displayName, UserType type, String userStoreName )
{
return createAndStoreUserAndUserGroup( uid, null, displayName, type, userStoreName );
}
public UserEntity createAndStoreUserAndUserGroup( String uid, String password, String displayName, UserType type, String userStoreName )
{
GroupEntity userGroup = new GroupEntity();
userGroup.setName( uid );
userGroup.setSyncValue( uid );
userGroup.setDeleted( 0 );
userGroup.setType( GroupType.resolveAssociate( type ) );
userGroup.setRestricted( 1 );
hibernateTemplate.save( userGroup );
UserEntity user = factory.createUser( uid, displayName, type, userStoreName );
if ( password != null )
{
user.encodePassword( password );
}
user.setUserGroup( userGroup );
hibernateTemplate.save( user );
hibernateTemplate.flush();
return user;
}
public List<LanguageEntity> findAllLanguage()
{
return typecastList( LanguageEntity.class, hibernateTemplate.find( "from LanguageEntity" ) );
}
public LanguageEntity findLanguageByCode( String value )
{
LanguageEntity example = new LanguageEntity();
example.setCode( value );
return (LanguageEntity) findFirstByExample( example );
}
public UserStoreEntity findUserStoreByName( String userStoreName )
{
UserStoreEntity example = new UserStoreEntity();
example.setName( userStoreName );
return (UserStoreEntity) findFirstByExample( example );
}
public int countUsersByName( String name )
{
UserEntity example = new UserEntity();
example.setName( name );
return findByExample( example ).size();
}
public int countUsersByType( UserType type )
{
UserEntity example = new UserEntity();
example.setType( type );
return findByExample( example ).size();
}
public int countNonDeletedUsersByType( UserType type )
{
UserEntity example = new UserEntity();
example.setType( type );
example.setDeleted( false );
return findByExample( example ).size();
}
public int countDeletedUsersByType( UserType type )
{
UserEntity example = new UserEntity();
example.setType( type );
example.setDeleted( true );
return findByExample( example ).size();
}
public UserEntity findUserByKey( String value )
{
return findUserByKey( new UserKey( value ) );
}
public UserEntity findUserByKey( UserKey value )
{
return (UserEntity) requireOneOrNone( hibernateTemplate.find( "from UserEntity where key = ?", value ) );
}
public UserEntity findUserByName( String value )
{
UserEntity example = new UserEntity();
example.setName( value );
return (UserEntity) findFirstByExample( example );
}
public UserEntity findUserByType( UserType userType )
{
UserEntity example = new UserEntity();
example.setType( userType );
return (UserEntity) findFirstByExample( example );
}
public int countGroupsByType( GroupType type )
{
GroupEntity example = new GroupEntity();
example.setType( type );
return findByExample( example ).size();
}
public GroupEntity findGroupByKey( String value )
{
return findGroupByKey( new GroupKey( value ) );
}
public GroupEntity findGroupByKey( GroupKey value )
{
return (GroupEntity) requireOneOrNone( hibernateTemplate.find( "from GroupEntity where key = ?", value ) );
}
public GroupEntity findGroupByName( String groupName )
{
GroupEntity example = new GroupEntity();
example.setName( groupName );
return (GroupEntity) findFirstByExample( example );
}
public GroupEntity findGroupByType( GroupType groupType )
{
GroupEntity example = new GroupEntity();
example.setType( groupType );
return (GroupEntity) findFirstByExample( example );
}
public GroupEntity findGroupByTypeAndUserstore( GroupType groupType, String userstoreName )
{
GroupEntity example = new GroupEntity();
example.setType( groupType );
example.setUserStore( findUserStoreByName( userstoreName ) );
return (GroupEntity) findFirstByExample( example );
}
public ContentHandlerEntity findContentHandlerByKey( ContentHandlerKey value )
{
return (ContentHandlerEntity) requireOneOrNone( hibernateTemplate.find( "from ContentHandlerEntity where key = ?", value ) );
}
public ContentHandlerEntity findContentHandlerByClassName( String value )
{
ContentHandlerEntity example = new ContentHandlerEntity();
example.setClassName( value );
return (ContentHandlerEntity) findFirstByExample( example );
}
public ContentTypeEntity findContentTypeByName( String value )
{
ContentTypeEntity example = new ContentTypeEntity();
example.setName( value );
return (ContentTypeEntity) findFirstByExample( example );
}
public UnitEntity findUnitByName( String value )
{
UnitEntity example = new UnitEntity();
example.setName( value );
return (UnitEntity) findFirstByExample( example );
}
public CategoryEntity findCategoryByKey( CategoryKey value )
{
return (CategoryEntity) requireOneOrNone( hibernateTemplate.find( "from CategoryEntity where key = ?", value ) );
}
public CategoryEntity findCategoryByName( String value )
{
CategoryEntity example = new CategoryEntity();
example.setName( value );
return (CategoryEntity) findFirstByExample( example );
}
public ContentEntity findFirstContentByCategory( CategoryEntity category )
{
ContentEntity example = new ContentEntity();
example.setCategory( category );
return (ContentEntity) findFirstByExample( example );
}
public List<ContentEntity> findContentByCategory( CategoryEntity category )
{
ContentEntity example = new ContentEntity();
example.setCategory( category );
return findByExample( example );
}
public int countAllContent()
{
List<ContentEntity> list = typecastList( ContentEntity.class, hibernateTemplate.find( "from ContentEntity" ) );
return list.size();
}
public List<ContentEntity> findAllContent()
{
return typecastList( ContentEntity.class, hibernateTemplate.find( "from ContentEntity" ) );
}
public ContentEntity findContentByKey( ContentKey value )
{
return (ContentEntity) requireOneOrNone( hibernateTemplate.find( "from ContentEntity where key = ?", value ) );
}
public ContentEntity findContentByName( String name )
{
ContentEntity example = new ContentEntity();
example.setName( name );
return (ContentEntity) findFirstByExample( example );
}
public ContentEntity findContentByPriority( int priority )
{
List<ContentEntity> list =
typecastList( ContentEntity.class, hibernateTemplate.find( "from ContentEntity where priority = ?", priority ) );
if ( list.isEmpty() )
{
return null;
}
return list.get( 0 );
}
public List<ContentVersionEntity> findContentVersionsByContent( ContentKey key )
{
return typecastList( ContentVersionEntity.class,
hibernateTemplate.find( "from ContentVersionEntity where content.key = ? order by key ", key ) );
}
public int countContentVersionsByTitle( String title )
{
ContentVersionEntity example = new ContentVersionEntity();
example.setTitle( title );
List<ContentVersionEntity> list = typecastList( ContentVersionEntity.class, findByExample( example ) );
return list.size();
}
public List<ContentVersionEntity> findContentVersionsByTitle( String title )
{
ContentVersionEntity example = new ContentVersionEntity();
example.setTitle( title );
return typecastList( ContentVersionEntity.class, findByExample( example ) );
}
public ContentVersionEntity findFirstContentVersionByTitle( String title )
{
ContentVersionEntity example = new ContentVersionEntity();
example.setTitle( title );
return (ContentVersionEntity) findFirstByExample( example );
}
public ContentVersionEntity findMainContentVersionByTitle( String title )
{
ContentVersionEntity example = new ContentVersionEntity();
example.setTitle( title );
List<ContentVersionEntity> list = typecastList( ContentVersionEntity.class, findByExample( example ) );
for ( ContentVersionEntity version : list )
{
if ( version.isMainVersion() )
{
return version;
}
}
return null;
}
public ContentVersionEntity findContentVersionByTitle( int index, String title )
{
ContentVersionEntity example = new ContentVersionEntity();
example.setTitle( title );
List<ContentVersionEntity> list = typecastList( ContentVersionEntity.class, findByExample( example ) );
return list.get( index );
}
public ContentVersionEntity findContentVersionByKey( ContentVersionKey value )
{
return (ContentVersionEntity) requireOneOrNone( hibernateTemplate.find( "from ContentVersionEntity where key = ?", value ) );
}
public ContentVersionEntity findContentVersionByContent( int index, ContentKey key )
{
List<ContentVersionEntity> list = typecastList( ContentVersionEntity.class, hibernateTemplate.find(
"from ContentVersionEntity where content.key = ? order by key ", key ) );
if ( list.isEmpty() )
{
return null;
}
return list.get( index );
}
public int countContentVersionsByContent( ContentKey key )
{
List<ContentVersionEntity> list =
typecastList( ContentVersionEntity.class, hibernateTemplate.find( "from ContentVersionEntity where content.key = ?", key ) );
return list.size();
}
public List<RelatedContentEntity> findRelatedContentsByContentVersionKey( ContentVersionKey versionKey )
{
return typecastList( RelatedContentEntity.class,
hibernateTemplate.find( "from RelatedContentEntity where key.parentContentVersionKey = ?", versionKey ) );
}
public BinaryDataEntity findBinaryDataByKey( BinaryDataKey value )
{
return (BinaryDataEntity) requireOneOrNone( hibernateTemplate.find( "from BinaryDataEntity where key = ?", value ) );
}
public MenuItemEntity findMenuItemByName( String name )
{
MenuItemEntity example = new MenuItemEntity();
example.setName( name );
return (MenuItemEntity) findFirstByExample( example );
}
public ContentHomeEntity findContentHomeByKey( ContentHomeKey value )
{
return (ContentHomeEntity) requireOneOrNone(
hibernateTemplate.find( "from ContentHomeEntity where key.siteKey = ? and key.contentKey = ?",
new Object[]{value.getSiteKey(), value.getContentKey()} ) );
}
public MenuItemEntity findMenuItemByNameAndOrder( String name, int order )
{
MenuItemEntity example = new MenuItemEntity();
example.setName( name );
example.setOrder( order );
return (MenuItemEntity) findFirstByExample( example );
}
public PageTemplateEntity findPageTemplateByName( String name )
{
PageTemplateEntity example = new PageTemplateEntity();
example.setName( name );
return (PageTemplateEntity) findFirstByExample( example );
}
public SiteEntity findSiteByName( String value )
{
SiteEntity example = new SiteEntity();
example.setName( value );
return (SiteEntity) findFirstByExample( example );
}
public void save( Object... objects )
{
for ( Object obj : objects )
{
hibernateTemplate.save( obj );
}
flushAndClearHibernateSession();
}
public void saveOrUpdate( Object... objects )
{
for ( Object obj : objects )
{
hibernateTemplate.saveOrUpdate( obj );
}
flushAndClearHibernateSession();
}
public void flushAndClearHibernateSession()
{
hibernateTemplate.flush();
hibernateTemplate.clear();
}
public void flushIndexTransaction()
{
if ( indexTransactionService.isActive() )
{
indexTransactionService.commit();
}
}
private List findByExample( Object example )
{
return hibernateTemplate.findByExample( example );
}
private Object findFirstByExample( Object example )
{
List list = hibernateTemplate.findByExample( example );
if ( list.isEmpty() )
{
return null;
}
if ( list.size() > 1 )
{
throw new IllegalStateException( "Expected only one result, was: " + list.size() );
}
return list.get( 0 );
}
private Object requireOneOrNone( List list )
{
if ( list.size() > 1 )
{
throw new IllegalStateException( "Expected only one result, was: " + list.size() );
}
else if ( list.size() == 0 )
{
return null;
}
else
{
return list.get( 0 );
}
}
@SuppressWarnings("unchecked")
private <T> List<T> typecastList( Class<T> clazz, Object list )
{
return (List<T>) list;
}
}