/* * 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 ); } }