From 04a188f75bf8f753af3d93a3949821969edb7a31 Mon Sep 17 00:00:00 2001 From: Petrigh <petrighlautaro@alu.ing.unlp.edu.ar> Date: Tue, 25 Jun 2024 17:03:43 -0300 Subject: [PATCH] Jersey implementations --- .../src/main/java/models/Almacenamiento.java | 2 +- backend/src/main/java/models/Item.java | 6 +- backend/src/main/java/models/Receta.java | 9 ++- .../java/persistance/interfaces/Iabm.java | 6 ++ .../java/persistance/services/ABMService.java | 7 +- .../resourcesRest/AlmacenamientoResource.java | 6 +- .../main/java/resourcesRest/BienResource.java | 6 +- .../java/resourcesRest/CanalResource.java | 6 +- .../FamiliaProductoraResource.java | 6 +- .../java/resourcesRest/NotaResources.java | 6 +- .../java/resourcesRest/OrdenResource.java | 6 +- .../java/resourcesRest/RecetaResource.java | 6 +- .../java/resourcesRest/UsuarioResource.java | 6 +- .../EntityManagerProvider.java | 2 +- .../src/main/java/utils/ServiceBinder.java | 17 +++++ .../src/main/java/utils/ServiceResolver.java | 66 +++++++++++++++++++ 16 files changed, 140 insertions(+), 23 deletions(-) rename backend/src/main/java/{persistance => utils}/EntityManagerProvider.java (97%) create mode 100644 backend/src/main/java/utils/ServiceBinder.java create mode 100644 backend/src/main/java/utils/ServiceResolver.java diff --git a/backend/src/main/java/models/Almacenamiento.java b/backend/src/main/java/models/Almacenamiento.java index 2a76308..fc62a35 100644 --- a/backend/src/main/java/models/Almacenamiento.java +++ b/backend/src/main/java/models/Almacenamiento.java @@ -34,7 +34,7 @@ public class Almacenamiento { @Column(name="cantidad", nullable = false) private Double cantidad; - @OneToMany(cascade = CascadeType.ALL) + @OneToMany @JoinColumn(name = "idBien") private List<Bien> bienes; diff --git a/backend/src/main/java/models/Item.java b/backend/src/main/java/models/Item.java index 61a7bdf..2ca90d1 100644 --- a/backend/src/main/java/models/Item.java +++ b/backend/src/main/java/models/Item.java @@ -1,10 +1,13 @@ package models; +import java.util.List; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; @@ -24,8 +27,9 @@ public class Item { @ManyToOne @JoinColumn(name="idBien") private Bien bien; - + @ManyToMany(mappedBy = "ingredientes") + private List<Receta> recetas; public double getCantidad() { return cantidad; diff --git a/backend/src/main/java/models/Receta.java b/backend/src/main/java/models/Receta.java index a92758a..8bb7486 100644 --- a/backend/src/main/java/models/Receta.java +++ b/backend/src/main/java/models/Receta.java @@ -7,7 +7,8 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.OneToOne; import javax.persistence.Table; @@ -37,8 +38,10 @@ public class Receta { @Column(name="nombre") private String nombre; - @OneToMany - @JoinColumn(name="idIngrediente") + @ManyToMany + @JoinTable(name="receta_ingredientes", + joinColumns = @JoinColumn(name="idReceta"), + inverseJoinColumns = @JoinColumn(name = "idIngrediente")) private List<Item> ingredientes; @OneToOne diff --git a/backend/src/main/java/persistance/interfaces/Iabm.java b/backend/src/main/java/persistance/interfaces/Iabm.java index 94aac23..6f43b47 100644 --- a/backend/src/main/java/persistance/interfaces/Iabm.java +++ b/backend/src/main/java/persistance/interfaces/Iabm.java @@ -5,6 +5,12 @@ import java.util.Optional; import javax.ws.rs.core.Response; +import org.glassfish.hk2.api.PerThread; +import org.jvnet.hk2.annotations.Contract; + + +@Contract +@PerThread public abstract interface Iabm<T> { Optional<T> get(Class<T> clase, long id); diff --git a/backend/src/main/java/persistance/services/ABMService.java b/backend/src/main/java/persistance/services/ABMService.java index 2fcad3d..656ba82 100644 --- a/backend/src/main/java/persistance/services/ABMService.java +++ b/backend/src/main/java/persistance/services/ABMService.java @@ -8,9 +8,14 @@ import javax.persistence.EntityTransaction; import javax.persistence.TypedQuery; import javax.ws.rs.core.Response; -import persistance.EntityManagerProvider; +import org.glassfish.hk2.api.PerLookup; +import org.jvnet.hk2.annotations.Service; + import persistance.interfaces.Iabm; +import utils.EntityManagerProvider; +@Service +@PerLookup public class ABMService<T> implements Iabm<T>{ protected EntityManager getEntityManager() { diff --git a/backend/src/main/java/resourcesRest/AlmacenamientoResource.java b/backend/src/main/java/resourcesRest/AlmacenamientoResource.java index deb4e58..187edcd 100644 --- a/backend/src/main/java/resourcesRest/AlmacenamientoResource.java +++ b/backend/src/main/java/resourcesRest/AlmacenamientoResource.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.DELETE; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -18,7 +19,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import models.Almacenamiento; -import persistance.services.ABMService; +import persistance.interfaces.Iabm; @Path("/Almacenamiento") public class AlmacenamientoResource { @@ -28,7 +29,8 @@ public class AlmacenamientoResource { @Context Request request; - private ABMService<Almacenamiento> almaDAO = new ABMService<Almacenamiento>(); + @Inject + private Iabm<Almacenamiento> almaDAO; @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/backend/src/main/java/resourcesRest/BienResource.java b/backend/src/main/java/resourcesRest/BienResource.java index 98c590b..db1365f 100644 --- a/backend/src/main/java/resourcesRest/BienResource.java +++ b/backend/src/main/java/resourcesRest/BienResource.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.DELETE; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -18,7 +19,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import models.Bien; -import persistance.services.ABMService; +import persistance.interfaces.Iabm; @Path("/Bien") public class BienResource { @@ -28,7 +29,8 @@ public class BienResource { @Context Request request; - private ABMService<Bien> bienDAO = new ABMService<Bien>(); + @Inject + private Iabm<Bien> bienDAO; @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/backend/src/main/java/resourcesRest/CanalResource.java b/backend/src/main/java/resourcesRest/CanalResource.java index 1dbd7a5..0dffd57 100644 --- a/backend/src/main/java/resourcesRest/CanalResource.java +++ b/backend/src/main/java/resourcesRest/CanalResource.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.DELETE; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import javax.ws.rs.core.Context; import javax.ws.rs.core.Request; @@ -18,7 +19,7 @@ import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.MediaType; import models.Canal; -import persistance.services.ABMService; +import persistance.interfaces.Iabm; @Path("/canal") public class CanalResource { @@ -28,7 +29,8 @@ public class CanalResource { @Context Request request; - private ABMService<Canal> canalDAO = new ABMService<Canal>(); + @Inject + private Iabm<Canal> canalDAO; @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/backend/src/main/java/resourcesRest/FamiliaProductoraResource.java b/backend/src/main/java/resourcesRest/FamiliaProductoraResource.java index 5c7b78e..d7db364 100644 --- a/backend/src/main/java/resourcesRest/FamiliaProductoraResource.java +++ b/backend/src/main/java/resourcesRest/FamiliaProductoraResource.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.DELETE; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -18,7 +19,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import models.FamiliaProductora; -import persistance.services.ABMService; +import persistance.interfaces.Iabm; @Path("/FamiliaProductora") public class FamiliaProductoraResource { @@ -28,7 +29,8 @@ public class FamiliaProductoraResource { @Context Request request; - private ABMService<FamiliaProductora> FamProDAO = new ABMService<FamiliaProductora>(); + @Inject + private Iabm<FamiliaProductora> FamProDAO; @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/backend/src/main/java/resourcesRest/NotaResources.java b/backend/src/main/java/resourcesRest/NotaResources.java index 5fc13c4..2dd3fb3 100644 --- a/backend/src/main/java/resourcesRest/NotaResources.java +++ b/backend/src/main/java/resourcesRest/NotaResources.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.DELETE; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -18,7 +19,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import models.Nota; -import persistance.services.ABMService; +import persistance.interfaces.Iabm; @Path("/Nota") public class NotaResources { @@ -28,7 +29,8 @@ public class NotaResources { @Context Request request; - private ABMService<Nota> notaDAO = new ABMService<Nota>(); + @Inject + private Iabm<Nota> notaDAO; @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/backend/src/main/java/resourcesRest/OrdenResource.java b/backend/src/main/java/resourcesRest/OrdenResource.java index 804456a..ce7048b 100644 --- a/backend/src/main/java/resourcesRest/OrdenResource.java +++ b/backend/src/main/java/resourcesRest/OrdenResource.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.DELETE; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -18,7 +19,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import models.Orden; -import persistance.services.ABMService; +import persistance.interfaces.Iabm; @Path("/Orden") public class OrdenResource { @@ -28,7 +29,8 @@ public class OrdenResource { @Context Request request; - private ABMService<Orden> ordenDAO = new ABMService<Orden>(); + @Inject + private Iabm<Orden> ordenDAO; @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/backend/src/main/java/resourcesRest/RecetaResource.java b/backend/src/main/java/resourcesRest/RecetaResource.java index 350f3d3..c809f5e 100644 --- a/backend/src/main/java/resourcesRest/RecetaResource.java +++ b/backend/src/main/java/resourcesRest/RecetaResource.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.DELETE; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -18,7 +19,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import models.Receta; -import persistance.services.ABMService; +import persistance.interfaces.Iabm; @Path("/Receta") public class RecetaResource { @@ -28,7 +29,8 @@ public class RecetaResource { @Context Request request; - private ABMService<Receta> recDAO = new ABMService<Receta>(); + @Inject + private Iabm<Receta> recDAO; @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/backend/src/main/java/resourcesRest/UsuarioResource.java b/backend/src/main/java/resourcesRest/UsuarioResource.java index ab911b2..60563d2 100644 --- a/backend/src/main/java/resourcesRest/UsuarioResource.java +++ b/backend/src/main/java/resourcesRest/UsuarioResource.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.DELETE; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -18,7 +19,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import models.Usuario; -import persistance.services.ABMService; +import persistance.interfaces.Iabm; @Path("/usuario") public class UsuarioResource { @@ -28,7 +29,8 @@ public class UsuarioResource { @Context Request request; - private ABMService<Usuario> usuarioDAO = new ABMService<Usuario>(); + @Inject + private Iabm<Usuario> usuarioDAO; @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/backend/src/main/java/persistance/EntityManagerProvider.java b/backend/src/main/java/utils/EntityManagerProvider.java similarity index 97% rename from backend/src/main/java/persistance/EntityManagerProvider.java rename to backend/src/main/java/utils/EntityManagerProvider.java index c50aa9f..ecafc33 100644 --- a/backend/src/main/java/persistance/EntityManagerProvider.java +++ b/backend/src/main/java/utils/EntityManagerProvider.java @@ -1,4 +1,4 @@ -package persistance; +package utils; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; diff --git a/backend/src/main/java/utils/ServiceBinder.java b/backend/src/main/java/utils/ServiceBinder.java new file mode 100644 index 0000000..2610bdc --- /dev/null +++ b/backend/src/main/java/utils/ServiceBinder.java @@ -0,0 +1,17 @@ +package utils; + +import org.glassfish.hk2.api.JustInTimeInjectionResolver; +import org.glassfish.hk2.utilities.binding.AbstractBinder; + +import persistance.interfaces.Iabm; +import persistance.services.ABMService; + +public class ServiceBinder extends AbstractBinder { + + @Override + protected void configure() { + bind( ServiceResolver.class ).to( JustInTimeInjectionResolver.class ); + bind( ABMService.class ).to( Iabm.class); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/utils/ServiceResolver.java b/backend/src/main/java/utils/ServiceResolver.java new file mode 100644 index 0000000..bfd236c --- /dev/null +++ b/backend/src/main/java/utils/ServiceResolver.java @@ -0,0 +1,66 @@ +package utils; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import jakarta.inject.Inject; + +import org.glassfish.hk2.api.ActiveDescriptor; +import org.glassfish.hk2.api.Injectee; +import org.glassfish.hk2.api.JustInTimeInjectionResolver; +import org.glassfish.hk2.api.ServiceLocator; +import org.glassfish.hk2.utilities.ServiceLocatorUtilities; +import org.jvnet.hk2.annotations.Contract; +import org.jvnet.hk2.annotations.Service; +import org.reflections.Reflections; + +/** + * + * + */ +@Service +public class ServiceResolver implements JustInTimeInjectionResolver { + + @Inject + private ServiceLocator serviceLocator; + + private String packageScan = ""; + + @Override + public boolean justInTimeResolution(Injectee injectee) { + final Type requiredType = injectee.getRequiredType(); + + if (injectee.getRequiredQualifiers().isEmpty() && requiredType instanceof Class) { + final Class<?> requiredClass = (Class<?>) requiredType; + + if (requiredClass.getName().startsWith(packageScan)) { + final List<ActiveDescriptor<?>> descriptors = new ArrayList<>(); + + if(requiredClass.isAnnotationPresent(Contract.class)) { + + Set<Class<?>> classes = getReflections().getSubTypesOf(((Class) requiredClass)); + for(Class subClass : classes) { + descriptors.addAll(ServiceLocatorUtilities.addClasses(serviceLocator, subClass)); + } + } else { + descriptors.addAll(ServiceLocatorUtilities.addClasses( serviceLocator, requiredClass )); + } + + + + if (!descriptors.isEmpty()) { + return true; + } + } + } + return false; + } + + + public Reflections getReflections() { + return new Reflections(packageScan); + + } +} -- GitLab