Add decorating "type" attr extension for service refs
[controller.git] / opendaylight / blueprint / src / main / java / org / opendaylight / controller / blueprint / ext / ComponentProcessor.java
index ed87e7093ba7aa13ed09a9b5ce13ad0cdc154a60..bae06b1ea6335e9ef5daecd81756fc7590250b84 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.controller.blueprint.ext;
 
+import com.google.common.base.Strings;
 import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.Hashtable;
@@ -15,6 +16,7 @@ import org.apache.aries.blueprint.ComponentDefinitionRegistry;
 import org.apache.aries.blueprint.ComponentDefinitionRegistryProcessor;
 import org.apache.aries.blueprint.ext.AbstractPropertyPlaceholder;
 import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.aries.blueprint.mutable.MutableServiceReferenceMetadata;
 import org.apache.aries.util.AriesFrameworkUtil;
 import org.opendaylight.controller.blueprint.BlueprintContainerRestartService;
 import org.osgi.framework.Bundle;
@@ -41,6 +43,7 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor
     private Bundle bundle;
     private BlueprintContainerRestartService blueprintContainerRestartService;
     private boolean restartDependentsOnUpdates;
+    private boolean useDefaultForReferenceTypes;
 
     public void setBundle(Bundle bundle) {
         this.bundle = bundle;
@@ -54,6 +57,10 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor
         this.restartDependentsOnUpdates = restartDependentsOnUpdates;
     }
 
+    public void setUseDefaultForReferenceTypes(boolean useDefaultForReferenceTypes) {
+        this.useDefaultForReferenceTypes = useDefaultForReferenceTypes;
+    }
+
     public void destroy() {
         for(ServiceRegistration<?> reg: managedServiceRegs) {
             AriesFrameworkUtil.safeUnregisterService(reg);
@@ -62,20 +69,42 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor
 
     @Override
     public void process(ComponentDefinitionRegistry registry) {
-        LOG.debug("{}: In process", bundle.getSymbolicName());
+        LOG.debug("{}: In process",  logName());
 
         for(String name : registry.getComponentDefinitionNames()) {
             ComponentMetadata component = registry.getComponentDefinition(name);
             if(component instanceof MutableBeanMetadata) {
                 processMutableBeanMetadata((MutableBeanMetadata)component);
+            } else if(component instanceof MutableServiceReferenceMetadata) {
+                processServiceReferenceMetadata((MutableServiceReferenceMetadata)component);
             }
         }
     }
 
+    private void processServiceReferenceMetadata(MutableServiceReferenceMetadata serviceRef) {
+        if(!useDefaultForReferenceTypes) {
+            return;
+        }
+
+        String filter = serviceRef.getFilter();
+        String extFilter = serviceRef.getExtendedFilter() == null ? null :
+            serviceRef.getExtendedFilter().getStringValue();
+
+        LOG.debug("{}: processServiceReferenceMetadata for {}, filter: {}, ext filter: {}", logName(),
+                serviceRef.getId(), filter, extFilter);
+
+        if(Strings.isNullOrEmpty(filter) && Strings.isNullOrEmpty(extFilter)) {
+            serviceRef.setFilter("(|(type=default)(!(type=*)))");
+
+            LOG.debug("{}: processServiceReferenceMetadata for {} set filter to {}", logName(),
+                    serviceRef.getId(), serviceRef.getFilter());
+        }
+    }
+
     private void processMutableBeanMetadata(MutableBeanMetadata bean) {
         if(restartDependentsOnUpdates && bean.getRuntimeClass() != null &&
                 AbstractPropertyPlaceholder.class.isAssignableFrom(bean.getRuntimeClass())) {
-            LOG.debug("{}: Found PropertyPlaceholder bean: {}, runtime {}", bundle.getSymbolicName(), bean.getId(),
+            LOG.debug("{}: Found PropertyPlaceholder bean: {}, runtime {}", logName(), bean.getId(),
                     bean.getRuntimeClass());
 
             for(BeanProperty prop: bean.getProperties()) {
@@ -83,13 +112,13 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor
                     if(prop.getValue() instanceof ValueMetadata) {
                         ValueMetadata persistentId = (ValueMetadata)prop.getValue();
 
-                        LOG.debug("{}: Found {} property, value : {}", bundle.getSymbolicName(),
+                        LOG.debug("{}: Found {} property, value : {}", logName(),
                                 CM_PERSISTENT_ID_PROPERTY, persistentId.getStringValue());
 
                         registerManagedService(persistentId.getStringValue());
                     } else {
                         LOG.debug("{}: {} property metadata {} is not instanceof ValueMetadata",
-                                bundle.getSymbolicName(), CM_PERSISTENT_ID_PROPERTY, prop.getValue());
+                                logName(), CM_PERSISTENT_ID_PROPERTY, prop.getValue());
                     }
 
                     break;
@@ -107,7 +136,7 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor
             @Override
             public void updated(Dictionary<String, ?> properties) {
                 LOG.debug("{}: ManagedService updated for persistentId {}, properties: {}, initialUpdate: {}",
-                        bundle.getSymbolicName(), persistentId, properties, initialUpdate);
+                        logName(), persistentId, properties, initialUpdate);
 
                 // The first update occurs when the service is registered so ignore it as we want subsequent
                 // updates when it changes. The ConfigAdmin will send an update even if the cfg file doesn't
@@ -127,4 +156,8 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor
         managedServiceRegs.add(bundle.getBundleContext().registerService(ManagedService.class.getName(),
                 managedService, props));
     }
+
+    private String logName() {
+        return bundle.getSymbolicName();
+    }
 }