/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Iterables;
import com.enonic.cms.core.content.contenttype.ContentTypeEntity;
import com.enonic.cms.core.search.IndexException;
public class RegenerateIndexBatcher
{
private static final Logger LOG = LoggerFactory.getLogger( RegenerateIndexBatcher.class );
private static final int DEFAULT_RETRIES = 3;
private final IndexService indexService;
private final ContentService contentService;
private int maxRetries = DEFAULT_RETRIES;
public RegenerateIndexBatcher( IndexService indexService, ContentService contentService )
{
this.indexService = indexService;
this.contentService = contentService;
}
public void regenerateIndex( ContentTypeEntity contentType, int batchSize, List<String> logEntries )
{
if ( contentType == null )
{
throw new IllegalArgumentException( "Given contentType cannot be null" );
}
if ( batchSize <= 0 )
{
throw new IllegalArgumentException( "Given batchSize must be larger that zero" );
}
List<ContentKey> allContentKeys = contentService.findContentKeysByContentType( contentType );
int currentIndex = 0;
while ( currentIndex < allContentKeys.size() )
{
List<ContentKey> nextContentKeys = getNextContentKeys( allContentKeys, currentIndex, batchSize );
if ( nextContentKeys != null && nextContentKeys.size() > 0 )
{
if ( logEntries != null )
{
logEntries.add(
"Regenerating indexes, (batch: " + ( currentIndex + 1 ) + " -> " + ( currentIndex + nextContentKeys.size() ) +
" of total " + allContentKeys.size() + ") of content type '" + contentType.getName() + "'" );
}
LOG.info( "Regenerating indexes, (batch: " + ( currentIndex + 1 ) + " -> " + ( currentIndex + nextContentKeys.size() ) +
" of total " + allContentKeys.size() + ") of content type '" + contentType.getName() + "'" );
long start = System.currentTimeMillis();
int retry = 0;
boolean indexSuccess = false;
do
{
try
{
indexService.reindex( nextContentKeys );
indexSuccess = true;
}
catch ( IndexException e )
{
retry++;
if ( retry > this.maxRetries )
{
throw e;
}
else
{
LOG.warn( "Unexpected error indexing batch with keys: " + Iterables.toString( nextContentKeys ), e );
LOG.warn( "Retrying (" + retry + ") ..." );
}
}
}
while ( !indexSuccess );
//indexService.regenerateIndexBatched( nextContentKeys );
long end = System.currentTimeMillis();
LOG.info( "Last batch took: " + ( ( end - start ) / 1000 ) + " sec" );
currentIndex = currentIndex + batchSize;
}
}
}
private List<ContentKey> getNextContentKeys( List<ContentKey> allContentKeys, int currentIndex, int batchSize )
{
if ( currentIndex + batchSize > allContentKeys.size() )
{
return allContentKeys.subList( currentIndex, allContentKeys.size() );
}
return allContentKeys.subList( currentIndex, currentIndex + batchSize );
}
public void setMaxRetries( final int maxRetries )
{
this.maxRetries = Math.max( maxRetries, 0 );
}
}