001package common.http.interceptor; 002 003import javax.servlet.ServletException; 004import javax.servlet.http.HttpServletRequest; 005import javax.servlet.http.HttpServletResponse; 006import java.io.IOException; 007import java.lang.annotation.Annotation; 008 009 010/** 011 * Classe astratta rappresentante un interceptor invocabile da un {@link InterceptableServlet} prima di eseguire 012 * un metodo "doGet", "doPost", "doX"... <br/> 013 * 014 * Per definire un interceptor occorre: 015 * <ul> 016 * <li>Estendere questa classe (Specificando l'annotazione a cui la nuova sottoclasse sarà associata)</li> 017 * <li>Definire il comportamento dell'interceptor sovrascrivendo i metodi {@link ServletInterceptor#handle(HttpServletRequest, HttpServletResponse, HttpServletBiConsumer)} 018 * e {@link ServletInterceptor#init(Annotation)}</li> 019 * </ul> 020 * 021 * @param <A> Il tipo di annotazione a cui l'interceptor sarà associato 022 */ 023public abstract class ServletInterceptor<A extends Annotation>{ 024 025 026 /** 027 * Chiamato dal factory per inizializzare l'interceptor dopo averlo istanziato. 028 * @param annotation L'istanza di annotazione associata all'interceptor, con eventuali parametri necessari per la configurazione 029 */ 030 protected abstract void init (A annotation); 031 032 /** 033 * Metodo contenete la logica dell'interceptor, che si occupa di processare la richiesta e la risposta passati come parametro 034 * e di passare eventualmente il controllo eventualmente al prossimo metodo specificato come parametro 035 * @param req La richiesta da processare 036 * @param resp La risposta da processare 037 * @param next Il riferimento al metodo a cui poter passare il controllo 038 * @throws ServletException 039 * @throws IOException 040 */ 041 public abstract void handle(HttpServletRequest req, HttpServletResponse resp, HttpServletBiConsumer next) 042 throws ServletException, IOException; 043 044 /** 045 * Definisce l'ordine in cui l'interceptor deve essere eseguito rispetto agli altri interceptor. 046 * Un numero più basso implica una maggiore priorità. Il valore di default (Se il metodo non è sovrascritto) è Integer.MAX_VALUE 047 * @return La priorità dell'interceptor 048 */ 049 public int priority(){ 050 return Integer.MAX_VALUE/2; 051 } 052}