Metodologie di Programmazione: Progetto

Riccardo Silvestri

Progetto

Web Site Analyser

Il progetto consiste nella realizzazione di un'applicazione chiamata Web Site Analyser, in breve WSA, che permette di analizzare siti web e può essere d'aiuto per la loro manutenzione. La WSA permette di eseguire esplorazioni di siti web e di analizzare i dati raccolti. Un sito web è caratterizzato da un dominio che è specificato da un URI assoluto e gerarchico (hierarchical URI) con la seguente sintassi

scheme://authority[path]

La parte path è opzionale e la parte authority consiste solamente nell'host. Alcuni esempi,

http://docs.oracle.com/javase/specs/jls/se8
http://twiki.di.uniroma1.it/pub/Metod_prog
https://www.python.org

Si noti che non è detto che l'URI che specifica un dominio sia l'indirizzo di una pagina scaricabile (ad es. http://twiki.di.uniroma1.it/pub/Metod_prog non corrisponde ad una pagina) e gli schemi possono essere qualsiasi (http,https, ftp, file, ecc.). Oltre a un dominio per poter effettuare un'esplorazione del sito web è necessario specificare uno o più indirizzi URI di pagine web che appartengono al dominio, questi sono detti seed. Ad esempio, per il dominio

http://twiki.di.uniroma1.it/pub/Metod_prog

si potrebbe dare l'indirizzo

http://twiki.di.uniroma1.it/pub/Metod_prog/RS_L18/lezione18.html

Chiaramente i seed devono corrispondere a pagine web e devono appartenere al dominio del sito web. Se dom è l'URI di un dominio e u è un URI, allora si può determinare se u appartiene al dominio dom controllando che valga o meno la seguente condizione: u è uguale a dom o dom.relativize(u) ritorna un URI diverso da u.

L'applicazione ha un'interfaccia utente grafica che permette di effettuare le seguenti operazioni.

  1. L'operazione fondamentale è l'esplorazione di un sito web e la raccolta di informazioni su di esso. L'utente specifica un dominio e uno o più URI seed e può far partire l'eplorazione del sito web. Ovviamente la WSA farà i controlli del caso. L'esplorazione cerca di scaricare le pagine a partire dai seed e per ognuna di quelle appartenenti al dominio estrae i link e scarica le pagine relative e continua l'esplorazione fino a che non ci sono più link da scaricare. Per gli URI non appartenenti al dominio prova solamente se sono scaricabili ma non ne considera i link.

  2. Prima d'iniziare l'esplorazione di un sito l'utente può scegliere una directory del file system in cui archiviare i risultati, anche parziali, dell'esplorazione.

  3. Durante l'esplorazione di un sito la WSA mostra gli URL delle pagine scaricate e gli eventuali errori incontrati. Inoltre per ogni pagina appartenente al dominio, a richiesta, mostra i link estratti e per ognuno se è già stato seguito o se ha incontrato un errore. L'utente può navigare facilmente questi dati che sono continuamente aggiornati. Per ogni pagina del dominio scaricata mostra il numero di link in essa contenuti e per ogni pagina, anche esterna al dominio, il numero di link finora trovati che puntano ad essa.

  4. In ogni momento l'utente può cliccare su uno dei link delle pagine è ottenere la visualizzazione della pagina. Inoltre, può aggiungere nuovi seed URI (appartenenti al dominio) per l'esplorazione anche mentre l'esplorazione è in esecuzione e può sospendere l'esplorazione e può riprenderla a piacere oppure può annullarla in modo definitivo.

  5. Se per l'esplorazione è stata decisa l'archiviazione, allora periodicamente (almeno ogni minuto) durante l'esplorazione l'archivio deve essere aggiornato in modo tale che se per qualsiasi motivo l'applicazione si interrompe, l'esplorazione può essere ripresa senza perdere troppo lavoro.

  6. L'utente può aprire in ogni momento l'archivio di un sito web ed eventualmente riprenderne l'esplorazione se non era terminata. Ma anche se era terminata l'utente può aggiungere qualche altro seed URI e riprendere l'esplorazione se questi sono diversi da quelli già visitati. Quando un archivio è aperto la WSA permette di navigare facilmente tutti i suoi dati: gli URI delle pagine e dei link classificandoli come interni al dominio, esterni al dominio, scaricati con successo o con errori. La WSA mostra la causa di ogni errore richiesto dall'utente. Per ogni URI dà la possibilità di visualizzare la pagina e mostra la lista dei link che puntano alla pagina (tra quelli esplorati) e per quelli appartenenti al dominio mostra anche la lista dei link contenuti nella pagina. Inoltre per ogni URI scaricato appartenente al dominio mostra anche il numero di immagini, il numero di nodi e l'altezza dell'albero di parsing.

  7. Per un sito web aperto la WSA permette di mostrare dati statistici generali come: numero totale URI visitati, numero URI interni al dominio, numero URI che hanno prodotto errori, massimo numero di link in una pagina, numero massimo di link che puntano ad una pagina. Inoltre, la WSA dovrebbe mostrare anche dati di un sito sotto forma di grafici. Ad esempio istogrammi relativi ai link uscenti e a quelli entranti.

  8. Per un sito aperto la cui esplorazione sia terminata l'utente può chiedere di calcolare la distanza tra due URI interni al dominio e anche la massima distanza tra tutte le coppie di URI appartenenti al dominio. Durante operazioni come queste che possono prendere tempi lunghi, la WSA mantiene sempre l'interfaccia utente reattiva e permette di cancellarne l'esecuzione.

  9. Relativamente a due o più siti aperti la WSA permette di calcolare il numero di link da uno dei siti verso un altro.

Per l'implementazione si può usare solamente la libreria standard di Java. La GUI deve essere implementata tramite JavaFX.

La parte relativa all'implementazione del web crawling deve essere implementata seguendo l'architettura stabilita in progetto.jar. Seguire scrupolosamente i javadoc delle classi e delle interfacce. L'implementazione dell'intera applicazione deve essere contenuta nel package wsa di progetto.jar. Quindi tutti gli eventuali altri package devono essere sotto-package di wsa e tutte le definizioni di classi e interfacce devono appartenere al package wsa o a un sotto-package. Inoltre deve esserci un package wsa.gui che deve contenere direttamente una classe di nome Main che definisce il metodo main dell'applicazione. In altri termini eseguendo il main della classe wsa.gui.Main si esegue l'applicazione.

Richieste di chiarimenti dovrebbero essere postate sul Google Group del corso.

Valutazione

La valutazione del progetto dipenderà dai seguenti aspetti.

  1. Rispetto delle specifiche, affidabilità ed efficienza valutate anche tramite testing.
  2. Qualità e usabilità della GUI.
  3. Organizzazione e struttura del codice.
  4. Leggibilità e documentazione.

Consegna

Il progetto deve essere consegnato in un unico file JAR di nome progetto.jar il cui contenuto deve rispettare la seguente struttura:

progetto
    |--- src
          |-- wsa
               |-- sub-package1
               |-- sub-package2
               . . .
    |--- resources
              |--- eventuali sub-directory

Più precisamente il JAR deve contenere una sola directory e questa deve chiamarsi progetto. Tale directory deve contenere una directory src ed eventualmente un'altra directory resources se ci sono risorse che servono alla GUI come immagini e CSS. Quindi la directory progetto deve contenere solamente la directory src ed eventualmente resources. Il JAR non deve contenere file che non servono al progetto. In particolare la directory src deve contenere esclusivamente file sorgenti .java e la directory resources deve contenere solamente risorse che sono necessarie alla GUI. Per costruire il JAR si deve usare il comando

jar cvMf progetto.jar progetto

Dopo aver creato il JAR, per controllare che il contenuto sia giusto, si deve fare il seguente controllo. Prima di tutto estrarre tutti i file con il comando

jar -xf progetto.jar

Poi compilare il progetto con il comando (i percorsi sono nella versione Linux/Mac, per windows usare \ al posto di /)1:

javac -classpath path/progetto/src progetto/src/wsa/gui/Main.java

dove path è il percorso assoluto della directory che contiene la directory progetto. Infine eseguire il progetto con il comando2

java -cp path/progetto/src:path/progetto/resources wsa.gui.Main

Il carattere : che separa i due percorsi va bene per Linux/Mac mentre per Windows bisogna usare ;. Controllare quindi che l'esecuzione dell'applicazione avvenga senza errori. ATTENZIONE: se il JAR consegnato non supera questo controllo non sarà preso in considerazione.

Prima di consegnare il progetto bisogna registrarlo tramite la pagina Registrazione Progetto. Poi può essere consegnato tramite la pagina Consegna Progetto.

Se si vuole discutere il progetto in un dato appello, il progetto va consegnato qualche giorno prima dell'appello secondo la seguente tabella:

Data consegna Appello
16 giugno 19 giugno
7 luglio 10 luglio
5 settembre 9 settembre
16 gennaio 2016 20 gennaio 2016
9 febbraio 2016 12 febbraio 2016
4 aprile 2016 5 aprile 2016

Avvertenze

Non copiare. I progetti consegnati saranno scrupolosamente confrontati anche con strumenti automatici.

Test della parte wsa.web del progetto

Il jar del programma per il test della parte wsa.web del progetto: test.jar. Istruzioni per eseguire il test:

  1. Estrarre test.jar, diciamo in una directory path
  2. Seguire le istruzioni nel javadoc della classe project.Grader per impostare il percorso della directory con i file di test (si possono usare quelli dell'homework 3)
  3. Supponendo che il progetto compilato sia nel jar progetto.jar, sempre nella directory path, compilare con il comando

     javac -classpath path:path/progetto.jar path/project/Grader.java
    
  4. Infine eseguire il test con il comando

     java -classpath path:path/progetto.jar project.Grader
    

7 Apr 2016


  1. L'opzione -classpath imposta uno o più percorsi assoluti (separati da : per Linux/Mac e ; per Windows) in cui il compilatore può ricercare file sorgenti.

  2. L'opzione -cp (abbreviazione di -classpath) imposta uno o più percorsi assoluti (separati da : per Linux/Mac e ; per Windows) in cui la JVM può ricercare file .class e risorse.