package es.ejie.frmk.presentacion.operacion.paso;

import java.util.StringTokenizer;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70Traza;
import es.ejie.frmk.presentacion.operacion.Q70OperacionDePresentacionException;
import es.ejie.frmk.presentacion.sesiondatos.Q70ContextoEJIE;

/**
 * Action que pasa los atributos de Request al Contexto
 * @version 2.0  Fecha 18-abr-06
 */
public class Q70ActionRequestToContext extends Q70ActionPasoOP {

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

	/**
	 * Instancia del log de trazas
	 */
	private static Q70Traza tr = Q70Traza.getSingleton();
	
	/**
	 * @see es.ejie.frmk.presentacion.operacion.paso.Q70ActionPasoOP#processOP(es.ejie.frmk.presentacion.sesiondatos.Q70ContextoEJIE, org.apache.struts.action.ActionErrors, org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	protected void processOP(Q70ContextoEJIE contexto, 
			ActionErrors errores, 
			ActionMapping mapping, 
			ActionForm form, 
			HttpServletRequest request, 
			HttpServletResponse response) throws Exception {
		
		String parameter = null;
		StringTokenizer parametrosMapear = null;
		
		// Identify the request parameter containing the method name
		parameter = mapping.getParameter();
		if (null == parameter) {
			if (tr.isTraceActive()) {
				tr.trace(COMPONENTE, Q70TraceLevel.ERROR,
						"Q70ActionRequestToContext: Falta el atributo parameter del Q70ActionRequestToContext en el fichero de configuración de Struts correspondiente.");
			}
			throw new Q70OperacionDePresentacionException(this.getClass().toString(), "processOP",
					"Falta el atributo parameter del Q70ActionRequestToContext en el fichero de configuración de Struts correspondiente.", null);
		}
		if (tr.isTraceActive())
		{
			tr.trace(COMPONENTE, Q70TraceLevel.DEBUG, "Atributo 'parameter' para Q70ActionRequestToContext= "+parameter);
		}
		
		if (parameter.indexOf(DELIMITADOR) == -1) {
			try {
				// se intenta mapear el parametro de la request al contexto
				BeanUtils.setProperty(contexto,parameter,request.getParameter(parameter));
				if (tr.isTraceActive())
				{
					tr.trace(COMPONENTE, Q70TraceLevel.DEBUG, "El parametro '"+parameter+"' ha sido mapeado al contexto.");
				}
			} catch (Exception e) {
				if (tr.isTraceActive())
				{
					tr.trace(COMPONENTE, Q70TraceLevel.ERROR, "No se ha podido mapear el parametro '"+parameter+"' al contexto.");
				}
			}
		} else  {
			// Se recupera la lista de parametros a mapear separados por el DELIMITADOR
			parametrosMapear = new StringTokenizer(parameter, DELIMITADOR);
			
			// Por cada parametro...
			String parametroMapear = null;
			while (parametrosMapear.hasMoreTokens()) {
				parametroMapear = parametrosMapear.nextToken();
				try {
					// se intenta mapear el parametro de la request al contexto
					BeanUtils.setProperty(contexto,parametroMapear,request.getParameter(parametroMapear));
					if (tr.isTraceActive())
					{
						tr.trace(COMPONENTE, Q70TraceLevel.DEBUG, "El parametro '"+parametroMapear+"' ha sido mapeado al contexto.");
					}
				} catch (Exception e) {
					if (tr.isTraceActive())
					{
						tr.trace(COMPONENTE, Q70TraceLevel.ERROR, "No se ha podido mapear el parametro '"+parametroMapear+"' al contexto.");
					}
				}
			}
		}
	}
	
	/**
	 * @see es.ejie.frmk.presentacion.operacion.paso.Q70ActionPasoOP#processForward(es.ejie.frmk.presentacion.sesiondatos.Q70ContextoEJIE, org.apache.struts.action.ActionErrors, org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	protected ActionForward processForward (Q70ContextoEJIE contexto,
			ActionErrors errores, 
			ActionMapping mapping, 
			ActionForm form, 
			HttpServletRequest request, 
			HttpServletResponse response) throws Exception {

		return mapping.findForward("ok");
	}
}
