ProductServlet.java

package com.popx.presentazione;

import com.google.gson.JsonObject;
import com.popx.modello.ProdottoBean;
import com.popx.persistenza.DataSourceSingleton;
import com.popx.persistenza.ProdottoDAOImpl;

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;

@WebServlet("/addProductServlet")
@MultipartConfig(maxFileSize = 2 * 1024 * 1024)
public class ProductServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    private ProdottoDAOImpl prodottoDAO;

    // ๐Ÿ‘‰ costruttore production (Tomcat)
    public ProductServlet() {
        this.prodottoDAO = new ProdottoDAOImpl(DataSourceSingleton.getInstance());
    }

    // ๐Ÿ‘‰ costruttore test
    public ProductServlet(ProdottoDAOImpl prodottoDAO) {
        this.prodottoDAO = prodottoDAO;
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        response.setContentType("application/json");
        JsonObject jsonResponse = new JsonObject();

        try {
            String id = request.getParameter("idProduct");
            String name = request.getParameter("name");
            String description = request.getParameter("description");
            String costStr = request.getParameter("price");
            String piecesInStockStr = request.getParameter("qty");
            String brand = request.getParameter("brand");
            String figure = request.getParameter("figure");
            Part imgPart = request.getPart("img_src");

            if (id == null || id.isEmpty() ||
                    name == null || name.isEmpty() ||
                    costStr == null || costStr.isEmpty() ||
                    piecesInStockStr == null || piecesInStockStr.isEmpty()) {

                jsonResponse.addProperty("success", false);
                jsonResponse.addProperty("message", "Campi obbligatori mancanti.");
                response.getWriter().write(jsonResponse.toString());
                return;
            }

            double cost = Double.parseDouble(costStr);
            int piecesInStock = Integer.parseInt(piecesInStockStr);

            byte[] imgBytes = null;
            if (imgPart != null && imgPart.getContentType().startsWith("image/")) {
                try (InputStream imgInputStream = imgPart.getInputStream()) {
                    imgBytes = imgInputStream.readAllBytes();
                }
            } else if (imgPart != null) {
                jsonResponse.addProperty("success", false);
                jsonResponse.addProperty("message", "Il file caricato non รจ un'immagine valida.");
                response.getWriter().write(jsonResponse.toString());
                return;
            }

            ProdottoBean prodotto = new ProdottoBean(
                    id, name, description, cost, piecesInStock, brand, imgBytes, figure
            );

            boolean isSaved = prodottoDAO.saveProdotto(prodotto);

            jsonResponse.addProperty("success", isSaved);
            jsonResponse.addProperty(
                    "message",
                    isSaved ? "Prodotto aggiunto con successo." : "Errore durante il salvataggio del prodotto."
            );

        } catch (Exception e) {
            jsonResponse.addProperty("success", false);
            jsonResponse.addProperty("message", "Errore interno.");
        }

        response.getWriter().write(jsonResponse.toString());
    }
}