private OSGi waitForExtensionDependencies()

in jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Whiteboard.java [1137:1214]


    private OSGi<?> waitForExtensionDependencies(
        CachingServiceReference<?> reference,
        CxfJaxrsServiceRegistrator cxfJaxrsServiceRegistrator,
        Consumer<CachingServiceReference<?>> onAddingDependent,
        Consumer<CachingServiceReference<?>> onRemovingDependent) {

        Map<String, ?> applicationRegistratorProperties =
            cxfJaxrsServiceRegistrator.getProperties();

        String[] extensionDependencies = canonicalize(
            reference.getProperty(JAX_RS_EXTENSION_SELECT));

        OSGi<CachingServiceReference<?>> program = just(reference);

        if (extensionDependencies.length == 0) {
            return program;
        }

        for (String extensionDependency : extensionDependencies) {
            if  (_log.isDebugEnabled()) {
                _log.debug(
                    "Extension {} has a dependency on {}",
                    reference, extensionDependency);
            }

            try {
                String finalExtensionDependency = extensionDependency.replace(
                    "(objectClass=", "(original.objectClass=");

                Filter extensionFilter = _bundleContext.createFilter(
                    finalExtensionDependency);

                if (extensionFilter.match(_runtimeReference) ||
                    extensionFilter.matches(
                        applicationRegistratorProperties))
                {
                    continue;
                }

                program =
                    once(
                        cxfJaxrsServiceRegistrator.waitForExtension(
                            extensionDependency).
                        effects(
                            __ -> {},
                            __ -> onAddingDependent.accept(reference)
                        )
                    ).effects(
                        ifDebugEnabled(
                            _log,
                            () -> "Extension " + reference +
                                " dependency " + extensionDependency +
                                    " has been fullfiled"),
                        ifDebugEnabled(
                            _log,
                            () -> "Extension " + reference +
                                " dependency " + extensionDependency +
                                    " has gone")
                    ).
                then(program);
            }
            catch (InvalidSyntaxException e) {

            }
        }

        program = effects(
            () -> onAddingDependent.accept(reference),
            () -> onRemovingDependent.accept(reference)).
            then(program);

        program = program.effects(
            __ -> onRemovingDependent.accept(reference),
            __ -> {}
        );

        return program;
    }