develop
Meliurwen 5 years ago
commit a6654c87cd
  1. 1
      .gitignore
  2. 26
      doc/bibliography.bib
  3. 41
      doc/chapters/01_introduzione.tex
  4. 40
      doc/chapters/02_progetto.tex
  5. 24
      doc/chapters/03_esecuzione.tex
  6. 63
      mivan/src/main/java/mivan/model/Loan.java
  7. 71
      mivan/src/main/java/mivan/model/User.java
  8. 16
      mivan/src/main/java/mivan/repository/LoanRepository.java
  9. 98
      mivan/src/main/java/mivan/repository/LoanRepositoryImpl.java
  10. 48
      mivan/src/test/java/mivan/LocationTest.java
  11. 59
      mivan/src/test/java/mivan/StaffTest.java
  12. 50
      mivan/src/test/java/mivan/UserTest.java

1
.gitignore vendored

@ -9,6 +9,7 @@
*.toc *.toc
*.out *.out
*.bbl *.bbl
*.bbl~
*.blg *.blg
*.bib~ *.bib~

@ -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}
}

@ -17,41 +17,48 @@ Ivan Donati - 781022
\section{Repository} \section{Repository}
Come da consegna per l'assignment è stato fatto uso dello strumento di file versioning git gestito da GitLab. Tutto il materiale definitivo del progetto è presente nel branch master del repository raggiungibile al seguente collegamento: Come da consegna per l'assignment è stato fatto uso dello strumento di file versioning \code{git} gestito da \textit{GitLab}. Tutto il materiale finale del progetto è presente nel branch master del repository raggiungibile al seguente collegamento:
\begin{center} \begin{center}
\url{https://gitlab.com/meliurwen/2019_assignment3_MiVan} \url{https://gitlab.com/meliurwen/2019_assignment3_MiVan}
\end{center} \end{center}
La radice del branch raffigurata in basso presenta un'organizzazione semplice e minimale: La radice del branch raffigurata in basso presenta un'organizzazione semplice e minimale:
\newline
\begin{itemize}
\item \textbf{mivan:} È la cartella che contiene il sorgente dell'applicazione.
\item \textbf{doc:} È la cartella che contiene il sorgente della documentazione scritta in \latex .
\item \textbf{assignment3\_mivan.pdf:} È la versione compilata in pdf della documentazione.
\item \textbf{Dockerfile} e \textbf{docker-compose.yml:} Sono i file necessari per eseguire la versione containerizzata dell'applicazione.
\item \textbf{LICENSE} e \textbf{README.md:} Sono rispettivamente la licenza (MIT) assegnata per il progeto ed una sua breve introduzione.
\end{itemize}
\dirtree{% \dirtree{%
.1 <repository>. .1 <repository>.
.2 app/. .2 mivan/.
.2 doc/. .2 doc/.
.2 .gitignore. .2 .gitignore.
.2 Dockerfile.
.2 docker-compose.yml.
.2 LICENSE.
.2 README.md. .2 README.md.
.2 assignment3\_mivan.pdf. .2 assignment3\_mivan.pdf.
} }
\begin{itemize}
\item \textbf{app:} È la cartella che contiene il sorgente dell'applicazione.
\item \textbf{doc:} È la cartella che contiene il sorgente della documentazione scritta in \latex .
\item \textbf{assignment3\_mivan.pdf:} È la versione compilata in pdf della documentazione.
\end{itemize}
\section{Applicazione} \section{Applicazione}
L'applicazione oggetto di questo assigment è \textbf{MiVan}. L'applicazione oggetto di questo assigment è \textbf{MiVan}.
\newline \newline
Si tratta di un'applicazione che gestisce prestiti di libri di un sistema bibliotecario con una o più sedi. Essa, oltre ad essere in grado di gestire i prestiti, è anche in grado di gestire i libri, la loro posizione, lo staff che amministra i prestiti e gli utenti che ne fanno richiesta.
\newline Si tratta di un'applicazione \textbf{back-end only} che \textit{gestisce prestiti di libri di un sistema bibliotecario} con \textit{una o più sedi}. Essa, oltre ad essere in grado di gestire i prestiti, possiede la capacità di gestire i libri, la loro \textit{posizione}, lo \textit{staff} che ne amministra i \textit{prestiti} e gli \textit{utenti} che ne fanno richiesta.
Grazie a questa applicazione è possibile creare, visualizzzare, modificare e rimuovere in tempo reale lo stato di prestito dei libri. I prestiti sono descritti da una data di inizio, di fine, uno stato, un libro, un utente ed un operatore. Si ritiene che sia importante sottolineare che durante la progettazione si è presa la decisione che un prestito possa consistere in esattamente una unità di libro, in maniera tale che questo livello di granularità permetta all'utente, in caso di prestito contemporaneo di più libri, di non doverli restituire tutti in blocco.
\newline Grazie a questa applicazione è possibile \textit{creare, visualizzzare, modificare e rimuovere} in tempo reale lo stato di cessione dei libri. I prestiti sono descritti da una \textit{data di inizio}, \textit{di fine}, uno \textit{stato}, un \textit{libro}, un \textit{utente} ed un \textit{operatore}. Si ritiene che sia importante sottolineare che durante la progettazione si è presa la decisione che un prestito debba consistere in esattamente una unità di libro, in maniera tale che questo livello di granularità permetta all'utente, in caso di prestito "contemporaneo" (in realtà avviene in rapida sequenza dal punto di vista del backend) di più libri, di non doverli restituire tutti in blocco.
Altra caratteristica è la separazione tra concetto di libro ed "unità di libro", questo per gestire in maniera efficiente il caso molto frequente in cui il sistema bibliotecario possieda più copie dello stesso libro; nella nostra implementazione ogni singola unità (Item) corrisponderebbe in maniera univoca all'unità fisica corrispondente.
\newline Altra caratteristica è la \textit{separazione} tra \textit{"concetto di libro"} ed \textit{"unità di libro"}, questo per gestire in maniera efficiente il caso molto frequente in cui il sistema bibliotecario possieda più copie dello stesso libro; nella nostra implementazione ogni singola unità (descritta come \textit{"Item"}) corrisponderebbe in maniera univoca all'unità fisica corrispondente. In altre parole, se il sistema bibliotecario è in possesso di \textit{n} libri identici (stesso ISBN) ognuno di essi è identificabile univocamente.
Una feature degna di nota (che andrebbe a soddisfare il requisito del self-loop) è la possibilità di sapere se nel sistema bibliotecario è disponibile il sequel (ammesso che esistano) di un determinato libro.
\newline Una feature degna di nota (che andrebbe a soddisfare il requisito del \textit{self-loop}) è la possibilità di sapere se nel sistema bibliotecario è presente il \textit{prequel} (ammesso che esista) di un determinato libro assieme al suos tato di disponibilità.
Allo stato attuale l'applicazione è stata pensata per essere utilizzata nell'area metropolitana di \underline{\textit{Brescia}} e \underline{\textit{Novara}}, con un \textit{\textbf{target iniziale}} ristretto agli utenti delle \textit{\textbf{sedi del sistema blibliotecario comunale}} delle rispettive città. Allo stato attuale l'applicazione è stata pensata per essere utilizzata nell'area metropolitana di \underline{\textit{Brescia}} e \underline{\textit{Novara}}, con un \textit{\textbf{target iniziale}} ristretto agli utenti delle \textit{\textbf{sedi del sistema blibliotecario comunale}} delle rispettive città.
\newline
A seconda della trazione che potrebbe ricevere una volta lanciata, si potrà valutare un'eventuale \textit{espansione} del territorio coperto e degli enti (sia pubblici che privati) interessati. A seconda della trazione che potrebbe ricevere una volta lanciata, si potrà valutare un'eventuale \textit{espansione} del territorio coperto e degli enti (sia pubblici che privati) interessati.

@ -1,41 +1,49 @@
\section{Progettazione} \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!] \begin{figure}[h!]
\centering \centering
\includegraphics[scale=0.6]{img/logo.png} \includegraphics[scale=0.8]{img/er.pdf}
\caption{Diagramma ER} \caption{Diagramma ER}
\label{fig:er} \label{fig:er}
\end{figure} \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!] \begin{figure}[h!]
\centering \centering
\includegraphics[scale=0.6]{img/logo.png} \includegraphics[scale=0.9]{img/eer.pdf}
\caption{Diagramma EER} \caption{Diagramma EER}
\label{fig:eer} \label{fig:eer}
\end{figure} \end{figure}
\begin{figure}[h!]
\centering
\includegraphics[scale=0.6]{img/logo.png}
\caption{Diagramma delle Classi}
\label{fig:classi}
\end{figure}
\section{Struttura} \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} \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.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} \end{itemize}
\section{Test} \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 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/}.
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. \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.

