Sezione restaurant server finita tranne listing CRUDUtils

This commit is contained in:
Claudio Maggioni 2018-05-01 13:20:15 +02:00
parent ca752971c2
commit 8954f2b793
3 changed files with 111 additions and 32 deletions

View File

@ -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.",

Binary file not shown.

135
main.tex
View File

@ -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 <T> The readable entity class
@ -372,7 +430,16 @@ public abstract class ReadableRESTController<T extends Readable,
protected Response existing(InputStream requestBody) { %*\ldots*) }
}
\end{lstlisting}
\begin{lstlisting}[caption=Interfaccia della classe \textit{CRUDRESTController}, label=crudrest-java, language=Java]
\begin{it}
Anche il listato \ref{lst:rdbrest-java} necessita di una breve spiegazione.
La classe astratta \textit{Readable}, vincolo sul primo parametro generico della classe,
è il padre di ogni classe ``entità'', mentre \textit{PrimaryKey<T>} è il padre
della classe contenente la chiave primaria di \textit{T}. Un'istanza della
classe figlia di \textit{PrimaryKey<T>} è 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 <T> The readable and writable entity class
@ -434,6 +501,12 @@ public abstract class CRUDRESTController<T extends CRUDable, U extends
%*\ldots*)
}
\end{lstlisting}
\begin{it}
Oltre a quanto mostrato, \textit{restaurant} contiene vari metodi utilità per
la gestione di file \texttt{.properties}, per la validazione dei dati in
input, per la registrazione della \textit{timestamp} di creazione o modifica
di un record, e altro ancora.
\end{it}
\begin{it}
@ -568,7 +641,7 @@ per \textit{InteGRa Mobile}.
\label{fig:argosarch}
\end{figure}
\textit{Guac Remote} è basata su un'applicativo e libreria per la connessione a computer remoto chiamato \textit{Apache Guacamole}\footnote{\textit{Apache Guacamole}: \url{https://guacamole.apache.org}}.
\textit{Guac Remote} è basata su un'applicativo e libreria per la connessione a computer remoto chiamato \textit{Apache Guacamole}\cite{guacamole:website}.
Tale software è costituito da due parti: \cite{guacdoc:arch}
\begin{description}
\item[\textit{guacamole-server} (o \textit{guacd})] un servizio scritto in C che funge da adattatore tra il protocollo \textit{guacamole} e i protocolli VNC, RDP o SSH, utilizzando questi ultimi per stabilire connessioni con gli host remoti;