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

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

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

import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70Traza;
import es.ejie.frmk.presentacion.base.Q70PasosOPMapping;
import es.ejie.frmk.presentacion.operacion.Q70OperacionDePresentacionException;
import es.ejie.frmk.presentacion.operacion.datos.Q70OPForm;
import es.ejie.frmk.presentacion.operacion.datos.Q70OPValidatorForm;
/**
 * Esta clase redirige el flujo hacia un paso de otra Operación de Presentación.
 * <p>
 * Para ello deberá configurarse en el atributo "parameter" del paso la URL absoluta 
 * del paso de Operación destino.
 * <p>
 * Se trata de una extensión de la clase <code>Q70ActionRemoto</code>, por lo que deberá sobrecargar el método
 * <code>process()</code> que implemente el mecanismo de redirección. 
 */

public class Q70ActionRedirectOP extends Q70ActionRemoto {

	/**
	 * 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();
	
		
	/**
	 * El método completa la URL absoluta del paso remoto y devuelve una redirección al mismo.
	 * <p>
	 * Para ello, transforma los atributos del bean de formulario de entrada al paso de OP destino en parámetros
	 * añadidos como pares <code>&nombre=valor</code> en la URL. A continuación devuelve la redirección a la URL 
	 * absoluta de destino.
	 * 
	 * @see es.ejie.frmk.presentacion.operacion.paso.Q70ActionRemoto#procces(es.ejie.frmk.presentacion.base.Q70PasosOPMapping, java.lang.String, javax.servlet.http.HttpServletRequest, org.apache.struts.action.ActionForm)
	 */
	protected RedirectingActionForward procces(Q70PasosOPMapping mapping,String pathRemoto,HttpServletRequest request, ActionForm form) throws Q70OperacionDePresentacionException
	{
		RedirectingActionForward retVal = null;
		try
		{
			//Recoger los parametros del bean de formulario recibido y añadirselos como get a la nueva redireccion
			StringBuffer pathBuf = null;
			if ((form instanceof Q70OPForm)||(form instanceof Q70OPValidatorForm)) 
			{				
				Map opfMap = null;
				if (form instanceof Q70OPForm) {
					opfMap = ((Q70OPForm) form).getMap();
				} else {
					opfMap = ((Q70OPValidatorForm) form).getMap();
				}	
				if (opfMap!=null)
				{				
					Set opfSet = (Set) opfMap.entrySet();
					if (opfSet!=null) 
					{
						Iterator it = opfSet.iterator();
						if (it.hasNext()) 
						{
							pathBuf = new StringBuffer(256);
							pathBuf.append( pathRemoto ).append( "?" );
							while (it.hasNext())
							{
								Map.Entry entry = (Map.Entry)it.next();
								if (entry.getKey()!=null)
								{
									pathBuf.append( entry.getKey() )
										   .append( "=" )
										   .append( (entry.getValue()!=null ? entry.getValue() : "") )
										   .append( "&" );
								}
							}
							if ((pathBuf.toString().endsWith("?"))||(pathBuf.toString().endsWith("&"))) 
								pathBuf.deleteCharAt(pathBuf.length()-1);
						}
					}
				}
				
			}
			
			//Hacer una redireccion tipo response.sendRedirect(...)
			// a la url destino con los parametros del action concatenados 
			pathRemoto = (pathBuf!=null ? pathBuf.toString() : pathRemoto);
			
			retVal = new RedirectingActionForward(pathRemoto);
									
			if (tr.isTraceActive())
			{
				tr.trace(COMPONENTE, Q70TraceLevel.DEBUG, "Salida de dispatch = " + pathRemoto);
			}			
		}
		catch(Exception e)
		{
			throw new Q70OperacionDePresentacionException (this.getClass().toString(),"procces","Excepción en Action de Operacion de Presentacion",e);
		}
		return retVal;
	}

}

