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