package com.vgo.movie.thread;
import java.awt.Cursor;
import java.io.File;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import com.vgo.movie.data.DatabaseDAO;
import com.vgo.movie.domain.Generique;
import com.vgo.movie.domain.Movie;
import com.vgo.movie.ecran.BulkInsertSelection;
import com.vgo.movie.util.Libelle;
public class AnalyseMediaThread extends Thread{
private String sourceFolder;
private BulkInsertSelection localParent;
private LinkedList<String> listeFichier;
private static String[] extensionsAutorises = {"avi","mpg","divx","mpeg","mkv"};
private List<String> tmpListLangueOut;
private List<String> tmpListQualiteOut;
private List<String> tmpListCompressionOut;
public AnalyseMediaThread(BulkInsertSelection parent, String source){
sourceFolder = source;
localParent = parent;
}
public void initialize() {
this.start();
}
public void run() {
localParent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
listeFichier = new LinkedList<String>();
analyseRepertoire(sourceFolder);
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("fichiersDecouvert", new Integer(this.listeFichier.size()).toString()),
Libelle.getLibelle("information"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
null,
null);
List tmpListIn = new LinkedList();
try {
tmpListIn = DatabaseDAO.selectAllMedias();
}
catch (SQLException e) {
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("erreurInitListe"),
Libelle.getLibelle("erreur"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE,
null,
null,
null);
}
List<String> tmpListOut = new LinkedList<String>();
Iterator tmpIterator = tmpListIn.listIterator();
while(tmpIterator.hasNext()){
tmpListOut.add(((Generique)tmpIterator.next()).getLibelle());
}
Object[] possibilities = tmpListOut.toArray();
String typeMedia = (String)JOptionPane.showInputDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("choisirTypeMedia"),
Libelle.getLibelle("information"),
JOptionPane.PLAIN_MESSAGE,
null,
possibilities,
null);
if(typeMedia == null){
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("operationAnnule"),
Libelle.getLibelle("information"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE,
null,
null,
null);
localParent.dispose();
}
else {
int dernierNumMedia = 0;
try {
dernierNumMedia = ((Movie)DatabaseDAO.recupDernierNumMedia()).getIdMedia();
} catch (SQLException e) {
dernierNumMedia = 0;
}
//R�cup�rer toute les listes
//On commence par celle des qualit�es
try {
tmpListQualiteOut = new LinkedList<String>();
tmpIterator = DatabaseDAO.selectAllQualites().listIterator();
while(tmpIterator.hasNext()){
tmpListQualiteOut.add(((Generique)tmpIterator.next()).getCode());
}
} catch (SQLException e) {
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("erreurInitialisationListeQualite"),
Libelle.getLibelle("erreur"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE,
null,
null,
null);
}
//Puis celle des Langues
try {
tmpListLangueOut = new LinkedList<String>();
tmpIterator = DatabaseDAO.selectAllLangues().listIterator();
while(tmpIterator.hasNext()){
tmpListLangueOut.add(((Generique)tmpIterator.next()).getCode());
}
} catch (SQLException e) {
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("erreurInitialisationListeLangue"),
Libelle.getLibelle("erreur"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE,
null,
null,
null);
}
//Puis celle des Compressions
try {
tmpListCompressionOut = new LinkedList<String>();
tmpIterator = DatabaseDAO.selectAllCompressions().listIterator();
while(tmpIterator.hasNext()){
tmpListCompressionOut.add(((Generique)tmpIterator.next()).getCode());
}
} catch (SQLException e) {
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("erreurInitialisationListeCompression"),
Libelle.getLibelle("erreur"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE,
null,
null,
null);
}
//parsing des noms de fichiers
//principe : enlever le "." et "_" dans le nom
//d�tecter les cat�gories avec ce qui existe en base
//enlever ce qui est d�tect� du nom du film
//proposer le reste comme nom de film
for (String film : listeFichier) {
Movie tmpMovie = new Movie();
film = film.replaceAll("_", " ");
film = film.replaceAll("\\.", " ");
//Cr�ation d'un film avec init du type de m�dia, du num�ro et du statut
tmpMovie.setType(typeMedia);
tmpMovie.setIdMedia(dernierNumMedia+1);
tmpMovie.setStatut("");
//Puis on initialise � vide les autres
tmpMovie.setCompression("");
tmpMovie.setLangue("");
tmpMovie.setQualite("");
//Puis on met le nom du film tel qu'il est
tmpMovie.setNom(film);
//Maintenant passons � la d�tection de la compression
tmpMovie = detectionCompression(tmpMovie);
//Idem pour la langue
tmpMovie = detectionLangue(tmpMovie);
//Et finalement la qualit�
tmpMovie = detectionQualite(tmpMovie);
//Puis on nettoie le nom du film en enlevant les doubles espaces g�n�r�s
while (tmpMovie.getNom().indexOf(" ") != -1){
tmpMovie.setNom(tmpMovie.getNom().replaceAll(" ", " "));
}
//Proposition du film dans la fen�tre
localParent.getJTextNomFilm().setText(tmpMovie.getNom());
localParent.getJTextFieldNumMedia().setText(new Integer(tmpMovie.getIdMedia()).toString());
localParent.getJComboBoxTypeMedia().setSelectedItem(tmpMovie.getType());
if(!tmpMovie.getCompression().equals("")){
localParent.getJComboBoxCompression().setSelectedItem(tmpMovie.getCompression());
}
if(!tmpMovie.getLangue().equals("")){
localParent.getJComboBoxLangue().setSelectedItem(tmpMovie.getLangue());
}
if(!tmpMovie.getQualite().equals("")){
localParent.getJComboBoxQualite().setSelectedItem(tmpMovie.getQualite());
}
//Puis mise en attente de la validation
localParent.setValidationEnCours(true);
localParent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
while(localParent.isValidationEnCours()){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
//L'utilisateur � valid� ou pass� on passe au films suivant
localParent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
//On attends un r�ponse de l'utilisateur
//Puis on passe au film suivant
}
/*Affichage du message final � l'utilisateur*/
if(localParent.getNbMovieInserted() > 1){
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("filmsInseres",
new Integer(localParent.getNbMovieInserted()).toString(),
new Integer(dernierNumMedia+1).toString()),
Libelle.getLibelle("information"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
null,
null);
}
else{
if(localParent.getNbMovieInserted() > 0){
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("filmInsere",
new Integer(localParent.getNbMovieInserted()).toString(),
new Integer(dernierNumMedia+1).toString()),
Libelle.getLibelle("information"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
null,
null);
}
else{
JOptionPane.showOptionDialog(
SwingUtilities.getWindowAncestor(localParent),
Libelle.getLibelle("aucunFilmInsere"),
Libelle.getLibelle("information"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
null,
null);
}
}
//Une fois tous les films d�roul�s on ferme
localParent.dispose();
}
}
private void analyseRepertoire(String repertoire) {
File rootFolder = new File(repertoire);
String[] tmpList = rootFolder.list();
for (int i=0;i<tmpList.length;i++){
File tmpFile = new File(repertoire + "\\" + tmpList[i]);
if(tmpFile.isDirectory()){
analyseRepertoire(tmpFile.getPath());
}
else{
if(extensionAutorisee(tmpFile.getName().substring(tmpFile.getName().lastIndexOf(".") + 1, tmpFile.getName().length()))){
listeFichier.add(tmpFile.getName().substring(0,tmpFile.getName().lastIndexOf(".")));
}
}
}
}
private boolean extensionAutorisee(String extension){
for(int i=0;i<extensionsAutorises.length;i++){
if(extension.toLowerCase().equals(extensionsAutorises[i].toLowerCase())){
return true;
}
}
return false;
}
private Movie detectionCompression(Movie tmpMovie){
StringTokenizer st;
String tmpToken = null;
StringTokenizer st2;
String tmpToken2 = null;
for(String compression : tmpListCompressionOut){
st = new StringTokenizer(tmpMovie.getNom()," ");
while ( st.hasMoreTokens() ) {
tmpToken = st.nextToken();
if (tmpToken.toLowerCase().equals(compression.toLowerCase())){
//On a une touche
//On met la compression � jour
tmpMovie.setCompression(compression);
//On enl�ve la compression du nom du film
String tmpNouveauNom = new String();
tmpNouveauNom = tmpMovie.getNom().substring(0, tmpMovie.getNom().toLowerCase().indexOf(compression.toLowerCase()));
tmpNouveauNom = tmpNouveauNom + tmpMovie.getNom().substring(tmpMovie.getNom().toLowerCase().indexOf(compression.toLowerCase()) + compression.length());
tmpMovie.setNom(tmpNouveauNom);
break;
}
st2 = new StringTokenizer(tmpToken,"-");
while ( st2.hasMoreTokens() ) {
tmpToken2 = st2.nextToken();
if (tmpToken2.toLowerCase().equals(compression.toLowerCase())){
//On a une touche
//On met la compression � jour
tmpMovie.setCompression(compression);
//On enl�ve la compression du nom du film
String tmpNouveauNom = new String();
tmpNouveauNom = tmpMovie.getNom().substring(0, tmpMovie.getNom().toLowerCase().indexOf(compression.toLowerCase()));
tmpNouveauNom = tmpNouveauNom + tmpMovie.getNom().substring(tmpMovie.getNom().toLowerCase().indexOf(compression.toLowerCase()) + compression.length());
tmpMovie.setNom(tmpNouveauNom);
break;
}
}
}
}
return tmpMovie;
}
private Movie detectionLangue(Movie tmpMovie){
StringTokenizer st;
String tmpToken = null;
StringTokenizer st2;
String tmpToken2 = null;
for(String langue : tmpListLangueOut){
st = new StringTokenizer(tmpMovie.getNom()," ");
while ( st.hasMoreTokens() ) {
tmpToken = st.nextToken();
if (tmpToken.toLowerCase().equals(langue.toLowerCase())){
//On a une touche
//On met la langue � jour
tmpMovie.setLangue(langue);
//On enl�ve la langue du nom du film
String tmpNouveauNom = new String();
tmpNouveauNom = tmpMovie.getNom().substring(0, tmpMovie.getNom().toLowerCase().indexOf(langue.toLowerCase()));
tmpNouveauNom = tmpNouveauNom + tmpMovie.getNom().substring(tmpMovie.getNom().toLowerCase().indexOf(langue.toLowerCase()) + langue.length());
tmpMovie.setNom(tmpNouveauNom);
break;
}
st2 = new StringTokenizer(tmpToken,"-");
while ( st2.hasMoreTokens() ) {
tmpToken2 = st2.nextToken();
if (tmpToken2.toLowerCase().equals(langue.toLowerCase())){
//On a une touche
//On met la langue � jour
tmpMovie.setLangue(langue);
//On enl�ve la langue du nom du film
String tmpNouveauNom = new String();
tmpNouveauNom = tmpMovie.getNom().substring(0, tmpMovie.getNom().toLowerCase().indexOf(langue.toLowerCase()));
tmpNouveauNom = tmpNouveauNom + tmpMovie.getNom().substring(tmpMovie.getNom().toLowerCase().indexOf(langue.toLowerCase()) + langue.length());
tmpMovie.setNom(tmpNouveauNom);
break;
}
}
}
}
return tmpMovie;
}
private Movie detectionQualite(Movie tmpMovie){
StringTokenizer st;
String tmpToken = null;
StringTokenizer st2;
String tmpToken2 = null;
for(String qualite : tmpListQualiteOut){
st = new StringTokenizer(tmpMovie.getNom()," ");
while ( st.hasMoreTokens() ) {
tmpToken = st.nextToken();
if (tmpToken.toLowerCase().equals(qualite.toLowerCase())){
//On a une touche
//On met la qualite � jour
tmpMovie.setQualite(qualite);
//On enl�ve la qualite du nom du film
String tmpNouveauNom = new String();
tmpNouveauNom = tmpMovie.getNom().substring(0, tmpMovie.getNom().toLowerCase().indexOf(qualite.toLowerCase()));
tmpNouveauNom = tmpNouveauNom + tmpMovie.getNom().substring(tmpMovie.getNom().toLowerCase().indexOf(qualite.toLowerCase()) + qualite.length());
tmpMovie.setNom(tmpNouveauNom);
break;
}
st2 = new StringTokenizer(tmpToken,"-");
while ( st2.hasMoreTokens() ) {
tmpToken2 = st2.nextToken();
if (tmpToken2.toLowerCase().equals(qualite.toLowerCase())){
//On a une touche
//On met la qualite � jour
tmpMovie.setQualite(qualite);
//On enl�ve la qualite du nom du film
String tmpNouveauNom = new String();
tmpNouveauNom = tmpMovie.getNom().substring(0, tmpMovie.getNom().toLowerCase().indexOf(qualite.toLowerCase()));
tmpNouveauNom = tmpNouveauNom + tmpMovie.getNom().substring(tmpMovie.getNom().toLowerCase().indexOf(qualite.toLowerCase()) + qualite.length());
tmpMovie.setNom(tmpNouveauNom);
break;
}
}
}
}
return tmpMovie;
}
}