diff --git a/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java b/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java new file mode 100644 index 0000000000000000000000000000000000000000..aac884e47d83e965f45ca81862978f392f302106 --- /dev/null +++ b/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java @@ -0,0 +1,270 @@ +package JPAControllerClasses; + +import Logica.Clases.Canal; +import Logica.Clases.ListaDeReproduccion; +import Logica.Clases.ListaDeReproduccion_; +import Logica.Clases.Usuario; +import Logica.Clases.Video; +import Logica.DataType.DtVideo; +import Logica.Enumerados.Filtrado; +import Logica.Enumerados.Ordenacion; +import Logica.Enumerados.TipoListaDeReproduccion; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Query; +import javax.persistence.Persistence; + +public class BusquedaEnBDD implements Serializable { + private EntityManagerFactory emf = null; + + public BusquedaEnBDD() { + this.emf = Persistence.createEntityManagerFactory(NombreManejador.getNombreManejador()); + } + public BusquedaEnBDD(EntityManagerFactory emf) { + this.emf = emf; + } + public EntityManager getEntityManager() { + return emf.createEntityManager(); + } + + /** + * Busca contenido por coincidencia de texto en nombre o descripcion de los + * contenidos del sistema En el resultado se incluirán (si corresponde segun + * el filtrado) los videos privados del usuarioActual + * + * @param busqueda Texto a buscar (si es vacÃo incluye todo el contenido) + * @param filtro Tipo de contenido en el cual se realizará la búsqueda + * @param orden Manera de ordenar el resultado de la búsqueda + * @return Resultado de la busqueda. Puede contener DtVideo, + * DtListaDeReproduccion y/o DtCanal. (para usar los elementos devueltos hay + * que castearlos) + */ + public ArrayList<Object> buscar(String busqueda, Filtrado filtro, Ordenacion orden){ + EntityManager em = getEntityManager(); + List<Object> ret = new ArrayList(); + if (busqueda == null || busqueda.equals("")) { + }else{ + busqueda = "%" + busqueda + "%"; + } + try { + Query q; + // Segun la opcion de filtrado, se obtienen los contenidos que contengan el texto a buscar + // Busca los Canales + if (filtro == Filtrado.TODO || filtro == Filtrado.CANALES){ + if (busqueda == null || busqueda.equals("")){ + q = em.createQuery("SELECT e FROM Canal e"); + }else{ + q = em.createQuery("SELECT e FROM Canal e WHERE (UPPER(e.nombre)) LIKE (UPPER(?1)) OR (UPPER(e.descripcion)) LIKE (UPPER(?1))"); + q.setParameter(1, busqueda); + } + ret.addAll(q.getResultList()); + } + // Busca los Listas de reproduccion + if (filtro == Filtrado.TODO || filtro == Filtrado.LISTAS_DE_REPRODUCCION){ + if (busqueda == null || busqueda.equals("")){ + q = em.createQuery("SELECT e FROM ListaDeReproduccion e WHERE e.tipo = ?1"); + q.setParameter(1, TipoListaDeReproduccion.PARTICULAR); + }else{ + q = em.createQuery("SELECT e FROM ListaDeReproduccion e WHERE e.tipo = ?1 AND (UPPER(e.nombre)) LIKE (UPPER(?2)) "); + q.setParameter(1, TipoListaDeReproduccion.PARTICULAR); + q.setParameter(2, busqueda); + } + ret.addAll(q.getResultList()); + } + // Busca los Videos + if (filtro == Filtrado.TODO || filtro == Filtrado.VIDEOS){ + if (busqueda == null || busqueda.equals("")){ + q = em.createQuery("SELECT e FROM Video e"); + }else{ + q = em.createQuery("SELECT e FROM Video e WHERE (UPPER(e.nombre)) LIKE (UPPER(?1)) OR (UPPER(e.descripcion)) LIKE (UPPER(?1))"); + q.setParameter(1, busqueda); + } + ret.addAll(q.getResultList()); + } + + // En este punto ret contiene todos los contenidos que contienen la busqueda en su nombre o descripcion + ArrayList<ParDeObjetos> pares = null; + ArrayList<ParDeObjetos> paresOrdenados; + switch (orden){ + case ALFABETICA_ASCENDENTE: + pares = nombrarElementos((ArrayList<Object>) ret); + break; + case FECHA_DESCENDENTE: + pares = fecharElementos((ArrayList<Object>) ret); + break; + } + return ParDeObjetos.extraerElementos( + ordenar(pares) + ); + } finally { + em.close(); + } + } + + /** + * Devuelve un listado de Video y ListaDeReproduccion que pertenezcan ala + * categoria indicada, ordenado por fecha de actividasd reciente + * @param cat Categoria a buscar + * @return Lista ordenada Video y ListaDeReproduccion + */ + public List<Object> buscarPorCategoria(String cat) { + EntityManager em = getEntityManager(); + List<Object> ret = new ArrayList(); + try { + Query q; + // Obtiene los videos en esa categoria + q = em.createQuery("SELECT v FROM Video v WHERE v.categoria = ?1"); + q.setParameter(1, cat); + ret.addAll(q.getResultList()); + // obtiene las listas de reproduccion en esa categoria + q = em.createQuery("SELECT l FROM ListaDeReproduccion l WHERE l.categoria = ?1"); + q.setParameter(1, cat); + ret.addAll(q.getResultList()); + + return ParDeObjetos.extraerElementos( + ordenar( + fecharElementos( + (ArrayList<Object>) ret + ) + ) + ); + } finally { + em.close(); + } + } + + /** + * Asocia los objetos recibidos a una fecha + * Canal se asocia a la fecha del video mas reciente + * Video a su propia fecha + * ListaDeReproduccion fecha del video con fecha mas reciente + * @param lista Lista de objetos a ordenar (Canal, Video o ListaDeReproduccion) + * @return Lista de los objetos recibidos pero asociados a una fecha + */ + public ArrayList<ParDeObjetos> fecharElementos(ArrayList<Object> lista){ + ArrayList<ParDeObjetos> ret = new ArrayList(); + for (Object o : lista){ + ret.add(new ParDeObjetos(o, ultimaActividad(o))); + } + return ret; + } + + /** + * Asocia los objetos recibidos a una fecha + * Canal se asocia a la fecha del video mas reciente + * Video a su propia fecha + * ListaDeReproduccion fecha del video con fecha mas reciente + * @param lista Lista de objetos a ordenar (Canal, Video o ListaDeReproduccion) + * @return Lista de los objetos recibidos pero asociados a una fecha + */ + public ArrayList<ParDeObjetos> nombrarElementos(ArrayList<Object> lista){ + ArrayList<ParDeObjetos> ret = new ArrayList(); + for (Object o : lista){ + ret.add(new ParDeObjetos(o, nombreParaOrdenar(o))); + } + return ret; + } + + /** + * Devuelve el nombre del objeto + * Canal su nombre + * Video su nombre + * ListaDeReproduccion su nombre + * @param o Objeto a dar nombre + * @return Nombre del objeto + */ + private String nombreParaOrdenar(Object o){ + java.sql.Date ret = null; + if (o.getClass() == Canal.class){ + Canal c = (Canal) o; + return c.getNombre(); + }else if (o.getClass() == ListaDeReproduccion.class){ + ListaDeReproduccion l = (ListaDeReproduccion) o; + return l.getNombre(); + }else if (o.getClass() == Video.class){ + Video v = (Video) o; + return v.getNombre(); + } + return ""; + } + + /** + * Devuelve la fecha de la ultima actividad del objeto + * Canal es la fecha del video mas reciente + * Video su propia fecha + * ListaDeReproduccion la fecha del video con fecha mas reciente + * @param o + * @return + */ + private java.sql.Date ultimaActividad(Object o){ + java.sql.Date ret = null; + if (o.getClass() == Canal.class){ + Canal c = (Canal) o; + ArrayList<DtVideo> videos = c.listarVideos(); + for (DtVideo dtv : videos){ + if (ret == null || dtv.getFechaPublicacion().compareTo(ret) > 0){ + ret = dtv.getFechaPublicacion(); + } + } + }else if (o.getClass() == ListaDeReproduccion.class){ + ListaDeReproduccion l = (ListaDeReproduccion) o; + ArrayList<DtVideo> videos = l.listarVideos(); + for (DtVideo dtv : videos){ + if (ret == null || dtv.getFechaPublicacion().compareTo(ret) > 0){ + ret = dtv.getFechaPublicacion(); + } + } + }else if (o.getClass() == Video.class){ + Video v = (Video) o; + ret = v.getFechaPublicacion(); + } + return ret; + } + + /** + * Ordena la lista de pares recibida + * @param lista Lista a ordenar + * @return Lista ordenada + */ + public ArrayList<ParDeObjetos> ordenar(ArrayList<ParDeObjetos> lista){ + if (lista == null || lista.isEmpty()){ + return new ArrayList(); + } + + ParDeObjetos par = lista.remove(0); + ArrayList<ParDeObjetos> listaOrdenada = ordenar(lista); + + int i = 0; + for (; i < listaOrdenada.size(); i++){ + ParDeObjetos p = listaOrdenada.get(i); + if (comparar(p, par) < 0){ + break; + } + } + listaOrdenada.add(i, par); + return listaOrdenada; + } + + /** + * Compara dos pares de objetos + * @param a Primer par a comparar + * @param b Segundo par a comparar + * @return 0 si (a == b), -1 si (a < b), 1 si (a > b) + */ + private int comparar(ParDeObjetos a, ParDeObjetos b){ + if (a.getOrderField().getClass() == String.class){ + String str1 = (String) a.getOrderField(); + String str2 = (String) b.getOrderField(); + return (str1.compareToIgnoreCase(str2)) * -1; + }else if (a.getOrderField().getClass() == java.sql.Date.class){ + java.sql.Date date1 = (java.sql.Date) a.getOrderField(); + java.sql.Date date2 = (java.sql.Date) b.getOrderField(); + return date1.compareTo(date2); + } + return 0; + } + +} diff --git a/UyTube_aplicacion/src/JPAControllerClasses/ParDeObjetos.java b/UyTube_aplicacion/src/JPAControllerClasses/ParDeObjetos.java new file mode 100644 index 0000000000000000000000000000000000000000..8c38f83397175f66b759940cfe327f8138c1ebbf --- /dev/null +++ b/UyTube_aplicacion/src/JPAControllerClasses/ParDeObjetos.java @@ -0,0 +1,40 @@ +package JPAControllerClasses; + +import java.util.ArrayList; + +public class ParDeObjetos { + private Object element; + private Object orderField; + + public ParDeObjetos(Object element, Object orderField) { + this.element = element; + this.orderField = orderField; + } + + public Object getElement() { + return element; + } + + public void setElement(Object element) { + this.element = element; + } + + public Object getOrderField() { + return orderField; + } + + public void setOrderField(Object orderField) { + this.orderField = orderField; + } + + + public static ArrayList<Object> extraerElementos(ArrayList<ParDeObjetos> lista){ + ArrayList<Object> ret = new ArrayList(); + for (ParDeObjetos par : lista){ + ret.add(par.getElement()); + } + return ret; + } + + +} diff --git a/UyTube_aplicacion/src/Logica/DatosDePrueba.java b/UyTube_aplicacion/src/Logica/DatosDePrueba.java index 31821ada086963ff4010315bb3fa9b0e86d96447..4a286e6c585388541c111d53f723e6f04fb8641f 100644 --- a/UyTube_aplicacion/src/Logica/DatosDePrueba.java +++ b/UyTube_aplicacion/src/Logica/DatosDePrueba.java @@ -1,16 +1,14 @@ package Logica; -import Logica.Clases.Usuario; -import Logica.Controladores.CAdmin; -import Logica.Controladores.CUsuario; +import JPAControllerClasses.BusquedaEnBDD; +import Logica.Clases.Canal; +import Logica.Clases.ListaDeReproduccion; +import Logica.Clases.Video; +import Logica.Enumerados.Filtrado; +import Logica.Enumerados.Ordenacion; import Logica.Interfaces.IAdmin; -import Logica.DataType.*; -import Logica.Enumerados.*; import Logica.Interfaces.IUsuario; -import java.sql.Date; -import java.sql.Time; import java.util.ArrayList; -import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; @@ -34,13 +32,36 @@ public class DatosDePrueba { try { EntityManagerFactory factory = Persistence.createEntityManagerFactory("UyTubePU"); EntityManager manager = factory.createEntityManager(); + /* + for (Object o : new BusquedaEnBDD().buscarPorCategoria("MUSICA")){ + if (o.getClass() == Video.class){ + Video i = (Video) o; + System.out.println(i.getNombre()); + }else if (o.getClass() == ListaDeReproduccion.class){ + ListaDeReproduccion i = (ListaDeReproduccion) o; + System.out.println(i.getNombre()); + } + + + + } + */ + for (Object o : new BusquedaEnBDD().buscar("no", Filtrado.TODO, Ordenacion.ALFABETICA_ASCENDENTE)){ + if (o.getClass() == Video.class){ + Video i = (Video) o; + System.out.println(i.getNombre()); + }else if (o.getClass() == ListaDeReproduccion.class){ + ListaDeReproduccion i = (ListaDeReproduccion) o; + System.out.println(i.getNombre()); + }else if (o.getClass() == Canal.class){ + Canal i = (Canal) o; + System.out.println(i.getNombre()); + } + } - /** - * Escriba aqui el codigo de la prueba que quiera realizar... - */ } catch (Exception e) { System.out.println("//////////////////////////"); @@ -49,4 +70,21 @@ public class DatosDePrueba { } } + + + /** + * Busca contenido por coincidencia de texto en nombre o descripcion de los + * contenidos del sistema que pertenezcan a la categoria indicada + * + * @param categoria Nombre de la categoria a buscar + * @return Resultado de la busqueda. Puede contener DtVideo y + * DtListaDeReproduccion. (para usar los elementos devueltos hay que + * castearlos) + */ + public static ArrayList<Object> buscar(String categoria){ + return null; + } + + + } \ No newline at end of file diff --git a/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java b/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java index 1e10aff35481ab8a2dbd0d48e7b5f74f2d55d3b9..f47b5d688ee2a010ed855c41bf28da5e730aeaab 100644 --- a/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java +++ b/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java @@ -76,8 +76,9 @@ public interface IUsuario { public ArrayList<Object> buscar(String busqueda, Filtrado filtro, Ordenacion orden); /** - * Busca contenido por coincidencia de texto en nombre o descripcion de los - * contenidos del sistema que pertenezcan a la categoria indicada + * Busca contenido que pertenezcan a la categoria indicada El Resultado + * contendrá todos los contenidos publicos, y los contenidos privados del + * usuarioActual * * @param categoria Nombre de la categoria a buscar * @return Resultado de la busqueda. Puede contener DtVideo y