Metodologie di Programmazione: Hw3
Il terzo homework è in questo archivio jar homework3.jar. Dopo averlo scaricato, dare il comando da terminale jar -xf homework3.jar
, essendo posizionati nella directory che contiene il jar che supponiamo si chiami hw3
. Le directory e file estratti in hw3
sono i seguenti:
wsa/
wsa/JFX.java
wsa/package-info.java
wsa/web/
wsa/web/AsyncLoader.java
wsa/web/Crawler.java
wsa/web/CrawlerResult.java
wsa/web/html/
wsa/web/html/Parsed.java
wsa/web/Loader.java
wsa/web/LoaderFactory.java
wsa/web/LoadResult.java
wsa/web/package-info.java
wsa/web/SiteCrawler.java
wsa/web/WebFactory.java
La spiegazione dell'homework è contenuta nei javadoc dei file partendo da wsa/package-info.java
.
Se si vuole si può usare un IDE creando un project contenente tali file. Ad esempio, con IntelliJ IDEA si può creare il project scegliendo New
-> Project From Existing Sources...
dal menu File
, successivamente si seleziona la directory hw3
, e si mantiene sempre come nome del project e directory base la directory hw3
(o qualunque sia il nome della directory che contiene wsa
) fino alla fine. Per evitare che il project veda l'archivio jar homework3.jar
come una libreria, prima di creare il project togliere da hw3
il file homework3.jar
.
Non solo una WebEngine
non può essere usata al di fuori del JavaFX Thread ma questo vale anche per il Document ritornato dal suo metodo Document getDocument()
. Quindi l'implementazione dell'interfaccia wsa.web.html.Parsed
non deve usare per i suoi metodi il Document
prodotto dalla WebEngine
. In altre parole, l'implementazione di wsa.web.html.Parsed
deve usare il Document
solamente nel costruttore (e questo deve avvenire nel JavaFX Thread) ma poi non deve più usarlo e anzi non dovrebbe neanche mantenere il riferimento ad esso, questo per motivi di efficienza (così che possa più facilmente essere garbage collected).
Per errore il metodo exec
di wsa.JFX
non è stato dichiarato synchronized
. Modificare l'intestazione nel seguente modo:
public static synchronized void exec(Runnable act)
Se si invoca il metodo load
di una WebEngine
con un indirizzo che punta alla pagina corrente, cioè l'ultima pagina scaricata con quella web engine, il Worker
della web engine non viene eseguito. Questo comporta che il ChangeListener
dello stato del Worker
non viene invocato e si può rimanere in attesa di una risposta che non verrà mai data. Per ovviare a ciò, prima di fare il load
di un qualsiasi URL fare il load
della pagina vuota, cioè load("")
, questo ha l'effetto di una sorta di reset della web engine. Ovviamente bisogna attendere che il load
delle pagina vuota abbia termine prima di poter eseguire il load
della pagina.
Fare attenzione al seguente fenomeno. A volte accade che nonostante il Worker
della web engine vada nello stato SUCCEEDED
, il metodo getDocument()
ritorna null
. Purtroppo non c'è nessun rimedio semplice. Quando accade, considerare che il download della pagina è fallito.
Suggerimento: implementare tramite variabili atomiche java.util.concurrent.atomic
tutti i campi che non sono dichiarati final
e che possono essere letti/scritti da più di un thread.
Il terzo homework deve essere consegnato entro le ore 24:00 del 3 Giugno 2015. Seguire scrupolosamente le istruzioni in esami.
Nell'archivio hw3_files ci sono i file usati dal grader. La directory hw3_files
contiene quattro directory (testLoader
, testAsync
, testCrawler
e testSiteCrawler
), una per ognuno dei quattro elementi testati Loader
, AsyncLoader
, Crawler
e SiteCrawler
. All'interno di ognuna delle quattro directory c'è una directory pages
, che contiene i file delle pagine html, e un file results.json
che contiene, in formato JSON, i risultati relativi a tali pagine. In tutti gli indirizzi assoluti contenuti nei file JSON, la stringa ABSPATH
sta per il percorso assoluto della directory che contiene la directory hw3_files
.
Non copiare. Gli homework consegnati saranno scrupolosamente confrontati anche con strumenti automatici. La prova di convalida sarà tanto più approfondita tanto più forti sono gli indizi di copiatura e tanto più alto è il punteggio.
23 Mag 2015