package ucam.servlets;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServlet;
import javax.sql.DataSource;

public class Singleton extends HttpServlet {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static class ThreadLocalConnection extends ThreadLocal {
	    public Object initialValue() {
	    	Context context;
			Connection conexion = null;
			try {
				context = new InitialContext();
				DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/miServidor");		
				conexion = dataSource.getConnection();
				conexion.setAutoCommit(false);
				
			} catch (NamingException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return conexion;
	    }
	  }

	private static ThreadLocalConnection hilo;
	
	public static Connection getConexion() {
		if (hilo == null) {
			// Se difiere la inicialización hasta que es necesaria
			hilo = new ThreadLocalConnection();
		}
		
		Connection con = (Connection) hilo.get();
		try {
			if (con == null || con.isClosed()) {
				hilo.set(hilo.initialValue());
			}
		} catch (SQLException sqle) {
			throw new RuntimeException("Error obteniendo una conexión a la base de datos");
		}
		
		return (Connection) hilo.get();
	}
	
	public static void rollback() {
		if (hilo != null) {
			try {
				((Connection) hilo.get()).rollback();
			} catch (Exception e) {}
		}
	}
	
	public static void release() {
		if (hilo != null) {
			try {
				((Connection) hilo.get()).commit();			
			} catch (Exception e) {}
			try {
				((Connection) hilo.get()).close();
			} catch (Exception e) {}		
		}
	}	
	
	public static boolean isConnectionOpen() {
		return hilo != null;
	}
}

