package docen_servlet01;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServlet;
import java.io.PrintWriter;
import java.io.IOException;
import java.sql.*;

/*************************************************************************
 * EJEMPLO DE SERVLET QUE SE CONECTA A BD
 * 1. En init() se intenta cargar driver.
 * 2. En doPost() intenta conexión a BD  y nos muestra si ha tenido éxito.
 *    La base de datos, login y pwd se obtienen de parámetros del Form
 *    Al final de doPost() cierra la conexión.
 * Utiliza la clase Propiedades para saber driver y host sobre el que trabaja.
 * Dicha clase obtiene esta información de archivo de properties.
**************************************************************************/
public class Conexion extends HttpServlet {
	private Connection con = null;             // Conexion
	private boolean driver = false;            // true si se ha cargado driver en init()
	private Propiedades acceso;                // Clase para saber driver, host, etc.

	/************************************************************************
       Al inicializarse el servlet se carga el driver. Para lo cual uso el contexto
    **************************************************************************/
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		try {
			ServletContext sc = config.getServletContext();    // Obtengo contexto del servlet

			//// El path donde está el archivo de propiedades es 'contexto/propiedades/paquete/'
			//// sc.RealPath("/") me da el path del contexto de aplicación
			acceso = new Propiedades( sc.getRealPath("/")+"propiedades/" + getClass().getPackage().getName()+"/");

			//// Si no hay problema con el archivo de propiedades, cargo el driver
			if ( acceso.mensajeError == null ) {
				Class.forName(acceso.getDriver());
				driver = true;
			}
		}
		catch (ClassNotFoundException e) {
			driver = false;
		}
	}

	/*****************************************************************
	 * Procesar una petición HTTP con el método POST. Intenta conexión
	 *****************************************************************/
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.setContentType("text/html; charset=iso-8859-1");  // Definir tipo de salida
		PrintWriter out = response.getWriter();                    // Obtener flujo salida

		try {
			//// Imprimir inicio página
			out.println("<html>");
			out.println("<head><title>Servlet de conexión</title></head>");
			out.println("<body bgcolor=\"#FFFF9D\"><FONT color=\"#000080\" FACE=\"Arial,Helvetica,Times\" SIZE=2>");
			out.println("<CENTER><H3>Servlet de conexión parametrizada</H3></CENTER><HR>");

			//// Si hay un error con el archivo de propiedades, muestro mensaje de error
			if ( acceso.mensajeError != null )
				out.println( acceso.mensajeError );

			//// Si no se ha cargado el driver: avisamos, terminamos página y salimos
			if ( !driver ) {
				out.println("<br>No se ha cargado el driver.");
				terminarPagina( out );
				return;
			}

			out.println("<br>Driver cargado.");

			//// Intento de conexión: la base de datos, login y pwd son parámetros del FORM
			con = DriverManager.getConnection( acceso.getHost() +
					     request.getParameter("base"),
					     request.getParameter("login"),
					     request.getParameter("password"));
			out.println("<br>Conexión realizada a " + acceso.getHost() + request.getParameter("base") +
							", LOGIN:" + request.getParameter("login"));

		}
		catch (SQLException e) {
			out.println("<br><B>Error. No hay conexión a la base de datos. " + e.getMessage() + "</B>");
		}
		catch (Exception e) {
			out.println("<br><B>Error. Excepción general. " + e.getMessage() + "</B>");
		}
       
		//// Terminar página y cerrar conexión
		finally {
			if ( cerrarConexion() )
				out.println( "<br>Cerrada la conexión.");
			else
				out.println( "<br>Error en cierre de conexión.");
			
			terminarPagina( out );
		}
	}

   /*****************************************************************
    * Procesar una petición HTTP con el método GET. Reenvia a doPost
    *****************************************************************/
	public void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

   /***********************************************************************
    * Terminar página
    **********************************************************************/
	void terminarPagina( PrintWriter out ) {
		out.println("</FONT></body></html>");
		out.close();
	}

	/************************************************************************
      Cerrar la conexión a base de datos
    **************************************************************************/
	boolean cerrarConexion() {
		try {
			if ( con != null ) {
				if (!con.isClosed())
					con.close();
			}
			return true;
		}
		catch (SQLException e) {
			return false;
		}
	}
}
