Interceptor Lab - Estendere l'Esercizio Music Library

Estendere l'applicazione ⏯️ Music Library (Esercizio 2) introducendo i CDI Interceptors, secondo le seguenti specifiche.

1. Logging delle operazioni tramite Interceptor

Realizzare una classe LoggingInterceptor che utilizzi l'annotazione @AroundInvoke e l'interfaccia InvocationContext per registrare l'esecuzione delle operazioni della libreria (aggiunta, eliminazione e ricerca dei brani). L'interceptor deve registrare il nome del metodo invocato, i parametri ricevuti e l'esito dell'operazione. Applicare l'interceptor ai metodi del Managed Bean Library tramite l'annotazione @Interceptors.

2. Intercettazione del ciclo di vita e monitoraggio delle prestazioni

Realizzare un secondo interceptor, denominato PerformanceInterceptor, che permetta di monitorare il ciclo di vita del Managed Bean e il tempo di esecuzione dei suoi metodi. Utilizzare @PostConstruct per intercettare l'inizializzazione del bean e @AroundInvoke per calcolare il tempo impiegato dalle operazioni, registrando i risultati nei log dell'applicazione.

3. Interceptor multipli, binding e priorità di esecuzione.

Definire un'annotazione personalizzata tramite @InterceptorBinding che consenta di associare gli interceptor ai metodi della libreria senza riferirsi direttamente alle rispettive classi. Configurare l'applicazione affinché più interceptor possano essere eseguiti sulla stessa operazione e utilizzare @Priority per stabilirne l'ordine di esecuzione. Verificare attraverso i log la corretta concatenazione degli interceptor, distinguendo le operazioni eseguite prima e dopo l'invocazione del metodo originale.

4. Gestione degli eventi tramite CDI

Realizzare un sistema di gestione degli eventi per il Managed Bean Library utilizzando il meccanismo di eventi di CDI. Definire una classe LibraryEvent che rappresenti un evento relativo alle operazioni della libreria (aggiunta, eliminazione e ricerca dei brani), contenente il tipo di operazione, il titolo del brano coinvolto e l'esito dell'operazione. Utilizzare @Inject e l'interfaccia Event per pubblicare gli eventi tramite il metodo fire() ogni volta che viene eseguita un'operazione. Realizzare una classe LibraryEventObserver che utilizzi @Observes per intercettare gli eventi e registrarne le informazioni nei log dell'applicazione. Verificare che gli observer vengano notificati correttamente e che le informazioni ricevute corrispondano alle operazioni effettuate.

5. Integrazione tra eventi CDI e interceptor per il monitoraggio delle operazioni

Estendere il Managed Bean Library realizzando un sistema di monitoraggio che combini eventi CDI e interceptor. Definire un'annotazione personalizzata @Monitored tramite @InterceptorBinding e implementare un interceptor LibraryMonitoringInterceptor che utilizzi @AroundInvoke e InvocationContext per intercettare le operazioni di aggiunta, eliminazione e ricerca dei brani. L'interceptor deve registrare il nome del metodo invocato, i parametri ricevuti e il tempo di esecuzione, generando al termine dell'operazione un evento CDI OperationCompletedEvent contenente tali informazioni e l'esito dell'esecuzione, anche in caso di errore. Utilizzare Event e fire() per pubblicare l'evento direttamente dall'interceptor e realizzare due observer distinti tramite @Observes: il primo incaricato di registrare nei log le operazioni completate, il secondo di individuare e segnalare quelle che superano una soglia di esecuzione prestabilita (ad esempio 100 ms). Configurare l'interceptor tramite @Priority e verificare attraverso i log la corretta sequenza di esecuzione tra interceptor, metodo originale e observer, assicurandosi che eventuali eccezioni generate dal metodo vengano propagate correttamente.