package org.tynamo.model.jpa.internal;
import java.util.Map;
import javax.persistence.EntityManager;
import org.apache.tapestry5.ioc.ObjectCreator;
import org.apache.tapestry5.ioc.ObjectLocator;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
import org.apache.tapestry5.jpa.EntityManagerManager;
import org.tynamo.model.jpa.TynamoJpaSymbols;
public class ConfigurableEntityManagerProvider {
private String persistenceUnitName;
private ObjectLocator locator;
private EntityManager proxy;
public ConfigurableEntityManagerProvider(ObjectLocator locator,
@Inject @Symbol(TynamoJpaSymbols.PERSISTENCEUNIT) String persistenceUnitName) {
this.locator = locator;
this.persistenceUnitName = persistenceUnitName;
}
public EntityManager getEntityManager() {
if (proxy != null) return proxy;
return getOrCreateProxy(persistenceUnitName, locator);
}
private synchronized EntityManager getOrCreateProxy(final String unitName, final ObjectLocator objectLocator) {
if (proxy == null) {
final PlasticProxyFactory proxyFactory = objectLocator.getService("PlasticProxyFactory", PlasticProxyFactory.class);
proxy = proxyFactory.createProxy(EntityManager.class, new ObjectCreator<EntityManager>() {
public EntityManager createObject() {
final EntityManagerManager entityManagerManager = objectLocator.getService(EntityManagerManager.class);
if (InternalUtils.isNonBlank(unitName)) return entityManagerManager.getEntityManager(unitName);
Map<String, EntityManager> entityManagers = entityManagerManager.getEntityManagers();
if (entityManagers.size() == 1) return entityManagers.values().iterator().next();
throw new RuntimeException(
"Unable to locate a single EntityManager. "
+ "You must provide the persistence unit name using the TynamoJpaSymbols.PERSISTENCEUNIT symbol");
}
}, "<EntityManagerProxy>");
}
return proxy;
}
}