001package common.http;
002
003import javax.inject.Inject;
004import javax.servlet.http.HttpServletRequest;
005import java.time.LocalDate;
006import java.time.format.DateTimeParseException;
007import java.util.Optional;
008import java.util.OptionalDouble;
009import java.util.OptionalInt;
010import java.util.OptionalLong;
011
012/**
013 * Classe di utilità che permette di accedere a parametri di un {@link HttpServletRequest} nel tipo desiderato
014 */
015public class ParameterConverter {
016    private final HttpServletRequest request;
017
018    /**
019     * Costruttore unico dell'oggetto.
020     * @param request L'oggetto {@link HttpServletRequest} rappresentante la richiesta in corso
021     */
022    @Inject
023    public ParameterConverter(HttpServletRequest request){
024        this.request = request;
025    }
026
027
028    /**
029     * Restituisce il valore di un parametro di richiesta come intero
030     * @param parameterKey Una stringa che specifica il nome del parametro
031     * @return Un {@link OptionalInt} contenente l'intero; {@link OptionalInt#empty()} se il parametro
032     * non è stato trovato o se il parsing ha avuto esito negativo
033     * @see Integer#parseInt(String)
034     */
035    public OptionalInt getIntParameter(String parameterKey){
036        String parameter = request.getParameter(parameterKey);
037        if(parameter == null || parameter.isBlank())
038            return OptionalInt.empty();
039        try{
040            return OptionalInt.of(Integer.parseInt(parameter.trim()));
041        } catch (NumberFormatException e){
042            return OptionalInt.empty();
043        }
044    }
045
046    /**
047     * Restituisce il valore di un parametro di richiesta come double
048     * @param parameterKey Una stringa che specifica il nome del parametro
049     * @return Un {@link OptionalDouble} contenente il double; {@link OptionalDouble#empty()} se il parametro
050     * non è stato trovato o se il parsing ha avuto esito negativo
051     * @see Double#parseDouble(String)
052     */
053    public OptionalDouble getDoubleParameter(String parameterKey){
054        String parameter = request.getParameter(parameterKey);
055        if(parameter == null || parameter.isBlank())
056            return OptionalDouble.empty();
057        try{
058            return OptionalDouble.of(Double.parseDouble(parameter.trim()));
059        } catch (NumberFormatException e){
060            return OptionalDouble.empty();
061        }
062    }
063
064    /**
065     * Restituisce il valore di un parametro di richiesta come long
066     * @param parameterKey Una stringa che specifica il nome del parametro
067     * @return Un {@link OptionalLong} contenente il long; {@link OptionalLong#empty()} se il parametro
068     * non è stato trovato o se il parsing ha avuto esito negativo
069     * @see Long#parseLong(String)
070     */
071    public OptionalLong getLongParameter(String parameterKey) {
072        String parameter = request.getParameter(parameterKey);
073        if (parameter == null || parameter.isBlank())
074            return OptionalLong.empty();
075        try {
076            return OptionalLong.of(Long.parseLong(parameter.trim()));
077        } catch (NumberFormatException e) {
078            return OptionalLong.empty();
079        }
080    }
081
082    /**
083     * Restituisce il valore di un parametro di richiesta come {@link LocalDate}. La conversione segue il formato "YYYY-mm-DD"
084     * @param parameterKey Una stringa che specifica il nome del parametro
085     * @return Un {@link Optional<LocalDate>} contenente l'oggetto; {@link Optional#empty()} se il parametro
086     * non è stato trovato o se il parsing ha avuto esito negativo
087     * @see LocalDate#parse(CharSequence)
088     */
089    public Optional<LocalDate> getDateParameter(String parameterKey){
090        String parameter = request.getParameter(parameterKey);
091        if (parameter == null || parameter.isBlank())
092            return Optional.empty();
093        try {
094            return Optional.of(LocalDate.parse(parameter.trim()));
095        } catch (DateTimeParseException e) {
096            return Optional.empty();
097        }
098    }
099}