package com.fp.base.persistence.util.helper;

import com.fp.common.exception.ExceptionHandler;
import com.fp.common.logger.APPLogger;
import com.fp.dto.hb.HibernateBean;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.commondb.PersistenceManager;
import com.fp.persistence.commondb.data.SessionData;
import com.fp.persistence.commondb.data.ThreadFacade;

/**
 * Clase que se encarga en insertar o actualizar un registro en la base de datos en un hilo diferente. 
 * @author Jorge Vaca.
 * @version 2.1
 *
 */
public class SaveBeanInOtherSession extends Thread {
	
	/**Codigo de compania con el cual se obtiene la coneccion a la base de datos.*/
	private Integer company;
	
	/**Objeto a enviar a la base de datos.*/
	private HibernateBean bean;
	
	public SaveBeanInOtherSession(Integer pCompany, HibernateBean pHibernateBean) throws Exception {
		company = pCompany;
		bean = pHibernateBean;
	}

	/**
	 * Metodo que se encarga de inicio de ejecucion del hilo. 
	 */
	public void run(){
		try {		
	        SessionData s = new SessionData();
	        s.setCompany(company);
	        ThreadFacade.setSaveRequest(s);	  
			PersistenceHelper.setEntityManager(PersistenceManager.getInstance().createEntityManagerLocal());
			PersistenceHelper.beginTransaction();	
			PersistenceHelper.saveOrUpdate(bean);
			PersistenceHelper.commitTransaction();
		} catch (Exception e) {
			APPLogger.getLogger().error(e);			
		}finally{
			try {
				//Cierra la sesion de base de datos con la cual se ejecuto el proceso de fin de dia.
				PersistenceHelper.closeSession();									
			} catch (Exception e) {
				ExceptionHandler eh = new ExceptionHandler(e,"es");
				APPLogger.getLogger().error(eh.getStackTrace());				
			}			
		}
	}
	

}
