*/
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;
* @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";
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) {
+ 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;
}
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<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
// yet exist.
- if(initialUpdate) {
+ if (initialUpdate) {
initialUpdate = false;
} else {
blueprintContainerRestartService.restartContainerAndDependents(bundle);
managedServiceRegs.add(bundle.getBundleContext().registerService(ManagedService.class.getName(),
managedService, props));
}
+
+ private String logName() {
+ return bundle.getSymbolicName();
+ }
}