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