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