FUNDAMENTOS DE PROGRAMACIÓN BOLETÍN DE PROBLEMAS 23: Tratamientos secuenciales generalizados, Preconditions, Combinación de tratamientos Curso: 2011/12 Versión: 1.0.0 OBJETIVOS Consolidar los conceptos vistos en el 2º cuatrimestre (parte Java). Esto es: o Uso de los métodos de la clase Iterables2. o Creación de objetos a partir de las factorías de Guava (Sets, Lists y Maps) o Implementación de predicados y funciones. o Uso de Ordering y Map. o Uso de los métodos de la clase Preconditions. PREPARACIÓN DEL BOLETÍN Se desea gestionar un Foro de Internet. Para modelarlo se dispone de los siguientes tipos: public interface Foro extends Iterable<Hilo> { public SortedSet<Hilo> getHilos(); public SortedSet<Hilo> buscarHilos(String cadena); public Hilo hiloMasVisitado(); public void incrementarVisitas(Fecha f); public List<Mensaje> buscarMensajesDeUsuario(Usuario u); } public interface Hilo extends Comparable<Hilo>, Copiable<Hilo>, Iterable<Mensaje> { List<Mensaje> getMensajes(); Integer getNumeroVisitas(); String getTitulo(); Fecha calculaFechaPublicacion(); Integer getNumeroMensajesDeUsuario (Usuario u); void setMensajes(List<Mensaje> l); void setNumeroVisitas(Integer n); void setTitulo(String t); } public interface Mensaje { Fecha getFechaPublicacion(); Usuario getAutor(); Integer getTamaño(); String getContenido(); } public interface Usuario extends Persona { Fecha getFechaRegistro(); String getAlias(); } Para realizar la carga de la información de un objeto de tipo Hilo se dispone de un fichero de texto “hilo.txt”. Cada línea contiene la información relativa a un mensaje del hilo: Usuario;Fecha;Tamaño;Contenido Usuario;Fecha;Tamaño;Contenido Usuario;Fecha;Tamaño;Contenido … Martínez,Fernando,28678992P;7/2/2012;315;¿Cuándo se van a publicar las soluciones del primer parcial? González,Mariano,36887244M;7/2/2012;597;Acaban de publicarse las soluciones en la Web de la asignatura. Martínez,Fernando,28678992P;8/2/2012;125;Muchas gracias. EJERCICIOS 1. Realice las modificaciones necesarias en los tipos Persona y Fecha vistos hasta ahora para: a) Utilizar los métodos de la clase Preconditions para comprobar las condiciones que tienen que cumplir los parámetros de entrada de los constructores y métodos que procedan. Asegure que en el tipo Persona, los atributos nombre, apellidos y dni no pueden ser nulos. En el tipo Fecha no podrán ser nulos ninguno de los atributos. Boletín de problemas 23: Repaso 2 b) Verifique que tiene implementados de prácticas anteriores un constructor por cadena para cada uno de dichos tipos. 2. Implemente las clases UsuarioImpl, MensajeImpl, HiloImpl y ForoImpl teniendo en cuenta: a) UsuarioImpl hereda de Persona. Contiene dos constructores: el primero recibe como parámetros: apellidos, nombre, dni, alias y fecha de registro. El segundo recibe una cadena con los apellidos, el nombre y el dni del usuario del foro. b) MensajeImpl contiene, además del constructor que recibe todas las propiedades del tipo, otro constructor que recibe una cadena con el formato dispuesto para cada mensaje del hilo. c) HiloImpl: i. Precondiciones: los atributos no pueden ser nulos y el número de visitas no puede ser negativo. ii. Contiene 3 constructores: uno que no recibe parámetros, uno que recibe un argumento por cada una de las propiedades del tipo, y un tercero que recibe tres parámetros: el nombre del fichero desde donde leer la información de los mensajes, una cadena que contiene el título del hilo y el número de visitas en el hilo. iii. Criterio de igualdad: dos hilos son iguales si tienen el mismo título. iv. Orden natural: por título. d) ForoImpl tiene como propiedad un conjunto ordenado de hilos. 3. Implemente el método buscarHilos de la clase ForoImpl que recibe una cadena a buscar entre los títulos de los hilos del foro y devuelve un conjunto ordenado de los hilos que contienen esa cadena. Tenga en cuenta que el orden será el natural definido para el tipo Hilo. 4. Implemente el método hiloMasVisitado de la clase ForoImpl que devuelve el hilo que tiene más visitas. 5. Implemente el método incrementarVisitas de la clase ForoImpl que incrementa en uno el número de visitas de los hilos cuya fecha es posterior a la fecha dada como parámetro. 6. Implemente el método buscarMensajesDeUsuario de la clase ForoImpl que devuelve una lista con todos los mensajes de un usuario que se pasa como parámetro. 7. Implemente el método getNumeroMensajesDeUsuario de la clase HiloImpl que devuelve el número de mensajes de un usuario en el hilo. 8. Cree una clase de utilidad denominada UtilesForo en el paquete utiles e implemente en ella los siguientes métodos estáticos: a. Método usuarioTamMensajes que recibe una lista (List<Mensaje>) con todos los mensajes del foro y devuelve un “map” (Map<Usuario, Integer>) donde cada usuario estará asociado a la suma de los tamaños de los mensajes enviados por dicho usuario. b. Método usuariosHilosRecientes que recibe como parámetros de entrada un usuario, la fecha a partir de la cual el hilo se considera reciente y un foro. El método devuelve un conjunto con los hilos en los que el usuario ha participado. 9. Pruebe los métodos implementados en la clase TestForo.