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

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

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

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

/**
 * Clase abstracta extensible por la aplicación diseñada para pasos de OP que van a acceder a lógica de negocio.
 * <p> 
 * Se usa cuando el tratamiento no necesita manipulación de datos del contexto previa o posterior a la invocación
 * de la OI. Permite, por tanto, un alto grado de automatización en el proceso a realizar por todas las clases hijas,
 * facilitando la declaratividad de tal modo que la clase hija aportada por la aplicación sólo deberá implementar el
 * método abstracto <code>processForward()</code> para la decisión de encaminamiento posterior.
 * Encapsula las problemáticas de:
 * <UL>
 * <li>petición de instancia de Operación Interna a la factoría de Operaciones Internas,</li>
 * <li>la invocación automática del método de negocio (procesamiento de la OI),</li>
 * <li>el paso del contexto,</li>
 * <li>la recepción del resultado una vez ejecutada la OI,</li>
 * <li>y el mapping automático de errores de OI sobre errores de Operación de Presentación.</li>
 * </UL>
 * 
 * @version 1.0
 * Fecha: 08-ene-04
 */
public abstract class Q70ActionOIDeclarativo extends Q70ActionOI {

	/**
	 * 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();
	
	/**
	 * Método que invoca al procesamiento de la Operación Interna.
	 * <p>
	 * Para ello recupera el identificador de la operación interna del atributo <code>parameter</code> del
	 * fichero XML de configuración de la operación de presentación.
	 * A continuación delega la invocación por defecto implementada por el método <code>executeOI()</code>. 
	 * 
	 * @see es.ejie.frmk.presentacion.operacion.paso.Q70ActionOI#processOI(es.ejie.frmk.presentacion.sesiondatos.Q70ContextoEJIE, org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	protected Q70OperacionInternaErrors processOI(Q70ContextoEJIE contexto, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Recuperamos la operación interna del atributo parameter en el struts-config.xml correspondiente.
		String operacionInterna = mapping.getParameter();
		if (operacionInterna==null || operacionInterna.length() < 1)
		{
			if (tr.isTraceActive())
			{
				tr.trace(COMPONENTE, Q70TraceLevel.ERROR, "No se ha definido la operación interna en el atributo parameter del fichero XML de configuración de la operación de presentación.");
			}
			throw new Q70OperacionDePresentacionException (this.getClass().toString(),"processOI","No se ha definido la operación interna en el atributo parameter del fichero XML de configuración de la operación de presentación.",null);
		}
		if (tr.isTraceActive())
		{
			tr.trace(COMPONENTE, Q70TraceLevel.DEBUG, "Q70ActionOIDeclarativo.processOI(): Llamando la operación interna: "+operacionInterna);
		}
		return this.executeOI(operacionInterna, contexto);
	}
}