@ -1,14 +1,17 @@
\section{Requisiti} \section{Requisiti}
L'applicazione è stata sviluppata, eseguita e testata su sistemi UNIX Like, in particolare sulla distribuzione GNU/Linux Debian.\newline L'applicazione è stata sviluppata, eseguita e testata su sistemi \textit{UNIX Like}, in particolare sulla distribuzione \textit{GNU/Linux Debian}.
Per questo questo motivo le istruzioni che seguono saranno incentrate su questo ambiente, ma dovrebbero valere per tutti gli altri sistemi.\newline
Per rendere la propria macchina pronta ad eseguire l'applicazione è necessario installare i pacchetti \code{openjdk} (la versione 8 è sufficiente) ed \code{mvn}; in caso di Debian o derivate si usa il seguente comando: Per questo questo motivo le istruzioni che seguono saranno incentrate su questo ambiente, ma dovrebbero valere per tutti gli altri sistemi.
Per rendere la propria macchina pronta ad eseguire l'applicazione è necessario installare i pacchetti \code{openjdk} (la versione 8 è sufficiente) e \code{mvn} corrispondenti rispettivamente a \textit{Open Java Development Kit} ed al tool \textit{Apache Maven} \cite{maven}; in caso di Debian o derivate si usa il seguente comando:
\newline \newline
\begin{lstlisting}[style=BashInputStyle] \begin{lstlisting}[style=BashInputStyle]
$ sudo apt-get install openjdk-8-jdk mvn $ sudo apt-get install openjdk-8-jdk mvn
\end{lstlisting} \end{lstlisting}
In caso si volesse usare Docker allora le dipendenze sono docker-compose, ed ovviamente docker stesso. Compose è presente nella maggior parte delle repo delle distro, il problema è che non è sempre aggiornato, per cui si ovvierà a questo possibile problema per mezzo di pip.\newline In caso si volesse usare \textit{Docker} allora le dipendenze sono \textit{docker-compose}\cite{docker}, ed ovviamente \textit{docker} stesso. \textit{Compose} è presente nella maggior parte delle repo delle distro, il problema è che non è sempre aggiornato, per cui si ovvierà a questo possibile problema per mezzo di \code{pip}. \cite{pip}
La serie di comandi è la seguente, in caso di distro diversa da Debian usare il relativo gestore di pacchetti in sostituzione ad apt: La serie di comandi è la seguente, in caso di distro diversa da Debian usare il relativo gestore di pacchetti in sostituzione ad apt:
\newline \newline
\begin{lstlisting}[style=BashInputStyle] \begin{lstlisting}[style=BashInputStyle]
@ -29,8 +32,9 @@ Per eseguire i test è necessario spostarsi all'interno della cartella del sorge
\section{Build} \section{Build}
L'operazione di build genera un file \code{.jar} all'interno della cartella di nome \code{target}, la quale se non è già presente verrà creata runtime.\newline L'operazione di build genera un file \code{.jar} all'interno della cartella di nome \code{target}, la quale se non è già presente \textit{verrà creata a runtime}.
Per seguire la build è necessario spostarsi all'interno della cartella del sorgente dell'applicazione e poi lanciare il relativo comando:
Per eseguire la build è necessario spostarsi all'interno della cartella del sorgente dell'applicazione e poi lanciare il wrapper \code{mvnw}:
\newline \newline
\begin{lstlisting}[style=BashInputStyle] \begin{lstlisting}[style=BashInputStyle]
$ cd mivan $ cd mivan
@ -48,19 +52,19 @@ L'avvio immediato dell'applicazione, utile durante lo sviluppo si esegue con un
\section{Avvio tramite Docker} \section{Avvio tramite Docker}
Per poter eseguire l'applicazione per mezzo di Docker container è necessario soddisfare i requisiti indicati all'inizio di questo capitolo. Il vantaggio di usare Docker è che semplifica notevolmente sia la fase di sviluppo che di deploy dell'applicazione, specialmente per l'ultimo punto che ne riduce in maniera sensibile sia il tempo che la complessità. Per poter eseguire l'applicazione per mezzo di Docker container è necessario soddisfare i requisiti indicati all'inizio di questo capitolo. Il vantaggio di usare Docker è che semplifica \textit{notevolmente} sia la fase di sviluppo che di \textit{deploy} dell'applicazione, specialmente per l'ultimo punto che ne riduce in maniera sensibile sia il tempo che la complessità.
\begin{leftbar} \begin{leftbar}
\noindent\textbf{Nota:}\newline Per poter utilizzare docker è necessario avere i privilegi di root od essere nel gruppo \code{docker}!. \noindent\textbf{Nota:}\newline Per poter utilizzare docker è necessario avere i privilegi di root od essere nel gruppo \code{docker}!
\end{leftbar} \end{leftbar}
Un comodo strumento di cui faremo uso per gestire i container è Compose, di cui, dato il file \code{.yml} già compilato alla radice della repository eseguiamo il comando di build: Un comodo strumento di cui faremo uso per gestire i container è \textit{Compose}, di cui, dato il file \code{.yml} già compilato alla radice della repository eseguiamo il comando di build:
\newline \newline
\begin{lstlisting}[style=BashInputStyle] \begin{lstlisting}[style=BashInputStyle]
$ sudo docker-compose build $ sudo docker-compose build
\end{lstlisting} \end{lstlisting}
E poi, una volta buildate le immagini dei container, le eseguiamo: E poi, una volta buildate l'immagine del container, lo lanciamo:
\newline \newline
\begin{lstlisting}[style=BashInputStyle] \begin{lstlisting}[style=BashInputStyle]
$ sudo docker-compose up $ sudo docker-compose up

