X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=opendaylight%2Fblueprint%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fblueprint%2Fext%2FComponentProcessor.java;h=14b3c2b849f64c6d9c63db0b588a11bec5cdeb5f;hb=67ff0fc78b2933b8b4f5a8544c7639499824e622;hp=ed87e7093ba7aa13ed09a9b5ce13ad0cdc154a60;hpb=36de1fd1c214d98ae97e6d7725f323dd01e34977;p=controller.git diff --git a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/ComponentProcessor.java b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/ComponentProcessor.java index ed87e7093b..14b3c2b849 100644 --- a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/ComponentProcessor.java +++ b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/ComponentProcessor.java @@ -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; @@ -34,6 +36,8 @@ import org.slf4j.LoggerFactory; * @author Thomas Pantelis */ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor { + static final String DEFAULT_TYPE_FILTER = "(|(type=default)(!(type=*)))"; + private static final Logger LOG = LoggerFactory.getLogger(ComponentProcessor.class); private static final String CM_PERSISTENT_ID_PROPERTY = "persistentId"; @@ -41,6 +45,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,42 +59,68 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor this.restartDependentsOnUpdates = restartDependentsOnUpdates; } + public void setUseDefaultForReferenceTypes(boolean useDefaultForReferenceTypes) { + this.useDefaultForReferenceTypes = useDefaultForReferenceTypes; + } + public void destroy() { - for(ServiceRegistration reg: managedServiceRegs) { + for (ServiceRegistration reg: managedServiceRegs) { AriesFrameworkUtil.safeUnregisterService(reg); } } @Override public void process(ComponentDefinitionRegistry registry) { - LOG.debug("{}: In process", bundle.getSymbolicName()); + LOG.debug("{}: In process", logName()); - for(String name : registry.getComponentDefinitionNames()) { + for (String name : registry.getComponentDefinitionNames()) { ComponentMetadata component = registry.getComponentDefinition(name); - if(component instanceof MutableBeanMetadata) { - processMutableBeanMetadata((MutableBeanMetadata)component); + 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(DEFAULT_TYPE_FILTER); + + 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(), + if (restartDependentsOnUpdates && bean.getRuntimeClass() != null + && AbstractPropertyPlaceholder.class.isAssignableFrom(bean.getRuntimeClass())) { + LOG.debug("{}: Found PropertyPlaceholder bean: {}, runtime {}", logName(), bean.getId(), bean.getRuntimeClass()); - for(BeanProperty prop: bean.getProperties()) { - if(CM_PERSISTENT_ID_PROPERTY.equals(prop.getName())) { - if(prop.getValue() instanceof ValueMetadata) { + for (BeanProperty prop : bean.getProperties()) { + if (CM_PERSISTENT_ID_PROPERTY.equals(prop.getName())) { + 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; @@ -99,20 +130,20 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor } private void registerManagedService(final String persistentId) { - // Register a ManagedService so we git updates from the ConfigAdmin when the cfg file corresponding + // Register a ManagedService so we get updates from the ConfigAdmin when the cfg file corresponding // to the persistentId changes. - ManagedService managedService = new ManagedService() { + final ManagedService managedService = new ManagedService() { private volatile boolean initialUpdate = true; @Override public void updated(Dictionary 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 // yet exist. - if(initialUpdate) { + if (initialUpdate) { initialUpdate = false; } else { blueprintContainerRestartService.restartContainerAndDependents(bundle); @@ -127,4 +158,8 @@ public class ComponentProcessor implements ComponentDefinitionRegistryProcessor managedServiceRegs.add(bundle.getBundleContext().registerService(ManagedService.class.getName(), managedService, props)); } + + private String logName() { + return bundle.getSymbolicName(); + } }