package com.packtpub.hibernatesearch.domain;

import java.io.Serializable;
import java.util.Set;

/**
 * Prosta klasa encji reprezentująca sprzęt elektroniczny... posiada nazwę, nazwę producenta, oraz kolekcję aplikacji 
 * wspieranych przez urządzenie.
 * 
 * Ten wariant pliku Device 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/Device.hbm.xml"
 * by załadować informacje o mappowaniu tej encji. Wyniki są identyczne jak w przypadku użycia adnotacji @Entity.
 * 
 * Ponieważ ta 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 Device implements Serializable {

	private static final long serialVersionUID = 1L;
	
	/**
	 * Klucz główny, skonfigurowany w pliku "Device.hbm.xml" tak, by był generowany automatycznie podczas tworzenia nowej instancji
	 * 
	 * Ta klasa encji nie ma własnego indeksu Lucene, w związku z tym adnotacja @DocumentId nie jest potrzebna. 
	 */
    private Long id;
	
	/**
	 * Nazwa producenta urządzenia. Adnotacja @Column jest zastąpiona wpisem w pliku "Device.hbm.xml",
	 * ale adnotacja Hibernate Search @Field jest używana by zmapować wyszukiwalne pole na indeks Lucene powiązanej encji (np. App).
	 */	
    private String manufacturer;
	
	/**
	 * Nazwa urządzenia.  Adnotacja @Column jest zastąpiona wpisem w pliku "Device.hbm.xml",
	 * ale adnotacja Hibernate Search @Field jest używana by zmapować wyszukiwalne pole na indeks Lucene powiązanej encji (np. App).
	 */	
    private String name;
	
	/**
	 * Kolekcja powiązanych encji typu App, reprezentujących aplikacje wspierane przez to urządzenie.  
	 * 
	 * Mapowanie Hibernate odbywa się w pliku "Device.hbm.xml" używamy elementu XML "<many-to-many>"
	 * zamiast adnotacji @ManyToMany. Niemniej jednak pobieranie oraz kaskadowanie opisane w komentarzach do kodu w katalogu 
	 * "rozdzial2" mają również zastosowanie w tym przypadku.
	 *
	 * Adnotacja Hibernate Search @ContainedIn jest odpowiednikiem @IndexedEmbedded (użytej dla App.SupportedDevices). 
	 * Instruuje Hibernate Search by dołączyło informacje o urządzeniach w indeksie Lucene encji App. 
	 */
	private Set<App> supportedApps;

	/**
	 * Domyślny pusty konstruktor.
	 */	
	public Device() {
	}
	
	/**
	 * Wygodny konstruktor ustawiający wartości wszystkich pól jednocześnie.    
	 */
	public Device(String manufacturer, String name, Set<App> supportedApps) {
		this.manufacturer = manufacturer;
		this.name = name;
		this.supportedApps = supportedApps;
	}
	
	//
	// GETTERS AND SETTERS
	//
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getManufacturer() {
		return manufacturer;
	}

	public void setManufacturer(String manufacturer) {
		this.manufacturer = manufacturer;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<App> getSupportedApps() {
		return supportedApps;
	}

	public void setSupportedApps(Set<App> supportedApps) {
		this.supportedApps = supportedApps;
	}

}
