All Downloads are FREE. Search and download functionalities are using the official Maven repository.

br.com.persistence.transaction.Transaction Maven / Gradle / Ivy

There is a newer version: 2.1.2-RC
Show newest version
package br.com.persistence.transaction;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.annotation.PreDestroy;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.persistence.EntityManager;

import br.com.persistence.dao.DAO;
import br.com.persistence.manager.Session;
import br.com.persistence.model.DatabaseConfig;

public class Transaction implements Serializable {
	private static final long serialVersionUID = 1L;

	private Map entityManagers;
	private Session session;
	private TransactionalAction transactionalAction;
	
	public Transaction(Session session) {
		this.session = session;
		transactionalAction = TransactionalAction.COMMIT;
		entityManagers = new HashMap();
	}

	@SuppressWarnings("unchecked")
	public EntityManager entityManagerFactory(InjectionPoint injectionPoint) {
		Class dao = injectionPoint.getMember().getDeclaringClass();
		
		if (dao.getSuperclass().equals(DAO.class)) {
			return entityManagerFactory((Class>) dao);
		}
		
		throw new NullPointerException(
				"Classe " + dao.getSimpleName() + " nao eh um tipo DAO valido");
	}
	
	public EntityManager entityManagerFactory(Class> dao) {
		DatabaseConfig database = session.getConfig(dao);
		
		EntityManager entityManager;
		if (entityManagers.containsKey(database.getKey())) {
			entityManager = entityManagers.get(database.getKey());
		} else {
			entityManager = session.getEntityManager(database);
			entityManagers.put(database.getKey(), entityManager);	
		}
		
		if (!entityManager.getTransaction().isActive()) 
			entityManager.getTransaction().begin();	
		return entityManager;
	}
	
	public int getOpenedEntityManager() {
		return entityManagers.size();
	}
	
	public void setTransactionalAction(TransactionalAction transactionalAction) {
		this.transactionalAction = transactionalAction;
	}
	
	@PreDestroy
	public void finalize() {
		Set keys = entityManagers.keySet();
		for (String key : keys) {
			closeEntityManager(entityManagers.get(key));
		}
		entityManagers.clear();
	}

	public void commit() {
		this.transactionalAction = TransactionalAction.COMMIT;
		finalize();
	}
	
	public void rollback() {
		this.transactionalAction = TransactionalAction.ROLLBACK;
		finalize();
	}
	
	private void closeEntityManager(EntityManager entityManager) {
		if (entityManager != null) {
			if (entityManager.isOpen()) {
				if (entityManager.getTransaction().isActive()) {
					if (transactionalAction.equals(TransactionalAction.COMMIT)) {
						entityManager.getTransaction().commit();
					} else {
						entityManager.getTransaction().rollback();
					}
				}
				entityManager.close();
			}
		}
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy