in component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationOSGiImpl.java [42:154]
public ConfigurationOSGiImpl(String pid) {
super((executionContext, op) -> {
AtomicReference<Configuration> atomicReference =
new AtomicReference<>(null);
AtomicReference<OSGiResult>
terminatorAtomicReference = new AtomicReference<>(
new OSGiResultImpl(NOOP, () -> false));
AtomicBoolean closed = new AtomicBoolean();
AtomicLong initialCounter = new AtomicLong();
CountDownLatch countDownLatch = new CountDownLatch(1);
BundleContext bundleContext = executionContext.getBundleContext();
ServiceRegistration<?> serviceRegistration =
bundleContext.registerService(
ConfigurationListener.class,
(ConfigurationEvent configurationEvent) -> {
if (configurationEvent.getFactoryPid() != null ||
!configurationEvent.getPid().equals(pid)) {
return;
}
try {
countDownLatch.await(1, TimeUnit.MINUTES);
}
catch (InterruptedException e) {
return;
}
Configuration configuration;
if (configurationEvent.getType() ==
ConfigurationEvent.CM_DELETED) {
atomicReference.set(null);
signalLeave(terminatorAtomicReference);
}
else {
configuration = getConfiguration(
bundleContext, configurationEvent);
if (configuration == null ||
configuration.getChangeCount() == initialCounter.get()) {
return;
}
if (atomicReference.get() == null) {
atomicReference.set(configuration);
}
else {
if (!UpdateSupport.sendUpdate(terminatorAtomicReference.get())) {
return;
}
}
UpdateSupport.runUpdate(() -> {
signalLeave(terminatorAtomicReference);
terminatorAtomicReference.set(
op.apply(new ConfigurationHolderImpl(configuration)));
});
if (closed.get()) {
/*
if we have closed while executing the
effects we have to execute the terminator
directly instead of storing it
*/
signalLeave(terminatorAtomicReference);
}
}
},
new Hashtable<>());
ServiceReference<ConfigurationAdmin> serviceReference =
bundleContext.getServiceReference(ConfigurationAdmin.class);
if (serviceReference != null) {
Configuration configuration = getConfiguration(
bundleContext, pid, serviceReference);
if (configuration != null) {
atomicReference.set(configuration);
initialCounter.set(configuration.getChangeCount());
terminatorAtomicReference.set(
op.apply(new ConfigurationHolderImpl(configuration)));
}
}
countDownLatch.countDown();
return new OSGiResultImpl(
() -> {
closed.set(true);
serviceRegistration.unregister();
signalLeave(terminatorAtomicReference);
},
() -> terminatorAtomicReference.get().update())
;
});
}