@ -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;
}
}

@ -1,6 +1,5 @@
package mivan.model; package mivan.model;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.Table; import javax.persistence.Table;
@ -11,80 +10,56 @@ public class User extends Person {
private static final long serialVersionUID = -5124436115031696628L; private static final long serialVersionUID = -5124436115031696628L;
@Column(name = "username", nullable=false,unique=true) @Column(name = "username", nullable = false, unique = true)
private String username; private String username;
@Column(name = "email", nullable=false,unique=true) @Column(name = "email", nullable = false, unique = true)
private String email; private String email;
@Column(name = "password", nullable=false) @Column(name = "password", nullable = false)
private String password; private String password;
protected User() { protected User() {
} }
public User(String firstName, String lastName, String city, String username, String email, String password) {
super(firstName, lastName, city);
public User(String firstName, String lastName, String city,String username, String email, String password) {
super(firstName,lastName,city);
this.username = username; this.username = username;
this.email = email; this.email = email;
this.password = password; this.password = password;
} }
public String getUsername() { public String getUsername() {
return username; return username;
} }
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
public String getEmail() { public String getEmail() {
return email; return email;
} }
public void setEmail(String email) { public void setEmail(String email) {
this.email = email; this.email = email;
} }
public String getPassword() { public String getPassword() {
return password; return password;
} }
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
} }
public static long getSerialversionuid() { public static long getSerialversionuid() {
return serialVersionUID; return serialVersionUID;
} }
@Override @Override
public String toString() { public String toString() {
return "User [username=" + username + ", email=" + email + ", password=" + password + "]"; return "User [username=" + username + ", email=" + email + ", password=" + password + "]";
} }
} }

