From 4bd21c72d130aaa8619afe75caef3a60b9cdd269 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 9 Feb 2023 14:07:42 +0100 Subject: [PATCH] Convert mdsal-netconf-notification to OSGi DS The blueprint here is quite simple, even if a bit confusing. At the end of the day we have only two components with services and a few plugins. JIRA: NETCONF-963 Change-Id: I8d715d1db2ac66972c432e2b2808ad02cba7a463 Signed-off-by: Robert Varga --- netconf/mdsal-netconf-notification/pom.xml | 27 ++++-- .../CapabilityChangeNotificationProducer.java | 56 +++++------ .../impl/NetconfNotificationManager.java | 63 ++++++++----- ...nfNotificationOperationServiceFactory.java | 40 ++++---- .../impl/NotificationToMdsalWriter.java | 50 +++++----- .../impl/SessionNotificationProducer.java | 76 +++++++-------- .../impl/YangLibraryNotificationProducer.java | 51 +++++----- ...angLibraryNotificationProducerRFC8525.java | 49 +++++----- .../impl/ops/NotificationsTransformUtil.java | 2 - .../blueprint/mdsal-netconf-notification.xml | 93 ------------------- .../impl/NetconfNotificationManagerTest.java | 5 +- .../impl/NotificationToMdsalWriterTest.java | 1 - 12 files changed, 220 insertions(+), 293 deletions(-) delete mode 100644 netconf/mdsal-netconf-notification/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-notification.xml diff --git a/netconf/mdsal-netconf-notification/pom.xml b/netconf/mdsal-netconf-notification/pom.xml index 6a2b595e23..5aa2d62964 100644 --- a/netconf/mdsal-netconf-notification/pom.xml +++ b/netconf/mdsal-netconf-notification/pom.xml @@ -37,30 +37,40 @@ mdsal-binding-runtime-spi - org.opendaylight.netconf.model - rfc5277 - - - ${project.groupId} + org.opendaylight.netconf netconf-api - ${project.groupId} + org.opendaylight.netconf netconf-notifications-api - ${project.groupId} + org.opendaylight.netconf netconf-mapping-api - ${project.groupId} + org.opendaylight.netconf netconf-util + + org.opendaylight.netconf.model + rfc5277 + com.guicedee.services javax.inject true + + jakarta.annotation + jakarta.annotation-api + provided + true + + + org.osgi + org.osgi.service.component.annotations + org.xmlunit @@ -78,5 +88,4 @@ test - diff --git a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/CapabilityChangeNotificationProducer.java b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/CapabilityChangeNotificationProducer.java index 51c05b2e87..9fe607e43e 100644 --- a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/CapabilityChangeNotificationProducer.java +++ b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/CapabilityChangeNotificationProducer.java @@ -10,7 +10,6 @@ package org.opendaylight.netconf.mdsal.notification.impl; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import java.util.Collection; -import java.util.Collections; import java.util.Set; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataObjectModification; @@ -26,6 +25,10 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.not import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Empty; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,23 +36,36 @@ import org.slf4j.LoggerFactory; * Listens on capabilities changes in data store and publishes them to base * netconf notification stream listener. */ +@Component(service = { }) public final class CapabilityChangeNotificationProducer extends OperationalDatastoreListener - implements AutoCloseable { - - private static final InstanceIdentifier CAPABILITIES_INSTANCE_IDENTIFIER = - InstanceIdentifier.create(NetconfState.class).child(Capabilities.class); + implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(CapabilityChangeNotificationProducer.class); + private static final InstanceIdentifier CAPABILITIES_INSTANCE_IDENTIFIER = + InstanceIdentifier.builder(NetconfState.class).child(Capabilities.class).build(); private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration; private final ListenerRegistration capabilityChangeListenerRegistration; - public CapabilityChangeNotificationProducer(final NetconfNotificationCollector netconfNotificationCollector, - final DataBroker dataBroker) { + @Activate + public CapabilityChangeNotificationProducer( + @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager, + @Reference final DataBroker dataBroker) { super(CAPABILITIES_INSTANCE_IDENTIFIER); - baseNotificationPublisherRegistration = netconfNotificationCollector.registerBaseNotificationPublisher(); + baseNotificationPublisherRegistration = notifManager.registerBaseNotificationPublisher(); capabilityChangeListenerRegistration = registerOnChanges(dataBroker); } + @Deactivate + @Override + public void close() { + if (baseNotificationPublisherRegistration != null) { + baseNotificationPublisherRegistration.close(); + } + if (capabilityChangeListenerRegistration != null) { + capabilityChangeListenerRegistration.close(); + } + } + @Override public void onDataTreeChanged(final Collection> changes) { for (DataTreeModification change : changes) { @@ -59,10 +75,10 @@ public final class CapabilityChangeNotificationProducer extends OperationalDatas case WRITE: { final Capabilities dataAfter = rootNode.getDataAfter(); final Capabilities dataBefore = rootNode.getDataBefore(); - final Set before = dataBefore != null ? ImmutableSet.copyOf(dataBefore.getCapability()) : - Collections.emptySet(); - final Set after = dataAfter != null ? ImmutableSet.copyOf(dataAfter.getCapability()) : - Collections.emptySet(); + final Set before = dataBefore != null ? ImmutableSet.copyOf(dataBefore.getCapability()) + : Set.of(); + final Set after = dataAfter != null ? ImmutableSet.copyOf(dataAfter.getCapability()) + : Set.of(); final Set added = Sets.difference(after, before); final Set removed = Sets.difference(before, after); publishNotification(added, removed); @@ -72,7 +88,7 @@ public final class CapabilityChangeNotificationProducer extends OperationalDatas final Capabilities dataBeforeDelete = rootNode.getDataBefore(); if (dataBeforeDelete != null) { final Set removed = ImmutableSet.copyOf(dataBeforeDelete.getCapability()); - publishNotification(Collections.emptySet(), removed); + publishNotification(Set.of(), removed); } break; } @@ -80,7 +96,6 @@ public final class CapabilityChangeNotificationProducer extends OperationalDatas LOG.debug("Received intentionally unhandled type: {}.", modificationType); } } - } private void publishNotification(final Set added, final Set removed) { @@ -94,17 +109,4 @@ public final class CapabilityChangeNotificationProducer extends OperationalDatas .setModifiedCapability(Set.of()) .build()); } - - /** - * Invoked by blueprint. - */ - @Override - public void close() { - if (baseNotificationPublisherRegistration != null) { - baseNotificationPublisherRegistration.close(); - } - if (capabilityChangeListenerRegistration != null) { - capabilityChangeListenerRegistration.close(); - } - } } diff --git a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationManager.java b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationManager.java index f25724efb8..0a1bac8a2a 100644 --- a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationManager.java +++ b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationManager.java @@ -21,9 +21,12 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; import org.checkerframework.checker.lock.qual.GuardedBy; +import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory; +import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeGenerator; import org.opendaylight.netconf.mdsal.notification.impl.ops.NotificationsTransformUtil; import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration; import org.opendaylight.netconf.notifications.NetconfNotification; @@ -47,6 +50,12 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.librar import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryUpdate; import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; +import org.opendaylight.yangtools.yang.parser.api.YangParserException; +import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,9 +63,10 @@ import org.slf4j.LoggerFactory; * A thread-safe implementation NetconfNotificationRegistry. */ @Singleton -public class NetconfNotificationManager implements NetconfNotificationCollector, NetconfNotificationRegistry, +@Component(service = { NetconfNotificationCollector.class, NetconfNotificationRegistry.class }, immediate = true, + property = "type=netconf-notification-manager") +public final class NetconfNotificationManager implements NetconfNotificationCollector, NetconfNotificationRegistry, NetconfNotificationListener, AutoCloseable { - public static final StreamNameType BASE_STREAM_NAME = new StreamNameType("NETCONF"); public static final Stream BASE_NETCONF_STREAM = new StreamBuilder() .setName(BASE_STREAM_NAME) @@ -90,8 +100,33 @@ public class NetconfNotificationManager implements NetconfNotificationCollector, private final NotificationsTransformUtil transformUtil; @Inject - public NetconfNotificationManager(final NotificationsTransformUtil transformUtil) { - this.transformUtil = requireNonNull(transformUtil); + @Activate + public NetconfNotificationManager(@Reference final YangParserFactory parserFactory, + @Reference final BindingRuntimeGenerator generator, @Reference final BindingDOMCodecFactory codecFactory) + throws YangParserException { + transformUtil = new NotificationsTransformUtil(parserFactory, generator, codecFactory); + } + + @PreDestroy + @Deactivate + @Override + public synchronized void close() { + // Unregister all listeners + // Use new list to avoid ConcurrentModificationException + for (final GenericNotificationListenerReg listenerReg : new ArrayList<>(notificationListeners.values())) { + listenerReg.close(); + } + notificationListeners.clear(); + + // Unregister all publishers + // Use new list to avoid ConcurrentModificationException + for (final GenericNotificationPublisherReg notificationPublisher : new ArrayList<>(notificationPublishers)) { + notificationPublisher.close(); + } + notificationPublishers.clear(); + + // Clear stream Listeners + streamListeners.clear(); } @Override @@ -156,26 +191,6 @@ public class NetconfNotificationManager implements NetconfNotificationCollector, }; } - @Override - public synchronized void close() { - // Unregister all listeners - // Use new list to avoid ConcurrentModificationException - for (final GenericNotificationListenerReg listenerReg : new ArrayList<>(notificationListeners.values())) { - listenerReg.close(); - } - notificationListeners.clear(); - - // Unregister all publishers - // Use new list to avoid ConcurrentModificationException - for (final GenericNotificationPublisherReg notificationPublisher : new ArrayList<>(notificationPublishers)) { - notificationPublisher.close(); - } - notificationPublishers.clear(); - - // Clear stream Listeners - streamListeners.clear(); - } - @Override public synchronized NotificationPublisherRegistration registerNotificationPublisher(final Stream stream) { final StreamNameType streamName = requireNonNull(stream).getName(); diff --git a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationOperationServiceFactory.java b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationOperationServiceFactory.java index 1f37ccf5c3..1c554d76e6 100644 --- a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationOperationServiceFactory.java +++ b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationOperationServiceFactory.java @@ -5,10 +5,10 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.netconf.mdsal.notification.impl; -import java.util.Collections; +import static java.util.Objects.requireNonNull; + import java.util.Set; import org.opendaylight.netconf.api.capability.Capability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; @@ -17,18 +17,31 @@ import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener; import org.opendaylight.netconf.notifications.NetconfNotificationRegistry; import org.opendaylight.yangtools.concepts.Registration; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +@Component(service = NetconfOperationServiceFactory.class, immediate = true, + property = "type=mdsal-netconf-notification") public final class NetconfNotificationOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable { - private final NetconfNotificationRegistry netconfNotificationRegistry; - private final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener; + private final NetconfNotificationRegistry notifManager; + private final NetconfOperationServiceFactoryListener aggregatorRegistry; + @Activate public NetconfNotificationOperationServiceFactory( - final NetconfNotificationRegistry netconfNotificationRegistry, - final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener) { - this.netconfNotificationRegistry = netconfNotificationRegistry; - this.netconfOperationServiceFactoryListener = netconfOperationServiceFactoryListener; + @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationRegistry notifManager, + @Reference(target = "(type=mapper-aggregator-registry)") + final NetconfOperationServiceFactoryListener aggregatorRegistry) { + this.notifManager = requireNonNull(notifManager); + this.aggregatorRegistry = requireNonNull(aggregatorRegistry); + this.aggregatorRegistry.onAddNetconfOperationServiceFactory(this); + } - this.netconfOperationServiceFactoryListener.onAddNetconfOperationServiceFactory(this); + @Deactivate + @Override + public void close() { + aggregatorRegistry.onRemoveNetconfOperationServiceFactory(this); } @Override @@ -38,21 +51,16 @@ public final class NetconfNotificationOperationServiceFactory implements Netconf // config-netconf-connector (it exposes all the schemas) // If the schemas exposed by config-netconf-connector are filtered, // this class would expose monitoring related models - return Collections.emptySet(); + return Set.of(); } @Override public NetconfOperationService createService(final String netconfSessionIdForReporting) { - return new NetconfNotificationOperationService(netconfSessionIdForReporting, netconfNotificationRegistry); + return new NetconfNotificationOperationService(netconfSessionIdForReporting, notifManager); } @Override public Registration registerCapabilityListener(final CapabilityListener listener) { return () -> { }; } - - @Override - public void close() { - netconfOperationServiceFactoryListener.onRemoveNetconfOperationServiceFactory(this); - } } diff --git a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NotificationToMdsalWriter.java b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NotificationToMdsalWriter.java index 5e17e09555..a78e08c44a 100644 --- a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NotificationToMdsalWriter.java +++ b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NotificationToMdsalWriter.java @@ -7,6 +7,8 @@ */ package org.opendaylight.netconf.mdsal.notification.impl; +import static java.util.Objects.requireNonNull; + import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.MoreExecutors; import java.util.concurrent.ExecutionException; @@ -15,6 +17,7 @@ import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.netconf.notifications.NetconfNotificationCollector; +import org.opendaylight.netconf.notifications.NetconfNotificationCollector.NetconfNotificationStreamListener; import org.opendaylight.netconf.notifications.NotificationRegistration; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.Netconf; @@ -22,32 +25,38 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.r import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.Stream; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.StreamKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Listens on changes in netconf notification stream availability and writes - * changes to the data store. + * Listens on changes in netconf notification stream availability and writes changes to the data store. */ -public final class NotificationToMdsalWriter implements AutoCloseable, NetconfNotificationCollector - .NetconfNotificationStreamListener { - +@Component(service = { }) +public final class NotificationToMdsalWriter implements NetconfNotificationStreamListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(NotificationToMdsalWriter.class); - private static final InstanceIdentifier STREAMS = InstanceIdentifier.builder(Netconf.class) - .child(Streams.class).build(); + private static final InstanceIdentifier STREAMS = + InstanceIdentifier.builder(Netconf.class).child(Streams.class).build(); - private final NetconfNotificationCollector netconfNotificationCollector; private final DataBroker dataBroker; - private NotificationRegistration notificationRegistration; - - public NotificationToMdsalWriter(final NetconfNotificationCollector netconfNotificationCollector, - final DataBroker dataBroker) { - this.netconfNotificationCollector = netconfNotificationCollector; - this.dataBroker = dataBroker; + private final NotificationRegistration notificationRegistration; + + @Activate + public NotificationToMdsalWriter( + @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager, + @Reference final DataBroker dataBroker) { + this.dataBroker = requireNonNull(dataBroker); + notificationRegistration = notifManager.registerStreamListener(this); } + @Deactivate @Override public void close() { + notificationRegistration.close(); + final WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); tx.delete(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Netconf.class)); @@ -62,15 +71,6 @@ public final class NotificationToMdsalWriter implements AutoCloseable, NetconfNo LOG.warn("Unable to clear streams", throwable); } }, MoreExecutors.directExecutor()); - - notificationRegistration.close(); - } - - /** - * Invoked by blueprint. - */ - public void start() { - notificationRegistration = netconfNotificationCollector.registerStreamListener(this); } @Override @@ -91,9 +91,7 @@ public final class NotificationToMdsalWriter implements AutoCloseable, NetconfNo public void onStreamUnregistered(final StreamNameType stream) { final WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); - final InstanceIdentifier streamIdentifier = STREAMS.child(Stream.class, new StreamKey(stream)); - - tx.delete(LogicalDatastoreType.OPERATIONAL, streamIdentifier); + tx.delete(LogicalDatastoreType.OPERATIONAL, STREAMS.child(Stream.class, new StreamKey(stream))); try { tx.commit().get(); diff --git a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/SessionNotificationProducer.java b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/SessionNotificationProducer.java index c05cb18e87..778f0ff43f 100644 --- a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/SessionNotificationProducer.java +++ b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/SessionNotificationProducer.java @@ -7,8 +7,6 @@ */ package org.opendaylight.netconf.mdsal.notification.impl; -import static com.google.common.base.Preconditions.checkArgument; - import java.util.Collection; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataObjectModification; @@ -19,33 +17,47 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.re import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEnd; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEndBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStartBuilder; import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Listens on changes in NetconfState/Sessions/Session datastore and publishes them. */ +@Component(service = { }) public class SessionNotificationProducer extends OperationalDatastoreListener { - private static final InstanceIdentifier SESSION_INSTANCE_IDENTIFIER = - InstanceIdentifier.create(NetconfState.class).child(Sessions.class).child(Session.class); private static final Logger LOG = LoggerFactory.getLogger(SessionNotificationProducer.class); + private static final InstanceIdentifier SESSION_INSTANCE_IDENTIFIER = + InstanceIdentifier.builder(NetconfState.class).child(Sessions.class).child(Session.class).build(); private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration; private final ListenerRegistration sessionListenerRegistration; - public SessionNotificationProducer(final NetconfNotificationCollector netconfNotificationCollector, - final DataBroker dataBroker) { + @Activate + public SessionNotificationProducer( + @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager, + @Reference final DataBroker dataBroker) { super(SESSION_INSTANCE_IDENTIFIER); - this.baseNotificationPublisherRegistration = netconfNotificationCollector.registerBaseNotificationPublisher(); - this.sessionListenerRegistration = registerOnChanges(dataBroker); + baseNotificationPublisherRegistration = notifManager.registerBaseNotificationPublisher(); + sessionListenerRegistration = registerOnChanges(dataBroker); + } + + @Deactivate + public void close() { + if (baseNotificationPublisherRegistration != null) { + baseNotificationPublisherRegistration.close(); + } + if (sessionListenerRegistration != null) { + sessionListenerRegistration.close(); + } } @Override @@ -72,37 +84,19 @@ public class SessionNotificationProducer extends OperationalDatastoreListener - implements AutoCloseable { - + implements AutoCloseable { private static final InstanceIdentifier MODULES_STATE_INSTANCE_IDENTIFIER = InstanceIdentifier.create(ModulesState.class); private final ListenerRegistration yangLibraryChangeListenerRegistration; private final YangLibraryPublisherRegistration yangLibraryPublisherRegistration; - public YangLibraryNotificationProducer(final NetconfNotificationCollector netconfNotificationCollector, - final DataBroker dataBroker) { + @Activate + public YangLibraryNotificationProducer( + @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager, + @Reference final DataBroker dataBroker) { super(MODULES_STATE_INSTANCE_IDENTIFIER); - this.yangLibraryPublisherRegistration = netconfNotificationCollector.registerYangLibraryPublisher(); - this.yangLibraryChangeListenerRegistration = registerOnChanges(dataBroker); - } - - @Override - public void onDataTreeChanged(final Collection> changes) { - for (DataTreeModification change : changes) { - final DataObjectModification rootNode = change.getRootNode(); - final ModulesState dataAfter = rootNode.getDataAfter(); - if (dataAfter != null) { - final YangLibraryChange yangLibraryChange = new YangLibraryChangeBuilder() - .setModuleSetId(dataAfter.getModuleSetId()) - .build(); - yangLibraryPublisherRegistration.onYangLibraryChange(yangLibraryChange); - } - } + yangLibraryPublisherRegistration = notifManager.registerYangLibraryPublisher(); + yangLibraryChangeListenerRegistration = registerOnChanges(dataBroker); } - /** - * Invoked by blueprint. - */ + @Deactivate @Override public void close() { if (yangLibraryPublisherRegistration != null) { @@ -71,4 +58,16 @@ public final class YangLibraryNotificationProducer extends OperationalDatastoreL yangLibraryChangeListenerRegistration.close(); } } + + @Override + public void onDataTreeChanged(final Collection> changes) { + for (DataTreeModification change : changes) { + final ModulesState dataAfter = change.getRootNode().getDataAfter(); + if (dataAfter != null) { + yangLibraryPublisherRegistration.onYangLibraryChange(new YangLibraryChangeBuilder() + .setModuleSetId(dataAfter.getModuleSetId()) + .build()); + } + } + } } diff --git a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/YangLibraryNotificationProducerRFC8525.java b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/YangLibraryNotificationProducerRFC8525.java index ddfb8b0a02..3e45f86763 100644 --- a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/YangLibraryNotificationProducerRFC8525.java +++ b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/YangLibraryNotificationProducerRFC8525.java @@ -9,56 +9,43 @@ package org.opendaylight.netconf.mdsal.notification.impl; import java.util.Collection; -import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.netconf.notifications.NetconfNotificationCollector; import org.opendaylight.netconf.notifications.YangLibraryPublisherRegistration; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryUpdate; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryUpdateBuilder; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; /** * Listens on the modules, submodules, datastores, and datastore schemas changes in data store and publishes * to base netconf notification stream listener a server-specific identifier representing * the current set of modules, submodules, datastores, and datastore schemas. */ +@Component(service = { }) public final class YangLibraryNotificationProducerRFC8525 extends OperationalDatastoreListener implements AutoCloseable { - private static final InstanceIdentifier YANG_LIBRARY_INSTANCE_IDENTIFIER = InstanceIdentifier.create(YangLibrary.class); private final ListenerRegistration yangLibraryChangeListenerRegistration; private final YangLibraryPublisherRegistration yangLibraryPublisherRegistration; - public YangLibraryNotificationProducerRFC8525(final NetconfNotificationCollector netconfNotificationCollector, - final DataBroker dataBroker) { + @Activate + public YangLibraryNotificationProducerRFC8525( + @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager, + @Reference final DataBroker dataBroker) { super(YANG_LIBRARY_INSTANCE_IDENTIFIER); - this.yangLibraryPublisherRegistration = netconfNotificationCollector.registerYangLibraryPublisher(); - this.yangLibraryChangeListenerRegistration = registerOnChanges(dataBroker); - } - - @Override - public void onDataTreeChanged(@NonNull Collection> changes) { - for (DataTreeModification change : changes) { - final DataObjectModification rootNode = change.getRootNode(); - final YangLibrary dataAfter = rootNode.getDataAfter(); - if (dataAfter != null) { - final YangLibraryUpdate yangLibraryUpdate = new YangLibraryUpdateBuilder() - .setContentId(dataAfter.getContentId()) - .build(); - yangLibraryPublisherRegistration.onYangLibraryUpdate(yangLibraryUpdate); - } - } + yangLibraryPublisherRegistration = notifManager.registerYangLibraryPublisher(); + yangLibraryChangeListenerRegistration = registerOnChanges(dataBroker); } - /** - * Invoked by blueprint. - */ + @Deactivate @Override public void close() { if (yangLibraryPublisherRegistration != null) { @@ -68,4 +55,16 @@ public final class YangLibraryNotificationProducerRFC8525 extends OperationalDat yangLibraryChangeListenerRegistration.close(); } } + + @Override + public void onDataTreeChanged(final Collection> changes) { + for (DataTreeModification change : changes) { + final YangLibrary dataAfter = change.getRootNode().getDataAfter(); + if (dataAfter != null) { + yangLibraryPublisherRegistration.onYangLibraryUpdate(new YangLibraryUpdateBuilder() + .setContentId(dataAfter.getContentId()) + .build()); + } + } + } } diff --git a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/ops/NotificationsTransformUtil.java b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/ops/NotificationsTransformUtil.java index f6ae762330..28f04fdee7 100644 --- a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/ops/NotificationsTransformUtil.java +++ b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/ops/NotificationsTransformUtil.java @@ -12,7 +12,6 @@ import static com.google.common.base.Verify.verify; import java.io.IOException; import java.util.Date; import java.util.Optional; -import javax.inject.Singleton; import javax.xml.stream.XMLStreamException; import javax.xml.transform.dom.DOMResult; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; @@ -35,7 +34,6 @@ import org.opendaylight.yangtools.yang.parser.api.YangParserException; import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; import org.w3c.dom.Document; -@Singleton public final class NotificationsTransformUtil { private final EffectiveModelContext schemaContext; private final BindingNormalizedNodeSerializer serializer; diff --git a/netconf/mdsal-netconf-notification/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-notification.xml b/netconf/mdsal-netconf-notification/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-notification.xml deleted file mode 100644 index 477eb6b2c3..0000000000 --- a/netconf/mdsal-netconf-notification/src/main/resources/OSGI-INF/blueprint/mdsal-netconf-notification.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/netconf/mdsal-netconf-notification/src/test/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationManagerTest.java b/netconf/mdsal-netconf-notification/src/test/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationManagerTest.java index 0b93fd944c..34bbcf3f1f 100644 --- a/netconf/mdsal-netconf-notification/src/test/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationManagerTest.java +++ b/netconf/mdsal-netconf-notification/src/test/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationManagerTest.java @@ -31,7 +31,6 @@ import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.binding.dom.codec.impl.di.DefaultBindingDOMCodecFactory; import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.netconf.api.xml.XmlUtil; -import org.opendaylight.netconf.mdsal.notification.impl.ops.NotificationsTransformUtil; import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration; import org.opendaylight.netconf.notifications.NetconfNotification; import org.opendaylight.netconf.notifications.NetconfNotificationCollector; @@ -246,7 +245,7 @@ public class NetconfNotificationManagerTest { } private static NetconfNotificationManager createManager() throws YangParserException { - return new NetconfNotificationManager(new NotificationsTransformUtil(new DefaultYangParserFactory(), - new DefaultBindingRuntimeGenerator(), new DefaultBindingDOMCodecFactory())); + return new NetconfNotificationManager(new DefaultYangParserFactory(), + new DefaultBindingRuntimeGenerator(), new DefaultBindingDOMCodecFactory()); } } \ No newline at end of file diff --git a/netconf/mdsal-netconf-notification/src/test/java/org/opendaylight/netconf/mdsal/notification/impl/NotificationToMdsalWriterTest.java b/netconf/mdsal-netconf-notification/src/test/java/org/opendaylight/netconf/mdsal/notification/impl/NotificationToMdsalWriterTest.java index 3274cfd2d3..5d43bb4e51 100644 --- a/netconf/mdsal-netconf-notification/src/test/java/org/opendaylight/netconf/mdsal/notification/impl/NotificationToMdsalWriterTest.java +++ b/netconf/mdsal-netconf-notification/src/test/java/org/opendaylight/netconf/mdsal/notification/impl/NotificationToMdsalWriterTest.java @@ -58,7 +58,6 @@ public class NotificationToMdsalWriterTest { doReturn(tx).when(dataBroker).newWriteOnlyTransaction(); writer = new NotificationToMdsalWriter(notificationCollector, dataBroker); - writer.start(); } @Test -- 2.36.6