/*

 * 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.

 */

/* Generated by Together */



package q02b.exe.arquitectura.utils.tablasBD;



import java.io.PrintWriter;

import java.io.StringWriter;

import java.math.BigInteger;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.Date;



import q02b.exe.arquitectura.dataobjects.Q02bDAOException;

import q02b.exe.arquitectura.dataobjects.Q02bDataBaseDAO;

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

import q02b.exe.arquitectura.utils.Q02bDateFormatter;



/**

 * @author sergio.navarro

 * @version 1.0

 */

public  abstract class Q02bTablaBD extends Q02bDataBaseDAO {

    

   

    /**

     * Almacena valores booleanos que se corresponden con la propiedad nullable de cada una de las columnas de la tabla asociada a la clase

     */

    protected boolean[] nullables = null;

    

    /**

     * Almacena los nombres de las columnas de la tabla asociada a la clase

     */

    protected String[] columnas = null;

    /** Indica si se trata de una tabla(true) o una vista(false)

     */

    protected boolean insertable = false;

    

    protected String valor = null;

    

    protected boolean cacheable = false;

    

    protected String idConexion = "";

    

    protected String tableName = "";

    

    protected int numInicio = 0;

    

    protected int numFinal = 0;

    

    private static final String COMPONENTE = "DAO_ACCESO_DATOS";

    

    /**

     * Devuelve el nombre de una columna

     * @return Nombre de la columna

     * @param indice  */

    public String getColumna(int indice) {

        return columnas[indice];

    }

    

    

    public String[] getColumnas() {

        return columnas;

    }

    /**

     * Devuelve true si una columna puede tener valor null

     * @return true si el valor de la columna puede ser null

     * @param columna  */

    public boolean isNullable(String columna) {

        int punto=java.util.Arrays.binarySearch(columnas,columna);

        return isNullable(punto);

    }

    

    /**

     * Devuelve true si una columna puede tener valor null

     * @return true si el valor de la columna puede ser null

     * @param columna  */

    public boolean isNullable(int columna) {

        return nullables[columna];

    }

    

    /**

     * Devuelve true si la clase se corresponde con una tabla. False si se corresponde con una vista

     * @return true si la clase se corresponde con una tabla. False si se corresponde con una vista

     */

    public boolean isInsertable(){

        

        return insertable;

    }

    

    /**

     * Devuelve la fecha de modificación de la clase.Método abstracto.

     * @return la fecha de modificación de la clase.

     */

    

    public abstract String getFechaClase();

    

    

    /**

     * Da valor a la propiedad numMaxRegistros utilizada para limitar

     *el nº de filas devueltas por un preparedStatement

     *

     */

    

    public abstract void setNumMaxRegistros(int valor) ;

    

    

    /**

     * Da valor a la propiedad orderBy utilizada para obtener las

     * filas bajo un criterio de ordenación

     *

     */

    public abstract void setOrderBy(String valor);

    

    /**

     * Obtiene el valor de la propiedad orderBy utilizada para obtener las

     * filas bajo un criterio de ordenación

     *

     */

    public abstract String getOrderBy();

    

    

    /**

     * Obtiene el valor de la propiedad numMaxRegistros utilizada para limitar

     *el nº de filas devueltas por un preparedStatement

     *

     */

    public abstract int getNumMaxRegistros();

    

    /** Method addColumnSelect(nombreColumna)

     * @param nombreColumna New value of property columnasSelect.

     * Este método añade una nueva columna a mostrar en el resultado de la select

     * Añadir las columnas usando las constantes de la tabla

     */

    public abstract void addColumnSelect(String nombreColumna);

    

    /** Method clearColumnsSelect()

     * Este método vacia el ArrayList con los nombres de las columnas sobre los q hacer la select

     */

    public abstract void clearColumnsSelect();

    

    /** Method getColumnsSelect()

     * Este método devuelve un String con los nombres de las columnas sobres las q hacer la

     * select separadas por comas.

     */

    public abstract String getColumnsSelect();

    

    /** Method setColumnsSelect(listaColumnas)

     * Este método inserta un String con los nombres de las columnas sobres las q hacer la

     * select, deben ir separadas por comas.

     */

    public abstract void setColumnsSelect(String listaColumnas);

    

    

    

    /**

     * Se encarga de inicializar la clase

     */

    public void reset(){

    }

    

    /**

     * Ejecuta una sentencia UPDATE contra la tabla, teniendo en cuenta los valores y concatenando la clausula WHERE recibida

     * @param where

     * @throws SQLException  */

    public void update(String where) throws SQLException {

        

        // throw new UnsupportedOperationException();

    }

    

    /**

     * Ejecuta una sentencia UPDATE contra la tabla, teniendo en cuenta los valores y concatenando una sentencia WHERE construida en base a las propiedades WHERE de la clase

     * @throws SQLException  */

