package es.ejie.frmk.infraestructura.tablas;
import java.util.HashMap;
import java.util.Map;
/**
* <div>
* Clase que permite tratar una tabla (creación, carga y obtención de atributos).<br>
* Una instancia de Q70Tabla tiene un parámetro, que es el nombre de la tabla<br>
* Los métodos de esta clase van a ser los set y get de los distintos atributos de la tabla.<br>
* </div>
*/
public class Q70Tabla {
	private String idTabla;
	private String nombreTablaFisico;
	private String alias;
	private boolean enMem;
	private String indices;
	private boolean cargada = false;
	private String multilenguaje;
	private String datasource;
	private Map columnas = new HashMap();
	private Map localesCodigo;
	private Map grupoLocalesColumnas;
	private String colLenguaje;
	private Map internationalization;

	/**
	 * Construye una tabla con el id especificado
	 * @param p_idTabla identificador de la tabla a contruir
	 */
	protected Q70Tabla(String p_idTabla) {
		idTabla = p_idTabla;
	}

	/**
	 * Obtiene el alias de una tabla
	 * @return un string con el alias de la tabla
	 */
	protected String getAlias() {
		return alias;
	}

	/**
	 * Establece el alias de la tabla
	 * @param val un string que indica el alias de la tabla
	 */
	protected void setAlias(String val) {
		alias = val;
	}
	
	/**
	 * Establece el valor de la propiedad 'enMem' para la tabla
	 * @param val un string que indica el valor de la propiedad 'enMem',que indica si va a estar la tabla en memoria o no
	 */
	protected void setInMem(String val) {
		this.enMem = new Boolean(val).booleanValue();
	}

	/**
	 * Establece el valor de la propiedad 'indices' para la tabla
	 * @param val un string que indica el valor de la propiedad 'indices',que indica los índices de la tabla 
	 */
	protected void setIndices(String val) {
		this.indices = val;
	}

	/**
	 * Establece el valor de la propiedad 'cargada' para la tabla
	 * @param val un string que indica el valor de la propiedad 'cargada', que indica si la tabla está cargada en memoria o no
	 */
	protected void setLoaded(String val) {
		this.cargada = new Boolean(val).booleanValue();
	}

	/**
	 * Establece los lenguajes para la tabla
	 * @param hmVal un objeto hashmap con los lenguajes de la tabla
	 */
	protected void setLanguages(Map hmVal) {
		this.localesCodigo = hmVal;
	}

	/**
	 * Establece el valor de la propiedad 'datasource' para la tabla
	 * @param val un string que indica el valor de la propiedad 'datasource'
	 */
	protected void setDataSource(String val) {
		this.datasource = val;
	}

	/**
	 * Establece la columna para la tabla
	 * @param nombre nombre de la columna
	 * @param tipo tipo de la columna
	 */
	protected void setColumn(String nombre, String tipo) {
		this.columnas.put(nombre, tipo);
	}

	/**
	 * Si la tabla está cargada devuelve True
	 * @return true, si la tabla está cargada; false, en caso contrario
	 */
	protected boolean getLoaded() {
		return cargada;
	}

	/**
	 * Si la tabla está en memoria devuelve True
	 * @return true, si la tabla está en memoria; false, en caso contrario
	 */
	protected boolean getInMem() {
		return enMem;
	}

	/**
	 * Obtiene los índices de una tabla
	 * @return un string con los índices de la tabla
	 */
	protected String getIndices() {
		return indices;
	}

	/**
	 * Obtiene el identificador de una tabla
	 * @return un string con el id de la tabla
	 */
	protected String getidTabla() {
		return idTabla;
	}

	/**
	 * Obtiene el datasource de una tabla
	 * @return un string con el datasource de la tabla
	 */
	protected String getDatasource() {
		return datasource;
	}

	/**
	 * Obtiene las columnas de una tabla
	 * @return un objeto hashmap con las columnas de la tabla
	 */
	protected Map getColumn() {
		return columnas;
	}
	
	/**
	 * Obtiene los lenguajes de la tabla (para multilenguaje vertical)
	 * @return un objeto hashmap con los lenguajes de la tabla <br>
	 * el hashmap estará formado por los pares: tipo de datos del campo idioma - valor de tipo de datos del campo idioma y <br>
	 * para cada idioma, idioma - valor de idioma
	 */
	protected Map getLanguages() {
			return localesCodigo;
	}

