Una organización administra la reserva de salas para reuniones. Debes permitir crear, consultar, cancelar y listar reservas con validaciones de negocio (choques de horario, sala no disponible, datos incompletos) y mapear errores a “códigos de respuesta” claros para el usuario.
Opcional: si lo deseas, persiste las reservas en MySQL o PostgreSQL usando JDBC. Recuerda descargar el driver JDBC correspondiente (MySQL:
mysql-connector-j; PostgreSQL:postgresql) y configurarlo.
Practicar en un caso realista:
try/catch/finally- try-with-resources
- excepciones por firma (
throws) - multi-catch
- re-lanzar/encapsular excepciones técnicas (wrapping)
- excepciones personalizadas que simulen códigos de estado (400/404/409/500)
- Crear reserva con:
idReserva,idSala,fecha,horaInicio,horaFin,organizador. - Consultar reserva por ID.
- Cancelar reserva por ID.
- Listar reservas por rango de fecha y/o por sala (filtros combinables).
- Obligatorios: sala, fecha, rango horario válido (
horaInicio < horaFin). - Choque de horario: no se permiten reservas solapadas en la misma sala.
- Sala fuera de servicio: no se puede reservar.
- ID único: no se puede repetir
idReserva. - No encontrado: operar sobre una reserva inexistente debe fallar claramente.
Crea una jerarquía (por ejemplo, paquete errors):
BadRequestException(400) – datos inválidos o faltantes.NotFoundException(404) – recurso inexistente.ConflictException(409) – choque de horario, sala fuera de servicio o id duplicado.ServiceException(500) – error interno / técnico envuelto.DataAccessException(checked) – operaciones de acceso a datos (archivo o BD) para forzarthrows.
Mapa de estado para la salida (simulación tipo HTTP):
BadRequestException→ 400NotFoundException→ 404ConflictException→ 409ServiceException→ 500- Cualquier otra no mapeada → 500
- ≥1 bloque
try { … } catch (…) { … } finally { … }donde elfinallyhaga algo visible (limpieza, mensaje “fin de operación”, etc.). - ≥1 try-with-resources (ej.: leer
salas.csvoapplication.properties). - ≥2 métodos con excepciones por firma (
throws DataAccessExceptionu otra checked). - ≥1 multi-catch (p. ej.,
NumberFormatException | IllegalArgumentException). - ≥1 wrapping: convertir una excepción técnica (I/O, SQL si usas BD) a
ServiceExceptionpreservando la causa.
-
Crear reserva
- Valida obligatorios; si falla →
BadRequestException. - Verifica ID único; duplicado →
ConflictException. - Verifica existencia y disponibilidad de la sala; si no,
NotFoundExceptionoConflictException. - Valida solapamiento horario; choque →
ConflictException. - Guarda usando tu capa de acceso a datos (
throws DataAccessException); si falla I/O/SQL, envuelve enServiceException.
- Valida obligatorios; si falla →
-
Consultar por ID
- Si no existe →
NotFoundException. - Fallo técnico de acceso →
ServiceException(wrapping).
- Si no existe →
-
Cancelar por ID
- Si no existe →
NotFoundException. - Fallo técnico →
ServiceException.
- Si no existe →
-
Listar con filtros
- Valida formato de parámetros; errores → multi-catch y lanza
BadRequestException. - Devuelve lista (vacía si no hay coincidencias).
- Valida formato de parámetros; errores → multi-catch y lanza
-
Manejo seguro de recursos Dado un archivo de configuración o catálogo de salas Cuando lo leo con try-with-resources Entonces el recurso se cierra automáticamente y no hay fugas.
-
Excepciones por firma Dado métodos que acceden a almacenamiento (archivo o BD opcional) Cuando declaran
throws DataAccessExceptionEntonces el compilador obliga a manejar/propagar y el flujo funciona. -
Validaciones de negocio Dado una creación con datos faltantes o rango inválido Cuando intento crear la reserva Entonces obtengo 400 con mensaje claro.
-
Conflictos de horario Dado una reserva existente en la misma sala y horario solapado Cuando intento crear otra Entonces obtengo 409.
-
Recurso inexistente Dado un
idReservainexistente Cuando consulto o cancelo Entonces obtengo 404. -
Errores técnicos envueltos Dado un fallo de acceso (archivo inaccesible o conexión BD inválida si usas BD) Cuando ejecuto la operación Entonces recibo 500 (ServiceException) con la causa original preservada.
-
Bloque
finallyvisible Dado cualquier flujo exitoso o con error Cuando finaliza Entonces se ejecuta una acción observable (mensaje/limpieza).
- Diagrama de caso de uso: crear, consultar, cancelar, listar con filtros.
- Diagrama de clases: entidades (
Sala,Reserva), capa de negocio, acceso a datos y excepciones; relaciones y dependencias. - Diagrama de datos (solo si usas BD): tablas mínimas (salas, reservas) y relaciones.
- README: cómo ejecutar; qué valida cada caso; mapeo de excepciones→códigos; si usas BD, recordatorio del driver JDBC y parámetros de conexión; ejemplos de entrada/salida.
- Crear reserva válida → 200/201.
- Crear con datos faltantes → 400.
- Crear con choque horario → 409.
- Consultar/cancelar ID inexistente → 404.
- Forzar fallo técnico (archivo bloqueado o URL BD inválida) → 500 con causa.
- Listar con filtros mal formateados → 400 (multi-catch).
- Verificar que
finallyse ejecuta siempre (mensaje de cierre).