*/
package org.opendaylight.controller.config.manager.impl.osgi;
-import org.opendaylight.controller.config.api.ModuleIdentifier;
-import org.opendaylight.controller.config.api.annotations.ServiceInterfaceAnnotation;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import static com.google.common.base.Preconditions.checkState;
-import javax.annotation.concurrent.GuardedBy;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkState;
+import javax.annotation.concurrent.GuardedBy;
+import org.opendaylight.controller.config.api.ModuleIdentifier;
+import org.opendaylight.controller.config.api.annotations.ServiceInterfaceAnnotation;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Registers instantiated beans as OSGi services and unregisters these services
*/
public OsgiRegistration registerToOsgi(AutoCloseable instance, ModuleIdentifier moduleIdentifier,
BundleContext bundleContext,
- Map<String, ServiceInterfaceAnnotation> serviceNamesToAnnotations) {
+ Map<ServiceInterfaceAnnotation, String /* service ref name */> serviceNamesToAnnotations) {
return new OsgiRegistration(instance, moduleIdentifier, bundleContext, serviceNamesToAnnotations);
}
@GuardedBy("this")
private final Set<ServiceRegistration<?>> serviceRegistrations;
@GuardedBy("this")
- private final Map<String, ServiceInterfaceAnnotation> serviceNamesToAnnotations;
+ private final Map<ServiceInterfaceAnnotation, String /* service ref name */> serviceNamesToAnnotations;
public OsgiRegistration(AutoCloseable instance, ModuleIdentifier moduleIdentifier,
BundleContext bundleContext,
- Map<String, ServiceInterfaceAnnotation> serviceNamesToAnnotations) {
+ Map<ServiceInterfaceAnnotation, String /* service ref name */> serviceNamesToAnnotations) {
this.instance = instance;
this.moduleIdentifier = moduleIdentifier;
this.serviceNamesToAnnotations = serviceNamesToAnnotations;
}
private static Set<ServiceRegistration<?>> registerToSR(AutoCloseable instance, BundleContext bundleContext,
- Map<String, ServiceInterfaceAnnotation> serviceNamesToAnnotations) {
+ Map<ServiceInterfaceAnnotation, String /* service ref name */> serviceNamesToAnnotations) {
Set<ServiceRegistration<?>> serviceRegistrations = new HashSet<>();
- for (Entry<String, ServiceInterfaceAnnotation> entry : serviceNamesToAnnotations.entrySet()) {
- Class<?> requiredInterface = entry.getValue().osgiRegistrationType();
+ for (Entry<ServiceInterfaceAnnotation, String /* service ref name */> entry : serviceNamesToAnnotations.entrySet()) {
+ Class<?> requiredInterface = entry.getKey().osgiRegistrationType();
checkState(requiredInterface.isInstance(instance), instance.getClass().getName() +
" instance should implement " + requiredInterface.getName());
- Dictionary<String, String> propertiesForOsgi = createProps(entry.getKey());
+ Dictionary<String, String> propertiesForOsgi = createProps(entry.getValue());
ServiceRegistration<?> serviceRegistration = bundleContext
.registerService(requiredInterface.getName(), instance, propertiesForOsgi);
serviceRegistrations.add(serviceRegistration);
@Override
public synchronized void close() {
for (ServiceRegistration<?> serviceRegistration : serviceRegistrations) {
- serviceRegistration.unregister();
+ try {
+ serviceRegistration.unregister();
+ } catch(IllegalStateException e) {
+ logger.trace("Cannot unregister {}", serviceRegistration, e);
+ }
}
serviceRegistrations.clear();
}
- public synchronized void updateRegistrations(Map<String, ServiceInterfaceAnnotation> newAnnotationMapping,
+ public synchronized void updateRegistrations(Map<ServiceInterfaceAnnotation, String /* service ref name */> newAnnotationMapping,
BundleContext bundleContext, AutoCloseable newInstance) {
boolean notEquals = this.instance != newInstance;
notEquals |= newAnnotationMapping.equals(serviceNamesToAnnotations) == false;