public ConfigurationOSGiImpl()

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