/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.dao; /* * #%L * Data Access * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * TransactionContainer * * @author dangleton * */ public class TransactionContainer { private static final Logger LOG = LogManager.getLogger(TransactionContainer.class); private static EntityManagerFactory entityManagerFactory; private static volatile boolean initialized = false; private static Boolean lock = new Boolean(true); private EntityManager em; private EntityTransaction transaction; private Object initiatingObject; /** * @param em * @param initiatingObject */ public TransactionContainer() { synchronized(lock){ if(initialized){ return; } initialized = true; try{ entityManagerFactory = Persistence.createEntityManagerFactory("wats"); } catch(Throwable t){ LOG.error("Failed to setup persistence unit!", t); } } } /** * @return the em */ public EntityManager getEntityManager() { if (em == null) { em = entityManagerFactory.createEntityManager(); } return em; } public void startTrasaction(Object initiatingObject) { if (em == null) { getEntityManager(); } if (transaction == null) { transaction = em.getTransaction(); transaction.begin(); LOG.debug("Starting transaciton with initiating Object " + initiatingObject); this.initiatingObject = initiatingObject; } else { LOG.debug("Transaction already started with initiating Object " + this.initiatingObject + " attempted initiating object " + initiatingObject); } } public void commitTransaction(Object initiatingObject) { if (transaction != null && this.initiatingObject == initiatingObject) { LOG.debug("Committing transaciton with initiating Object " + initiatingObject); transaction.commit(); } else { LOG.debug("Commit ignored from initiating Object " + initiatingObject + " need initiating object " + this.initiatingObject); } } public void rollbackTransaction(Object initiatingObject) { if (transaction != null && this.initiatingObject == initiatingObject) { LOG.debug("Rollback transaciton with initiating Object " + initiatingObject); transaction.rollback(); } else { LOG.debug("Rollback ignored from initiating Object " + initiatingObject + " need initiating object " + this.initiatingObject); } } public void cleanup(Object initiatingObject) { if (this.initiatingObject == initiatingObject) { if (transaction != null) { if (transaction.isActive()) { LOG.info("Rolling back transaciton with initiating Object " + initiatingObject); transaction.rollback(); } transaction = null; } if (em != null && em.isOpen()) { LOG.debug("Closing EntityManager"); em.clear(); em.close(); em = null; } } else { LOG.debug("Rollback ignored from initiating Object " + initiatingObject + " need initiating object " + this.initiatingObject); } } }