    public void update() throws SQLException{

        //throw new UnsupportedOperationException();

    }

    

    /**

     * Ejecuta una sentencia DELETE contra la tabla, concatenando la clausula WHERE recibida

     * @param where

     * @throws SQLException  */

    public void delete(String where) throws SQLException{

        //throw new UnsupportedOperationException();

    }

    

    /**

     * Ejecuta una sentencia DELETE contra la tabla, concatenando una sentencia WHERE construida en base a las propiedades WHERE de la clase

     * @throws SQLException  */

    public void delete() throws SQLException{

        // throw new UnsupportedOperationException();

    }

    

    /**

     * Ejecuta una sentencia INSERT teniendo en cuenta los valores de las columnas contenidos en la clase

     * @throws SQLException  */

    public void insert() throws SQLException {

        // throw new UnsupportedOperationException();

    }

    

    /**

     * Ejecuta una sentencia SELECT, con una clausula WHERE construida en base a los valores de las propiedades XXXX_WHERE

     * @return ResultSet: resultado de la ejecución de la SELECT

     * @throws SQLException

     */

    public java.sql.ResultSet select() throws SQLException,Q02bDAOException {

        // throw new UnsupportedOperationException();

        return null;

    }

    

    /**

     * Ejecuta una sentencia SELECT, con la clausula WHERE recibida como parámetro

     * @param where

     * @throws Exception

     * @return devuelve el RS

     */

    public java.sql.ResultSet select(String where) throws SQLException,Q02bDAOException {

        //  throw new UnsupportedOperationException();

        return null;

    }

    

    /**

     * Ejecuta una sentencia SELECT COUNT(*), con la clausula WHERE recibida como parámetro

     * @param where

     * @throws SQLException

     * @return devuelve el RS

     */

    public java.sql.ResultSet selectCount(String where)throws SQLException  {

        return null;

    }

    

    /**

     * Ejecuta una sentencia SELECT COUNT(*), con una clausula WHERE construida en base a los valores de las propiedades XXXX_WHERE

     * @throws SQLException

     * @return devuelve el RS

     */

    public java.sql.ResultSet selectCount()throws SQLException  {

        return null;

    }

    

    /**

     * Ejecuta una sentencia SELECT DISTINCT NOMBRE_CAMPO , con la clausula WHERE recibida como parámetro

     * @param where New value of property WHERE.

     * @return Value of the resultSet.

     */

    public java.sql.ResultSet selectDistinct(String where)throws SQLException  {

        return null;

    }

    

    /**

     * Ejecuta una sentencia SELECT DISTINCT NOMBRE_CAMPO, con una clausula WHERE construida en base a los valores de las propiedades XXXX_WHERE

     * @param where New value of property WHERE.

     * @return Value of the resultSet.

     */

    public java.sql.ResultSet selectDistinct()throws SQLException  {

        return null;

    }

    

    /** Muestra por consola todas las filas del RS con el nombre, tipo y valor de cada columna.

     * @param rs Result Set del que se quiere visualizar el contenido

     * @throws SQLException Lanza las excepciones SQL

     */

    public static void showResultSet(java.sql.ResultSet rs) throws SQLException {

     

        ResultSetMetaData rsmd = rs.getMetaData();

        int numcolumn= rsmd.getColumnCount();

        while(rs.next()) {

            for (int i=1;i<=numcolumn;i++){

                

                

            } // for

        } // while

    }

    

    /**

     * Establece el nombre de la columna usada en la select distinct

     * @param Nombre de la columna usada en la select distinct

     */

    public void setDistinct(String valor){

        this.valor = valor;

    }

    

    /**

     * Devuelve el nombre de la columna usada en la select distinct

     * @return Nombre de la columna usada en la select distinct

     */

    public String getDistinct(){

        return valor;

    }

    

    

    public void setCacheable(boolean valor){

        this.cacheable = valor;

    }

    

    

    public boolean isCacheable(){

        return this.cacheable;

    }

    

    public String getIdConexion(){

        return idConexion;

    }

    

    public String getTableName(){

        return tableName;

    }

    

    public void setTableName(String valor){

        tableName = valor;

    }

    

    public int getNumInicio(){

        return numInicio;

    }

    

    public void setNumInicio(int valor){

        numInicio = valor;

    }

    

    public int getNumFinal(){

        return numFinal;

    }

    

    public void setNumFinal(int valor){

        numFinal = valor;

    }

    

   

    

    /* Invoca el método set correspondiente*/

