/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.store.dao;
import java.util.ArrayList;
import java.util.List;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.enonic.cms.framework.cache.CacheFacade;
import com.enonic.cms.core.content.category.CategoryEntity;
import com.enonic.cms.core.content.category.CategoryKey;
import com.enonic.cms.core.content.category.CategoryMap;
class FindCategoryByKeysCommand
{
private CategoryExistInCacheResolver categoryExistInCacheResolver;
private HibernateTemplate hibernateTemplate;
private FindCategoryByKeysQuerier findCategoryByKeysQuerier;
FindCategoryByKeysCommand( CacheFacade entityCache, HibernateTemplate hibernateTemplate,
FindCategoryByKeysQuerier findCategoryByKeysQuerier )
{
this.categoryExistInCacheResolver = new CategoryExistInCacheResolver( entityCache );
this.hibernateTemplate = hibernateTemplate;
this.findCategoryByKeysQuerier = findCategoryByKeysQuerier;
}
CategoryMap execute( final List<CategoryKey> categoryKeys )
{
final CategoryMap categoryMap = new CategoryMap( categoryKeys );
final List<CategoryKey> categoriesNotFoundInCache = findCategoriesInCache( categoryKeys, categoryMap );
if ( !categoriesNotFoundInCache.isEmpty() )
{
final List<CategoryEntity> categoriesFromDB = findCategoryByKeysQuerier.queryCategories( categoriesNotFoundInCache );
categoryMap.addAll( categoriesFromDB );
}
return categoryMap;
}
private List<CategoryKey> findCategoriesInCache( Iterable<CategoryKey> categoryKeys, CategoryMap categoriesFoundInCache )
{
final List<CategoryKey> categoriesNotFoundInCache = new ArrayList<CategoryKey>();
for ( final CategoryKey categoryKey : categoryKeys )
{
final boolean categoryExistsInCache = categoryExistInCacheResolver.categoryExistsInCache( categoryKey );
if ( categoryExistsInCache )
{
final CategoryEntity categoryFoundInCache = hibernateTemplate.get( CategoryEntity.class, categoryKey );
if ( categoryFoundInCache != null )
{
categoriesFoundInCache.add( categoryFoundInCache );
}
}
else
{
categoriesNotFoundInCache.add( categoryKey );
}
}
return categoriesNotFoundInCache;
}
}