package com.packtpub.hibernatesearch.domain;

/**
 * Osadzalny obiekt (lub "komponent" w tradycyjnym żargonie Hibernate), przechowujący opinię użytkownika o aplikacji. 
 * Opinia składa się z nazwy użytkownika prezentującego opinię, liczby gwiazdek (maksimum pięć) oznaczających ocenę aplikacji,
 * oraz komentarza.
 * 
 * Ten wariant aplikacji jest mapowany do bazy danych za pomocą klasycznego podejścia opartego na plikach XML.
 * W Mavenowej strukturze projektu wszystkie pliki XML są umieszczone w "src/main/resources".  Hibernate 
 * automatycznie przegląda plik "hibernate.cfg.xml", który odwołuje się do "com/packtpub/hibernatesearch/domain/App.hbm.xml"
 * by załadować informacje o mappowaniu encji App (która zawiera w sobie obiekty typu CustomerReview). Ponieważ CustomerReview
 * nie jest pełnoprawną encją, nie posiada własnego pliku "hbm.xml. Hibernate konfiguruje go używając elementu XML
 * <composite-element> w pliku mapującym encję zawierającą wbudowane obiekty (np. "App.hbm.xml").
 * 
 * Cykl życia obiektów tego typu jest uzależniony od obiektów w których się zawierają. Innymi słowy, jeżeli aplikacja zostanie 
 * skasowana, razem z nią zostaną skasowane komentarze użytkowników. 
 * 
 * Ponieważ ta wbudowana klasa nie jest adnotowana za pomocą @Indexed, Hibernate Search nie utworzy dedykowanego indeksu Lucene  
 * dla niej.  Wszystkie indeksowane informacje dla tej klasy znajdą się w indeksie Lucene encji zawierającej obiekty tej klasy (np. App). 
 */
public class CustomerReview {

	/**
	 * Nazwa użytkownika osoby wysyłającej komentarz.  Adnotacja Hibernate Search @Field jest używana by zmapować pole na indeks Lucene 
	 * dowolnej encji, w której obiekt został osadzony (np. App).
	 */	
  private String username;

	/**
	 * Ocena w skali od 1 do 5 (np. "4 z 5 gwiazdek"). Nie planujemy wyszukiwania na podstawie tej wartości, więc nie użyjemy 
	 * adnotacji @Column ani @Field.
	 */
	private int stars;
	
	/**
	 * Komentarz dotyczący aplikacji.  Adnotacja Hibernate Search @Field jest używana by zmapować pole na indeks Lucene 
	 * dowolnej encji, w której obiekt został osadzony (np. App).
	 */	
	private String comments;

	/**
	 * Domyślny pusty konstruktor.
	 */
	public CustomerReview() {
	}
	
	/**
	 * Wygodny konstruktor, ustawiający wszystkie wartości pól jednocześnie.  
	 */
	public CustomerReview(String username, int stars, String comments) {
		this.username = username;
		this.stars = stars;
		this.comments = comments;
	}

	//
	// GETTERY I SETTERY
	//
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getStars() {
		return stars;
	}

	public void setStars(int stars) {
		this.stars = stars;
	}

	public String getComments() {
		return comments;
	}

	public void setComments(String comments) {
		this.comments = comments;
	}
	
}
