CampagnaDAO.java

package model.DAO;

import model.beans.Campagna;
import model.beans.Categoria;
import model.beans.StatoCampagna;
import model.beans.Utente;
import model.storage.ConPool;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


public final class CampagnaDAO
        implements DAO<Campagna> {
    /**
     * @param id rappresenta l'identificativo dell'entity
     * @return null se non viene trovato nessun risultato,
     * un'istanza di T nel caso in cui viene trovato un risultato
     */
    @Override
    public Campagna getById(final int id) {
        if (id <= 0) {
            throw new IllegalArgumentException("Id <= 0");
        } else {
            try (Connection connection = ConPool.getInstance().getConnection();
                 PreparedStatement statement =
                         connection.prepareStatement("SELECT"
                         + " * FROM campagna "
                         + " WHERE idCampagna = ?")) {
                int index = 1;

                statement.setInt(index, id);

                ResultSet set = statement.executeQuery();
                Campagna campagna = null;
                if (set.next()) {
                    campagna = extract(set);
                }
                return campagna;
            } catch (SQLException e) {
                throw new RuntimeException("SQL error: " + e.getMessage());
            }
        }
    }

    /**
     * @param idUtente id dell'utente della quale si vogliono
     *                 trovare le campagne
     * @return lista di campagne create dall'utente
     */
    public List<Campagna> getByIdUtente(final int idUtente) {

        if (idUtente <= 0) {
            throw new IllegalArgumentException("Id <= 0");
        } else {
            try (Connection connection = ConPool.getInstance().getConnection();
                 PreparedStatement statement =
                         connection.prepareStatement("SELECT *"
                                 + " FROM campagna"
                                 + " WHERE idUtente = ?")) {

                statement.setInt(1, idUtente);
                List<Campagna> list = new ArrayList<>();

                ResultSet set = statement.executeQuery();
                while (set.next()) {
                    list.add(extract(set));
                }

                return list;

            } catch (SQLException e) {
                throw new RuntimeException("SQL error: " + e.getMessage());
            }
        }
    }

    /**
     * @return una lista di entity T
     */
    @Override
    public List<Campagna> getAll() {
        try (Connection connection = ConPool.getInstance().getConnection();
             PreparedStatement statement =
                     connection.prepareStatement("SELECT * "
                             + "FROM campagna ")) {
            List<Campagna> list = new ArrayList<>();
            ResultSet set = statement.executeQuery();

            while (set.next()) {
                list.add(extract(set));
            }
            return list;
        } catch (SQLException e) {
            throw new RuntimeException("SQL error: " + e.getMessage());
        }
    }

    /**
     * @param entity l'istanza da salvare
     * @return false --> se l'operazione non va a buon fine,
     * true --> se l'operazione va a buon fine
     */
    @Override
    public boolean save(final Campagna entity) {
        if (entity == null) {
            throw new IllegalArgumentException("Null object");
        } else {
            try (Connection connection = ConPool.getInstance().getConnection();
                 PreparedStatement statement =
                         connection.prepareStatement("INSERT INTO campagna "
                                         + "(STATO, TITOLO, DESCRIZIONE,"
                                         + " SOMMARACCOLTA, SOMMATARGET,"
                                         + " IDCATEGORIA, IDUTENTE)"
                                         + "VALUES (?,?,?,?,?,?,?)",
                                 PreparedStatement.RETURN_GENERATED_KEYS)) {

                int index = 1;
                statement.setString(index++, entity.getStato().toString());
                statement.setString(index++, entity.getTitolo());
                statement.setString(index++, entity.getDescrizione());
                statement.setDouble(index++, entity.getSommaRaccolta());
                statement.setDouble(index++, entity.getSommaTarget());
                statement.setInt(index++,
                        entity.getCategoria().getIdCategoria());
                statement.setInt(index, entity.getUtente().getIdUtente());

                int ret = statement.executeUpdate();
                ResultSet set = statement.getGeneratedKeys();
                if (set.next()) {
                    entity.setIdCampagna(set.getInt(1));
                }

                return ret > 0;
            } catch (SQLException e) {
                throw new RuntimeException("SQL error: " + e.getMessage());
            }
        }
    }

    /**
     * @param entity l'istanza da aggiornare
     * @return false --> se l'operazione non va a buon fine,
     * true --> se l'operazione va a buon fine
     */
    @Override
    public boolean update(final Campagna entity) {
        if (entity == null) {
            throw new IllegalArgumentException("Null object");
        } else {
            try (Connection connection = ConPool.getInstance().getConnection();
                 PreparedStatement statement =
                         connection.prepareStatement("UPDATE campagna SET"
                                 + " Stato = ?, titolo = ?, descrizione = ?,"
                                 + " sommaRaccolta = ?, sommaTarget = ?,"
                                 + " idCategoria = ?"
                                 + " WHERE idCampagna = ?")) {
                int index = 0;
                statement.setString(++index, entity.getStato().toString());
                statement.setString(++index, entity.getTitolo());
                statement.setString(++index, entity.getDescrizione());
                statement.setDouble(++index, entity.getSommaRaccolta());
                statement.setDouble(++index, entity.getSommaTarget());
                statement.setInt(++index,
                        entity.getCategoria().getIdCategoria());
                statement.setInt(++index, entity.getIdCampagna());

                return statement.executeUpdate() > 0;
            } catch (SQLException e) {
                throw new RuntimeException("SQL error: " + e.getMessage());
            }
        }
    }

    /**
     * @param entity l'istanza da eliminare
     * @return false --> se l'operazione non va a buon fine,
     * true --> se l'operazione va a buon fine
     */
    @Override
    public boolean delete(final Campagna entity) {
        if (entity == null) {
            throw new IllegalArgumentException("Null object");
        } else {
            try (Connection connection = ConPool.getInstance().getConnection();
                 PreparedStatement statement =
                         connection.prepareStatement("DELETE FROM campagna"
                                 + " WHERE idCampagna = ?")) {
                statement.setInt(1, entity.getIdCampagna());

                return statement.executeUpdate() > 0;
            } catch (SQLException e) {
                throw new RuntimeException("SQL error: " + e.getMessage());
            }
        }
    }

    /**
     * @param resultSet resultSet della query eseguita
     * @return l'istanza della della classe T popolata con le informazioni
     * presenti nel resultSet
     * @throws SQLException eccezione lanciata in caso di problemi
     */
    @Override
    public Campagna extract(final ResultSet resultSet)
            throws SQLException {

        if (resultSet == null) {
            throw new IllegalArgumentException("Null object");
        } else {
            Campagna c = new Campagna();
            c.setIdCampagna(resultSet.getInt("idCampagna"));
            c.setStato(StatoCampagna.valueOf(
                    resultSet.getString("Stato").toUpperCase()));
            c.setTitolo(resultSet.getString("titolo"));
            c.setDescrizione(resultSet.getString("descrizione"));
            c.setSommaRaccolta(resultSet.getDouble("sommaRaccolta"));
            c.setSommaTarget(resultSet.getDouble("sommaTarget"));
            Categoria c1 = new Categoria();
            c1.setIdCategoria(resultSet.getInt("idCategoria"));
            c.setCategoria(c1);
            Utente utente = new Utente();
            utente.setIdUtente(resultSet.getInt("idUtente"));
            c.setUtente(utente);
            return c;
        }
    }

    /**
     * Permette la ricerca di campagne.
     *
     * @param text una stringa per effettuare la ricerca
     * @return la lista di campagne che soddisfano il parametro passato
     */
    public List<Campagna> getByKeyword(final String text) {
        if (text == null) {
            throw new IllegalArgumentException("Null object");
        } else {
            try (Connection connection = ConPool.getInstance().getConnection();
                 PreparedStatement statement = connection.prepareStatement(
                         "SELECT * FROM campagna "
                                 + " where UPPER(CONCAT"
                                 + "(idCampagna, titolo, descrizione)) "
                                 + "LIKE UPPER(?)"
                 )) {
                List<Campagna> campagnaList = new ArrayList<>();
                statement.setString(1, "%" + text + "%");

                ResultSet set = statement.executeQuery();
                while (set.next()) {
                    campagnaList.add(extract(set));
                }

                return campagnaList;

            } catch (SQLException e) {
                throw new RuntimeException("SQL error: " + e.getMessage());
            }
        }
    }

    /**
     * Permette la ricerca di campagne.
     *
     * @param category una stringa per effettuare la ricerca
     * @return la lista di campagne che soddisfano il parametro passato
     */
    public List<Campagna> getByCategory(final String category) {
        if (category == null) {
            throw new IllegalArgumentException("Null object");
        } else {
            try (Connection connection = ConPool.getInstance().getConnection();
                 PreparedStatement statement = connection.prepareStatement(
                         "SELECT * FROM campagna c "
                                 + "LEFT JOIN categoria ca "
                                 + "ON c.idCategoria = ca.idCategoria"
                                 + " WHERE ca.nomeCategoria = ?"
                 )) {
                List<Campagna> campagnaList = new ArrayList<>();
                statement.setString(1, category);

                ResultSet set = statement.executeQuery();
                while (set.next()) {
                    campagnaList.add(extract(set));
                }

                return campagnaList;

            } catch (SQLException e) {
                throw new RuntimeException("SQL error: " + e.getMessage());
            }
        }
    }

    /**
     * Permette la ricerca di una porzione precisa delle campagne presenti.
     *
     * @param size   il numero di campagne da recuperare
     * @param offset il punto da cui iniziare il recupero
     * @return la lista delle campagne che soddisfano i parametri passati
     */
    public List<Campagna> getBySizeOffset(final int size, final int offset) {
        if (size <= 0 || offset < 0) {
            throw new IllegalArgumentException("Null object");
        } else {
            try (Connection connection = ConPool.getInstance().getConnection();
                 PreparedStatement statement = connection.prepareStatement(
                         "SELECT * FROM campagna LIMIT ?, ?"
                 )) {

                int index = 1;
                List<Campagna> campagnaList = new ArrayList<>();
                statement.setInt(index++, offset);
                statement.setInt(index, size);

                ResultSet set = statement.executeQuery();
                while (set.next()) {
                    campagnaList.add(extract(set));
                }
                return campagnaList;
            } catch (SQLException e) {
                throw new RuntimeException("SQL error: " + e.getMessage());
            }
        }
    }
}