/*
 * Creado el 10-dic-03
 *
 * Para cambiar la plantilla para este archivo generado vaya a
 * Ventana&gt;Preferencias&gt;Java&gt;Generación de código&gt;Código y comentarios
 */
package es.ejie.frmk.listeners.validadorremoto;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;

import org.apache.struts.util.RequestUtils;
import org.apache.struts.util.ResponseUtils;

import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70Traza;
import es.ejie.frmk.presentacion.iu.taglib.base.Q70Constants;
import es.ejie.frmk.presentacion.iu.taglib.base.Q70JavascriptLib;
import es.ejie.frmk.presentacion.iu.taglib.html.Q70BaseHandlerTag;



/**
 * @author UFRM002
 *
 * Para cambiar la plantilla para este comentario de tipo generado vaya a
 * Ventana&gt;Preferencias&gt;Java&gt;Generación de código&gt;Código y comentarios
 */
public class Q70ValidadorRemotoTag extends Q70BaseHandlerTag {

	//	-------------------------------------------------------- Private variables

	/**
	 * Constante que indica el componente al que pertenece dicha clase. Es
	 * necesario para el uso del log de trazas.
	 */
	private static final String COMPONENTE = "VALIDADOR_REMOTO";

	/**
	 * Instancia del log de trazas
	 */
	private static Q70Traza tr = Q70Traza.getSingleton();
	

	//	-------------------------------------------------------- Instance Variables

	// Nombre de la funcion javascript que lanza la validacion 
	private String javascriptValidateFunc = null;
	
	// Nombre de la funcion javascript que captura el retorno de la validacion
	private String javascriptReturnFunc = "";	 

	// Nombre del formulario donde estan incluidos los tags html	 
	private String formName = null;
	
	// Nombre del tag html que tiene los datos de la condicion ppal. de la consulta remota  
	private String sourceTag = ""; 

	// Nombre del tag html que muestra el resultado de la consulta remota
	private String targetTag = "";
		
	// Nombre de la tabla de la que se obtiene los datos
	private String table = null;
	
	// Nombre de la columna de bd que forma la parte where de la consulta remota
	private String predicateColumn = null;

	// Indica si el campo indicado en predicateColumn es numerico
	// Valor por defecto: true
	private boolean predicateColumnNumeric = true;

	// Nombre de la columna de bd que forma la parte select de la consulta
	private String subjectColumn = null;

	// Condiciones extra de la Consulta a lanzar contra el Gestor de Tablas y Codigos
	private String extraPredicate = "";	

	// Metodo usado para llamar al validador remoto.
	// Posibles valores: GET | POST
	// Valor por defecto: POST    
	private String submitMethod = "POST";
	
	//tecnología empleada en las validaciones, por defecto se utiliza ajax
	private String technology = Q70Constants.AJAX_TECH;


	//	-------------------------------------------------------- Constructor

	/**	 Constructor */
	public Q70ValidadorRemotoTag(){ }

	// --------------------------------------------------------- Instance Methods  

	/**
	 * @return
	 */
	public String getFormName() {
		return formName;
	}
	/**
	 * @param string
	 */
	public void setFormName(String string) {
		formName = string;
	}
	
	/**
	 * @return
	 */
	public String getJavascriptValidateFunc() {
		return javascriptValidateFunc;
	}
	/**
	 * @param string
	 */
	public void setJavascriptValidateFunc(String string) {
		javascriptValidateFunc = string;
	}
	
	/**
	 * @return
	 */
	public String getJavascriptReturnFunc() {
		return javascriptReturnFunc;
	}
	/**
	 * @param string
	 */
	public void setJavascriptReturnFunc(String string) {
		javascriptReturnFunc = string;
	}	
	
	/**
	 * @return
	 */
	public String getPredicateColumn() {
		return predicateColumn;
	}
	/**
	 * @param string
	 */
	public void setPredicateColumn(String string) {
		predicateColumn = string;
	}
		
	/**
	 * @return
	 */
	public boolean getPredicateColumnNumeric() {
		return predicateColumnNumeric;
	}
	/**
	 * @param string
	 */
	public void setPredicateColumnNumeric(boolean value) {
		predicateColumnNumeric = value;
	}	
	
