diff --git a/bibliography.bib b/bibliography.bib index 0615926..da77682 100644 --- a/bibliography.bib +++ b/bibliography.bib @@ -1,6 +1,6 @@ @online{guacdoc:arch, title = "Guacamole Manual, Chapter 1. Implementation and architecture", - author = "The Apache Software Foundation", + author = "The Apache Software Fundation", url = "https://guacamole.apache.org/doc/gug/guacamole-architecture.html", note = "[Online; in data 9-aprile-2018, traduzione e rielaborazione proprie]" } @@ -10,6 +10,12 @@ url = "https://ionicframework.com/framework", note = "[Online; in data 30-aprile-2018]" } +@online{guacamole:website, + title = {Apache Guacamole\copyright}, + author = "The Apache Software Foundation", + url = "https://guacamole.apache.org", + note = "[Online; in data 1-maggio-2018]" +} @online{agomir:website, title = "Agomir S.p.A. - Software - Sistemi - Servizi", author = "Agomir S.p.A.", diff --git a/italian.pdf b/italian.pdf index 4f89e53..8821ea1 100644 Binary files a/italian.pdf and b/italian.pdf differ diff --git a/main.tex b/main.tex index 4291193..0e83b5c 100644 --- a/main.tex +++ b/main.tex @@ -48,7 +48,7 @@ % listings configuration \begin{it} \renewcommand{\lstlistingname}{Listato} - \renewcommand{\lstlistlistingname}{Lista dei listati} + \renewcommand{\lstlistlistingname}{Elenco dei listati} \end{it} \lstset{ basicstyle=\small\ttfamily, @@ -57,7 +57,11 @@ columns=fullflexible, commentstyle=\color{gray}, keywordstyle=\bfseries, - escapeinside={\%*}{*)} + escapeinside={\%*}{*)}, + aboveskip=2em, + captionpos=b, + abovecaptionskip=1em, + belowcaptionskip=1em } \begin{document} @@ -124,17 +128,22 @@ \begin{it} \section{Gestione dei progetti} - Non ho diretto controllo manageriale su ciò che sviluppo in azienda, in quanto ho un ruolo simile a quello di un - dipendente. L'incarico di gestire l'andamento dei progetti spetta a Mario Goretti, A.D. dell'azienda e capo del settore - di sviluppo software gestionale (\textsc{SWG}), e ai suoi collaboratori. + Non ho diretto controllo manageriale su ciò che sviluppo in azienda, + in quanto ho un ruolo simile a quello di un dipendente. L'incarico di gestire + l'andamento dei progetti spetta a Mario Goretti, A.D. dell'azienda e capo + del settore di sviluppo software gestionale (\textsc{SWG}), e ai suoi collaboratori. - In generale sviluppo i progetti da solo. Collaboro con il collega Daniele Crippa per l'interfacciamento con i software - aziendali esistenti e per l'organizzazione di nuovi progetti, nonché consigli e dritte varie. + In generale sviluppo i progetti da solo. Collaboro con il collega Daniele + Crippa per l'interfacciamento con i software aziendali esistenti e per + l'organizzazione di nuovi progetti, nonché consigli e dritte varie. - Nonostante non abbia controllo totale \`e comunque mia responsabilità fare stime orarie sul lavoro da svolgere nonché - definire passi e \textit{milestone} per i vari progetti. + Nonostante non abbia controllo totale \`e comunque mia responsabilità fare + stime orarie sul lavoro da svolgere nonché definire passi e \textit{milestone} + per i vari progetti. - Per aumentare la forza lavoro per lo sviluppo di applicazioni \textit{mobile} ho coordinato momenti di formazione ad alcuni dipendenti nei quali ho mostrato il principale funzionamento delle tecnologie che uso. + Per aumentare la forza lavoro per lo sviluppo di applicazioni \textit{mobile} + ho coordinato momenti di formazione ad alcuni dipendenti nei quali ho mostrato + il principale funzionamento delle tecnologie che uso. \end{it} \begin{en} \section{Projects management} @@ -145,23 +154,29 @@ \begin{it} \section{Il progetto principale: \textit{InteGRa Mobile}} - Questa applicazione, una volta completata, dovrebbe permettere ad utenti in mobilità di interfacciarsi con alcune - funzioni del prodotto ERP di punta di Agomir: il gestionale - \textit{InteGRa}\footnote{Sito internet di InteGRa ERP: \url{https://integra.agomir.com/}}. Nel dettaglio, sarà possibile accedere alle seguenti sezioni: + Questa applicazione, una volta completata, dovrebbe permettere ad utenti in + mobilità di interfacciarsi con alcune funzioni del prodotto ERP di punta di + Agomir: il gestionale \textit{InteGRa}\footnote{Sito internet di InteGRa ERP: + \url{https://integra.agomir.com/}}. Nel dettaglio, sarà possibile accedere + alle seguenti sezioni: \begin{description} - \item[Ordini cliente] per registrare ordini di prodotti a clienti; - \item[Soggetti] per consultare informazioni anagrafiche di clienti e fornitori; - \item[Agenda] per consultare e aggiungere eventi nel calendario presente nell'ERP, il quale si pu\`o integrare con \textit{Outlook}; - \item[Magazzini] gestire e inventariare scorte in magazzino. + \item[Ordini cliente] per registrare ordini di prodotti a clienti; + \item[Soggetti] per consultare informazioni anagrafiche di clienti e fornitori; + \item[Agenda] per consultare e aggiungere eventi nel calendario presente + nell'ERP, il quale si pu\`o integrare con \textit{Outlook}; + \item[Magazzini] gestire e inventariare scorte in magazzino. \end{description} - In aggiunta, sarà possibile anche registrare le ore per interventi in trasferta, funzione gi\`a implementata - nell'applicazione \textit{InteGRa.Service}, sviluppata nei periodi di alternanza precedenti. Tale lavoro non \`e - direttamente implementabile in \textit{InteGRa Mobile} a causa di differenze consistenti nelle architetture dei due prodotti. + In aggiunta, sarà possibile anche registrare le ore per interventi in + trasferta, funzione gi\`a implementata nell'applicazione + \textit{InteGRa.Service}, sviluppata nei periodi di alternanza precedenti. + Tale lavoro non \`e direttamente implementabile in \textit{InteGRa Mobile} a + causa di differenze consistenti nelle architetture dei due prodotti. - Inoltre, l'applicazione sarà in grado di funzionare in modo limitato anche senza connessione diretta ad - \textit{InteGRa}, permettendo la sincronizzazione dei dati modificati con il gestionale in un momento futuro. + Inoltre, l'applicazione sarà in grado di funzionare in modo limitato anche + senza connessione diretta ad \textit{InteGRa}, permettendo la sincronizzazione + dei dati modificati con il gestionale in un momento futuro. \end{it} \begin{en} \section{The main project: \textit{InteGRa Mobile}} @@ -202,8 +217,8 @@ server (chiamato \textit{InteGRaREST}) che svolge il ruolo di intermediario. \item Tale componente è una Java WebApplication che utilizza una libreria - sviluppata internamente (chiamata \textit{restaurant}) per offrire le - servlet accessibili al client e per interagire con il database di + sviluppata internamente (chiamata \textit{restaurant}) per offrire le rotte + accessibili al client e per interagire con il database di \textit{InteGRa}, una normale istanza di \textit{PostgreSQL}. \item Nella fase di comunicazione tramite HTTP, i dati in input vengono @@ -225,8 +240,7 @@ in grado di gestire (in modo limitato) operazioni eseguite in mancanza di connessione alla rete. - \end{itemize} - + \end{itemize} \end{it} \begin{en} \blindtext @@ -234,7 +248,44 @@ \begin{it} \subsubsection{\textit{restaurant} -- lato server} -\begin{lstlisting}[caption=Interfaccia della classe \textit{JsonProducer}, label=jsonprd-java, language=Java] + La libreria \textit{restaurant}\footnote{Il nome \textit{restaurant} è un + gioco di parole sull'acronimo REST.} viene importata + come una normale dipendenza Maven \cite{maven:website}. Essa dipende da: + \begin{description} + \item[Hibernate ORM] un famoso Object/Relation Mapper \cite{wiki:orm} per + Java, utile ad interrogare il database \textit{PostgreSQL} con facilità; + \item[GSON] una libreria di Google per serializzare e deserializzare oggetti + Java in JSON; + \item[Jersey] un'implementazione dell'API JAX-RS per realizzare gli endpoint + REST. Ciò avviene senza servlet ma tramite semplici + metodi contenuti in classi senza ``padre'' dette \textit{controller}, + opportunamente decorati con le annotazioni nel package + \texttt{javax.ws.rs}. + \end{description} + + Le operazioni richieste per interrogare la base di dati sono ulteriormente + semplificate dal codice contenuto in \textit{restaurant} su due livelli: + \begin{itemize} + \item È possibile eseguire normali operazioni di CRUD \cite{wiki:crud} + nonchè costruire manualmente query tramite i metodi statici della classe + \textit{CRUDUtils}, che lavorano in input e in output con istanze delle + classi ``entità''; + \item Inoltre, è possibile creare nuovi \textit{controller} con facilità + ereditando dalle classi astratte \textit{JsonProducer} (per + implementare funzioni al di fuori di CRUD), + \textit{ReadableRESTController} (per implementare operazioni in sola + lettura, equivalenti alla ``Read'' in CRUD) e \textit{CRUDRESTController} + (per implementare CRUD completi), che offono + metodi in grado di generare autonomamente risposte in JSON, sia in caso + di successo che in errore. + \end{itemize} + + Seguono le interfaccie delle classi \textit{CRUDUtils}, \textit{JsonProducer}, + \textit{ReadableRESTController} e \textit{CRUDRESTController}, complete di + Javadoc. +\end{it} + +\begin{lstlisting}[caption=Interfaccia della classe \textit{JsonProducer}, label={lst:jsonprd-java}, language=Java] /** * Something that generates JSON responses */ @@ -242,7 +293,7 @@ public abstract class JsonProducer { protected static final Logger log = %*\ldots*); - protected static final Gson GSON; + protected static final Gson GSON = %*\ldots*); /** * Generates a json response with status 200 containing an object @@ -288,7 +339,14 @@ public abstract class JsonProducer { protected Response require(Object s, String propName) { %*\ldots*) } } \end{lstlisting} -\begin{lstlisting}[caption=Interfaccia della classe \textit{ReadableRESTController}, label=rdbrest-java, language=Java] +\begin{it} + Per una migliore lettura del listato \ref{lst:jsonprd-java}, si precisa che la + classe \textit{Error} è una enumerazione Java contenente messaggi di errore + standard. La classe \textit{ErrorDetails}, invece, permette al codice esterno + di realizzare messaggi di errore personalizzati. +\end{it} + +\begin{lstlisting}[caption=Interfaccia della classe \textit{ReadableRESTController}, label={lst:rdbrest-java}, language=Java] /** * A REST Controller only readable * @param The readable entity class @@ -372,7 +430,16 @@ public abstract class ReadableRESTController} è il padre + della classe contenente la chiave primaria di \textit{T}. Un'istanza della + classe figlia di \textit{PrimaryKey} è contenuta come attributo nella + classe ``entità'' \textit{T}, che a sua volta estende \textit{Readable}. +\end{it} + +\begin{lstlisting}[caption=Interfaccia della classe \textit{CRUDRESTController}, label={crudrest-java}, language=Java] /** * A REST Controller readable and writable * @param The readable and writable entity class @@ -434,6 +501,12 @@ public abstract class CRUDRESTController