From 09af0ccdfb9c8072acedf39875f6eef0ea78ba97 Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Fri, 29 Mar 2019 16:02:49 +0100 Subject: [PATCH] Aggiunto l'esempio capitolo su Enterprise JavaBean --- ejbdemo/ejbdemo.iml | 42 +++++++++ ejbdemo/pom.xml | 88 +++++++++++++++++++ .../src/main/java/it/plague/jeedemo/Book.java | 35 ++++++++ .../main/java/it/plague/jeedemo/BookEJB.java | 39 ++++++++ .../java/it/plague/jeedemo/BookEJBRemote.java | 16 ++++ .../it/plague/jeedemo/DatabasePopulator.java | 56 ++++++++++++ .../it/plague/jeedemo/DatabaseProducer.java | 12 +++ ejbdemo/src/main/resources/META-INF/beans.xml | 8 ++ .../main/resources/META-INF/persistence.xml | 16 ++++ .../java/it/plague/jeedemo/BookEJBIT.java | 54 ++++++++++++ pom.xml | 7 ++ 11 files changed, 373 insertions(+) create mode 100644 ejbdemo/ejbdemo.iml create mode 100644 ejbdemo/pom.xml create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/Book.java create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java create mode 100644 ejbdemo/src/main/resources/META-INF/beans.xml create mode 100644 ejbdemo/src/main/resources/META-INF/persistence.xml create mode 100644 ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java diff --git a/ejbdemo/ejbdemo.iml b/ejbdemo/ejbdemo.iml new file mode 100644 index 0000000..39dfcd5 --- /dev/null +++ b/ejbdemo/ejbdemo.iml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ejbdemo/pom.xml b/ejbdemo/pom.xml new file mode 100644 index 0000000..9445b13 --- /dev/null +++ b/ejbdemo/pom.xml @@ -0,0 +1,88 @@ + + + + 4.0.0 + ejbdemo + ejbdemo + + + jeedemo + it.plague.jeedemo + 1.0-SNAPSHOT + + + + UTF-8 + 1.7 + 1.7 + + + + + org.eclipse.persistence + org.eclipse.persistence.jpa + + + org.hibernate + hibernate-validator + + + org.glassfish + javax.el + + + org.apache.derby + derbyclient + + + org.apache.derby + derby + test + + + org.projectlombok + lombok + provided + + + org.glassfish.main.extras + glassfish-embedded-all + provided + + + junit + junit + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.12.4 + + + integration-test + + integration-test + verify + + + + + + + diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/Book.java b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java new file mode 100644 index 0000000..f0f7d9b --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java @@ -0,0 +1,35 @@ +package it.plague.jeedemo; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@NoArgsConstructor +@Builder +@NamedQuery(name = "Book.findAll", query = "select b from Book b") +public class Book implements Serializable { + + @Id + @GeneratedValue + private Long id; + @NotNull + @Column(nullable = false) + private String title; + private Float price; + @Size(max = 2000) + @Column(length = 2000) + private String description; + private String isbn; + private Integer nbOfPage; + private Boolean illustrations; +} diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java new file mode 100644 index 0000000..4fa19e9 --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java @@ -0,0 +1,39 @@ +package it.plague.jeedemo; + +import java.util.List; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.validation.constraints.NotNull; + +@Stateless +@LocalBean +public class BookEJB implements BookEJBRemote { + + @Inject + private EntityManager em; + + @Override + public List findBooks() { + TypedQuery query = em.createNamedQuery("Book.findAll", Book.class); + return query.getResultList(); + } + + @Override + public @NotNull Book createBook(@NotNull Book book) { + em.persist(book); + return book; + } + + @Override + public @NotNull Book updateBook(@NotNull Book book) { + return em.merge(book); + } + + @Override + public void deleteBook(@NotNull Book book) { + em.remove(em.merge(book)); + } +} diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java new file mode 100644 index 0000000..523fca0 --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java @@ -0,0 +1,16 @@ +package it.plague.jeedemo; + +import java.util.List; +import javax.ejb.Remote; + +@Remote +public interface BookEJBRemote { + + List findBooks(); + + Book createBook(Book book); + + void deleteBook(Book book); + + Book updateBook(Book book); +} diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java new file mode 100644 index 0000000..8ba1f3d --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java @@ -0,0 +1,56 @@ +package it.plague.jeedemo; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.annotation.sql.DataSourceDefinition; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import javax.inject.Inject; + + +@Startup +@Singleton +@DataSourceDefinition( + className = "org.apache.derby.jdbc.EmbeddedDataSource", + name = "java:global/jdbc/ejbdemoDS", + user = "app", + password = "app", + databaseName = "ejbdemo", + properties = {"connectionAttributes=;create=true"}) +public class DatabasePopulator { + + @Inject + private BookEJB bookEJB; + + private Book h2g2; + private Book lord; + + @PostConstruct + private void populateDB() { + h2g2 = Book.builder() + .title("Beginning Java EE 7") + .price(35f) + .description("Great book") + .isbn("1-8763-9125-7") + .nbOfPage(605) + .illustrations(true) + .build(); + lord = Book.builder() + .title("The Lord of the Rings") + .price(50.4f) + .description("SciFi") + .isbn("1-84023-742-2") + .nbOfPage(1216) + .illustrations(true) + .build(); + + bookEJB.createBook(h2g2); + bookEJB.createBook(lord); + } + + @PreDestroy + private void clearDB() { + bookEJB.deleteBook(h2g2); + bookEJB.deleteBook(lord); + } +} diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java b/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java new file mode 100644 index 0000000..a9087da --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java @@ -0,0 +1,12 @@ +package it.plague.jeedemo; + +import javax.enterprise.inject.Produces; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +public class DatabaseProducer { + + @Produces + @PersistenceContext(unitName = "ejbdemoPU") + private EntityManager em; +} diff --git a/ejbdemo/src/main/resources/META-INF/beans.xml b/ejbdemo/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000..5c49eb7 --- /dev/null +++ b/ejbdemo/src/main/resources/META-INF/beans.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/ejbdemo/src/main/resources/META-INF/persistence.xml b/ejbdemo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..ed7b83f --- /dev/null +++ b/ejbdemo/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,16 @@ + + + + + java:global/jdbc/ejbdemoDS + + + + + + + + \ No newline at end of file diff --git a/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java new file mode 100644 index 0000000..5856513 --- /dev/null +++ b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java @@ -0,0 +1,54 @@ +package it.plague.jeedemo; + +import static org.junit.Assert.*; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import javax.ejb.embeddable.EJBContainer; +import javax.naming.Context; +import org.junit.Test; + +public class BookEJBIT { + + @Test + public void shouldCreateABook() throws Exception { + Map properties = new HashMap<>(); + properties.put(EJBContainer.MODULES, new File("target/classes")); + try (EJBContainer ec = EJBContainer.createEJBContainer(properties)) { + Context ctx = ec.getContext(); + + // Check JNDI dependencies (Datasource and EJBs) + assertNotNull(ctx.lookup("java:global/jdbc/ejbdemoDS")); + assertNotNull(ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJBRemote")); + assertNotNull(ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB")); + + // Looks up the EJB + BookEJB bookEJB = (BookEJB) ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB"); + + // Find all the books and makes sure there are two (inserted by the DBPopulator) + assertEquals(2, bookEJB.findBooks().size()); + + // Creates an instance of book; + Book book = Book.builder() + .title("H2G2") + .price(12.5f) + .description("Scifi book") + .isbn("1-24561-799-0") + .nbOfPage(354) + .illustrations(false) + .build(); + book = bookEJB.createBook(book); + assertNotNull("ID should not be null", book.getId()); + + // Find all the books and makes sure is an extra one + assertEquals(3, bookEJB.findBooks().size()); + + // Removes the created book + bookEJB.deleteBook(book); + + // Finds all the books and makes sure there is one less + assertEquals(2, bookEJB.findBooks().size()); + } + } +} diff --git a/pom.xml b/pom.xml index 2ed2870..4f79e02 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ cdidemo beanvalidationdemo jpademo + ejbdemo @@ -47,6 +48,12 @@ derbyclient 10.9.1.0 + + org.glassfish.main.extras + glassfish-embedded-all + 4.0 + provided + org.apache.derby derby