From: Tomas Cechvala Date: Wed, 20 Apr 2016 10:54:19 +0000 (+0200) Subject: Bug 5510 - Modifying DataTreeChangeHandler X-Git-Tag: release/boron~210 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=57d89fde6ea8d7fab2524d8ef08faebcc0c73673;hp=788f339286d0892a0e3b2115887c7c476455bbdb;p=groupbasedpolicy.git Bug 5510 - Modifying DataTreeChangeHandler Listener registration moved out from constructor to overcome cases when data already exist in DS and change event might be received before class initialization is finished. Change-Id: I7898eb4fa9472e91b8cff2d127d9beb51b55c3de Signed-off-by: Tomas Cechvala --- diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java index 370f82bc7..4ed80025e 100755 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java @@ -309,7 +309,8 @@ public class PolicyResolver implements PolicyValidatorRegistry, AutoCloseable { private class PolicyChangeListener extends DataTreeChangeHandler { protected PolicyChangeListener(DataBroker dataProvider, DataTreeIdentifier pointOfInterest) { - super(dataProvider, pointOfInterest); + super(dataProvider); + registerDataTreeChangeListener(pointOfInterest); } @Override diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/sf/SupportedClassifierDefinitionListener.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/sf/SupportedClassifierDefinitionListener.java index e152fd667..07f1950ac 100644 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/sf/SupportedClassifierDefinitionListener.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/sf/SupportedClassifierDefinitionListener.java @@ -53,8 +53,7 @@ public class SupportedClassifierDefinitionListener extends DataTreeChangeHandler private final PolicyValidatorRegistry validatorRegistry; public SupportedClassifierDefinitionListener(DataBroker dataProvider, PolicyValidatorRegistry validatorRegistry) { - super(dataProvider, new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, - IidFactory.supportedClassifierDefinitionIidWildcard())); + super(dataProvider); this.validatorRegistry = validatorRegistry; if (validatorRegistry == null) { LOG.info( @@ -65,6 +64,8 @@ public class SupportedClassifierDefinitionListener extends DataTreeChangeHandler "{} service was found. Automatic registration of simple classifier-instance validators is available for renderers.", PolicyValidatorRegistry.class.getCanonicalName()); } + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + IidFactory.supportedClassifierDefinitionIidWildcard())); } @Override diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/util/DataTreeChangeHandler.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/util/DataTreeChangeHandler.java index d321e32be..ae72a3a65 100644 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/util/DataTreeChangeHandler.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/util/DataTreeChangeHandler.java @@ -26,23 +26,28 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; * The purpose of this class is to eliminate boilerplate code used in most of * {@link DataTreeChangeListener} implementations. * - * @param + * @param target class */ public abstract class DataTreeChangeHandler implements DataTreeChangeListener, AutoCloseable { protected final DataBroker dataProvider; - protected final ListenerRegistration> registeredListener; + protected ListenerRegistration> registeredListener; /** - * Registers {@link DataTreeChangeListener} for {@code pointOfInterest} by using - * {@code dataProvider} * * @param dataProvider cannot be {@code null} - * @param pointOfInterest cannot be {@code null} - * @throws NullPointerException if at least one paramter is {@code null} + * @throws NullPointerException if dataProvider is {@code null} */ - protected DataTreeChangeHandler(DataBroker dataProvider, DataTreeIdentifier pointOfInterest) { + protected DataTreeChangeHandler(DataBroker dataProvider) { this.dataProvider = checkNotNull(dataProvider); + } + + /** + * + * @param pointOfInterest identifier of root node + * @throws NullPointerException if pointOfInterest is {@code null} + */ + protected void registerDataTreeChangeListener(DataTreeIdentifier pointOfInterest) { registeredListener = dataProvider.registerDataTreeChangeListener(checkNotNull(pointOfInterest), this); } diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/OvsdbNodeListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/OvsdbNodeListener.java index f8fc121da..c191a1397 100644 --- a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/OvsdbNodeListener.java +++ b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/OvsdbNodeListener.java @@ -20,6 +20,7 @@ import java.util.Set; import javax.annotation.Nonnull; import org.opendaylight.controller.config.yang.config.neutron_ovsdb.impl.IntegrationBridgeSetting; +import org.opendaylight.controller.config.yang.config.neutron_ovsdb.impl.NeutronOvsdbModule; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; @@ -94,12 +95,12 @@ public class OvsdbNodeListener extends DataTreeChangeHandler { private final Map, NeutronBridgeWithExtPort> bridgeByNodeIid = new HashMap<>(); public OvsdbNodeListener(DataBroker dataProvider, IntegrationBridgeSetting brSettings) { - super(dataProvider, - new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, - InstanceIdentifier.create(NetworkTopology.class) - .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID)) - .child(Node.class))); + super(dataProvider); intBrSettings = brSettings; + this.registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + InstanceIdentifier.create(NetworkTopology.class) + .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID)) + .child(Node.class))); } @Override diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/PortByEndpointListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/PortByEndpointListener.java index 499725967..764567e8d 100644 --- a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/PortByEndpointListener.java +++ b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/PortByEndpointListener.java @@ -48,13 +48,13 @@ public class PortByEndpointListener extends DataTreeChangeHandler(LogicalDatastoreType.OPERATIONAL, - InstanceIdentifier.builder(Mappings.class) - .child(NeutronByGbpMappings.class) - .child(PortsByEndpoints.class) - .child(PortByEndpoint.class) - .build())); + super(dataProvider); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + InstanceIdentifier.builder(Mappings.class) + .child(NeutronByGbpMappings.class) + .child(PortsByEndpoints.class) + .child(PortByEndpoint.class) + .build())); } @Override diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/ProviderPhysicalNetworkListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/ProviderPhysicalNetworkListener.java index 72233f336..d0bc88803 100644 --- a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/ProviderPhysicalNetworkListener.java +++ b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/ProviderPhysicalNetworkListener.java @@ -35,8 +35,8 @@ public class ProviderPhysicalNetworkListener extends DataTreeChangeHandler(LogicalDatastoreType.OPERATIONAL, + super(dataProvider); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(Mappings.class) .child(NeutronByGbpMappings.class) .child(ProviderPhysicalNetworksAsL2FloodDomains.class) diff --git a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/IovisorResolvedEndpointListener.java b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/IovisorResolvedEndpointListener.java index 81f7e9104..a47e1e8d7 100644 --- a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/IovisorResolvedEndpointListener.java +++ b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/IovisorResolvedEndpointListener.java @@ -35,7 +35,8 @@ public class IovisorResolvedEndpointListener private static final Logger LOG = LoggerFactory.getLogger(IovisorResolvedEndpointListener.class); protected IovisorResolvedEndpointListener(DataBroker dataprovider) { - super(dataprovider, new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + super(dataprovider); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, IovisorIidFactory.iovisorResolvedEndpointsByTenantIdByEndpointGroupIdWildCardIid())); } diff --git a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/ResolvedPolicyListener.java b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/ResolvedPolicyListener.java index 7b40f86ea..5c459a783 100644 --- a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/ResolvedPolicyListener.java +++ b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/ResolvedPolicyListener.java @@ -39,9 +39,10 @@ public class ResolvedPolicyListener extends DataTreeChangeHandler(LogicalDatastoreType.OPERATIONAL, - InstanceIdentifier.builder(ResolvedPolicies.class).child(ResolvedPolicy.class).build())); + super(dataBroker); this.iovisorModuleManager = iovisorModuleManager; + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + InstanceIdentifier.builder(ResolvedPolicies.class).child(ResolvedPolicy.class).build())); } @Override diff --git a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListener.java b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListener.java index 1c49a0ea8..6a00e74ef 100644 --- a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListener.java +++ b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListener.java @@ -22,9 +22,10 @@ public class EndpointListener extends DataTreeChangeHandler { private final EndpointManager endpointManager; public EndpointListener(DataBroker dataProvider, EndpointManager endpointManager) { - super(dataProvider, - new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, IidFactory.l3EndpointsIidWildcard())); + super(dataProvider); this.endpointManager = endpointManager; + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + IidFactory.l3EndpointsIidWildcard())); } @Override diff --git a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/module/IovisorModuleListener.java b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/module/IovisorModuleListener.java index 9366111e3..8ecfce91d 100644 --- a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/module/IovisorModuleListener.java +++ b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/module/IovisorModuleListener.java @@ -22,7 +22,8 @@ import org.slf4j.LoggerFactory; public class IovisorModuleListener extends DataTreeChangeHandler { public IovisorModuleListener(DataBroker dataProvider) { - super(dataProvider, new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + super(dataProvider); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, IovisorIidFactory.iovisorModuleInstanceWildCardIid().child(IovisorModuleInstance.class))); } diff --git a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ActionDefinitionListener.java b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ActionDefinitionListener.java index 926b4c0d8..efc1c7a67 100644 --- a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ActionDefinitionListener.java +++ b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ActionDefinitionListener.java @@ -44,7 +44,8 @@ public class ActionDefinitionListener extends DataTreeChangeHandler(LogicalDatastoreType.CONFIGURATION, + super(dataBroker); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(SubjectFeatureDefinitions.class).child(ActionDefinition.class).build())); } diff --git a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassifierDefinitionListener.java b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassifierDefinitionListener.java index 433e162fa..b34652e6f 100755 --- a/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassifierDefinitionListener.java +++ b/renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassifierDefinitionListener.java @@ -46,7 +46,8 @@ public class ClassifierDefinitionListener extends DataTreeChangeHandler(LogicalDatastoreType.CONFIGURATION, + super(dataBroker); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(SubjectFeatureDefinitions.class).child(ClassifierDefinition.class).build())); } diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayContextListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayContextListener.java index d3029ac70..1b22aaf8f 100644 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayContextListener.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayContextListener.java @@ -39,9 +39,10 @@ public class OfOverlayContextListener extends DataTreeChangeHandler(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier - .builder(Endpoints.class).child(Endpoint.class).augmentation(OfOverlayContext.class).build())); + super(dataProvider); this.swManager = checkNotNull(swManager); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier + .builder(Endpoints.class).child(Endpoint.class).augmentation(OfOverlayContext.class).build())); } @Override diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayL3ContextListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayL3ContextListener.java index 60ff2d700..581104c16 100644 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayL3ContextListener.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/OfOverlayL3ContextListener.java @@ -39,9 +39,10 @@ public class OfOverlayL3ContextListener extends DataTreeChangeHandler(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier - .builder(Endpoints.class).child(EndpointL3.class).augmentation(OfOverlayL3Context.class).build())); + super(dataProvider); this.swManager = checkNotNull(swManager); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier + .builder(Endpoints.class).child(EndpointL3.class).augmentation(OfOverlayL3Context.class).build())); } @Override diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/statistics/ResolvedPolicyClassifierListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/statistics/ResolvedPolicyClassifierListener.java index e7faaace4..91fc2edc9 100644 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/statistics/ResolvedPolicyClassifierListener.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/statistics/ResolvedPolicyClassifierListener.java @@ -39,9 +39,10 @@ public class ResolvedPolicyClassifierListener extends DataTreeChangeHandler(LogicalDatastoreType.OPERATIONAL, - InstanceIdentifier.builder(ResolvedPolicies.class).child(ResolvedPolicy.class).build())); + super(dataProvider); this.ofStatsManager = checkNotNull(ofStatsManager); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + InstanceIdentifier.builder(ResolvedPolicies.class).child(ResolvedPolicy.class).build())); } @Override diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/statistics/SflowClientSettingsListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/statistics/SflowClientSettingsListener.java index ec0a0bf17..ca485f103 100755 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/statistics/SflowClientSettingsListener.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/statistics/SflowClientSettingsListener.java @@ -36,9 +36,10 @@ public class SflowClientSettingsListener extends DataTreeChangeHandler(LogicalDatastoreType.CONFIGURATION, IID)); + super(dataprovider); this.statisticsManager = Preconditions.checkNotNull(statisticsManager); this.executor = Preconditions.checkNotNull(executor); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, IID)); } @Override