@ -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;
}
}

@ -28,8 +28,8 @@ public class LocationTest {
@Order(1) @Order(1)
void testAddLocation() { void testAddLocation() {
String lname = "Library bria 2"; String lname = "test_add_location_name";
String ladress = "via chissa dove2"; String ladress = "test_add_location_adress";
Location location = new Location(lname, ladress); Location location = new Location(lname, ladress);
int size = locationRepository.getSize(); int size = locationRepository.getSize();
@ -46,18 +46,18 @@ public class LocationTest {
void testUpdateLocation() { void testUpdateLocation() {
// creo nuovo menìmbro dello staff // creo nuovo menìmbro dello staff
String firstname = "Ivan"; String firstname1 = "test_update_location_name1";
String lastname = "Donati"; String lastname1 = "test_update_location_lastname1";
String city = "Milano"; String city1 = "test_update_location_city1";
String idka = "lihwelhqluchwlir8"; String idka1 = "test_update_location_idka1";
String ruolo = "frontoffice"; String ruolo1 = "test_update_location_role1";
Staff newstaff1 = new Staff(firstname, lastname, city, idka, ruolo); Staff newstaff1 = new Staff(firstname1, lastname1, city1, idka1, ruolo1);
String firstname2 = "Rossi"; String firstname2 = "test_update_location_name2";
String lastname2 = "Donati"; String lastname2 = "test_update_location_lastname2";
String city2 = "Milano"; String city2 = "test_update_location_city2";
String idka2 = "lihwelhsfgdghhwlir8"; String idka2 = "test_update_location_idka2";
String ruolo2 = "manager"; String ruolo2 = "test_update_location_role2";
Staff newstaff2 = new Staff(firstname2, lastname2, city2, idka2, ruolo2); Staff newstaff2 = new Staff(firstname2, lastname2, city2, idka2, ruolo2);
staffRepository.addStaff(newstaff1); staffRepository.addStaff(newstaff1);
@ -68,8 +68,8 @@ public class LocationTest {
staffs.add(newstaff2); staffs.add(newstaff2);
// creo una locazione // creo una locazione
String lname = "Library cosa 2"; String lname = "test_update_location_name";
String ladress = "via chissa dove"; String ladress = "test_update_location_adress";
Location newlocation = new Location(lname, ladress); Location newlocation = new Location(lname, ladress);
locationRepository.addLocation(newlocation); locationRepository.addLocation(newlocation);
@ -77,16 +77,16 @@ public class LocationTest {
long id = editLocation.getId(); long id = editLocation.getId();
// nuovi dati per modificare i vecchi // nuovi dati per modificare i vecchi
String newlName = "Library bria 5"; String newlname = "test_update_location_newname";
String newlAdress = "via prossima stella"; String newladress = "test_update_location_newadress";
// aggungo i membri dello staff / modifico i dati della location // aggungo i membri dello staff / modifico i dati della location
locationRepository.updateLocation(id, newlName, newlAdress, staffs); locationRepository.updateLocation(id, newlname, newladress, staffs);
Optional<Location> location = locationRepository.findById(id); Optional<Location> location = locationRepository.findById(id);
location.ifPresent(a -> { location.ifPresent(a -> {
assertEquals(a.getName(), newlName); assertEquals(a.getName(), newlname);
assertEquals(a.getAdress(), newlAdress); assertEquals(a.getAdress(), newladress);
assertEquals(a.getStaffs(), staffs); assertEquals(a.getStaffs(), staffs);
}); });
} }
@ -95,8 +95,8 @@ public class LocationTest {
@Order(3) @Order(3)
void testDeleteLocation() { void testDeleteLocation() {
String lname = "Library bria 9"; String lname = "test_delete_location_name";
String ladress = "via chissa dove9"; String ladress = "test_delete_location_adress";
Location location = new Location(lname, ladress); Location location = new Location(lname, ladress);
locationRepository.addLocation(location); locationRepository.addLocation(location);
@ -110,7 +110,7 @@ public class LocationTest {
int newsize = locationRepository.getSize(); int newsize = locationRepository.getSize();
assertEquals(newsize, size -1); assertEquals(newsize, size - 1);
} }
} }

@ -26,14 +26,14 @@ public class StaffTest {
@Order(1) @Order(1)
void testAddStaff() { void testAddStaff() {
String firstname = "Ivan"; String firstname = "test_add_staff_name";
String lastname = "Donati"; String lastname = "test_add_staff_lastname";
String city = "Milano"; String city = "test_add_staff_city";
String idka = "lihwelhqluchwlir8"; String idka = "test_add_staff_idka";
String ruolo = "frontoffice"; String ruolo = "test_add_staff_role";
String lname = "Library bria 2"; String lname = "test_add_staff_loc_name";
String ladress = "via chissa dove"; String ladress = "test_add_staff_loc_adress";
Location location = new Location(lname, ladress); Location location = new Location(lname, ladress);
locationRepository.addLocation(location); locationRepository.addLocation(location);
@ -55,13 +55,13 @@ public class StaffTest {
void testUpdateStaff() { void testUpdateStaff() {
// creo una locazione // creo una locazione
String lname = "Library cosa 2"; String lname = "test_update_staff_loc_name";
String ladress = "via chissa dove"; String ladress = "test_update_staff_loc_adress";
Location location = new Location(lname, ladress); Location location = new Location(lname, ladress);
// creo una seconda locazione // creo una seconda locazione
String newlName = "Library destra 5"; String newlName = "test_update_staff_loc_newname";
String newlAdress = "via prossima stella"; String newlAdress = "test_update_staff_loc_newname";
Location newlocation = new Location(newlName, newlAdress); Location newlocation = new Location(newlName, newlAdress);
int losize = locationRepository.getSize(); int losize = locationRepository.getSize();
@ -74,11 +74,12 @@ public class StaffTest {
assertEquals(newlosize, losize + 2); // ci sono 2 locazioni aggunte assertEquals(newlosize, losize + 2); // ci sono 2 locazioni aggunte
// creo un membro dello staff // creo un membro dello staff
String firstname = "Maccio"; String firstname = "test_update_staff_name";
String lastname = "Donati"; String lastname = "test_update_staff_lastname";
String city = "Milano"; String city = "test_update_staff_city";
String idka = "lihwelhqluchwlir8"; String idka = "test_update_staff_idka";
String ruolo = "frontoffice"; String ruolo = "test_update_staff_role";
Staff newstaff = new Staff(firstname, lastname, city, idka, ruolo); Staff newstaff = new Staff(firstname, lastname, city, idka, ruolo);
int size = staffRepository.getSize(); int size = staffRepository.getSize();
@ -92,11 +93,11 @@ public class StaffTest {
Staff editStaff = staffRepository.searchStaffByidka(idka); Staff editStaff = staffRepository.searchStaffByidka(idka);
long id = editStaff.getId(); long id = editStaff.getId();
String newfirstname = "Ivans"; String newfirstname = "test_update_staff_newname";
String newlastname = "Donatis"; String newlastname = "test_update_staff_newlastname";
String newcity = "Milanos"; String newcity = "test_update_staff_newcity";
String newidka = "lihwelhkluchwlir5"; String newidka = "test_update_staff_newidka";
String newruolo = "spazzino"; String newruolo = "test_update_staff_newrole";
staffRepository.updateStaff(id, newfirstname, newlastname, newcity, newidka, newruolo, newlocation); staffRepository.updateStaff(id, newfirstname, newlastname, newcity, newidka, newruolo, newlocation);
@ -117,14 +118,14 @@ public class StaffTest {
@Order(3) @Order(3)
void testDeleteStaff() { void testDeleteStaff() {
String firstname = "John"; String firstname = "test_delete_staff_name";
String lastname = "Donati"; String lastname = "test_delete_staff_lastname";
String city = "Milano"; String city = "test_delete_staff_city";
String idka = "lihwelhsfghhwlir8"; String idka = "test_delete_staff_idka";
String ruolo = "manager"; String ruolo = "test_delete_staff_role";
String lname = "Library siniz 2"; String lname = "test_delete_staff_loc_name";
String ladress = "via sassa dove"; String ladress = "test_delete_staff_loc_adress";
Location location = new Location(lname, ladress); Location location = new Location(lname, ladress);
locationRepository.addLocation(location); locationRepository.addLocation(location);

@ -23,12 +23,12 @@ class UserTest {
@Order(1) @Order(1)
void testAddUser() { void testAddUser() {
String firstname = "Ivan"; String firstname = "test_add_user_name";
String lastname = "Donati"; String lastname = "test_add_user_lastname";
String city = "Milano"; String city = "test_add_user_city";
String username = "p.donati"; String username = "test_add_user_username";
String email = "p.donati@campus.unimib.it"; String email = "test_add_user_email";
String password = "pdonatipassword"; String password = "test_add_user_password";
User user = new User(firstname, lastname, city, username, email, password); User user = new User(firstname, lastname, city, username, email, password);
int size = userRepository.getSize(); int size = userRepository.getSize();
@ -42,14 +42,14 @@ class UserTest {
@Test @Test
@Order(2) @Order(2)
void testUpdateCompany() { void testUpdateUser() {
String firstname = "Simone"; String firstname = "test_update_user_name";
String lastname = "Donati"; String lastname = "test_update_user_lastname";
String city = "Milano"; String city = "test_update_user_city";
String username = "i.donati"; String username = "test_update_user_username";
String email = "i.donati@campus.unimib.it"; String email = "test_update_user_email";
String password = "passwordsicura"; String password = "test_update_user_password";
User newuser = new User(firstname, lastname, city, username, email, password); User newuser = new User(firstname, lastname, city, username, email, password);
@ -59,12 +59,12 @@ class UserTest {
long id = editUser.getId(); long id = editUser.getId();
String newfirstname = "Ivans"; String newfirstname = "test_update_user_newname";
String newlastname = "Donatis"; String newlastname = "test_update_user_newlastname";
String newcity = "Milanos"; String newcity = "test_update_user_newcity";
String newusername = "asd.donati1s"; String newusername = "test_update_user_newusername";
String newemail = "asd.donati@campus.unimib.com"; String newemail = "test_update_user_newemail";
String newpassword = "newpdonatipassword"; String newpassword = "test_update_user_newpassword";
userRepository.updateUser(id, newfirstname, newlastname, newcity, newusername, newemail, newpassword); userRepository.updateUser(id, newfirstname, newlastname, newcity, newusername, newemail, newpassword);
@ -84,12 +84,12 @@ class UserTest {
@Order(3) @Order(3)
void testDeleteUser() { void testDeleteUser() {
String firstname = "Rossi"; String firstname = "test_delete_user_name";
String lastname = "Donati"; String lastname = "test_delete_user_lastname";
String city = "Milano"; String city = "test_delete_user_city";
String username = "r.donati"; String username = "test_delete_user_username";
String email = "r.donati@campus.unimib.it"; String email = "test_delete_user_email";
String password = "rdonatipassword"; String password = "test_delete_user_password";
User newuser = new User(firstname, lastname, city, username, email, password); User newuser = new User(firstname, lastname, city, username, email, password);

Loading…
Cancel
Save