diff --git a/.gitignore b/.gitignore index 0c01375..38c7bc6 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ *.toc *.out *.bbl +*.bbl~ *.blg *.bib~ diff --git a/doc/bibliography.bib b/doc/bibliography.bib index 8b13789..637fad3 100644 --- a/doc/bibliography.bib +++ b/doc/bibliography.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} +} diff --git a/doc/chapters/01_introduzione.tex b/doc/chapters/01_introduzione.tex index 8395fed..4e388d3 100644 --- a/doc/chapters/01_introduzione.tex +++ b/doc/chapters/01_introduzione.tex @@ -17,41 +17,48 @@ Ivan Donati - 781022 \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} \url{https://gitlab.com/meliurwen/2019_assignment3_MiVan} \end{center} 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{% .1 . - .2 app/. + .2 mivan/. .2 doc/. .2 .gitignore. + .2 Dockerfile. + .2 docker-compose.yml. + .2 LICENSE. .2 README.md. .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} L'applicazione oggetto di questo assigment è \textbf{MiVan}. \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 -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 -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 -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 + +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 \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 \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 \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à. -\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. diff --git a/doc/chapters/02_progetto.tex b/doc/chapters/02_progetto.tex index e460030..dfe5cca 100644 --- a/doc/chapters/02_progetto.tex +++ b/doc/chapters/02_progetto.tex @@ -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. diff --git a/doc/chapters/03_esecuzione.tex b/doc/chapters/03_esecuzione.tex index 74694c5..4b8e70a 100644 --- a/doc/chapters/03_esecuzione.tex +++ b/doc/chapters/03_esecuzione.tex @@ -1,14 +1,17 @@ \section{Requisiti} -L'applicazione è stata sviluppata, eseguita e testata su sistemi UNIX Like, in particolare sulla distribuzione GNU/Linux Debian.\newline -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: +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. + +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 \begin{lstlisting}[style=BashInputStyle] $ sudo apt-get install openjdk-8-jdk mvn \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: \newline \begin{lstlisting}[style=BashInputStyle] @@ -29,8 +32,9 @@ Per eseguire i test è necessario spostarsi all'interno della cartella del sorge \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 -Per seguire la build è necessario spostarsi all'interno della cartella del sorgente dell'applicazione e poi lanciare il relativo comando: +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 eseguire la build è necessario spostarsi all'interno della cartella del sorgente dell'applicazione e poi lanciare il wrapper \code{mvnw}: \newline \begin{lstlisting}[style=BashInputStyle] $ cd mivan @@ -48,19 +52,19 @@ L'avvio immediato dell'applicazione, utile durante lo sviluppo si esegue con un \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} - \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} -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 \begin{lstlisting}[style=BashInputStyle] $ sudo docker-compose build \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 \begin{lstlisting}[style=BashInputStyle] $ sudo docker-compose up diff --git a/mivan/src/main/java/mivan/model/Loan.java b/mivan/src/main/java/mivan/model/Loan.java new file mode 100644 index 0000000..34f2e45 --- /dev/null +++ b/mivan/src/main/java/mivan/model/Loan.java @@ -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; + } + + +} diff --git a/mivan/src/main/java/mivan/model/User.java b/mivan/src/main/java/mivan/model/User.java index 3b4bdec..a153eab 100644 --- a/mivan/src/main/java/mivan/model/User.java +++ b/mivan/src/main/java/mivan/model/User.java @@ -1,6 +1,5 @@ package mivan.model; - import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; @@ -9,82 +8,58 @@ import javax.persistence.Table; @Table(name = "user") public class User extends Person { - private static final long serialVersionUID = -5124436115031696628L; - - @Column(name = "username", nullable=false,unique=true) - private String username; - - @Column(name = "email", nullable=false,unique=true) - private String email; - - @Column(name = "password", nullable=false) - private String password; - - - protected User() { - } - - - -public User(String firstName, String lastName, String city,String username, String email, String password) { - super(firstName,lastName,city); - this.username = username; - this.email = email; - this.password = password; -} - - - -public String getUsername() { - return username; -} - - - -public void setUsername(String username) { - this.username = username; -} - - - -public String getEmail() { - return email; -} - - - -public void setEmail(String email) { - this.email = email; -} - - - -public String getPassword() { - return password; -} + private static final long serialVersionUID = -5124436115031696628L; + @Column(name = "username", nullable = false, unique = true) + private String username; + @Column(name = "email", nullable = false, unique = true) + private String email; -public void setPassword(String password) { - this.password = password; -} + @Column(name = "password", nullable = false) + private String password; + protected User() { + } + public User(String firstName, String lastName, String city, String username, String email, String password) { + super(firstName, lastName, city); + this.username = username; + this.email = email; + this.password = password; + } -public static long getSerialversionuid() { - return serialVersionUID; -} + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + public String getEmail() { + return email; + } -@Override -public String toString() { - return "User [username=" + username + ", email=" + email + ", password=" + password + "]"; -} + public void setEmail(String email) { + this.email = email; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + public static long getSerialversionuid() { + return serialVersionUID; + } - + @Override + public String toString() { + return "User [username=" + username + ", email=" + email + ", password=" + password + "]"; + } } diff --git a/mivan/src/main/java/mivan/repository/LoanRepository.java b/mivan/src/main/java/mivan/repository/LoanRepository.java new file mode 100644 index 0000000..4898199 --- /dev/null +++ b/mivan/src/main/java/mivan/repository/LoanRepository.java @@ -0,0 +1,16 @@ +package mivan.repository; + + +import mivan.model.Loan; + +public interface LoanRepository extends Repository { + + public void deleteLoanById(Long id); + + public void addLoan(Loan loan); + + public void updateLoan(Long id, String stato); + + public int getSize(); + +} diff --git a/mivan/src/main/java/mivan/repository/LoanRepositoryImpl.java b/mivan/src/main/java/mivan/repository/LoanRepositoryImpl.java new file mode 100644 index 0000000..0dec829 --- /dev/null +++ b/mivan/src/main/java/mivan/repository/LoanRepositoryImpl.java @@ -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 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 findAll() { + final EntityManager entityManager = this.entityManagerFactory.createEntityManager(); + List 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; + } +} diff --git a/mivan/src/test/java/mivan/LocationTest.java b/mivan/src/test/java/mivan/LocationTest.java index 4202fa8..77b0f92 100644 --- a/mivan/src/test/java/mivan/LocationTest.java +++ b/mivan/src/test/java/mivan/LocationTest.java @@ -28,8 +28,8 @@ public class LocationTest { @Order(1) void testAddLocation() { - String lname = "Library bria 2"; - String ladress = "via chissa dove2"; + String lname = "test_add_location_name"; + String ladress = "test_add_location_adress"; Location location = new Location(lname, ladress); int size = locationRepository.getSize(); @@ -46,18 +46,18 @@ public class LocationTest { void testUpdateLocation() { // creo nuovo menìmbro dello staff - String firstname = "Ivan"; - String lastname = "Donati"; - String city = "Milano"; - String idka = "lihwelhqluchwlir8"; - String ruolo = "frontoffice"; - Staff newstaff1 = new Staff(firstname, lastname, city, idka, ruolo); - - String firstname2 = "Rossi"; - String lastname2 = "Donati"; - String city2 = "Milano"; - String idka2 = "lihwelhsfgdghhwlir8"; - String ruolo2 = "manager"; + String firstname1 = "test_update_location_name1"; + String lastname1 = "test_update_location_lastname1"; + String city1 = "test_update_location_city1"; + String idka1 = "test_update_location_idka1"; + String ruolo1 = "test_update_location_role1"; + Staff newstaff1 = new Staff(firstname1, lastname1, city1, idka1, ruolo1); + + String firstname2 = "test_update_location_name2"; + String lastname2 = "test_update_location_lastname2"; + String city2 = "test_update_location_city2"; + String idka2 = "test_update_location_idka2"; + String ruolo2 = "test_update_location_role2"; Staff newstaff2 = new Staff(firstname2, lastname2, city2, idka2, ruolo2); staffRepository.addStaff(newstaff1); @@ -68,8 +68,8 @@ public class LocationTest { staffs.add(newstaff2); // creo una locazione - String lname = "Library cosa 2"; - String ladress = "via chissa dove"; + String lname = "test_update_location_name"; + String ladress = "test_update_location_adress"; Location newlocation = new Location(lname, ladress); locationRepository.addLocation(newlocation); @@ -77,16 +77,16 @@ public class LocationTest { long id = editLocation.getId(); // nuovi dati per modificare i vecchi - String newlName = "Library bria 5"; - String newlAdress = "via prossima stella"; + String newlname = "test_update_location_newname"; + String newladress = "test_update_location_newadress"; // aggungo i membri dello staff / modifico i dati della location - locationRepository.updateLocation(id, newlName, newlAdress, staffs); + locationRepository.updateLocation(id, newlname, newladress, staffs); Optional location = locationRepository.findById(id); location.ifPresent(a -> { - assertEquals(a.getName(), newlName); - assertEquals(a.getAdress(), newlAdress); + assertEquals(a.getName(), newlname); + assertEquals(a.getAdress(), newladress); assertEquals(a.getStaffs(), staffs); }); } @@ -95,8 +95,8 @@ public class LocationTest { @Order(3) void testDeleteLocation() { - String lname = "Library bria 9"; - String ladress = "via chissa dove9"; + String lname = "test_delete_location_name"; + String ladress = "test_delete_location_adress"; Location location = new Location(lname, ladress); locationRepository.addLocation(location); @@ -110,7 +110,7 @@ public class LocationTest { int newsize = locationRepository.getSize(); - assertEquals(newsize, size -1); + assertEquals(newsize, size - 1); } } diff --git a/mivan/src/test/java/mivan/StaffTest.java b/mivan/src/test/java/mivan/StaffTest.java index 5920453..1a4fcaa 100644 --- a/mivan/src/test/java/mivan/StaffTest.java +++ b/mivan/src/test/java/mivan/StaffTest.java @@ -26,14 +26,14 @@ public class StaffTest { @Order(1) void testAddStaff() { - String firstname = "Ivan"; - String lastname = "Donati"; - String city = "Milano"; - String idka = "lihwelhqluchwlir8"; - String ruolo = "frontoffice"; - - String lname = "Library bria 2"; - String ladress = "via chissa dove"; + String firstname = "test_add_staff_name"; + String lastname = "test_add_staff_lastname"; + String city = "test_add_staff_city"; + String idka = "test_add_staff_idka"; + String ruolo = "test_add_staff_role"; + + String lname = "test_add_staff_loc_name"; + String ladress = "test_add_staff_loc_adress"; Location location = new Location(lname, ladress); locationRepository.addLocation(location); @@ -55,13 +55,13 @@ public class StaffTest { void testUpdateStaff() { // creo una locazione - String lname = "Library cosa 2"; - String ladress = "via chissa dove"; + String lname = "test_update_staff_loc_name"; + String ladress = "test_update_staff_loc_adress"; Location location = new Location(lname, ladress); // creo una seconda locazione - String newlName = "Library destra 5"; - String newlAdress = "via prossima stella"; + String newlName = "test_update_staff_loc_newname"; + String newlAdress = "test_update_staff_loc_newname"; Location newlocation = new Location(newlName, newlAdress); int losize = locationRepository.getSize(); @@ -73,12 +73,13 @@ public class StaffTest { assertEquals(newlosize, losize + 2); // ci sono 2 locazioni aggunte - // creo un membro dello staff - String firstname = "Maccio"; - String lastname = "Donati"; - String city = "Milano"; - String idka = "lihwelhqluchwlir8"; - String ruolo = "frontoffice"; + // creo un membro dello staff + String firstname = "test_update_staff_name"; + String lastname = "test_update_staff_lastname"; + String city = "test_update_staff_city"; + String idka = "test_update_staff_idka"; + String ruolo = "test_update_staff_role"; + Staff newstaff = new Staff(firstname, lastname, city, idka, ruolo); int size = staffRepository.getSize(); @@ -92,11 +93,11 @@ public class StaffTest { Staff editStaff = staffRepository.searchStaffByidka(idka); long id = editStaff.getId(); - String newfirstname = "Ivans"; - String newlastname = "Donatis"; - String newcity = "Milanos"; - String newidka = "lihwelhkluchwlir5"; - String newruolo = "spazzino"; + String newfirstname = "test_update_staff_newname"; + String newlastname = "test_update_staff_newlastname"; + String newcity = "test_update_staff_newcity"; + String newidka = "test_update_staff_newidka"; + String newruolo = "test_update_staff_newrole"; staffRepository.updateStaff(id, newfirstname, newlastname, newcity, newidka, newruolo, newlocation); @@ -117,14 +118,14 @@ public class StaffTest { @Order(3) void testDeleteStaff() { - String firstname = "John"; - String lastname = "Donati"; - String city = "Milano"; - String idka = "lihwelhsfghhwlir8"; - String ruolo = "manager"; + String firstname = "test_delete_staff_name"; + String lastname = "test_delete_staff_lastname"; + String city = "test_delete_staff_city"; + String idka = "test_delete_staff_idka"; + String ruolo = "test_delete_staff_role"; - String lname = "Library siniz 2"; - String ladress = "via sassa dove"; + String lname = "test_delete_staff_loc_name"; + String ladress = "test_delete_staff_loc_adress"; Location location = new Location(lname, ladress); locationRepository.addLocation(location); diff --git a/mivan/src/test/java/mivan/UserTest.java b/mivan/src/test/java/mivan/UserTest.java index d7efa13..cea2a7f 100644 --- a/mivan/src/test/java/mivan/UserTest.java +++ b/mivan/src/test/java/mivan/UserTest.java @@ -23,12 +23,12 @@ class UserTest { @Order(1) void testAddUser() { - String firstname = "Ivan"; - String lastname = "Donati"; - String city = "Milano"; - String username = "p.donati"; - String email = "p.donati@campus.unimib.it"; - String password = "pdonatipassword"; + String firstname = "test_add_user_name"; + String lastname = "test_add_user_lastname"; + String city = "test_add_user_city"; + String username = "test_add_user_username"; + String email = "test_add_user_email"; + String password = "test_add_user_password"; User user = new User(firstname, lastname, city, username, email, password); int size = userRepository.getSize(); @@ -42,14 +42,14 @@ class UserTest { @Test @Order(2) - void testUpdateCompany() { + void testUpdateUser() { - String firstname = "Simone"; - String lastname = "Donati"; - String city = "Milano"; - String username = "i.donati"; - String email = "i.donati@campus.unimib.it"; - String password = "passwordsicura"; + String firstname = "test_update_user_name"; + String lastname = "test_update_user_lastname"; + String city = "test_update_user_city"; + String username = "test_update_user_username"; + String email = "test_update_user_email"; + String password = "test_update_user_password"; User newuser = new User(firstname, lastname, city, username, email, password); @@ -59,12 +59,12 @@ class UserTest { long id = editUser.getId(); - String newfirstname = "Ivans"; - String newlastname = "Donatis"; - String newcity = "Milanos"; - String newusername = "asd.donati1s"; - String newemail = "asd.donati@campus.unimib.com"; - String newpassword = "newpdonatipassword"; + String newfirstname = "test_update_user_newname"; + String newlastname = "test_update_user_newlastname"; + String newcity = "test_update_user_newcity"; + String newusername = "test_update_user_newusername"; + String newemail = "test_update_user_newemail"; + String newpassword = "test_update_user_newpassword"; userRepository.updateUser(id, newfirstname, newlastname, newcity, newusername, newemail, newpassword); @@ -84,12 +84,12 @@ class UserTest { @Order(3) void testDeleteUser() { - String firstname = "Rossi"; - String lastname = "Donati"; - String city = "Milano"; - String username = "r.donati"; - String email = "r.donati@campus.unimib.it"; - String password = "rdonatipassword"; + String firstname = "test_delete_user_name"; + String lastname = "test_delete_user_lastname"; + String city = "test_delete_user_city"; + String username = "test_delete_user_username"; + String email = "test_delete_user_email"; + String password = "test_delete_user_password"; User newuser = new User(firstname, lastname, city, username, email, password);