private OSGi safeRegisterExtension()

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


    private OSGi<?> safeRegisterExtension(
        CachingServiceReference<?> serviceReference,
        CxfJaxrsServiceRegistrator registrator) {

        Map<?, ?> properties = registrator.getProperties();

        Bundle originalBundle = _bundleContext.getBundle(
            Long.class.cast(properties.get("service.bundleid")).longValue());

        return
            just(() -> getServiceName(properties::get)).
                flatMap(applicationName ->
            changeContext(
                originalBundle.getBundleContext(),
                    onlyGettables(
                        just(serviceReference),
                        _runtime::addNotGettableExtension,
                        _runtime::removeNotGettableExtension,
                        _log
                    )
                ).recoverWith(
                (t, e) ->
                    just(t.getCachingServiceReference()).
                    effects(
                        _runtime::addErroredExtension,
                        _runtime::removeErroredExtension
                    ).
                    effects(
                        ifErrorEnabled(
                            _log,
                            () -> "ServiceReference {} for extension " +
                                "produced error: {}",
                            e),
                        ifErrorEnabled(
                            _log,
                            () -> "Errored ServiceReference {} for extension " +
                                "left")
                    ).
                    then(nothing())
            ).effects(
                registrator::addProvider,
                registrator::removeProvider
            ).effects(
                t -> _runtime.addApplicationExtension(
                    properties::get, serviceReference,
                    t.getService().getClass()),
                __ -> _runtime.removeApplicationExtension(
                    properties::get, serviceReference)
            ).
            effects(
                ifDebugEnabled(
                    _log,
                    () ->
                        "Registered extension " +
                            serviceReference.getServiceReference() +
                                " into application " +
                            getServiceName(properties::get)
                ),
                ifDebugEnabled(
                    _log,
                    () ->
                        "Unregistered extension  " +
                            serviceReference.getServiceReference() +
                            " from application " +
                            getServiceName(properties::get)
                )

            ).
            effects(
                __ -> registrator.registerExtension(
                    serviceReference),
                __ -> registrator.unregisterExtension(
                    serviceReference)
            ));
    }