Merge branch 'develop' of https://gitlab.com/meliurwen/2019_assignment3_MiVan into develop
commit
a6654c87cd
@ -1 +1,27 @@ |
||||
@article{docker, |
||||
title = {Docker Documentation}, |
||||
author = {Docker Inc}, |
||||
year={2019}, |
||||
journal = {docs.docker.com} |
||||
} |
||||
|
||||
@article{pip, |
||||
title = {The Python Package Installer Documentation}, |
||||
author = {PyPA}, |
||||
year={2019}, |
||||
journal = {pip.pypa.io/en/stable/} |
||||
} |
||||
|
||||
@article{jpa, |
||||
title = {Using JPA}, |
||||
author = {Spring}, |
||||
year={2019}, |
||||
journal = {https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/\#boot-features-jpa-and-spring-data} |
||||
} |
||||
|
||||
@article{maven, |
||||
title = {Apache Maven Documentation}, |
||||
author = {Apache Software Foundation}, |
||||
year={2019}, |
||||
journal = {https://maven.apache.org/guides/index.html} |
||||
} |
||||
|
@ -1,41 +1,49 @@ |
||||
\section{Progettazione} |
||||
|
||||
Nella fase iniziale di progettazione, invece che iniziare direttamente con la stesura di un diagramma UML delle Classi si è ritenuto più comodo sviluppare prima l'idea su carta disegnando un semplice diagramma ER (Entity Relationship). |
||||
Nella fase iniziale di progettazione, invece che iniziare direttamente con la stesura di un \textit{diagramma UML delle Classi} si è ritenuto più comodo sviluppare prima l'idea su carta disegnando un semplice \textit{diagramma ER} (Entity Relationship), mostrato in figura \ref{fig:er}. |
||||
|
||||
\begin{figure}[h!] |
||||
\centering |
||||
\includegraphics[scale=0.6]{img/logo.png} |
||||
\includegraphics[scale=0.8]{img/er.pdf} |
||||
\caption{Diagramma ER} |
||||
\label{fig:er} |
||||
\end{figure} |
||||
|
||||
Una volta stesa una bozza definitva e chiara sulle entità, relazioni e relativi attributi da definire si è passati a trasporre in una forma più dettagliata e più comoda per noi da tenere come riferimento, ossia un EER (Enhaced Entity Relationship) disegnato con il tool MySQL Workbench. |
||||
Una volta stesa una bozza definitva e chiara sulle entità, relazioni e relativi attributi da definire si è passati a trasporre in una forma più dettagliata e \textit{più comoda} per noi da tenere come riferimento, ossia un \textit{EER} (\textit{Enhaced Entity Relationship}) disegnato con il tool \textit{MySQL Workbench}. |
||||
|
||||
\begin{figure}[h!] |
||||
\centering |
||||
\includegraphics[scale=0.6]{img/logo.png} |
||||
\includegraphics[scale=0.9]{img/eer.pdf} |
||||
\caption{Diagramma EER} |
||||
\label{fig:eer} |
||||
\end{figure} |
||||
|
||||
\begin{figure}[h!] |
||||
\centering |
||||
\includegraphics[scale=0.6]{img/logo.png} |
||||
\caption{Diagramma delle Classi} |
||||
\label{fig:classi} |
||||
\end{figure} |
||||
|
||||
\section{Struttura} |
||||
|
||||
L'applicazione è strutturata in diversi package con ognuno funzionalità specifiche: |
||||
L'applicazione è strutturata in diversi \textit{package} con ognuno funzionalità specifiche: |
||||
|
||||
\begin{itemize} |
||||
\item \textbf{com.mivan.model:} In questo package sono presenti tutte le entità del modello dati dell'applicazione, implementate in classi come mostrate in figura \ref{fig:classi}. Per gestire la persistenza dei dati di un database relazionere, per tali classi sono state utilizzate le annotazioni delle JPA (Java Persistence API). |
||||
\item \textbf{com.mivan.model:} In questo package sono presenti tutte le entità del modello dati dell'applicazione, implementate in classi \textit{Author}, \textit{Book}, \textit{Location}, \textit{Staff}, \textit{User}, \textit{Loan}, \textit{Item} e \textit{Item}. Per gestire la persistenza dei dati di un database relazionere, per tali classi sono state utilizzate le annotazioni delle \textit{JPA} \cite{jpa} (\textit{Java Persistence API}). |
||||
\item \textbf{com.mivan.repository:} In questo package sono implementate le query per l'interrogazione al database. |
||||
\item \textbf{com.mivan.exception:} In questo package sono contenute le classi che gestiscono le eccezioni generate dalle interrogazioni al database. |
||||
\end{itemize} |
||||
|
||||
\section{Test} |
||||
|
||||
Per verificare l'effettivo funzionamento del programma sono stati sviluppati dei test d'integrazione, posizionati all'interno della cartella \code{mivan/src/test/java/}.\newline |
||||
Per i JUnit test volti a verificare la corretta esecuzione delle operazioni CRUD (Create, Read, Update, Delete) è stato fatto uso dell'engine H2, il quale consente di eseguire tali operazioni su un database temporaneo caricato in memoria (RAM). Tale approccio consente arginare del tutto il problema di intaccare il database persistente dai dati fittizzi dei test. |
||||
Per verificare l'effettivo funzionamento del programma sono stati sviluppati dei test d'integrazione, posizionati all'interno della cartella del'applicazione \code{mivan/src/test/java/mivan/}. |
||||
\newline |
||||
Le classi presenti nella cartella sono in seguito elencate: |
||||
|
||||
\begin{itemize} |
||||
\item \textbf{AuthorTest:} Consente di testare l'\textit{inserimento}, la \textit{modifica} e l'\textit{eliminazione} (implicitamente anche \textit{lettura} nei primi due test) degli \textit{autori}. |
||||
\item \textbf{BookTest:} Consente di testare l'\textit{inserimento}, la \textit{modifica} e l'\textit{eliminazione} (implicitamente anche \textit{lettura} nei primi due test) dei libri. |
||||
\item \textbf{AuthorBookTest:} Consente di testare l'\textit{aggiunta}, la \textit{modifica} e l'\textit{eliminazione} (ed anche \textit{lettura} nei primi due test) degli \textit{autori} ai \textit{libri} e viceversa. |
||||
\item \textbf{LocationTest:} Consente di testare l'\textit{inserimento}, la \textit{modifica} e l'\textit{eliminazione} (implicitamente anche \textit{lettura} nei primi due test) delle \textit{sedi} del sistema bibliotecario. |
||||
\item \textbf{StaffTest:} Consente di testare l'\textit{inserimento}, la \textit{modifica} e l'\textit{eliminazione} (implicitamente anche \textit{lettura} nei primi due test) dello \textit{staff}. |
||||
\item \textbf{UserTest:} Consente di testare l'\textit{inserimento}, la \textit{modifica} e l'\textit{eliminazione} (implicitamente anche \textit{lettura} nei primi due test) degli \textit{utenti}. |
||||
\item \textbf{ItemTest:} Consente di testare l'\textit{aggiunta}, la \textit{modifica} e l'\textit{eliminazione} (implicitamente anche \textit{lettura} nei primi due test) delle singole \textit{unità di libro} (\textit{Item}). |
||||
\item \textbf{LoanTest:} Consente di testare l'\textit{aggiunta}, la \textit{modifica} e l'\textit{eliminazione} (implicitamente anche \textit{lettura} nei primi due test) dei \textit{prestiti}. |
||||
\end{itemize} |
||||
|
||||
Come è possibile osservare nell'elenco sovrastante i \textit{JUnit test} volti a verificare la \textit{corretta esecuzione} delle operazioni \textit{CRUD} (\textit{Create, Read, Update, Delete}) è stato fatto uso dell'engine \textit{H2}, il quale consente di eseguire tali operazioni su un \textit{database temporaneo} caricato in memoria (\textit{RAM}). |
||||
|
||||
Tale approccio consente \textit{arginare} del tutto il problema di intaccare il database persistente dai dati fittizzi dei test. |
||||
|
@ -0,0 +1,63 @@ |
||||
package mivan.model; |
||||
|
||||
import javax.persistence.Column; |
||||
import javax.persistence.Id; |
||||
|
||||
public class Loan { |
||||
|
||||
private static final long serialVersionUID = -5124436115031696628L; |
||||
|
||||
@Id |
||||
@Column(name = "id", nullable=false, unique=true) |
||||
private long id; |
||||
|
||||
@Column(name = "date_start", nullable = false) |
||||
private String date_start; |
||||
|
||||
@Column(name = "date_end", nullable = false) |
||||
private String date_end; |
||||
|
||||
@Column(name = "state", nullable = false) |
||||
private String state; |
||||
|
||||
public Loan(long id, String date_start, String date_end, String state) { |
||||
this.id = id; |
||||
this.date_start = date_start; |
||||
this.date_end = date_end; |
||||
this.state = state; |
||||
} |
||||
|
||||
public long getId() { |
||||
return id; |
||||
} |
||||
|
||||
public String getDate_start() { |
||||
return date_start; |
||||
} |
||||
|
||||
public String getDate_end() { |
||||
return date_end; |
||||
} |
||||
|
||||
public String getState() { |
||||
return state; |
||||
} |
||||
|
||||
public void setId(long id) { |
||||
this.id = id; |
||||
} |
||||
|
||||
public void setDate_start(String date_start) { |
||||
this.date_start = date_start; |
||||
} |
||||
|
||||
public void setDate_end(String date_end) { |
||||
this.date_end = date_end; |
||||
} |
||||
|
||||
public void setState(String state) { |
||||
this.state = state; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,16 @@ |
||||
package mivan.repository; |
||||
|
||||
|
||||
import mivan.model.Loan; |
||||
|
||||
public interface LoanRepository extends Repository<Loan, Long> { |
||||
|
||||
public void deleteLoanById(Long id); |
||||
|
||||
public void addLoan(Loan loan); |
||||
|
||||
public void updateLoan(Long id, String stato); |
||||
|
||||
public int getSize(); |
||||
|
||||
} |
@ -0,0 +1,98 @@ |
||||
package mivan.repository; |
||||
|
||||
import java.util.List; |
||||
import java.util.Optional; |
||||
|
||||
import javax.persistence.EntityManager; |
||||
import javax.persistence.EntityManagerFactory; |
||||
import javax.persistence.Persistence; |
||||
|
||||
import mivan.model.Loan; |
||||
|
||||
public class LoanRepositoryImpl implements LoanRepository{ |
||||
|
||||
private EntityManagerFactory entityManagerFactory; |
||||
|
||||
public LoanRepositoryImpl() { |
||||
this.entityManagerFactory = Persistence.createEntityManagerFactory("mivan"); |
||||
} |
||||
|
||||
public Optional<Loan> findById(Long id) { |
||||
final EntityManager entityManager = this.entityManagerFactory.createEntityManager(); |
||||
Loan loan = entityManager.find(Loan.class, id); |
||||
entityManager.close(); |
||||
return Optional.ofNullable(loan); |
||||
} |
||||
|
||||
@Override |
||||
public Iterable<Loan> findAll() { |
||||
final EntityManager entityManager = this.entityManagerFactory.createEntityManager(); |
||||
List<Loan> loan = entityManager.createQuery("FROM Loan", Loan.class).getResultList(); |
||||
entityManager.close(); |
||||
return loan; |
||||
} |
||||
|
||||
@Override |
||||
public void deleteLoanById(Long id) { |
||||
final EntityManager entityManager = this.entityManagerFactory.createEntityManager(); |
||||
try { |
||||
if (!entityManager.getTransaction().isActive()) { |
||||
entityManager.getTransaction().begin(); |
||||
} |
||||
Loan loan = entityManager.find(Loan.class, id); |
||||
entityManager.remove(loan); |
||||
entityManager.getTransaction().commit(); |
||||
entityManager.close(); |
||||
} catch (Exception ex) { |
||||
entityManager.getTransaction().rollback(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void addLoan(Loan loan) { |
||||
final EntityManager entityManager = this.entityManagerFactory.createEntityManager(); |
||||
try { |
||||
if (!entityManager.getTransaction().isActive()) { |
||||
entityManager.getTransaction().begin(); |
||||
} |
||||
entityManager.persist(loan); |
||||
entityManager.getTransaction().commit(); |
||||
entityManager.close(); |
||||
|
||||
} catch (Exception ex) { |
||||
entityManager.getTransaction().rollback(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void updateLoan(Long id, String state) { |
||||
final EntityManager entityManager = this.entityManagerFactory.createEntityManager(); |
||||
try { |
||||
if (!entityManager.getTransaction().isActive()) { |
||||
entityManager.getTransaction().begin(); |
||||
} |
||||
Loan loan = entityManager.find(Loan.class, id); |
||||
loan.setState(state); |
||||
entityManager.persist(loan); |
||||
entityManager.getTransaction().commit(); |
||||
entityManager.close(); |
||||
} catch (Exception ex) { |
||||
entityManager.getTransaction().rollback(); |
||||
} |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public int getSize() { |
||||
final EntityManager entityManager = this.entityManagerFactory.createEntityManager(); |
||||
int size = 0; |
||||
try { |
||||
size = entityManager.createQuery("FROM Loan").getResultList().size(); |
||||
|
||||
entityManager.close(); |
||||
} catch (Exception ex) { |
||||
size = 0; |
||||
} |
||||
return size; |
||||
} |
||||
} |
Loading…
Reference in new issue