	/**
	 * @return
	 */
	public String getSourceTag() {
		return sourceTag;
	}
	/**
	 * @param string
	 */
	public void setSourceTag(String string) {
		sourceTag = string;
	}
	
	/**
	 * @return
	 */
	public String getTable() {
		return table;
	}
	/**
	 * @param string
	 */
	public void setTable(String string) {
		table = string;
	}

	/**
	 * @return
	 */
	public String getSubjectColumn() {
		return subjectColumn;
	}
	/**
	 * @param string
	 */
	public void setSubjectColumn(String string) {
		subjectColumn = string;
	}
	
	/**
	 * @return
	 */
	public String getTargetTag() {
		return targetTag;
	}
	/**
	 * @param string
	 */
	public void setTargetTag(String string) {
		targetTag = string;
	}
	
	/**
	 * @return
	 */
	public String getExtraPredicate() {
		return extraPredicate;
	}
	/**
	 * @param string
	 */
	public void setExtraPredicate(String string) {
		extraPredicate = string;
	}

	/**
	 * @return
	 */
	public String getSubmitMethod() {
		return submitMethod;
	}

	/**
	 * @param string
	 */
	public void setSubmitMethod(String string) {
		submitMethod = string;
	}

	public String getTechnology() {
		return technology;
	}

	public void setTechnology(String technology) {
		this.technology = technology;
	}




	//	--------------------------------------------------------- Public Methods


	/**
	 * Process the start of this tag.  The default implementation does nothing.
	 *
	 * @exception JspException if a JSP exception has occurred
	 */
	public int doStartTag() throws JspException 
	{
		if (tr.isTraceActive())	tr.trace(COMPONENTE, Q70TraceLevel.DEBUG, "Generando tag de tipo " + this.getClass().toString());
				
		return 1; //EVAL_BODY_INCLUDE
	}


	/**
	 * Process the end of this tag.  The default implementation does nothing.
	 *
	 * @exception JspException if a JSP exception has occurred
	 */
	public int doEndTag() throws JspException {
		
		//Realiza las comprobaciones necesarias sobre los atributos del tag
		verifyAtributes();
			
		// Devolver el resultado HTML a la pagina
		String htmlCode = Q70JavascriptLib.renderValidadorRemotoHtmlCode((HttpServletRequest) pageContext.getRequest(), this);
		
		ResponseUtils.write( this.pageContext, htmlCode );
		
		//Dejar en el contexto de pagina un indicador de que esta definido el validador para esta pagina
		super.putBridgeCounter();
				
		return 6; //(EVAL_PAGE);
		
	}
	 
	 
	/** Release any acquired resources.*/
	public void release() {
		super.release();
	}	 


	
	
	// ----------------------------------------------------------- Private Methods
	
	/**
	 * Verificaciones a aplicar sobre los atributos
	 */
	private void verifyAtributes() throws JspException 
	{
		if (null==this.javascriptReturnFunc)
		{
			if (null==this.targetTag || 0==this.targetTag.trim().length())
			{
				JspException e =
					new JspException("Debe especificar un valor para el atrito targetTag.");
		
				RequestUtils.saveException(pageContext, e);
				throw e;							
			}
		}
		
		if (!(this.submitMethod.toUpperCase().equals("POST") || this.submitMethod.toUpperCase().equals("GET"))) 
		{
			JspException e =
				new JspException("El valor del atributo submitMethod es incorrecto. Los posibles valores son: GET ó POST.");
		
			RequestUtils.saveException(pageContext, e);
			throw e;			
		}
		
		if ((!this.getTechnology().equalsIgnoreCase(Q70Constants.AJAX_TECH)) && (!this.getTechnology().equalsIgnoreCase(Q70Constants.IFRAME_TECH))){
			JspException e =
				new JspException("El valor del atributo technology es incorrecto. Los posibles valores son: 'ajax' ó 'iframe'.");
		
			RequestUtils.saveException(pageContext, e);
			throw e;			
		}
	}
}
