package org.infinispan.query.impl.massindex; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import org.hibernate.search.batchindexing.MassIndexerProgressMonitor; import org.infinispan.query.logging.Log; import org.infinispan.util.TimeService; import org.infinispan.util.logging.LogFactory; /** * @author Sanne Grinovero <sanne@hibernate.org> (C) 2012 Red Hat Inc. */ public class DefaultMassIndexerProgressMonitor implements MassIndexerProgressMonitor { private static final Log log = LogFactory.getLog(DefaultMassIndexerProgressMonitor.class, Log.class); private final AtomicLong documentsDoneCounter = new AtomicLong(); private volatile long startTime; private final int logAfterNumberOfDocuments; private final TimeService timeService; /** * Logs progress of indexing job every 50 documents written. */ public DefaultMassIndexerProgressMonitor(TimeService timeService) { this(50, timeService); } /** * Logs progress of indexing job every <code>logAfterNumberOfDocuments</code> * documents written. * * @param logAfterNumberOfDocuments * log each time the specified number of documents has been added */ public DefaultMassIndexerProgressMonitor(int logAfterNumberOfDocuments, TimeService timeService) { this.logAfterNumberOfDocuments = logAfterNumberOfDocuments; this.timeService = timeService; } public void entitiesLoaded(int size) { // not used } public void documentsAdded(long increment) { long current = documentsDoneCounter.addAndGet(increment); if (current == increment) { startTime = timeService.time(); } if (current % getStatusMessagePeriod() == 0) { printStatusMessage(startTime, current); } } public void documentsBuilt(int number) { //not used } public void addToTotalCount(long count) { //not known } public void indexingCompleted() { log.indexingEntitiesCompleted(documentsDoneCounter.get()); } protected int getStatusMessagePeriod() { return logAfterNumberOfDocuments; } protected void printStatusMessage(long startTime, long doneCount) { log.indexingDocumentsCompleted(doneCount, timeService.timeDuration(startTime, TimeUnit.MILLISECONDS)); } }