package com.packtpub.hibernatesearch.util;

import org.hibernate.search.indexes.interceptor.EntityIndexingInterceptor;
import org.hibernate.search.indexes.interceptor.IndexingOverride;

import com.packtpub.hibernatesearch.domain.App;

/**
 * EntityIndexingInterceptor dla encji App, używany do warunkowego indeksowania. Interceptor ma za zadanie 
 * zapobieżeniu indeksowania nieaktywnych aplikacji (tzn. instancje App, których pole "active" ma wartość 
 * "false").  
 * 
 * Adnotacja @Indexed klasy encji App rejestruje interceptor i sprawia, że jedna z jej metod jest uruchamiana 
 * gdy wykonywane są jakieś operacje na instancji App na poziomie Hibernate.  Odpowiednia metoda określa co 
 * powinno się zdarzyć z indeksem Lucene na poziomie Hibernate Search. 
 * 
 * UWAGA: Warunkowe indeksowanie nie jest niezawodne, ponieważ interceptory są ignorowane, gdy Lucene jest
 *       przeindeksowane ręcznie.  Jest to znany błąd i powinien być poprawiony w przyszłych wersjach
 *       Hibernate Search. 
 */
public class IndexWhenActiveInterceptor implements EntityIndexingInterceptor<App> {
	
	/** 
	 * Ta metoda jest automatycznie uruchomiona gdy nowa encja typu App jest zapisywana przez Hibernate.  
	 * Gdy encja App jest aktywna, użyta jest domyślna operacja Hibernate Search (tzn. dodanie do indeksu Lucene).
	 * Jeżeli aplikacja jest nieaktywna, indeksowanie w Lucene się nie odbywa. 
	 */
	public IndexingOverride onAdd(App entity) {
		if(entity.isActive()) {
			return IndexingOverride.APPLY_DEFAULT;
		}
		return IndexingOverride.SKIP;
	}

	/**
	 * Ta metoda jest automatycznie uruchomiona gdy encja typu App jest usuwana przez Hibernate. Niezależnie
	 * od parametru "active" encji App, Hibernate Search ma wykonać domyślną akcję  (tj. usunięcie wpisu z indeksu 
	 * Lucene, jeżeli istnieje).
	 */
	public IndexingOverride onDelete(App entity) {
		return IndexingOverride.APPLY_DEFAULT;
	}

	/**
	 * Ta metoda jest automatycznie uruchomiona gdy encja typu App jest aktualizowana przez Hibernate.  Jeżeli 
	 * aplikacja jest aktywna, indeks Lucene ma zostać zaktualizowany.  Jeżeli aplikacja jest nieaktywna 
	 * encja ma być usunięta z indeksu Lucene.
	 */
	public IndexingOverride onUpdate(App entity) {
		if(entity.isActive()) {
			return IndexingOverride.UPDATE;
		} else {
			return IndexingOverride.REMOVE;
		}
	}

	/**
	 * Ta metoda jest automatycznie uruchomiona gdy encja typu App znajduje się w kolekcji grupowo aktualizowanej
	 * przez Hibernate. Nie jest to istotne dla interceptora, więc zostaje użyta standardowa metoda onUpdate().
	 */
	public IndexingOverride onCollectionUpdate(App entity) {
		return onUpdate(entity);
	}

}
