/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.tools.index;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Collection;
import java.util.List;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.enonic.cms.core.content.ContentService;
import com.enonic.cms.core.content.IndexService;
import com.enonic.cms.core.content.RegenerateIndexBatcher;
import com.enonic.cms.core.content.contenttype.ContentTypeEntity;
@Component
public class ReindexContentToolServiceImpl
implements ReindexContentToolService
{
private IndexService indexService;
private ContentService contentService;
protected static final int BATCH_SIZE = 10;
private Boolean reIndexInProgress = Boolean.FALSE;
private Long lastReindexRuntime = 0L;
private DateTime lastIndexedTime;
private boolean lastReindexFailed = false;
public void reindexAllContent( List<String> logEntries )
{
logEntries.clear();
long globalStart = System.currentTimeMillis();
if ( !indexService.indexExists() )
{
logEntries.add( "Index does not exist, createing..." );
indexService.createIndex();
}
Collection<ContentTypeEntity> contentTypes = contentService.getAllContentTypes();
logEntries.add( "Generating indexes for " + contentTypes.size() + " content types..." );
try
{
doReindexAllContentTypes( logEntries, contentTypes );
}
catch ( Exception e )
{
logEntries.add( "Reindex failed: " + stackTraceLogString( e ) );
throw new ReindexContentException( "Reindex all contenttypes failed", e );
}
long globalTimeUsed = ( System.currentTimeMillis() - globalStart );
String timeUsed = getTimeusedString( globalTimeUsed );
this.lastIndexedTime = new DateTime();
this.lastReindexRuntime = globalTimeUsed;
logEntries.add( "Reindexing of all content types was successful!" );
logEntries.add( "Total time used: " + timeUsed );
}
private String stackTraceLogString( Throwable aThrowable )
{
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter( result );
aThrowable.printStackTrace( printWriter );
return result.toString();
}
private String getTimeusedString( final long globalTimeUsed )
{
long timeUsedSeconds = globalTimeUsed / 1000;
return timeUsedSeconds > 240 ? timeUsedSeconds / 60 + " min" : timeUsedSeconds + " sec";
}
private void doReindexAllContentTypes( final List<String> logEntries, final Collection<ContentTypeEntity> contentTypes )
{
int count = 1;
for ( ContentTypeEntity contentType : contentTypes )
{
final StringBuffer message = new StringBuffer();
message.append( "Generating indexes for '" ).append( contentType.getName() ).append( "'" );
message.append( " (#" ).append( count++ ).append( " of " ).append( contentTypes.size() ).append( ")..." );
logEntries.add( message.toString() );
long start = System.currentTimeMillis();
final RegenerateIndexBatcher batcher = new RegenerateIndexBatcher( indexService, contentService );
batcher.regenerateIndex( contentType, BATCH_SIZE, logEntries );
long end = System.currentTimeMillis();
logEntries.add( "... index values generated in " + ( end - start ) + " ms" );
}
}
@Override
public DateTime getLastReindexTime()
{
return lastIndexedTime;
}
@Override
public Long getLastReindexTimeUsed()
{
return lastReindexRuntime;
}
public Boolean isReIndexInProgress()
{
return reIndexInProgress;
}
public void setReIndexInProgress( final Boolean reIndexInProgress )
{
this.reIndexInProgress = reIndexInProgress;
}
@Autowired
public void setIndexService( @Qualifier("indexService") IndexService value )
{
this.indexService = value;
}
@Autowired
public void setContentService( @Qualifier("contentService") ContentService value )
{
this.contentService = value;
}
public boolean isLastReindexFailed()
{
return lastReindexFailed;
}
public void setLastReindexFailed( final boolean lastReindexFailed )
{
this.lastReindexFailed = lastReindexFailed;
}
}