catalogo.Main.java Source code

Java tutorial

Introduction

Here is the source code for catalogo.Main.java

Source

package catalogo;

/*
 * Copyright (C) 2014 Javier Garca Escobedo (javiergarbedo.es)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import catalogo.CatalogoDBManagerMySQL;
import catalogo.Catalogo;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
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 org.apache.commons.codec.digest.DigestUtils;

/**
 *
 * @author Javier Garca Escobedo (javiergarbedo.es)
 * @version 0.2.0
 * @date 2014-02-27
 */
@WebServlet(name = "Main", urlPatterns = { "/Main" })
//Anotacin requerida para la subida de archivos usando enctype="multipart/form-data"
@MultipartConfig
public class Main extends HttpServlet {

    private static final Logger logger = Logger.getLogger(CatalogoDBManagerMySQL.class.getName());

    public static final String ACTION_EDIT_REQUEST = "E";
    public static final String ACTION_EDIT_RESPONSE = "S";
    public static final String ACTION_INSERT_REQUEST = "I";
    public static final String ACTION_INSERT_RESPONSE = "A";
    public static final String ACTION_DELETE = "D";
    public static final String ACTION_EXPORT_XML = "X";

    //Nombre de la carpeta donde se guardarn las imgenes subidas
    public static final String SAVE_DIR = "uploadFiles";

