package org.infinispan.query.indexmanager;

import java.util.List;

import org.hibernate.search.backend.IndexingMonitor;
import org.hibernate.search.backend.LuceneWork;
import org.hibernate.search.indexes.spi.IndexManager;

/**
 * This backend only triggers initialization of a different backend when
 * incoming indexing operations trigger it, then transfers the incoming
 * operations to the new backend.
 * Which backed is being selected depends on the cluster state.
 *
 * @author Sanne Grinovero <sanne@hibernate.org> (C) 2014 Red Hat Inc.
 * @since 7.0
 */
public class LazyInitializingBackend implements IndexingBackend {

   private final LazyInitializableBackend backend;

   public LazyInitializingBackend(LazyInitializableBackend backend) {
      this.backend = backend;
   }

   @Override
   public void applyWork(List<LuceneWork> workList, IndexingMonitor monitor, IndexManager indexManager) {
      backend.lazyInitialize();
      backend.getCurrentIndexingBackend().applyWork(workList, monitor, indexManager);
   }

   @Override
   public void applyStreamWork(LuceneWork singleOperation, IndexingMonitor monitor, IndexManager indexManager) {
      backend.lazyInitialize();
      backend.getCurrentIndexingBackend().applyStreamWork(singleOperation, monitor, indexManager);

   }

   @Override
   public boolean isMasterLocal() {
      // Avoid initializing yet
      return false;
   }

   @Override
   public void flushAndClose(IndexingBackend replacement) {
      //no-op: this is essentially stateless
   }

   public String toString() {
      return "LazyInitializingBackend";
   }

}
