diff --git a/.gitignore b/.gitignore index 6bc0bfa..ccc6ec9 100644 --- a/.gitignore +++ b/.gitignore @@ -81,4 +81,7 @@ fabric.properties # Sonarlint plugin .idea/sonarlint +# Compiled bytecode +/target/ + # End of https://www.gitignore.io/api/intellij diff --git a/.idea/Maven.JPA.EntityManager.iml b/.idea/Maven.JPA.EntityManager.iml new file mode 100644 index 0000000..0bbc534 --- /dev/null +++ b/.idea/Maven.JPA.EntityManager.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index db06ab1..3fa7bae 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,6 +7,7 @@ + diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..ba2aa47 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,14 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/movies + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 803a716..48b4b95 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,9 @@ + + \ No newline at end of file diff --git a/src/main/java/entities/Actor.java b/src/main/java/entities/Actor.java new file mode 100644 index 0000000..6767672 --- /dev/null +++ b/src/main/java/entities/Actor.java @@ -0,0 +1,96 @@ +package entities; + + +import com.sun.istack.NotNull; + +import javax.persistence.*; +import java.time.LocalDate; +import java.util.Set; + +@Entity +//@Table( +// name = "actor", +// uniqueConstraints = {@UniqueConstraint(columnNames = {"birthDate", "firstName", "lastName"})} +//) +public class Actor +{ + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + @NotNull + private String firstName; + @NotNull + private String lastName; + private String gender; + @NotNull + private LocalDate birthDate; + private String nationality; + @ManyToMany(cascade = + {CascadeType.PERSIST, CascadeType.MERGE}) + @JoinTable( + name = "movie_cast", + joinColumns = {@JoinColumn(name = "actor_id")}, + inverseJoinColumns = {@JoinColumn(name = "movie_id")} + ) + private Set filmography; + + public Actor() + { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public LocalDate getBirthDate() { + return birthDate; + } + + public void setBirthDate(LocalDate birthDate) { + this.birthDate = birthDate; + } + + public String getNationality() { + return nationality; + } + + public void setNationality(String nationality) { + this.nationality = nationality; + } + + public Set getFilmography() { + return filmography; + } + + public void setFilmography(Set filmography) { + this.filmography = filmography; + } +} diff --git a/src/main/java/entities/Movie.java b/src/main/java/entities/Movie.java new file mode 100644 index 0000000..18d099b --- /dev/null +++ b/src/main/java/entities/Movie.java @@ -0,0 +1,105 @@ +package entities; + + +import com.sun.istack.NotNull; + +import javax.persistence.*; +import java.time.LocalDate; +import java.util.Objects; +import java.util.Set; + +@Entity +//@Table( +// name = "movie", +// uniqueConstraints = {@UniqueConstraint(columnNames = {"title", "releaseDate"})} +//) +public class Movie +{ + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + @NotNull + private String title; + @NotNull + private LocalDate releaseDate; + private String director; + @ManyToMany(cascade = + {CascadeType.PERSIST, CascadeType.MERGE}) + @JoinTable( + name = "movie_cast", + joinColumns = {@JoinColumn(name = "movie_id")}, + inverseJoinColumns = {@JoinColumn(name = "actor_id")} + ) + private Set cast; + String summary; + + public Movie() + { + } + + public Long getId() + { + return this.id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getTitle() + { + return this.title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public LocalDate getReleaseDate() + { + return this.releaseDate; + } + + public void setReleaseDate(LocalDate releaseDate) + { + this.releaseDate = releaseDate; + } + + public String getDirector() + { + return this.director; + } + + public void setDirector(String director) + { + this.director = director; + } + + public Set getCast() + { + return this.cast; + } + + public void setCast(Set cast) + { + this.cast = cast; + } + + public String getSummary() + { + return this.summary; + } + + public void setSummary(String summary) + { + this.summary = summary; + } + + @Override + public int hashCode() + { + return Objects.hash(this.getTitle()); + } +} diff --git a/src/main/java/services/ActorService.java b/src/main/java/services/ActorService.java new file mode 100644 index 0000000..2cfec3d --- /dev/null +++ b/src/main/java/services/ActorService.java @@ -0,0 +1,94 @@ +package services; + +import entities.Actor; +import entities.Movie; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class ActorService +{ + EntityManagerFactory emf; + EntityManager em; + List actorList; + + public ActorService() + { + emf = Persistence.createEntityManagerFactory("movieDB"); + em = emf.createEntityManager(); + actorList = new ArrayList<>(); + } + + public List findAll() + { + return em.createQuery("SELECT a FROM Actor a", Actor.class).getResultList(); + } + + public Actor findById(Long id) + { + return em.find(Actor.class, id); + } + + public Actor create(Actor actor) + { + em.getTransaction().begin(); + em.persist(actor); + em.getTransaction().commit(); + + return actor; + } + + public Actor create(Long id, String firstName, String lastName, String gender, LocalDate birthDate, + String nationality, Set filmography) + { + Actor createdActor = new Actor(); + createdActor.setId(id); + createdActor.setFirstName(firstName); + createdActor.setLastName(lastName); + createdActor.setGender(gender); + createdActor.setBirthDate(birthDate); + createdActor.setNationality(nationality); + createdActor.setFilmography(filmography); + em.getTransaction().begin(); + em.persist(createdActor); + em.getTransaction().commit(); + + return createdActor; + } + + public void update(Long id, Actor actor) + { + em.getTransaction().begin(); + Actor persistentActor = em.find(Actor.class, id); + persistentActor.setFirstName(actor.getFirstName()); + persistentActor.setLastName(actor.getLastName()); + persistentActor.setGender(actor.getGender()); + persistentActor.setBirthDate(actor.getBirthDate()); + persistentActor.setNationality(actor.getNationality()); + persistentActor.setFilmography(actor.getFilmography()); + em.getTransaction().commit(); + } + + public void delete(Long id) + { + Actor actorToRemove = em.find(Actor.class, id); + if(actorToRemove != null) + { + em.getTransaction().begin(); + em.remove(actorToRemove); + em.getTransaction().commit(); + } + } + + public void delete(Actor actor) + { + em.getTransaction().begin(); + em.remove(actor); + em.getTransaction().commit(); + } +} diff --git a/src/main/java/services/DELETEME.txt b/src/main/java/services/DELETEME.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/services/MovieService.java b/src/main/java/services/MovieService.java new file mode 100644 index 0000000..3a6486c --- /dev/null +++ b/src/main/java/services/MovieService.java @@ -0,0 +1,91 @@ +package services; + +import entities.Actor; +import entities.Movie; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class MovieService +{ + EntityManagerFactory emf; + EntityManager em; + List movieList; + + public MovieService() + { + emf = Persistence.createEntityManagerFactory("movieDB"); + em = emf.createEntityManager(); + movieList = new ArrayList<>(); + } + + public List findAll() + { + return em.createQuery("SELECT m FROM Movie m", Movie.class).getResultList(); + } + + public Movie findById(Long id) + { + return em.find(Movie.class, id); + } + + public Movie create(Movie movie) + { + em.getTransaction().begin(); + em.persist(movie); + em.getTransaction().commit(); + + return movie; + } + + public Movie create(String title, LocalDate releaseDate, String director, Set cast, String summary) + { + Movie createdMovie = new Movie(); + createdMovie.setTitle(title); + createdMovie.setReleaseDate(releaseDate); + createdMovie.setDirector(director); + createdMovie.setCast(cast); + createdMovie.setSummary(summary); + em.getTransaction().begin(); + em.persist(createdMovie); + em.getTransaction().commit(); + + return createdMovie; + } + + public void update(Long id, Movie movie) + { + em.getTransaction().begin(); + Movie persistentMovie = em.find(Movie.class, id); + persistentMovie.setTitle(movie.getTitle()); + persistentMovie.setReleaseDate(movie.getReleaseDate()); + persistentMovie.setDirector(movie.getDirector()); + persistentMovie.setCast(movie.getCast()); + persistentMovie.setSummary(movie.getSummary()); + em.merge(persistentMovie); + em.getTransaction().commit(); + } + + public void delete(Long id) + { + Movie movieToRemove = em.find(Movie.class, id); + if(movieToRemove != null) + { + em.getTransaction().begin(); + em.remove(movieToRemove); + em.getTransaction().commit(); + } + } + + public void delete(Movie movie) + { + em.getTransaction().begin(); + em.remove(movie); + em.getTransaction().commit(); + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..68fde66 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,22 @@ + + + + org.hibernate.jpa.HibernatePersistenceProvider + + + + + + + + + + + + + + + diff --git a/src/test/java/services/ActorServiceTest.java b/src/test/java/services/ActorServiceTest.java new file mode 100644 index 0000000..39d7729 --- /dev/null +++ b/src/test/java/services/ActorServiceTest.java @@ -0,0 +1,102 @@ +package services; + +import entities.Actor; +import entities.Movie; +import org.junit.Before; +import org.junit.Test; + +import java.time.LocalDate; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ActorServiceTest +{ + ActorService testActorService; + MovieService testMovieService; + + @Before + public void init() + { + testActorService = new ActorService(); + testMovieService = new MovieService(); + } + + @Test + public void createActorTest() + { + Actor testActor = new Actor(); + testActor.setFirstName("Chris"); + testActor.setLastName("Pine"); + testActor.setNationality("American"); + testActor.setBirthDate(LocalDate.of(1980, 8, 26)); + testActor.setGender("male"); + + Movie testMovieA = new Movie(); + Movie testMovieB = new Movie(); + testMovieA.setTitle("Star Trek"); + testMovieB.setTitle("Wonder Woman"); + Set films = new HashSet<>(); + films.add(testMovieA); + films.add(testMovieB); + + testActor.setFilmography(films); + + testActorService.create(testActor); + } + + @Test + public void createActorsSameMovie() + { + Actor testTomHanks = new Actor(); + testTomHanks.setFirstName("Tom"); + testTomHanks.setLastName("Hanks"); + testTomHanks.setBirthDate(LocalDate.of(1967, 3, 21)); + Actor testMegRyan = new Actor(); + testMegRyan.setFirstName("Meg"); + testMegRyan.setLastName("Ryan"); + testMegRyan.setBirthDate(LocalDate.of(1969, 11, 2)); + Movie testJoe = new Movie(); + testJoe.setTitle("Joe Vs. the Volcano"); + testJoe.setReleaseDate(LocalDate.of(1988, 7, 11)); + Movie testSleepless = new Movie(); + testSleepless.setTitle("Sleepless In Seattle"); + testSleepless.setReleaseDate(LocalDate.of(1992, 11, 20)); + Movie testMail = new Movie(); + testMail.setTitle("You've Got Mail"); + testMail.setReleaseDate(LocalDate.of(1995, 5, 31)); + Movie testDupeMail = new Movie(); + testDupeMail.setTitle("You've Got Mail"); + testDupeMail.setReleaseDate(LocalDate.of(1995, 5, 31)); + + Set hanksFilms = new HashSet<>(); + hanksFilms.add(testJoe); + hanksFilms.add(testSleepless); + hanksFilms.add(testMail); + + Set ryanFilms = new HashSet<>(); + ryanFilms.add(testJoe); + ryanFilms.add(testSleepless); + ryanFilms.add(testDupeMail); + + testTomHanks.setFilmography(hanksFilms); + testMegRyan.setFilmography(ryanFilms); + + testActorService.create(testTomHanks); + testActorService.create(testMegRyan); + + List movies = testMovieService.findAll(); + + for(Movie movie : movies) + { + System.out.println(movie.getTitle()); + System.out.println("======="); + Set cast = movie.getCast(); + for(Actor actor : cast) + { + System.out.println("Actor: " + actor.getFirstName() + " " + actor.getLastName()); + } + System.out.println("\n"); + } + } +} diff --git a/src/test/java/services/DELETEME.txt b/src/test/java/services/DELETEME.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/services/MovieServiceTest.java b/src/test/java/services/MovieServiceTest.java new file mode 100644 index 0000000..3c726c2 --- /dev/null +++ b/src/test/java/services/MovieServiceTest.java @@ -0,0 +1,119 @@ +package services; + +import entities.Actor; +import entities.Movie; +import org.junit.Before; +import org.junit.Test; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.junit.Assert.*; + +public class MovieServiceTest +{ + MovieService testMovieService; + + @Before + public void setup() + { + testMovieService = new MovieService(); + } + + @Test + public void addMovieTest() + { + Movie testMovie = new Movie(); + testMovie.setTitle("The Good, the Bad and the Ugly"); + testMovie.setDirector("Sergio Leone"); + testMovie.setReleaseDate(LocalDate.of(1967, 12, 29)); + + Actor testActor = new Actor(); + testActor.setLastName("Eastwood"); + testActor.setFirstName("Clint"); + + Set testCast = new HashSet<>(); + testCast.add(testActor); + + testMovie.setCast(testCast); + testMovie.setSummary("Three rival gungslingers search for lost Confederate gold."); + + testMovieService.create(testMovie); + Movie actual = testMovieService.findById(1L); + + assertEquals(testMovie, actual); + } + + @Test + public void addMovieOtherWayTest() + { + testMovieService.create("Captain America: The Winter Soldier", LocalDate.of(2014, 4, 10), + "Joe Russo", new HashSet(), "Captain America must face off against Hydra in the modern era."); + } + + @Test + public void findAllMovies() + { + String expectedTitle = "Short Circuit"; + Movie firstMovie = new Movie(); + Movie secondMovie = new Movie(); + Movie thirdMovie = new Movie(); + List expected = new ArrayList<>(); + firstMovie.setTitle("E.T."); + firstMovie.setDirector("Steven Spielberg"); + firstMovie.setSummary("A boy and alien become pals."); + firstMovie.setReleaseDate(LocalDate.of(1982, 5, 11)); + secondMovie.setTitle("Star Wars"); + thirdMovie.setTitle(expectedTitle); + + expected.add(firstMovie); + expected.add(secondMovie); + expected.add(thirdMovie); + + testMovieService.create(firstMovie); + testMovieService.create(secondMovie); + testMovieService.create(thirdMovie); + + List actual = testMovieService.findAll(); + String actualTitle = actual.get(2).getTitle(); + + assertEquals(expected, actual); + assertEquals(expectedTitle, actualTitle); + } + + @Test + public void updateMovieTest() + { + Movie testMovie = new Movie(); + String originalTitle = "Toy Story II"; + testMovie.setTitle(originalTitle); + testMovieService.create(testMovie); + String actualOriginalTitle = testMovieService.findById(1L).getTitle(); + assertEquals(originalTitle, actualOriginalTitle); + + String changedTitle = "Toy Story 2"; + testMovie.setTitle(changedTitle); + testMovieService.update(1L, testMovie); + String actualChangedTitle = testMovieService.findById(1L).getTitle(); + + assertEquals(changedTitle, actualChangedTitle); + } + + @Test + public void deleteAMovie() + { + Movie testMovie = new Movie(); + testMovie.setTitle("Fight Club"); + + testMovieService.create(testMovie); + List persistentMovies = testMovieService.findAll(); + assertEquals(true, persistentMovies.contains(testMovie)); + + testMovieService.delete(testMovie); + persistentMovies = testMovieService.findAll(); + assertEquals(false, persistentMovies.contains(testMovie)); + } +}