/* Codice java commentato */
/* Questa pagina contiene il codice java dello spider.
Tutti i commenti e ció che non é codice sono stati inseriti come commento, in modo
da facilitare un eventuale utilizzo del codice o di parti di esso. */
/* Inizio codice */
import java.sql.*; /* Libreria utilizzata per interagire con la base di dati */
import java.io.File; /* Libreria utilizzata per la scansione del file system */
import de.vdheide.mp3.*; /* Libreria utilizzata per la lettura dei tag id3 */
import de.vdheide.utils.*; /* Libreria utilizzata per la lettura dei tag id3 */
import java.net.InetAddress; /* Libreria utilizzata per conoscere l'indirizzo ip e il nome dell'host */
public class Smp3 {
static Connection con = null; /* variabile necessaria per la connessione al DBMS */
static String my_table = "mp3"; /* nome della tabella in cui inserire i dati */
static String nome_host=null; /* nome dell'host */
static String ind_ip=null; /* indirizzo ip dell'host */
static String ro=null; /* variabile per la root di codivisione */
public static void main(String[] args)
{String url=null; /* la directory da scansionare */
String serverName = "localhost"; /* nome del server in cui e' installato MySql */
String mydatabase = "daniele"; /* nome del database su cui lavorare */
String username = "rampoldi"; /* username da utilizzare per la connessione a MySql */
String password = "rampoldi"; /* password da utilizzare per la connessione a MySql */
InetAddress ip=null; /* variabile in cui inserire l'indirizzo ip dell'host */
int cancella=0; /* se cancella==1 --> elimina tutte le precedenti righe inserite da quell'host */
try
{ip=java.net.InetAddress.getLocalHost(); /* public static InetAddress getLocalHost()
throws UnknownHostException
(Returns the local host) */
nome_host=ip.getHostName(); /* public String getHostName()
(Gets the host name for this IP address) */
ind_ip=ip.getHostAddress(); /* public String getHostAddress()
(Returns the IP address string in textual presentation) */
}
catch(Exception ex)
{System.out.println("Errore nel recupero dell'indirizzo ip");
nome_host="";
ind_ip="127.0.0.1";
}
if(args.length!=0) /* entra se nel chiamare l'applicazione ho utilizzato dei parametri aggiuntivi */
{int p=0; /* identifica il parametro i-esimo */
while(p < args.length)
{if(args[p].equals("-s")) /* indica il servername da cambiare */
{p++;
try
{serverName=args[p].substring(0);
}
catch(Exception ex)
{System.out.println("Errore di sintassi in input -s");
return;
}
p++;
continue;
}
if(args[p].equals("-u")) /* indica l'username */
{p++;
try
{username=args[p].substring(0);
}
catch(Exception ex)
{System.out.println("Errore di sintassi in input -u");
return;
}
p++;
continue;
}
if(args[p].equals("-p")) /* indica la password */
{p++;
try
{password=args[p].substring(0);
}
catch(Exception ex)
{System.out.println("Errore di sintassi in input -p");
return;
}
p++;
continue;
}
if(args[p].equals("-b")) /* indica il database da cambiare */
{p++;
try
{mydatabase=args[p].substring(0);
}
catch(Exception ex)
{System.out.println("Errore di sintassi in input -b");
return;
}
p++;
continue;
}
if(args[p].equals("-d")) /* indica la directory da scandire */
{p++;
try
{url=args[p].substring(0);
}
catch(Exception ex)
{System.out.println("Errore di sintassi in input -d");
return;
}
while(p+1 < args.length) /* in windows il nome di una cartella puo' contenere uno spazio (es.:"C:\Documents and Settings"): il nome viene dunque passato al programma in piu' parametri anziche' in uno solo */
{if(!(args[p+1].equals("-r")) && !(args[p+1].equals("-n")) && !(args[p+1].equals("-i")) && !(args[p+1].equals("-d")) && !(args[p+1].equals("-c")) && !(args[p+1].equals("-h")) && !(args[p+1].equals("-s")) && !(args[p+1].equals("-b")) && !(args[p+1].equals("-u")) && !(args[p+1].equals("-p")))
{p++;
url=url+" "+args[p].substring(0);
}
else
break;
}
if(java.io.File.separator.equals(url.substring(url.length()-1)))
url=url; /* se la directory in input termina con il separatore non faccio niente (es.:"C:\") */
else
url=url+java.io.File.separator; /* se la directory in input non termina con il separatore lo aggiungo (es.:"C:" --> diventa --> "C:\") */
p++;
continue;
}
if(args[p].equals("-r")) /* indica la root di condivisione. Blocco di codice analogo al precedente */
{p++;
try
{ro=args[p].substring(0);
}
catch(Exception ex)
{System.out.println("Errore di sintassi in input -r");
return;
}
while(p+1 < args.length)
{if(!(args[p+1].equals("-r")) && !(args[p+1].equals("-n")) && !(args[p+1].equals("-i")) && !(args[p+1].equals("-d")) && !(args[p+1].equals("-c")) && !(args[p+1].equals("-h")) && !(args[p+1].equals("-s")) && !(args[p+1].equals("-b")) && !(args[p+1].equals("-u")) && !(args[p+1].equals("-p")))
{p++;
ro=ro+" "+args[p].substring(0);
}
else
break;
}
if(java.io.File.separator.equals(ro.substring(ro.length()-1)))
ro=ro;
else
ro=ro+java.io.File.separator;
p++;
continue;
}
if(args[p].equals("-c")) /* cancella tutte le righe della BDD riferite all'host corrente */
{cancella=1;
p++;
continue;
}
if(args[p].equals("-i")) /* nuovo indirizzo ip */
{p++;
try
{ind_ip=args[p].substring(0);
}
catch(Exception ex)
{System.out.println("Errore di sintassi in input -i");
return;
}
p++;
continue;
}
if(args[p].equals("-n")) /* nuovo nome host */
{p++;
try
{nome_host=args[p].substring(0);
}
catch(Exception ex)
{System.out.println("Errore di sintassi in input -n");
return;
}
p++;
continue;
}
if(args[p].equals("-h")) /* help --> stampa a video i possibili parametri */
{System.out.println();
System.out.println("Parametri disponibili:");
System.out.println(" -h --> help");
System.out.println(" -s --> server su cui sono presenti i databases");
System.out.println(" es.: \"-s db.stat.unipd.it\"");
System.out.println(" -b --> nome del database");
System.out.println(" es.: \"-b daniele\"");
System.out.println(" -u --> username");
System.out.println(" es.: \"-u rampoldi\"");
System.out.println(" -p --> password");
System.out.println(" es.: \"-p rampoldi\"");
System.out.println(" -i --> ip");
System.out.println(" es.: \"-i 127.0.0.99\"");
System.out.println(" -n --> nome dell'host");
System.out.println(" es.: \"-n DR_casa\"");
System.out.println(" -r --> root di condivisione");
System.out.println(" es.: \"-r c:\\www\"");
System.out.println(" -c --> cancella dal database tutti i dati precedenti");
System.out.println(" -d --> indica la directory principale da analizzare");
System.out.println(" es.: \"-d c:\\mp3\"");
System.out.println(" es.2: \"-d c:");
System.out.println();
return;
}
else
{System.out.println("Errore di sintassi in input -h");
break;
}
}
}
/* caricamento dei driver MySql e connessione al DBMS */
String urlsql = "jdbc:mysql://" + serverName + "/" + mydatabase; /* l'url JDBC */
try{
String driverName = "org.gjt.mm.mysql.Driver"; /* il driver MySQL MM JDBC */
Class.forName(driverName);
con = DriverManager.getConnection(urlsql, username, password); /* Connessione al DBMS */
}
catch (ClassNotFoundException e) {
System.out.println("Non c'e' il driver del database?");
return;
}
catch (Exception e) {
System.out.println("Errore nel caricamento dei driver o nella connessione al DBMS");
return;
}
if(cancella==1) /* Si vogliono cancellare dal DB le righe corrispondenti all'host */
{try
{Statement stmt = con.createStatement();
String sql = "delete from mp3 where nome_host='" + nome_host + "' AND ip='" + ind_ip + "'";
stmt.executeUpdate(sql);
}
catch (SQLException e2)
{System.out.println("SQLException: " + e2.getMessage());
System.out.println("SQLState: " + e2.getSQLState());
System.out.println("VendorError: " + e2.getErrorCode());
}
catch (Exception e2)
{System.out.println("Errore nella cancellazione delle righe precedenti");
return;
}
}
if(url==null) /* directory di scansione vuota */
{File prog=new File("Smp3.class"); /* prendo di default la cartella corrente (in cui sto eseguendo il programma "Smp3.class") */
/* public File(String pathname) */
/* NOTA BENE: e' necessario modificare questa riga (ed alcune poco piu' sotto) se si cambia il nome del file */
url=prog.getAbsolutePath(); /* public String getAbsolutePath()
(Returns the absolute pathname string of this abstract pathname) */
url=url.substring(0,url.length()-10); /* estraggo dal pathname assoluto la directory in cui mi trovo */
/* 10 e' la lunghezza del nome "Smp3.class" (da cambiare se si rinomina il file java) */
}
if(ro==null) /* directory di condivisione vuota. Blocco di codice analogo al precedente */
{File prog=new File("Smp3.class");
ro=prog.getAbsolutePath();
ro=ro.substring(0,ro.length()-10); /* 10 e' la lunghezza del nome "Smp3.class" */
}
System.out.println("\n\n Cartella principale di ricerca:\n "+url);
System.out.println();
System.out.println(" Cartella di root di condivisione:\n "+ro+"\n");
System.out.println();
ro=correggi(ro); /* effettua una correzione sulla stringa ro */
cerca(url); /* Do' il via al programma vero e proprio */
try{
con.close(); /* chiudo la connessione con il DBMS */
}
catch (Exception e) {
System.out.println("Errore durante la disconnessione dal DBMS");
}
}
/* Questa funzione e' il programma vero e proprio.
E' una funzione ricorsiva; memorizza (e scansiona) le cartelle e le sottocartelle
utilizzando una struttura a pila (stack) */
public static void cerca(String u)
{String path="";
String nome="";
String album="";
String artista="";
String commento="";
String titolo="";
String anno="";
String link="";
String a[]; /* struttura utilizzata per la memorizzazione del contenuto delle directory */
String estensione=".mp3";
File b=new File(u); /* crea un nuovo oggetto File che identifichi la cartella corrente */
a=b.list(); /* memorizza in a[] il contenuto della directory */
for(int i=0;i < a.length;i++) /* scansiona la directory */
{File c=new File(u,a[i]);
if(c.isDirectory()) /* se l'oggetto scansionato e' una cartella chiama ricorsivamente la funzione cerca */
{ /* con in input il path assoluto della cartella trovata */
cerca(u+a[i]+java.io.File.separator);
continue; /* quando ritorno a questo livello (cioe' quando ho scansionato tutte le sottocartelle) */
} /* vai al passo successivo del for, quindi controlla il successivo oggetto della cartella corrente */
if(a[i].length() < 5) /* se l'oggetto corrente e' un file con nome piu' corto di 5 caratteri */
continue; /* non sara' sicuramente un file con estensione mp3 (almeno 5 caratteri: "1.mp3") */
if(estensione.equalsIgnoreCase(a[i].substring(a[i].length()-4))) /* se il file ha estensione ".mp3" lo prendo in considerazione, se no passo al prossimo oggetto */
{if(c.isFile())
{de.vdheide.mp3.ID3 d=new ID3(c); /* creo un nuovo oggetto ID3 */
nome=correggi(a[i]); /* correggo il nome del file e il path per il passaggio a MySql */
path=correggi(u);
try
{if(d.checkForTag()) /* estraggo e memorizzo i tag id3 */
{album=d.getAlbum();
album=correggi(album); /* e li correggo per il passaggio a MySql */
artista=d.getArtist();
artista=correggi(artista);
commento=d.getComment();
commento=correggi(commento);
titolo=d.getTitle();
titolo=correggi(titolo);
anno=d.getYear();
anno=correggi(anno);
}
else /* se i tag non sono presenti */
{album="";
artista="";
commento="";
titolo="";
anno="";
}
}
catch (Exception ex) {
System.out.println("Errore nel prelievo del tag id3 del file "+u+" --> "+a[i]);
}
/* ora devo occuparmi dei link da inserire in MySql per l'interfaccia utente */
/* innanzi tutto se la lunghezza del path corrente e' minore della lunghezza del path di condivisione */
/* sono sicuro che il file non sara' disponibile in linea */
if(path.length() < ro.length())
{link="progetto-sebd/no.htm";
}
else /* se il path corrente e' una subdirectory del path di condivisione ricostruisco il link */
{if(ro.equalsIgnoreCase(path.substring(0,ro.length()))) /* da notare che il programma utilizza per il confronto una funzione che ignora la differenza fra caratteri minuscoli o maiuscoli */
{link=path.substring(ro.length()); /* quindi per esempio c:\FiLeMp3 sara' uguale a c:\fIlEmP3 */
link=link.concat(nome);
link=correggiLink(link);
}
else
{link="progetto-sebd/no.htm";
}
}
try { /* ora ho tutte le informazioni che mi servono: inserisco quindi la riga nel DBMS */
Statement stmt = con.createStatement();
String sql = "INSERT INTO " + my_table + " VALUES('" + ind_ip + "','" + nome_host + "','" + nome + "','" + path + "','" + link + "','" + artista + "','" + titolo + "','" + album + "','" + anno + "','" + commento +"')";
stmt.executeUpdate(sql);
}
catch (SQLException e) {
try{ /* se ho un errore del tipo SQLException potrebbe voler dire che la riga e' gia' presente --> provo quindi prima di tutto ad aggiornarla */
Statement stmt = con.createStatement();
String sql2 = "UPDATE " + my_table + " SET artista='" + artista + "',titolo='" + titolo + "',album='" + album + "',anno='" + anno + "',commento='" + commento + "',link='" + link + "' WHERE ip='" + ind_ip + "' AND nome_host='" + nome_host + "' AND nome_file='" + nome + "' AND path='" + path + "'";
stmt.executeUpdate(sql2);
}
catch (SQLException e2){
System.out.println("SQLException: " + e2.getMessage());
System.out.println("SQLState: " + e2.getSQLState());
System.out.println("VendorError: " + e2.getErrorCode());
}
catch (Exception e2){
System.out.println("Errore nell'update della riga corrispondente al file " + path + " + " + nome);
}
}
catch (Exception e) {
System.out.println("Errore nell'inserimento della riga corrispondente al file " + path + " + " + nome);
}
} /* fine if(c.isFile()) */
} /* fine if(estensione.equals(a[i].substring(a[i].length()-3))) */
} /* fine for(int i=0;i < a.length;i++) */
}
/* questa funzione effettua una correzione sulla stringa in input per non avere problemi quando
la stringa sara' passata a MySql. La correzione riguarda la barra "\" e l'apice singolo */
public static String correggi(String a)
{char[] data=new char[a.length()+a.length()+a.length()+a.length()];
int k=0;
String ritorno=null;
String barra="\\";
String apo="'";
for(int y=0;y < a.length();y++)
{data[k]=a.charAt(y);
if(barra.equals(a.substring(y,y+1)))
{k++;
data[k]='\\';
}
if(apo.equals(a.substring(y,y+1)))
{data[k+1]=a.charAt(y);
data[k]='\\';
k++;
}
k++;
}
ritorno=java.lang.String.valueOf(data,0,k);
return ritorno;
}
/* questa funzione effettua una correzione sulla stringa che indica il collegamento al file
perche' in windows il carattere di separazione e' "\", mentre su molti altri
sistemi operativi e in rete e' "/" */
public static String correggiLink(String a)
{char[] data=new char[a.length()+a.length()];
int k=0;
String ritorno=null;
String barra="\\";
String apo="'";
for(int y=0;y < a.length();y++)
{if(barra.equals(a.substring(y,y+1)))
{if(barra.equals(a.substring(y+1,y+2)))
{data[k]='/';
k++;
y++;
continue;
}
}
data[k]=a.charAt(y);
k++;
}
ritorno=java.lang.String.valueOf(data,0,k);
return ritorno;
}
}
Data creazione: 17 Settembre 2010
Data ultima modifica: 30 Dicembre 2012