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}