diff --git a/formation-programmation-java/projets/javaee/jpa-101/pom.xml b/formation-programmation-java/projets/javaee/jpa-101/pom.xml index 4269c8a..7c15331 100644 --- a/formation-programmation-java/projets/javaee/jpa-101/pom.xml +++ b/formation-programmation-java/projets/javaee/jpa-101/pom.xml @@ -31,6 +31,13 @@ pom import + + org.jboss.arquillian + arquillian-bom + ${version.arquillian} + pom + import + @@ -53,6 +60,18 @@ junit test + + + org.jboss.arquillian.junit + arquillian-junit-container + test + + + org.wildfly.arquillian + wildfly-arquillian-container-embedded + 2.1.0.Final + test + @@ -65,6 +84,45 @@ 1.8 + + org.apache.maven.plugins + maven-dependency-plugin + + + unpack + process-test-classes + + unpack + + + + + org.wildfly + wildfly-dist + ${version.wildfly} + zip + false + target + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + always + + ${project.basedir}/target/wildfly-${version.wildfly} + org.jboss.logmanager.LogManager + + false + + \ No newline at end of file diff --git a/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionCategories.java b/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionCategories.java index f3ec541..9815ce8 100644 --- a/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionCategories.java +++ b/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionCategories.java @@ -7,11 +7,11 @@ @Stateless public class GestionCategories extends GestionGenerique { - public GestionCategories() { + public GestionCategories() throws NoSuchFieldException { super(Categorie.class); } - public Long getNbProduitParCategorieId(Integer id) { + public long getNbProduitParCategorieId(Integer id) { TypedQuery query = em.createQuery("select count(p) from Produit p where p.categorie.id=:id", Long.class); query.setParameter("id", id); return query.getSingleResult(); diff --git a/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionFabricants.java b/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionFabricants.java index d79d608..afd6838 100644 --- a/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionFabricants.java +++ b/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionFabricants.java @@ -7,7 +7,7 @@ @Stateless public class GestionFabricants extends GestionGenerique { - public GestionFabricants() { + public GestionFabricants() throws NoSuchFieldException { super(Fabricant.class); } diff --git a/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionGenerique.java b/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionGenerique.java index 5219218..d4f983a 100644 --- a/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionGenerique.java +++ b/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionGenerique.java @@ -3,15 +3,16 @@ import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import java.lang.reflect.Field; import java.util.List; /** * Ceci est une implémentation générique d'un EJB d'accès aux données (souvent appelé DAO). - * + *

* Il apporte les opérations de base communes à toutes nos entités (Categorie, Fabricant et Produit). - * + *

* Il stocke la classe sur laquelle il travaille dans son attribut 'managedClass'. - * + *

* Les sous-classes concrètes pourront ajouter des méthodes selon les besoins spécifiques. * * @param Le type que l'EJB gère @@ -22,9 +23,13 @@ public abstract class GestionGenerique { protected EntityManager em; private final Class managedClass; + private final Field idField; - public GestionGenerique(Class managedClass) { + public GestionGenerique(Class managedClass) throws NoSuchFieldException { this.managedClass = managedClass; + + idField = managedClass.getDeclaredField("id"); + idField.setAccessible(true); } public List findAll() { @@ -32,6 +37,15 @@ public List findAll() { } public T add(T entity) { + try { + if (idField != null && idField.get(entity) == null) { + em.persist(entity); + return entity; + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return em.merge(entity); } diff --git a/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionProduits.java b/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionProduits.java index e586798..312bac5 100644 --- a/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionProduits.java +++ b/formation-programmation-java/projets/javaee/jpa-101/src/main/java/fr/lteconsulting/training/moviedb/ejb/GestionProduits.java @@ -8,7 +8,7 @@ @Stateless public class GestionProduits extends GestionGenerique { - public GestionProduits() { + public GestionProduits() throws NoSuchFieldException { super(Produit.class); } diff --git a/formation-programmation-java/projets/javaee/jpa-101/src/test/java/fr/lteconsulting/training/moviedb/GestionCategoriesTest.java b/formation-programmation-java/projets/javaee/jpa-101/src/test/java/fr/lteconsulting/training/moviedb/GestionCategoriesTest.java index 3453f27..99d001b 100644 --- a/formation-programmation-java/projets/javaee/jpa-101/src/test/java/fr/lteconsulting/training/moviedb/GestionCategoriesTest.java +++ b/formation-programmation-java/projets/javaee/jpa-101/src/test/java/fr/lteconsulting/training/moviedb/GestionCategoriesTest.java @@ -1,19 +1,63 @@ package fr.lteconsulting.training.moviedb; import fr.lteconsulting.training.moviedb.ejb.GestionCategories; +import fr.lteconsulting.training.moviedb.ejb.GestionProduits; import fr.lteconsulting.training.moviedb.model.Categorie; -import org.junit.Assert; +import fr.lteconsulting.training.moviedb.model.Produit; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; +import org.junit.runner.RunWith; -import static org.junit.Assert.assertTrue; +import javax.ejb.EJB; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +@RunWith(Arquillian.class) public class GestionCategoriesTest { + @Deployment + public static Archive createDeployment() { + return ShrinkWrap.create(WebArchive.class, "test.war") + .addPackage(Categorie.class.getPackage()) + .addPackage(GestionCategories.class.getPackage()) + .addAsResource("test-persistence.xml", "META-INF/persistence.xml") + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); + } + + @EJB + private GestionCategories gestionCategories; + + @EJB + private GestionProduits gestionProduits; + + @Test + public void testAjoutCategorie() { + Categorie categorie = new Categorie(); + categorie.setNom("test"); + gestionCategories.add(categorie); + + assertNotNull("l'ID ne devrait pas être null", categorie.getId()); + assertEquals("le nom devrait être 'test'", "test", categorie.getNom()); + } + @Test - public void testGestionCategorie() { - GestionCategories gestionCategories = new GestionCategories(); + public void testGetNbProduitParCategorieId() { + Categorie categorie = new Categorie(); + gestionCategories.add(categorie); - gestionCategories.add(new Categorie()); + int nb = 10; + for (int i = 0; i < nb; i++) { + Produit produit = new Produit(); + produit.setCategorie(categorie); + gestionProduits.add(produit); + } - assertTrue(true); + assertNotNull("l'ID ne devrait pas être null", categorie.getId()); + assertEquals("il devrait y avoir " + nb + " produits pour cette catégorie", nb, gestionCategories.getNbProduitParCategorieId(categorie.getId())); } } diff --git a/formation-programmation-java/projets/javaee/jpa-101/src/test/java/fr/lteconsulting/training/moviedb/GestionProduitsTest.java b/formation-programmation-java/projets/javaee/jpa-101/src/test/java/fr/lteconsulting/training/moviedb/GestionProduitsTest.java new file mode 100644 index 0000000..fd2f453 --- /dev/null +++ b/formation-programmation-java/projets/javaee/jpa-101/src/test/java/fr/lteconsulting/training/moviedb/GestionProduitsTest.java @@ -0,0 +1,62 @@ +package fr.lteconsulting.training.moviedb; + +import fr.lteconsulting.training.moviedb.ejb.GestionCategories; +import fr.lteconsulting.training.moviedb.ejb.GestionFabricants; +import fr.lteconsulting.training.moviedb.ejb.GestionProduits; +import fr.lteconsulting.training.moviedb.model.Categorie; +import fr.lteconsulting.training.moviedb.model.Produit; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.ejb.EJB; +import java.util.List; + +@RunWith(Arquillian.class) +public class GestionProduitsTest { + @Deployment + public static Archive createDeployment() { + return ShrinkWrap.create(WebArchive.class, "test.war") + .addPackage(Categorie.class.getPackage()) + .addPackage(GestionCategories.class.getPackage()) + .addAsResource("test-persistence.xml", "META-INF/persistence.xml") + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); + } + + @EJB + private GestionCategories gestionCategories; + + @EJB + private GestionFabricants gestionFabricants; + + @EJB + private GestionProduits gestionProduits; + + @Before + public void beforeTest() { + for (Produit produit : gestionProduits.findAll()) + gestionProduits.deleteById(produit.getId()); + } + + @Test + public void testRechercheProduits() { + Produit produit = new Produit(); + produit.setNom("toto"); + gestionProduits.add(produit); + + List produits = gestionProduits.findByName("toto"); + Assert.assertNotNull("liste devrait etre non nulle", produits); + Assert.assertEquals("on devrait en trouver un", 1, produits.size()); + + produits = gestionProduits.findByName("tot"); + Assert.assertNotNull("liste devrait etre non nulle", produits); + Assert.assertEquals("on devrait en trouver un", 1, produits.size()); + } +} diff --git a/formation-programmation-java/projets/javaee/jpa-101/src/test/resources/test-persistence.xml b/formation-programmation-java/projets/javaee/jpa-101/src/test/resources/test-persistence.xml new file mode 100644 index 0000000..25d521d --- /dev/null +++ b/formation-programmation-java/projets/javaee/jpa-101/src/test/resources/test-persistence.xml @@ -0,0 +1,14 @@ + + + + java:jboss/datasources/ExampleDS + + + + + + \ No newline at end of file