/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.store.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.stereotype.Repository;
import com.enonic.cms.framework.hibernate.support.InClauseBuilder;
import com.enonic.cms.framework.hibernate.support.SelectBuilder;
import com.enonic.cms.core.resource.ResourceKey;
import com.enonic.cms.core.security.group.GroupEntity;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.structure.SiteEntity;
import com.enonic.cms.core.structure.SiteKey;
import com.enonic.cms.core.structure.menuitem.MenuItemAccessEntity;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
import com.enonic.cms.core.structure.menuitem.section.SectionContentTypeFilterEntity;
import com.enonic.cms.store.support.EntityPageList;
@Repository("siteDao")
public final class SiteEntityDao
extends AbstractBaseEntityDao<SiteEntity>
implements SiteDao
{
/**
* Find all sites.
*/
public List<SiteEntity> findAll()
{
return findAll( false );
}
/**
* Find all sites.
*/
private List<SiteEntity> findAll( boolean deleted )
{
return findByNamedQuery( SiteEntity.class, "SiteEntity.findAll" );
}
public SiteEntity findByKey( int siteKey )
{
return get( SiteEntity.class, new SiteKey( siteKey ) );
}
public SiteEntity findByKey( SiteKey siteKey )
{
return get( SiteEntity.class, siteKey );
}
public Collection<SiteEntity> findByDefaultCss( ResourceKey resourceKey )
{
Collection<SiteEntity> allSites = findAll();
Collection<SiteEntity> cssSites = new ArrayList<SiteEntity>();
for ( SiteEntity site : allSites )
{
ResourceKey defaultCssKey = site.getDefaultCssKey();
if ( defaultCssKey != null && defaultCssKey.equals( resourceKey ) )
{
cssSites.add( site );
}
}
return cssSites;
}
private List<SiteEntity> findByDefaultCssPrefix( String prefix )
{
Collection<SiteEntity> allSites = findAll();
List<SiteEntity> cssSites = new ArrayList<SiteEntity>();
for ( SiteEntity site : allSites )
{
ResourceKey defaultCssKey = site.getDefaultCssKey();
if ( defaultCssKey != null )
{
if ( defaultCssKey.toString().startsWith( prefix ) )
{
cssSites.add( site );
}
}
}
return cssSites;
}
public List getResourceUsageCountDefaultCSS()
{
List list = new ArrayList();
Collection<SiteEntity> allSites = findAll();
for ( SiteEntity site : allSites )
{
ResourceKey resourceKey = site.getDefaultCssKey();
if ( resourceKey != null )
{
list.add( new Object[]{resourceKey, 1L} );
}
}
return list;
}
public void updateResourceCSSReference( ResourceKey oldResourceKey, ResourceKey newResourceKey )
{
Collection<SiteEntity> entityList = findByDefaultCss( oldResourceKey );
for ( SiteEntity entity : entityList )
{
entity.setDefaultCssKey( newResourceKey );
}
}
public void updateResourceCSSReferencePrefix( String oldPrefix, String newPrefix )
{
List<SiteEntity> entityList = findByDefaultCssPrefix( oldPrefix );
for ( SiteEntity entity : entityList )
{
String key = entity.getDefaultCssKey().toString();
key = key.replace( oldPrefix, newPrefix );
entity.setDefaultCssKey( ResourceKey.from( key ) );
}
}
public List<SiteEntity> findByPublishPossible( final int contentTypeKey, final UserEntity user )
{
return executeListResult( new HibernateCallback()
{
public Object doInHibernate( Session session )
throws HibernateException, SQLException
{
StringBuffer hql = new StringBuffer();
SelectBuilder sites = new SelectBuilder( hql, 0 );
sites.addSelect( "sit" );
sites.addFromTable( SiteEntity.class.getName(), "sit", SelectBuilder.NO_JOIN, null );
SelectBuilder mei = new SelectBuilder( 3 );
mei.addSelect( "mei.key" );
mei.addFromTable( MenuItemEntity.class.getName(), "mei", SelectBuilder.NO_JOIN, null );
mei.append( "left outer join mei.page.template pat" );
mei.addFilter( "AND", "mei.site.key = sit.key" );
mei.addFilter( "AND", "( mei.menuItemType = 6 or pat.type = 6 )" );
mei.addFilter( "AND", "( mei.section = 1 )" );
SelectBuilder sctf = new SelectBuilder( 9 );
sctf.addSelect( "sctf.key" );
sctf.addFromTable( SectionContentTypeFilterEntity.class.getName(), "sctf", SelectBuilder.NO_JOIN, null );
sctf.addFilter( "AND", "sctf.contentType.key = :contentTypeKey" );
sctf.addFilter( "AND", "sctf.section.key = mei.key" );
mei.addFilter( "AND", "exists (" + sctf.toString() + ")" );
if ( !user.isEnterpriseAdmin() )
{
Collection<String> groupKeys = resolveUsersAllGroupMemberships( user );
if ( groupKeys.isEmpty() )
{
return new ArrayList<SiteEntity>();
}
else
{
SelectBuilder mia = new SelectBuilder( 6 );
mia.addSelect( "mia.key.menuItemKey" );
mia.addFromTable( MenuItemAccessEntity.class.getName(), "mia", SelectBuilder.NO_JOIN, null );
mia.addFilter( "AND", "mia.addAccess = 1" );
mia.addFilter( "AND", "mia.key.menuItemKey = mei.key" );
mia.addFilter( "AND", new InClauseBuilder<String>( "mia.key.groupKey", groupKeys )
{
public void appendValue( StringBuffer sql, String value )
{
sql.append( "'" ).append( value ).append( "'" );
}
}.toString() );
mei.addFilter( "AND", "exists (" + mia.toString() + ")" );
}
}
sites.addFilter( "AND", "exists (" + mei.toString() + ")" );
Query compiled = session.createQuery( hql.toString() );
compiled.setCacheable( false );
compiled.setInteger( "contentTypeKey", contentTypeKey );
return compiled.list();
}
} );
}
private Collection<String> resolveUsersAllGroupMemberships( UserEntity user )
{
List<String> groupKeys = new ArrayList<String>();
GroupEntity userGroup = user.getUserGroup();
if ( userGroup == null )
{
return groupKeys;
}
groupKeys.add( userGroup.getGroupKey().toString() );
for ( GroupEntity group : userGroup.getAllMemberships() )
{
groupKeys.add( group.getGroupKey().toString() );
}
return groupKeys;
}
private List<SiteEntity> executeListResult( HibernateCallback callback )
{
return (List<SiteEntity>) getHibernateTemplate().execute( callback );
}
public EntityPageList<SiteEntity> findAll( int index, int count )
{
return findPageList( SiteEntity.class, null, index, count );
}
}