\chapter{L'applicazione DBLPConverter}
La seconda fase è stata quella di progettare e sviluppare
un'applicazione che permettesse la creazione e il popolamento del
database, a partire dei dati contenuti nella bibliografia DBLP. A
questa applicazione è stato dato il nome di \emph{DBLPConverter}.

\section{Requisiti}
I requisiti dell'applicazione sono:
\begin{enumerate}
  \item Linguaggio indipendente dalla piattaforma hardware/software.
  \item Apertura e successiva lettura del file XML della bibliografia.
  \item Due modalità di output:
  \begin{itemize}
    \item Creazione di un file contenente i comandi SQL per la
    creazione e popolamento del database con i dati della
    bibliografa.
    \item Connessione ad un DBMS, creazione delle tabelle
    e popolamento del database con i dati della bibliografia.
  \end{itemize}
  \item Nel caso di connessione al DBMS, possibilità di interagire
  con esso (creazione tabelle, drop tabelle e cancellazione tuple).
  \item Enumerazione di elementi, attributi e caratteri contenuti nella bibliografia.
  \item Mostrare lo stato del processo di conversione (progress
  bar) e il tempo trascorso.
  \item Possibilità di scegliere quale tipo di elementi aggiungere
  al database (Article, Proceedings, Inproceeding, Book,
  Incollection, Master\_thesis, Phd\_thesis, WWW).
\end{enumerate}

\section{Architettura}

\begin{figure}[htpd]
  \centering
  \includegraphics[width = 1.0 \textwidth]{figures/UML.eps}
  \caption{Class Diagram}\label{fig:uml}
\end{figure}

La figura \figurename~\ref{fig:uml} mostra il diagramma delle classi
dell'applicazione \emph{DBLPConverter}. Essa fa uso di alcune classi
ed interfaccie esterne.
\subsection{Descrizione delle classi}

\subsubsection{Classe Main}
Classe obbligatoria, viene instanziata nel momento in cui si avvia
l'applicazione. Tale classe si occupa di instanziare la classe
\emph{Application}.

\subsubsection{Classe Application}
Classe principale dell'applicazione. Si occupa di instanziare le
classi: \emph{Window}, \emph{XMLManager}, \emph{SaxThread},
\emph{XMLManager}, \emph{DatabaseManager} e \emph{QueryBuilder}.

\subsubsection{Classe SaxThread}
Classe che si occupa di gestire \emph{Xerces-C++ XML Parser}. Essa
estende l'interfaccia \emph{Runnable}, facendo in modo che, una
volta eseguito il metodo Run, tale oggetto diviene un thread
separato dall'applicazione. Questo è obbligatorio nel caso si
vogliano gestire risorse esterne (nel nostro caso Sax2Count e
Sax2Print) senza compromettere il funzionamento dell'applicazione.

\subsubsection{Classe XMLManager}
La classe in esame si occupa della gestione degli elementi XML.

\subsubsection{Classe Element}
Tale classe è sostanzialmente una struttura dati per la
memorizzazione dei vari elementi XML contenuti in un elemeto
principale. Tali elementi vengono poi passati alla classe che si
occupa di gestire il database. Tale classe contiene inoltre un
vettore, per la memorizzazione degli oggetti di tipo Cite.

\subsubsection{Classe Cite}
Classe che si occupa di memorizzare un elemento di tipo Cite.

\subsubsection{Classe QueryBuilder}
Classe che si occupa di creare le query SQL. Tali query vengono
generate dinamicamente in base all'elemento e ai valori da
aggiungere.

\subsubsection{Classe DatabaseManager}
Classe che offre le primitive a basso livello per poter effettuare
interrogazioni sul database, oppure scrivere sul file .sql .

\subsubsection{Classe Window}
Classe che implementa la GUI (Graphics User Interface). Mette a
disposizione verso l'utente tutti i comandi per poter interagire con
l'applicazione \emph{DBLPConverter}.

\subsubsection{Classe StatusBar}
Classe per la gestione della barra di avanzamento per indicare lo
stato del progresso durante l'esecuzione. Essa rapporta il numero di
elementi analizzati con quelli ancora da analizzare (calcolati
tramite l'applicazione SaxCounter).

\subsubsection{Classe Temporized}
Classe che si occupa di gestire il timer. Come per la classe
\emph{SaxThread}, anche questa implementa l'interfaccia Runnable,
per rendere autonomo l'avanzamento del timer.

\subsection{Analisi dell'esecuzione} In questa sezione viene descritta
in dettaglio l'esecuzione del task di analisi e memorizzazione di un
elemento. Consideriamo a titolo di esempio il seguente elemento
article:

\begin{verbatim}
<article mdate="2004-01-14" key="journals/amai/GrumbachL97">
<author>Zo&egrave; Lacroix</author>
<title>On Non-Determinism in Machines and Languages.</title>
<pages>169-213</pages>
<year>1997</year>
<volume>19</volume>
<journal>Ann. Math. Artif. Intell.</journal>
<number>1-2</number>
<url>db/journals/amai/amai19.html#GrumbachL97</url>
</article>
\end{verbatim}

\begin{figure}[htpd]
  \centering
  \includegraphics[width = 1.0 \textwidth, keepaspectratio=true, angle=0]{figures/Diagramma.eps}
  \caption{Esecuzione dell'applicazione}\label{fig:esecuzione}
\end{figure}

La \figurename~\ref{fig:esecuzione} mostra in che modo
l'applicazione interagisce con i dati, e tutte le classi coinvolte.
Senza perdere di generalità, non vengono considerate tutte le classi
auiliarie, come ad esempio \emph{Window} oppure \emph{StatusBar}.
Inizialmente la classe \emph{Application} instanzia le classi:
\emph{SaxThread}, \emph{XMLManager}, \emph{Element},
\emph{QueryBuilder} e \emph{DatabaseManager}. Una volta specificato
il documento XML e ricevuto il comando di \emph{parse()} l'oggetto
saxThread (che a sua volta usa l'applicazione \emph{SaxPrint})
inizia la lettura del file per elemento. Ogni elemento letto viene
passato all'oggetto xmlManager, che a sua volta esegue il parsing
vero e proprio, riconoscendo così gli attributi dell'elemento
article (key, mdate, reviewid e rating) e gli elementi in esso
contenuti (author, title, pages, year, volume, journal, number e
url). I valori di questi elementi vengono memorizzati nell'oggetto
\emph{element}, che provvederà a tenerli temporaneamente
memorizzati. Una volta che \emph{xmlManager} rileva il tag di
chiusura dell'elemento
principale(\ensuremath{<}/article\ensuremath{>}) provvederà a
passare l'oggetto \emph{element} all'oggetto \emph{qBuilder}, che a
sua volta genererà dinamicamente le query a partire dai valori
contenuti in \emph{element}. L'oggetto \emph{qBuilder} userà i
metodi messi a disposizione dall'oggetto \emph{dbManager} per
l'aggiunta dei valori al database, o per la scrittura delle query su
file.
\par Per questioni di spazio, la \figurename~\ref{fig:esecuzione}
non contiene le query sql (ad esse è assegnato per semplicità un
numero), verranno quindi riportate di seguito:

\begin{description}
  \item [1] :
    \begin{verbatim}
    INSERT INTO articles(id, mdate, reviewid, rating, title,
    url, month, year, crossref, ee, note)
    VALUES('journals/amai/GrumbachL97', '2004-01-14', 'null',
    'null', On Non-Determinism in Machines and Languages.',
    'db/journals/amai/amai19.html#GrumbachL97', 'null',
    '1997', 'null', 'null', 'null')
    \end{verbatim}
  \item [2] :
    \begin{verbatim}
    INSERT INTO in_1(id, name, volume, number, pages)
    VALUES('journals/amai/GrumbachL97',
    'Ann. Math. Artif. Intell.', '19',
    '1-2', '169-213')
    \end{verbatim}
  \item [3] :
    \begin{verbatim}
    INSERT INTO authors(id, name)
    VALUES('journals/amai/GrumbachL97', 'Zoè Lacroix')
    \end{verbatim}
\end{description}

Da aggiungere infine che Java effettua automaticamente il
riconoscimento delle lettere accentate.

\section{Descrizione dei componenti}
In questa sezione verranno discussi tutti i componenti messi a
disposizione all'utente. La \figurename~\ref{fig:gui} mostra
l'interfaccia grafica dell'applicazione.

\begin{figure}[htpd]
  \centering
  \includegraphics[width = 1.0 \textwidth, keepaspectratio=true, angle=0]{figures/Gui.eps}
  \caption{Interfaccia grafica dell'applicazione}\label{fig:gui}
\end{figure}

Verranno elencati tutti i pannelli con le relative funzionalità:
\begin{description}
  \item[XML Data] Pannello che permette di specificare il nome e la posizione del
  file XML.
  \item[Mode] Questo pannello offre la possibilità di scegliere l'output
  dell'applicazione: database o documento sql.
  \item[Database] Pannello dedicato alla gestione del database. E' possibile
  specificare: indirizzo del DBMS, nome del database, nome utente e password.
  Sono disponibili inoltre alcuni pulsanti che permettono di Creare le tabelle,
  cancellare le tuple delle tabelle (erase) e rimozione delle
  tabelle (drop). Vi è infine un text field per specificare il
  percorso del file sql.
  \item[Element type] In queso pannello è possibile specificare i
  tipi degli elementi da aggiungere al database.
  \item[Action] Pannello che contiene il pulsante per
  avviare o interrompere il processo di parsing.
  \item[Statistics] Pannello dedicato alle informazioni analitiche:
  numero di elementi, numero d attributi, numero di caratteri e
  stato di avanzamento del processo.
  \item[Log] Log dell'applicazione.
\end{description}

La \figurename~\ref{fig:esec} mostra l'esecuzione dell'applicazione
DBLPConverter.

\begin{figure}[htpd]
  \centering
  \includegraphics[width = 1.0 \textwidth, keepaspectratio=true, angle=0]{figures/DblpConvEsec.eps}
  \caption{Esecuzione dell'applicazione BLPConverter}\label{fig:esec}
\end{figure}

\section{Problematiche riscontrate}
In questa sezione verrà discusso per quale motivo si è ricorso
all'uso degli applicativi Sax2Count e Sax2Print. \par Inizialmente,
l'applicazione DBLPConverter utilizzava i metodi messi a
disposizione dal linguaggio Java per l'apertura e la gestione del
file XML. Durante il parsing del file, è però emerso un problema
relativo all'occupazione di memoria centrale, che, andava lentamente
saturandosi. Questo rendeva quindi impossibile analizzare
completamente il file. Si è ricorso allora agli applicativi citati
precedentemente, essi gestiscono l'apertura del file e la lettura
(quest'ultima avviene per elemento) delegando a Java la gestione
degli elementi. La \figurename~\ref{fig:count} mostra l'output
dell'applicazione Sax2Count con input la bibliografia DBLP. Mentre
la \figurename~\ref{fig:print} mostra l'output dell'applicazione
Sax2Print con il medesimo input di Sax2Count.

\begin{figure}[htpd]
  \centering
  \includegraphics[width = 1.0 \textwidth, keepaspectratio=true, angle=0]{figures/Sax2Count.eps}
  \caption{Esecuzione di Sax2Count}\label{fig:count}
\end{figure}

\begin{figure}[H]
  \centering
  \includegraphics[width = 1.0 \textwidth, keepaspectratio=true, angle=0]{figures/Sax2Print.eps}
  \caption{Esecuzione di Sax2Printl}\label{fig:print}
\end{figure}

\section{Tecnologie adottate}
L'applicazione è stata sviluppata utilizzando il linguaggio
\emph{Java}; la versione della JDK\footnote{Java Development Kit} è
la 1.5. L'utilizzo di Java ha permesso di rispettare il requisito 1.
Il DBMS utilizzato è \emph{MySQL} versione 1.2.12. Per permettere la
connessione tra applicazione e DBMS viene usata la libreria
\emph{Connector/J} versione 5.1.5 fornita da MySQL. Per l'analisi e
il parsing del file XML è stato usato \emph{Xerces-C++ XML Parser}
versione 2.8.0.