    /**
     * Este mtodo es ejecutado cada vez que se hace una llamada a esta pgina
     *
     * @param request Contiene los datos que se pasan a esta pgina mediante
     * parmetros GET o POST
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //Obtener los datos de conexin a la BD desde un archivo de propiedades
        Properties properties = new Properties();
        properties.load(getServletContext().getResourceAsStream("/WEB-INF/config.properties"));
        String dbServer = properties.getProperty("db_server");
        String dbName = properties.getProperty("db_name");
        String dbUser = properties.getProperty("db_user");
        String dbPassword = properties.getProperty("db_password");

        //Conexin con la base de datos
        CatalogoDBManagerMySQL.connect(dbServer, dbName, dbUser, dbPassword);

        //Comprueba si se ha podido realizar la conexin
        if (CatalogoDBManagerMySQL.isConnected()) {
            String action = request.getParameter("action");
            logger.fine("action = " + action);
            if (action != null && !action.isEmpty()) {
                //Se ha llamado a Main tras pulsar el enlace de Editar en la lista
                if (action.equals(ACTION_EDIT_REQUEST)) {
                    //Obtener el id de la persona a partir del parmetro is que se
                    //  ha debido utilizar al realizar la llamada a esta pgina Main
                    int id = Integer.valueOf(request.getParameter("id"));
                    //Lee de la BD los datos de la persona con el id solicitado
                    Catalogo catalogo = CatalogoDBManagerMySQL.getCatalogoByID(id);
                    //Se prepara el objeto Person generado para pasarlo a otra pgina
                    request.setAttribute("catalogo", catalogo);
                    //Se redirige a otra pgina que muestra el detalle de la persona,
                    //  pasando en request la persona
                    redirectTo("catalogo_detail.jsp", request, response);
                    //Se ha llamado a Main tras pulsar el botn Guardar en la pgina de 
                    //  detalle cuando se estaba editando una persona existente
                } else if (action.equals(ACTION_EDIT_RESPONSE)) {
                    int id = Integer.valueOf(request.getParameter("id"));
                    Catalogo catalogo = CatalogoDBManagerMySQL.getCatalogoByID(id);
                    //Se modifican los datos que haba en la BD, asignado los datos
                    //  que se han introducido en la pgina de detalle. Esos datos
                    //  se reciben como parmetros de la llamada (request) a esta pgina Main 
                    updateCatalogoWithRequestData(catalogo, request);
                    //Se actualiza en la BD la persona
                    CatalogoDBManagerMySQL.updateCatalogo(catalogo);
                    //Volvemos a recargar la pgina Main con lista (no se indica 
                    //  ninguna accin si se quiere mostrar la lista)
                    response.sendRedirect("Main?action=");
                    //Se ha llamado a Main tras pulsar el botn Insertar
                } else if (action.equals(ACTION_INSERT_REQUEST)) {
                    Catalogo catalogo = new Catalogo();
                    request.setAttribute("catalogo", catalogo);
                    redirectTo("catalogo_detail.jsp", request, response);
                    //Se ha llamado a Main tras pulsar el botn Guardar en la pgina de 
                    //  detalle cuando se estaba insertando una nueva persona
                } else if (action.equals(ACTION_INSERT_RESPONSE)) {
                    Catalogo catalogo = new Catalogo();
                    updateCatalogoWithRequestData(catalogo, request);
                    CatalogoDBManagerMySQL.insertCatalogo(catalogo);
                    response.sendRedirect("Main?action=");
                    //Se ha llamado a Main tras pulsar el enlace de Eliminar en la lista
                } else if (action.equals(ACTION_DELETE)) {
                    String id = request.getParameter("id");
                    //Se borra de la BD la persona con el ID indicado
                    CatalogoDBManagerMySQL.deleteCatalogoById(id);
                    response.sendRedirect("Main?action=");
                    //Se ha llamado a Main tras pulsar el botn Exportar XML
                } else if (action.equals(ACTION_EXPORT_XML)) {
                    //Se obtiene desde la BD una lista con todas las personas
                    ArrayList<Catalogo> catalogoList = CatalogoDBManagerMySQL.getCatalogoList();
                    //Se prepara la lista obtenida para pasarla a otra pgina
                    request.setAttribute("catalogoList", catalogoList);
                    //Se redirige a otra pgina que genera el XML pasando en request 
                    //  la lista de personas
                    redirectTo("export_xml.jsp", request, response);
                }
                //Si no se indica ninguna accin se entiende que se quiere mostrar la lista
            } else {
                ArrayList<Catalogo> catalogoList = CatalogoDBManagerMySQL.getCatalogoList();
                request.setAttribute("catalogoList", catalogoList);
                redirectTo("catalogo_list.jsp", request, response);
            }
        } else { //No se ha podido hacer la conexin con la BD
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("Error: No se ha podido conectar con la BD.<br>");
            out.println("Compruebe la configuracin en el archivo 'config.properties'");
            out.close();
        }
    }

    /**
     * Redirige la navegacin web a la pgina indicada en newUrl, pasndole en
     * request los datos que necesite
     *
     * @param newUrl
     * @param request
     * @param response
     */
    private static void redirectTo(String newUrl, HttpServletRequest request, HttpServletResponse response) {
        try {
            RequestDispatcher dispatcher = null;
            dispatcher = request.getRequestDispatcher(newUrl);
            dispatcher.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Actualiza los datos de un objeto Person, usando los datos recibidos en
     * request cuyo contenido se ha formado en person_detail.jsp
     *
     * @param person
     * @param request
     */
    private void updateCatalogoWithRequestData(Catalogo catalogo, HttpServletRequest request) {
        catalogo.setName(request.getParameter("name"));
        catalogo.setPrice(request.getParameter("price"));
        catalogo.setComments(request.getParameter("comments"));

        //Asignacin de foto
        //Consultar si se ha solicitado dejar el contacto sin foto activando el 
        //  checkbox "deletePhoto" del formulario
        logger.fine("DeletePhoto: " + request.getParameter("deletePhoto"));
        if (request.getParameter("deletePhoto") != null && request.getParameter("deletePhoto").equals("on")) {
            //Si el contacto tena alguna foto, borrar el archivo y dejar la propiedad foto en blanco
            if (!catalogo.getPhotoFileName().isEmpty() && catalogo.getPhotoFileName() != null) {
                deletePhotoFile(request, catalogo.getPhotoFileName());
                catalogo.setPhotoFileName("");
            }
        } else { //No se ha pedido dejar sin foto
            //Guardar la imagen en el servidor y asignar el nombre a la persona
            String photoFileName = savePhotoFile(request);
            if (photoFileName != null) {
                if (catalogo.getPhotoFileName().isEmpty() || catalogo.getPhotoFileName() == null) {
                    //Si no tena foto, le asigna la nueva
                    catalogo.setPhotoFileName(photoFileName);
                } else {
                    //Si ya tena foto, borra el archivo antiguo y asigna la nueva
                    deletePhotoFile(request, catalogo.getPhotoFileName());
                    catalogo.setPhotoFileName(photoFileName);
                }
            }
        }
    }

    /**
     * Almacena la imagen indicada en el input "photoFileName" del formulario
     * dentro de la carpeta indicada en la constante SAVE_DIR, generando un
     * nombre nuevo para el archivo en funcin de una codificacin MD5
     * 
     * @param request
     * @return Nombre generado para la imagen o null si no se ha enviado ningn
     * archivo
     */
    private String savePhotoFile(HttpServletRequest request) {
        //Crear la ruta completa donde se guardarn las imgenes
        String appPath = request.getServletContext().getRealPath("");
        String savePath = appPath + File.separator + SAVE_DIR;
        logger.fine("Save path = " + savePath);

        //Crear la carpeta si no existe
        File fileSaveDir = new File(savePath);
        if (!fileSaveDir.exists()) {
            fileSaveDir.mkdir();
        }

        //Crear un nombre para la imagen utilizando un cdigo MD5 en funcin
        //  del tiempo y una palabra secreta. 
        //  Se utiliza una codificacin de este tipo para que se dificulte la 
        //  localizacin no permitida de las imgenes
        String secret = "W8fQAP9X";
        long time = Calendar.getInstance().getTimeInMillis();
        //Para generar el cdigo MD5 se usa la clase DigestUtils de la librera 
        //  org.apache.commons.codec (se incluye en la carpeta 'libs' del proyecto)
        String fileName = DigestUtils.md5Hex(secret + time);

        try {
            //Obtener los datos enviados desde el input "photoFileName" del formulario
            Part filePart = request.getPart("photoFileName");
            String fullPathFile = savePath + File.separator + fileName;
            //Guardar la imagen en la ruta y nombre indicados
            if (filePart.getSize() > 0) {
                filePart.write(fullPathFile);
                logger.fine("Saved file: " + fullPathFile);
                return fileName;
            } else {
                return null;
            }
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalStateException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ServletException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    private void deletePhotoFile(HttpServletRequest request, String photoFileName) {
        String appPath = request.getServletContext().getRealPath("");
        String filePath = appPath + File.separator + SAVE_DIR + File.separator + photoFileName;
        File photoFile = new File(filePath);
        photoFile.delete();
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}