package sk.upjs.paz.filmy;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;
import sk.upjs.paz.filmy.komparatory.FilmPodlaDlzkyComparator;
import sk.upjs.paz.filmy.komparatory.FilmPodlaHodnoteniaComparator;
public class TextovyZoznamFilmov implements ZoznamFilmov {
private Film[] filmy;
private String nazovSuboru;
/**
* Konštruktor vytvára nový zoznam filmov. Ak súbor, ktorého názov je na
* vstupe, neexistuje, vyhodíme výnimku
* KonstruktorMaZlyNazovSuboruException.
*
* @param nazovSuboru
* Názov súboru, do ktorého budeme zoznam ukladať.
* @throws KonstruktorMaZlyNazovSuboruException
*/
public TextovyZoznamFilmov(String nazovSuboru)
throws KonstruktorMaZlyNazovSuboruException {
this();
File subor = new File(nazovSuboru);
if (!subor.exists()) {
throw new KonstruktorMaZlyNazovSuboruException();
}
this.nazovSuboru = nazovSuboru;
nacitajSa(nazovSuboru);
}
public TextovyZoznamFilmov() {
filmy = new Film[0];
}
/**
* Metóda vloží nový film do zoznamu. Ak vo vloženom filme je prázdny názov filmu,
* vyhodí sa výnimka NazovPrazdnyException.
*
* @param dvd
* @throws NazovPrazdnyException
*/
public void vlozNovyFilm(Film dvd) throws NazovPrazdnyException {
if (dvd.getNazovFilmu().length()==0) {
throw new NazovPrazdnyException();
}
Film[] novePole = new Film[filmy.length + 1];
System.arraycopy(filmy, 0, novePole, 0, filmy.length);
novePole[filmy.length] = dvd;
filmy = novePole;
}
public void vypisVsetko() {
for (int i = 0; i < filmy.length; i++) {
System.out.println(filmy[i].toString());
}
}
public void vypisPodlaZanru(String zaner) {
for (int i = 0; i < filmy.length; i++) {
if (filmy[i].mamZaner(zaner)) {
System.out.println(filmy[i]);
System.out.println("=====================");
}
}
}
private void vymazFilm(Film dvd) {
Film[] novePole = new Film[filmy.length - 1];
int pozicia = 0;
while (filmy[pozicia] != dvd) {
if (pozicia == novePole.length) {
return;
}
novePole[pozicia] = filmy[pozicia];
pozicia++;
}
for (int i = pozicia + 1; i < filmy.length; i++) {
novePole[i - 1] = filmy[i];
}
filmy = novePole;
}
public void vymazFilm(String nazovFilmu) {
int pozicia = 0;
while ((pozicia < filmy.length)
&& (!filmy[pozicia].getNazovFilmu().equals(nazovFilmu))) {
pozicia++;
}
if ((pozicia < filmy.length))
vymazFilm(filmy[pozicia]);
}
/**
* metóda uloží celý zoznam filmov do súboru, každý film sa zapisuje sám
*
* @param subor
* @throws FileNotFoundException
* @throws KonstruktorMaZlyNazovSuboruException
*/
private void ulozSa(String subor) throws FileNotFoundException,
KonstruktorMaZlyNazovSuboruException {
// if (nazovSuboru == null) {
// throw new
// KonstruktorMaZlyNazovSuboruException("Súbor "+subor+", do ktorého chcem ukladať, neexistuje. "
// +
// "Zoznam vyrábaj s konštruktorom, ktorý má názov súboru");
// }
File f;
try {
f = new File(subor);
} catch (NullPointerException e) {
throw new KonstruktorMaZlyNazovSuboruException("Súbor, "
+ "do ktorého chcem ukladať, nebol zadaný. "
+ "Zoznam skús vyrábať s konštruktorom, ktorý má názov súboru", e);
}
PrintWriter pw = null;
pw = new PrintWriter(f);
pw.println(filmy.length);
for (int i = 0; i < filmy.length; i++) {
filmy[i].ulozSa(pw);
}
pw.close();
}
/**
* metóda načíta celý zoznam filmov zo súboru
* každý film si prečíta hodnoty a naplní svoje inštančné premenné sám
* cez príslušný konštruktor
*
* @param subor Názov súboru z ktorého sa má načítať zoznam.
*/
public void nacitajSa(String subor) {
File f = new File(subor);
Scanner citac = null;
filmy = new Film[0];
try {
citac = new Scanner(f);
int dlzkaDb = citac.nextInt();
citac.nextLine();
for (int i = 0; i < dlzkaDb; i++) {
String typMedia = citac.nextLine();
if (typMedia.equals("dvd")) {
vlozNovyFilm(new FilmNaDvd(citac));
}
if (typMedia.equals("paska")) {
vlozNovyFilm(new FilmNaPaske(citac));
}
if (typMedia.equals("pc")) {
vlozNovyFilm(new FilmVPocitaci(citac));
}
}
} catch (FileNotFoundException e) {
System.err.println("Subor neviem precitat, zoznam filmov je prazdny.");
} catch (NazovPrazdnyException e) {
System.err.println("Načítal som súbor s prázdnum názvom.");
} finally {
if (citac != null) {
citac.close();
}
}
}
/**
* Metóda uloží zoznam do úložiska. Ak nemáme v inštančnej premennej nazovSuboru
* súbor, do ktorého chceme ukladať, vyhodíme výnimku KonstruktorMaZlyNazovSuboruException.
*
* @throws KonstruktorMaZlyNazovSuboruException
*/
@Override
public void ulozSa() throws KonstruktorMaZlyNazovSuboruException {
try {
ulozSa(nazovSuboru);
} catch (FileNotFoundException e) {
throw new KonstruktorMaZlyNazovSuboruException("Nazov suboru "
+ nazovSuboru + " definovany v konstruktore niekto zmazal",
e);
}
}
@Override
public void utriedPodlaNazvu() {
Arrays.sort(filmy);
}
@Override
public void utriedPodlaDlzky() {
Arrays.sort(filmy, new FilmPodlaDlzkyComparator());
}
@Override
public void utriedPodlaHodnotenia() {
Arrays.sort(filmy, new FilmPodlaHodnoteniaComparator());
}
}