/*

 * Copyright 2001 by IENET, Inc.

 *

 * Private and Confidential

 * Code contained in this document is the property of IENET.

 * It is for the exclusive use of designated employees

 * and not for distribution without prior written

 * authorization.

 */

/*

 * BaseDAO.java

 *

 * Created on 31 de mayo de 2001, 10:19

 */



package q02b.exe.arquitectura.dataobjects;



// Java classes import



import es.ejie.frmk.infraestructura.traza.Q70Traza;

import java.util.ArrayList;

import java.util.HashMap;

/** Clase que se utiliza como base para todos los DAO.

 * <p>

 * Los DAO (DataAccessObject) son los objetos encargados del acceso a los

 * recursos (LDAP, Bases de datos, etc.). Un DAO se compone de 3 o más clases:

 * <ul>

 * <li>Interface: donde definimos los métodos y constantes que deberán tener las clases

 * que realmente accedean a los recursos.</li>

 * <li>ValueObject(s): una o más clases que contendrán los datos que devuelven los DAO (tanto el

 * interface como las clases que lo implementen</li>

 * <li>Clases de implementación: estas clases implementarán el interface que hemos creado anteriormente,

 * y heredarán, directa o indirectamente de BaseDAO.

 * </li>

 * </ul>

 * <p>

 * Para instanciar una Clase que herede de BaseDAO, utilizaremos el método getInstance, pasando como parámetro

 * la clase base de ese DAO (normalmente un interface del tipo IClientesDAO). En base al nombre de la clase,

 * buscaremos en la configuración, qué clase instanciable le corresponde, y la instanciaremos utilizando el

 * constructor vacío. Ejemplo:<br>

 * q02b.exe.arquitectura.besaidenet.dataobjects.IInfovinculosDAO dao = (q02b.exe.arquitectura.besaidenet.dataobjects.IInfovinculosDAO) BaseDAO.getInstance(q02b.exe.arquitectura.besaidenet.dataobjects.IInfovinculosDAO);

 * <p>

 * Por lo tanto, el constructor vacío de todas las clases hijas de BaseDAO deberá crear una instancia ya inicializada

 * (conexiones a bases de datos, LDAP, etc...).

 * @author Antonio.Vieiro

 * @version 1.0

 */

public abstract class Q02bBaseDAO extends Object implements java.io.Serializable{

   

    /** Objeto Log para escribir trazas */

    protected static Q70Traza tr = Q70Traza.getSingleton();

    

    /** Holds value of property nombreClaseSinPackage. */

    protected String nombreClaseSinPackage;

    

    /** Variables obtenidas del contexto de la aplicación */

    protected String 	user				= null;

    protected String 	idioma				= null;

    protected ArrayList	roles			  	= null;

    protected HashMap 	mapaRestricciones	= null;

    

   

    /** Crea un nuevo BaseDAO

     */

    public Q02bBaseDAO() {

        initNombreClaseSinPackage();

    }

    

    

    /**

     * Libera los recursos de un objeto DAO

     * @param dao Dao cuyos recursos hay que liberar

     * @throws Q02bDAOException si hay algún error

     */

    public static void freeResources(Object dao) throws Q02bDAOException {

        try{

            if(dao==null){

                return;
            }
            ((Q02bBaseDAO)dao).freeResources();

        }catch(Exception ex){

            //log.error("BaseDAO  Failed: " + ex.getMessage() + ". freeResources",log.CAT_APP);

            throw new Q02bDAOException(ex);

        }

    }

    

    /**

     * Libera los recursos del DAO.

     */

    public abstract void freeResources();

    

    /** Utilizaremos este método para instanciar cualquier clase que extienda de BaseDAO.

     * <p>

     * Pasaremos como parámetro una clase (Normalmente un interface, por ejemplo IClientesDAO).

     * Con el nombre de esta clase, buscaremos en un fichero de propiedades, la clase que realmente vamos a

     * instanciar.<br>

     * De este modo, podemos configurar si queremos instanciar la clase que accede a los clientes mediante

     * LDAP, base de datos, HOST, etc...

     * @param clase Interface del que queremos instanciar el DAO.

     * @return Instancia de BaseDAO

     * @throws DAOException Si se produce cualquier error

     */

    

    

    

    /** 

     * Inicializa la propiedad nombreClaseSinPackage

     */

    public void initNombreClaseSinPackage() {

        String nombreFiltrado;

        String nombreClase = getClass().getName();

        

        try {

            if (nombreClase != null){

                nombreFiltrado = nombreClase.substring( nombreClase.lastIndexOf(".") + 1);

            }

            else{

                nombreFiltrado = "ClaseDesconocida";

            }

        }catch (java.lang.Exception e){

            nombreFiltrado = "ClaseDesconocida";

        }

        

        nombreClaseSinPackage = nombreFiltrado;

    }

    

     /** Getter for property nombreClaseSinPackage.

     * @return Value of property nombreClaseSinPackage.

     */

    public String getNombreClaseSinPackage() {

        return this.nombreClaseSinPackage;

    }

    

    public String getUser() {

		return user;

	}

	public void setUser(String user) {

		this.user = user;

	}

	

	public String getIdioma() {

		return this.idioma;

	}

	public void setIdioma(String idioma) {

		this.idioma = idioma;

	}

	

	public ArrayList getRoles() {

		return this.roles;

	}

	public void setRoles(ArrayList roles) {

		this.roles = roles;

	}

	

	public HashMap getMapaRestricciones(){

		return this.mapaRestricciones;

	}

	

	public void setMapaRestricciones(HashMap mapaRestricciones){

		this.mapaRestricciones = mapaRestricciones;

	}

	

	/**

	 * Devuelve los roles separados por comas para poder introducirlos en una query

	 * @return String

	 */

	public String obtenerRolesSeparadosComas(){

		StringBuffer rolesStr = new StringBuffer();

		for(int i=0;i<this.roles.size();i++){

			rolesStr.append((String)this.roles.get(i));

			if(i!=(this.roles.size()-1)){

				rolesStr.append(",");

			}

		}

		return rolesStr.toString();

	}

    

}