	/**
	 * Obtiene el nombre de la columna correspondiente al idioma (para multilenguaje vertical)
	 * @return un string con el nombre de la columna
	 */
	protected String getColNameLanguage() {
			return colLenguaje;
	}
	
	/**
	 * Establece el nombre de la columna correspondiente al idioma de la tabla
	 * @param nomCol un string que indica la columna correspondiente al idioma
	 */
	protected void setColNameLanguage(String nomCol) {
		colLenguaje = nomCol;
	}

	/**
	 * Obtiene el multilenguaje de la tabla
	 * @return un string con el multilenguaje de la tabla
	 */
	protected String getMultilenguaje() {
		return multilenguaje;
	}

	/**
	 * Establece el multilenguaje de la tabla
	 * @param multi un string que indica el multilenguaje
	 */
	protected void setMultilanguage(String multi) {
		multilenguaje = multi;
	}

	/**
	 * Establece los campos para la tabla
	 * @param hmVal un objeto hashmap con los campos de la tabla
	 */
	protected void setFields(Map hmVal) {
		this.grupoLocalesColumnas = hmVal;
	}

	/**
	 * Obtiene los campos multiidioma de la tabla (para multilenguaje horizontal)
	 * @return un objeto hashmap con los campos multiidioma de la tabla
	 * el hashmap estará formado por los pares: nombre genérico del campo - hashmap formado
	 * por los pares: idioma - valor del campo en ese idioma
	 */
	protected Map getFields() {
		return grupoLocalesColumnas;
	}
		
	/**
	 * @see java.lang.Object#toString()
	 */
	//describe la tabla
	public String toString() {
		String retorno = "\n<tabla id=" + idTabla + ">\n";
		retorno += "<nombreTablaFisico>" + nombreTablaFisico + "</alias>\n";
		retorno += "<alias>" + alias + "</alias>\n";		
		retorno += "<enMemoria>" + enMem + "</enMemoria>\n";
		retorno += "<indices>" + indices + "</indices>\n";
		retorno += "<cargada>" + cargada + "</cargada>\n";
		retorno += "<datasource>" + datasource + "</datasource>\n";
		retorno += "<multilenguaje>" + multilenguaje + "</multilenguaje>\n";
		retorno += "<colLenguaje>" + colLenguaje + "</colLenguaje>\n";
		return retorno;
	}

	
	/**
	 * Obtiene información de la tabla
	 * @return un objeto hashmap con los pares: nombre de la propiedad  - valor de la propiedad
	 */
	protected Map getInfoTable(){
		HashMap hm = new HashMap();
		hm.put(Q70Constantes.NOMBRE_TABLA_FISICO,nombreTablaFisico);
		hm.put(Q70Constantes.ALIAS,alias);		
		hm.put(Q70Constantes.MULTILENGUAJE,multilenguaje);
		hm.put(Q70Constantes.LOCALES_CODIGO,localesCodigo);
		hm.put(Q70Constantes.COLUMNA_LENGUAJE,colLenguaje);
		hm.put(Q70Constantes.GRUPO_LOCALES_COLUMNA,grupoLocalesColumnas);
		hm.put(Q70Constantes.I18N,internationalization);
		return hm;
	}

	/**
	 * Obtiene los datos de la internacionalización de la tabla (campos 'codigo', 'literal' y 'tipoCodigo')
	 * @return un objeto hashmap con tres pares: <br>
	 * . codigo - nombre del campo del código,<br>
	 * . literal - nombre del campo del literal<br>
	 * . tipoCodigo - tipo de datos del código
	 */
	protected Map getInternationalization() {
		return internationalization;
	}

	/**
	 * Establece la internacionalización para la tabla
	 * @param inter un objeto hashmap con la internacionalización de la tabla
	 */
	protected void setInternationalization(Map inter) {
		internationalization = inter;
	}
	
	/**
	 * Retorna el nombre fisico Real de la tabla.
	 * @return nombreTablaFisico un objeto String 
	 */
	protected String getNombreTablaFisico() { 
		return nombreTablaFisico;
	}
	
	/**
	 * Establece el nombre fisico Real de la tabla
	 * @param nombreTablaFisico un objeto String
	 */
	protected void setNombreTablaFisico(String nombreTablaFisico) {
		this.nombreTablaFisico = nombreTablaFisico;
	}

}
