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