    public void setProperty(String key, String value){

       

        // Obtenemos los métodos del objeto

        java.lang.reflect.Method [] metodosSet = this.getClass().getMethods();

        

        //Recorremos el for 2 veces. La primera, buscando un método set + key, y la

        //segunda, lo mismo, pero habremos quitado al key el nombre de la tabla

        while(true){

            for ( int i=0; metodosSet!= null && i<metodosSet.length; i++ ) {

                if ( metodosSet[i].getName().equals("set" + key)){



                    Class[] parameterTypes = metodosSet[i].getParameterTypes();



                    try {



                        if (!parameterTypes[0].isPrimitive()){

                        	Object[] params = null;

                        	if (value!=null){

                        		params = this.parserType(parameterTypes,value);

                        	}else{

                        		params=new Object[1];

                        		params[0]=null;

                        	}

                        	  

                        	if (tr.isTraceActive()){

	                            for (int a=0;a<params.length;a++){

	                                tr.trace(COMPONENTE, Q70TraceLevel.DEBUG, this.getClass().getName()+".setProperty::"+params[a]+"("+(params[a]==null?null:params[a].getClass().getName())+")");

	                            }

                        	}

                            metodosSet[i].invoke( this,  params);

                            return;

                        }



                    }catch( Exception e ) {

                        

                        e.printStackTrace();

                        return;

                    }

                }

            }



			String s = ".TablaBD"+key;



            if(s.startsWith(this.getTableName())){

                key = s.substring(this.getTableName().length()+1);

            }else{

                return;

            }

            

            

            

        }

        

        

    }

    

    /* Retorna un objeto que contiene el valor del paramétro parseado

     * con su tipo correspondiente*/

    public Object[] parserType(Class[] clases,String valor) {

        

        Object[] params = new Object[clases.length];

        Class clase = null;

        

        for (int i=0;i<clases.length;i++){

            try{

                clase = clases[i];

                

                if (!clase.isPrimitive()){

                    if(valor==null){

                        continue;

                    }else

                    if(String.class.isAssignableFrom(clase)){//String

                        params[i]=valor;

                    }else

                    if(Number.class.isAssignableFrom(clase)){//Numérico

                        //Si es numérico y es "", insertaremos null

                        if(valor.trim().length()==0){ continue;}

                        

                        //Procesamos los diferentes tipos de numéricos

	                    if(Integer.class.isAssignableFrom(clase)){//Integer

	                        params[i] = new Integer(valor);

	                    }else

	                    if(Long.class.isAssignableFrom(clase)){//Long

	                        params[i] = new Long(valor);

	                    }else

	                    if(Double.class.isAssignableFrom(clase)){//Double

	                        params[i] = new Double(valor);

	                    }else

	                    if(Float.class.isAssignableFrom(clase)){//Float

	                        params[i] = new Float(valor);

	                    }else

	                    if(BigInteger.class.isAssignableFrom(clase)){//BigInteger

	                        params[i] = new java.math.BigInteger(valor);

	                    }

                    }else

                    if (Date.class.isAssignableFrom(clase)){//Fecha

                        //Si la fecha es "", insertaremos un null

                        if(valor.trim().length()==0){ continue;}

                        

                        int pos = valor.indexOf("##");

                        if(pos>=0){

                            params[i] = Q02bDateFormatter.parseDate(valor.substring(0,pos),valor.substring(pos+2));

                        }else{

                            params[i] = Q02bDateFormatter.parseDate(valor);

                        }

                    }else

                    if(Object.class.isAssignableFrom(clase)){//Resto de objetos.... por aquí no debería pasar nunca.

                        params[i] = valor;

                    }

                    



                }    

            }catch (Exception ex){

                StringWriter sw = new StringWriter();

                PrintWriter out = new PrintWriter(sw);

                out.println(this.getClass().getName()+".parserType::Error parseando clase: " + clase.getName() + " con valor: " + valor);

                ex.printStackTrace(out);                

                if (tr.isTraceActive()){

                    tr.trace(COMPONENTE, Q70TraceLevel.ERROR, sw.getBuffer().toString());                    

            	}

                params[i] = null;

                out = null;

                sw = null;

            }

        }

        

        return params;

    }

    

    /** GRaba un mensaje de log por cada fila del RS

     * @param rs Result Set del que se quiere visualizar el contenido

     * @throws SQLException Lanza las excepciones SQL

     */

    /*

    public static void logResultSet(java.sql.ResultSet rs) throws SQLException {

     

        ResultSetMetaData rsmd = rs.getMetaData();

        int numcolumn= rsmd.getColumnCount();

        while(rs.next()) {

            for (int i=1;i<=numcolumn;i++){

                if (this.log.isDebugEnabled(Log.CAT_DB)){

                    this.log.debug(rsmd.getColumnName(i) +

                    " - " + rsmd.getColumnTypeName(i) +

                    " - " + rs.getString(i),

                    Log.CAT_DB);

                } //if

            }// for

        }// while

    }*/

   

}





/**

 * @param rs

 * @throws SQLException  */

