in tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/AbstractManagedJPAEMFLocator.java [173:203]
private void updateService(ServiceReference<EntityManagerFactoryBuilder> reference, EntityManagerFactoryBuilder service) {
boolean setEMFB;
synchronized (this) {
setEMFB = activeEMFB.compareAndSet(null, service);
}
if (setEMFB) {
AbstractJPAEntityManagerProvider provider = null;
Map<String, Object> jpaProps = jpaProperties.get();
Runnable close = () -> onClose.accept(jpaProps);
try {
provider = getResourceProvider(context, service, reference, jpaProps, providerProperties, close);
providerObject.set(provider);
ServiceRegistration<JPAEntityManagerProvider> reg = context
.registerService(JPAEntityManagerProvider.class, provider, getServiceProperties());
if (!serviceReg.compareAndSet(null, reg)) {
throw new IllegalStateException("Unable to set the JDBC connection provider registration");
}
} catch (Exception e) {
LOG.error("An error occurred when creating the resource provider for {}.", pid, e);
activeEMFB.compareAndSet(service, null);
if(provider != null) {
provider.close();
} else {
// Make sure that we don't leak the DataSource
close.run();
}
}
}
}