private void updateService()

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();
				}
					
			}
		}
	}