*/
package org.opendaylight.controller.blueprint.ext;
+import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Hashtable;
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;
private Bundle bundle;
private BlueprintContainerRestartService blueprintContainerRestartService;
private boolean restartDependentsOnUpdates;
+ private boolean useDefaultForReferenceTypes;
public void setBundle(Bundle bundle) {
this.bundle = bundle;
this.restartDependentsOnUpdates = restartDependentsOnUpdates;
}
+ public void setUseDefaultForReferenceTypes(boolean useDefaultForReferenceTypes) {
+ this.useDefaultForReferenceTypes = useDefaultForReferenceTypes;
+ }
+
public void destroy() {
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()) {
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()) {
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;
@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
managedServiceRegs.add(bundle.getBundleContext().registerService(ManagedService.class.getName(),
managedService, props));
}
+
+ private String logName() {
+ return bundle.getSymbolicName();
+ }
}