diff --git a/.gitignore b/.gitignore index 84f198a..0bede59 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ *.zip *.tar.gz *.rar +*.dat # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* @@ -88,3 +89,4 @@ fabric.properties # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser +/ejbdemo/testdb/ diff --git a/ejbdemo/ejbdemo.iml b/ejbdemo/ejbdemo.iml new file mode 100644 index 0000000..d94b47a --- /dev/null +++ b/ejbdemo/ejbdemo.iml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ejbdemo/pom.xml b/ejbdemo/pom.xml new file mode 100644 index 0000000..b5408c4 --- /dev/null +++ b/ejbdemo/pom.xml @@ -0,0 +1,85 @@ + + + + 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.eclipse.persistence + org.eclipse.persistence.jpa.modelgen.processor + 2.5.0 + provided + + + org.hibernate + hibernate-validator + + + org.glassfish + javax.el + + + 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..541f323 --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java @@ -0,0 +1,37 @@ +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.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@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..9c5ab0c --- /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 = "testdb", + 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..4bff095 --- /dev/null +++ b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java @@ -0,0 +1,56 @@ +package it.plague.jeedemo; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +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/jpademo/jpademo.iml b/jpademo/jpademo.iml index 93e6728..1b4d57b 100644 --- a/jpademo/jpademo.iml +++ b/jpademo/jpademo.iml @@ -4,7 +4,10 @@ - + + + + diff --git a/pom.xml b/pom.xml index b18fc0d..c1e9333 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ cdidemo beanvalidationdemo jpademo + ejbdemo xmlandjsondemo @@ -48,6 +49,12 @@ derbyclient 10.9.1.0 + + org.glassfish.main.extras + glassfish-embedded-all + 4.1.2 + provided + org.apache.derby derby