UpdateMaglietta.java

package control.maglietta;

import model.maglietta.MagliettaBean;
import model.maglietta.MagliettaDAO;
import model.misura.MisuraBean;
import model.misura.MisuraDAO;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.SQLException;
import java.util.stream.Stream;

@WebServlet("/UpdateMaglietta")
@MultipartConfig
public class UpdateMaglietta extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        final String ERROR_PAGE = "/pages/errorpage.jsp";
        final String PATH = req.getServletContext().getRealPath("/images/grafiche/");
        Path uploadDir = Paths.get(PATH).toAbsolutePath().normalize();

        int id;
        int iva;
        int quantita;
        float prezzo;

        try {
            id = Integer.parseInt(req.getParameter("id"));
            prezzo = Float.parseFloat(req.getParameter("prezzo"));
            iva = (int) Float.parseFloat(req.getParameter("IVA"));
            quantita = Integer.parseInt(req.getParameter("quantita"));
        } catch (NumberFormatException | NullPointerException e) {
            req.getRequestDispatcher(ERROR_PAGE).forward(req, resp);
            return;
        }

        String nome = req.getParameter("nome");
        String descrizione = req.getParameter("descrizione");
        String taglia = req.getParameter("taglia");

        String colore = req.getParameter("colore");
        colore = (colore != null) ? colore : req.getParameter("coloreVecchio");

        String tipo = req.getParameter("tipo");
        tipo = (tipo != null) ? tipo : req.getParameter("tipoVecchio");

        String pathGrafica = req.getParameter("path");

        Part grafica;
        try {
            grafica = req.getPart("grafica");
            if (grafica != null && grafica.getSubmittedFileName().isEmpty()) {
                grafica = null;
            }
        } catch (IOException | ServletException e) {
            req.getRequestDispatcher(ERROR_PAGE).forward(req, resp);
            return;
        }


        if (grafica != null) {
            try {
                pathGrafica = gestisciUploadGrafica(grafica, id, tipo, uploadDir, req, resp);
            } catch (ServletException | IOException e) {
                req.getRequestDispatcher(ERROR_PAGE).forward(req, resp);
                return;
            }
            if (pathGrafica == null) return;
        }

        MagliettaBean maglietta = new MagliettaBean();
        maglietta.setID(id);
        maglietta.setNome(nome);
        maglietta.setPrezzo(prezzo);
        maglietta.setIVA(iva);
        maglietta.setColore(colore);
        maglietta.setTipo(tipo);
        maglietta.setDescrizione(descrizione);
        maglietta.setGrafica(pathGrafica);

        MisuraBean misuraBean = new MisuraBean(id, quantita, taglia);

        try {
            new MagliettaDAO().doUpdate(maglietta);
            new MisuraDAO().doUpdate(misuraBean);
        } catch (SQLException e) {
            req.getRequestDispatcher(ERROR_PAGE).forward(req, resp);
            return;
        }

        resp.sendRedirect("Catalogo");
    }

    private String gestisciUploadGrafica(
            Part grafica,
            int id,
            String tipo,
            Path uploadDir,
            HttpServletRequest req,
            HttpServletResponse resp)
            throws ServletException, IOException {

        final String ERROR_PAGE = "/pages/errorpage.jsp";

        int extensionIndex = grafica.getSubmittedFileName().lastIndexOf(".");
        String estensione = grafica.getSubmittedFileName().substring(extensionIndex);
        String nomeFile = (id + tipo + estensione)
                .replaceAll("[^a-zA-Z0-9._-]", "_");

        String pathGrafica = "images/grafiche/" + nomeFile;

        try (Stream<Path> files = Files.list(uploadDir)) {
            files.filter(p -> p.normalize().startsWith(uploadDir))
                    .filter(p -> p.getFileName().toString().startsWith(id + tipo))
                    .forEach(p -> {
                        try { Files.deleteIfExists(p); } catch (IOException ignored) {/* Ignored*/ }
                    });
        } catch (IOException e) {
            req.getRequestDispatcher(ERROR_PAGE).forward(req, resp);
            return null;
        }

        Path destinationFile = uploadDir.resolve(nomeFile).normalize();
        if (!destinationFile.startsWith(uploadDir)) {
            req.getRequestDispatcher(ERROR_PAGE).forward(req, resp);
            return null;
        }

        try (InputStream inputStream = grafica.getInputStream()) {
            Files.copy(inputStream, destinationFile);
        } catch (IOException e) {
            req.getRequestDispatcher(ERROR_PAGE).forward(req, resp);
            return null;
        }

        return pathGrafica;
    }
}