in winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java [158:289]
public ServiceRegistration<?> registerService(final String[] classes, final Object service,
final Dictionary<String, ?> properties,
final Bundle from) {
final Hashtable<String, Object> serviceProperties = new Hashtable<String, Object>() {
@Override
public Object get(final Object key) {
final String property = System.getProperty(String.valueOf(key));
if (forcedDeepPropertyRead.contains(key)) { // http.port for ex
final Object overridenValue = super.get(key);
if (overridenValue != null) {
return overridenValue;
}
}
return property != null ? property : super.get(key);
}
};
if (properties != null) {
list(properties.keys()).forEach(key -> serviceProperties.put(key, properties.get(key)));
}
serviceProperties.put(Constants.OBJECTCLASS, classes.length == 1 ? classes[0] : classes);
serviceProperties.put(Constants.SERVICE_ID, idGenerator.getAndIncrement());
serviceProperties.put(Constants.SERVICE_BUNDLEID, from.getBundleId());
if (ServiceFactory.class.isInstance(service)) {
serviceProperties.put(Constants.SERVICE_SCOPE, PrototypeServiceFactory.class.isInstance(service) ?
Constants.SCOPE_PROTOTYPE : Constants.SCOPE_BUNDLE);
} else {
serviceProperties.put(Constants.SERVICE_SCOPE, Constants.SCOPE_SINGLETON);
}
final boolean isConfigListener = Stream.of(classes).anyMatch(it -> it.equals(ConfigurationListener.class.getName()));
if (isConfigListener) {
synchronized (configurationListeners) {
configurationListeners.add(ConfigurationListener.class.cast(service));
}
}
boolean isEventHandler = Stream.of(classes).anyMatch(it -> it.equals(EventHandler.class.getName()));
final boolean removeEventHandler = isEventHandler;
final boolean serviceFindHook = Stream.of(classes).anyMatch(it -> it.equals(FindHook.class.getName()));
final boolean bundleFindHook = Stream.of(classes).anyMatch(it -> it.equals(org.osgi.framework.hooks.bundle.FindHook.class.getName()));
final boolean eventListenerHook = Stream.of(classes).anyMatch(it -> it.equals(EventListenerHook.class.getName()));
final ServiceReferenceImpl<Object> ref = new ServiceReferenceImpl<>(serviceProperties, from, service);
final ServiceRegistrationImpl<Object> registration = new ServiceRegistrationImpl<>(classes,
serviceProperties, ref, reg -> {
final ServiceEvent event = new ServiceEvent(ServiceEvent.UNREGISTERING, reg.getReference());
fireEvent(reg, event);
synchronized (OSGiServices.this) {
services.remove(reg);
}
if (isConfigListener) {
synchronized (configurationListeners) {
configurationListeners.remove(ConfigurationListener.class.cast(service));
}
}
if (removeEventHandler) {
synchronized (eventListeners) {
eventListeners.removeIf(it -> it.getHandler() == service);
}
}
if (serviceFindHook) {
hooks.getServiceFindHooks().remove(ref);
}
if (bundleFindHook) {
hooks.getBundleFindHooks().remove(ref);
}
if (eventListenerHook) {
hooks.getEventListenerHooks().remove(ref);
}
});
if (isEventHandler) {
final Object topics = properties.get(EventConstants.EVENT_TOPIC);
final String[] topicsArray = String[].class.isInstance(topics) ?
String[].class.cast(topics) :
(String.class.isInstance(topics) ? new String[]{ String.class.cast(topics)} :
Collection.class.isInstance(properties) ?
((Collection<Object>) topics).stream().map(String::valueOf).toArray(String[]::new) :
null);
if (topics == null) {
LOGGER.warn("No topic for {}", service);
} else {
synchronized (eventListeners) {
eventListeners.add(new DefaultEventAdmin.EventHandlerInstance(
from,
EventHandler.class.isInstance(service) ?
EventHandler.class.cast(service) :
new DefaultEventAdmin.EventHandlerFactory(
from, ServiceRegistration.class.cast(registration),
ServiceFactory.class.cast(service)),
Stream.of(topicsArray).anyMatch("*"::equals) ? null : topicsArray,
ofNullable(properties.get(EventConstants.EVENT_FILTER)).map(String::valueOf).orElse(null)));
}
}
}
final Object pid = serviceProperties.get(Constants.SERVICE_PID);
if (pid != null) {
final ConfigurationAdmin configurationAdmin = framework.getConfigurationAdmin();
asStream(pid).forEach(it -> initConfiguration(serviceProperties, configurationAdmin, it));
}
final Object factoryPid = serviceProperties.get("service.factoryPid");
if (factoryPid != null) {
final ConfigurationAdmin configurationAdmin = framework.getConfigurationAdmin();
asStream(factoryPid).forEach(it -> initFactoryConfiguration(serviceProperties, configurationAdmin, it));
}
services.add(registration);
final ServiceEvent event = new ServiceEvent(ServiceEvent.REGISTERED, ref);
if (ManagedService.class.isInstance(service)) {
try {
ManagedService.class.cast(service).updated(serviceProperties);
} catch (final ConfigurationException e) {
throw new IllegalStateException(e);
}
}
fireEvent(registration, event);
if (serviceFindHook) {
hooks.getServiceFindHooks().add(ServiceReference.class.cast(ref));
}
if (bundleFindHook) {
hooks.getBundleFindHooks().add(ServiceReference.class.cast(ref));
}
if (eventListenerHook) {
hooks.getEventListenerHooks().add(ServiceReference.class.cast(ref));
}
return registration;
}