package es.ejie.frmk.negocio.adaptadorinvocacion.dynamic;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.transaction.Status;
import javax.transaction.UserTransaction;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.infraestructura.logs.transacciones.Q70LogTransaccionesInterface;

public class Q70ServiceHandler implements InvocationHandler
{
	//public static  Q70LogTransacciones logTransacciones = Q70LogTransacciones.getSingleton();
	Object stubEJB;
	public Q70ServiceHandler(Object o)
	{
		this.stubEJB = o;
	}

	public Object invoke(Object object, Method method, Object[] objectArray) throws Throwable
	{
		Object ret = null;
		int status=-1;
		StringBuffer datos=null;
		try
		{
			if (stubEJB != null)
			{
				//cargar los datos 
				datos = new StringBuffer();
				if (objectArray!=null && objectArray.length>0)
				{
				
					for (int i=0;i<objectArray.length;i++)
					{
						datos.append(objectArray[i]);
						if(!(i==objectArray.length-1))
							datos.append(",");
					}
				}	
				else
				{
					datos.append(" ");
				}
				Q70LogTransaccionesInterface logTransacciones = Q70Factoria.getLogTransacciones();
				//Loggear el inicio de la transacción.
				if (logTransacciones.isEnabled())
					logTransacciones.log(stubEJB.getClass().getName(),method.getName(),datos.toString(),null,null,null);				
				
				//Iniciar la tansacción en el cliente.
				Context c = new InitialContext();
				UserTransaction ut = (UserTransaction)c.lookup("java:comp/UserTransaction");
				ut.begin();
				//invocar al método del ejb
				ret = method.invoke(this.stubEJB, objectArray);
				//chekear el estado de la transacción.				
				status = ut.getStatus();
				switch(status)
				{
					case Status.STATUS_ACTIVE:
						ut.commit();
						break;
					case Status.STATUS_MARKED_ROLLBACK:
						ut.rollback();
						break;
				}
				//Loggear el inicio de la transacción.
				if (logTransacciones.isEnabled())
					logTransacciones.log(stubEJB.getClass().getName(),method.getName(),datos.toString(),"OK","" + status,ret.toString());
				return ret;
			}
		}
		catch (Throwable e)
		{
			//Loggear Error
			e.printStackTrace();
			Q70LogTransaccionesInterface logTransacciones = Q70Factoria.getLogTransacciones();
			logTransacciones.log(stubEJB.getClass().getName(),method.getName(),datos.toString(),"ERROR","" + status, "");
			throw e;
		}
		return null;
	}
}