Bump upstreams 00/109800/42
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 16 Jan 2024 12:24:13 +0000 (13:24 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 28 Jan 2024 21:59:46 +0000 (22:59 +0100)
Adopt:
- yangtools-13.0.1
- mdsal-13.0.0
- controller-9.0.0
- aaa-0.19.1

Change-Id: I690bf875372e058d96920e6470bfd63be74194bc
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
176 files changed:
apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/CallHomeMountSshAuthProvider.java
apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/tls/CallHomeMountTlsAuthProvider.java
apps/netconf-topology-impl/src/main/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImpl.java
apps/netconf-topology-impl/src/test/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImplTest.java
apps/netconf-topology-singleton/pom.xml
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/MasterSalFacade.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManager.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManager.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMActionService.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBroker.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMRpcService.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyYangTextSourceProvider.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/NetconfNodeActor.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ActorProxyTransactionFacade.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/FailedProxyTransactionFacade.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransaction.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologySetup.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/CreateInitialMasterActorData.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/RegisterMountPoint.java
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/YangTextSchemaSourceRequest.java
apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/MountPointEndToEndTest.java
apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeActorTest.java
apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManagerTest.java
apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManagerTest.java
apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBrokerTest.java
apps/netconf-topology/pom.xml
apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfClientConfigurationBuilderFactoryImpl.java
apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapter.java
apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeHandler.java
apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProvider.java
apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapterTest.java
apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProviderTest.java
apps/yanglib-mdsal-writer/src/main/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriter.java
apps/yanglib-mdsal-writer/src/test/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriterTest.java
features/odl-aaa-netconf-plugin/src/main/feature/feature.xml
features/odl-netconf-api/src/main/feature/feature.xml
features/odl-netconf-connector/src/main/feature/feature.xml
features/odl-netconf-model-rfc5277/src/main/feature/feature.xml
features/odl-netconf-model-rfc6022/src/main/feature/feature.xml
features/odl-netconf-model-rfc6241/src/main/feature/feature.xml
features/odl-netconf-model-rfc8040/src/main/feature/feature.xml
features/odl-netconf-model-rfc8341/src/main/feature/feature.xml
features/odl-netconf-model-rfc8526/src/main/feature/feature.xml
features/odl-netconf-model-rfc8639/src/main/feature/feature.xml
features/odl-netconf-model-rfc8641/src/main/feature/feature.xml
features/odl-netconf-transport-api/src/main/feature/feature.xml
features/odl-netconf-util/src/main/feature/feature.xml
features/odl-restconf-common/src/main/feature/feature.xml
features/odl-restconf-nb/src/main/feature/feature.xml
features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml
features/odl-yanglib/src/main/feature/feature.xml
karaf/pom.xml
netconf/tools/netconf-test-perf/src/main/java/org/opendaylight/netconf/test/perf/MountedDeviceListener.java
netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java
netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/NetconfDeviceSimulator.java
netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/PayloadCreator.java
netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/schemacache/SchemaSourceCache.java
netconf/yanglib/src/main/java/org/opendaylight/yanglib/impl/YangLibProvider.java
netconf/yanglib/src/test/java/org/opendaylight/yanglib/impl/YangLibProviderTest.java
parent/pom.xml
plugins/netconf-client-mdsal/pom.xml
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/CachedYangTextSchemaSource.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceMountPointContext.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSources.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSourcesResolver.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemas.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaSourceProvider.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/MonitoringSchemaSourceProvider.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfDevice.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasResolverImpl.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfRpcService.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfSessionPreferences.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/SchemalessRpcService.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/BaseRpcSchemalessTransformer.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/BaseSchema.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultBaseNetconfSchemas.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultCredentialProvider.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSchemaResourceManager.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProvider.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfBaseOps.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformUtil.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformer.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfRpcStructureTransformer.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfSalKeystoreRpcs.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/RpcStructureTransformer.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessMessageTransformer.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformer.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractTxChain.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractWriteTx.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/FieldsAwareTxChain.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/KeepaliveSalFacade.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDOMRpcService.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBroker.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceMount.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationService.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacade.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTx.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/TxChain.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemasTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaYangSourceProviderTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/MonitoringSchemaSourceProviderTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProviderTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformerTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformerTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/MountInstanceTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDataTreeServiceImplTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBrokerTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationServiceTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceRpcTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTxTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/TxChainTest.java
plugins/netconf-common-mdsal/src/main/java/org/opendaylight/netconf/common/mdsal/ProxyMountPointContext.java
plugins/netconf-common-mdsal/src/test/java/org/opendaylight/netconf/common/mdsal/NormalizedDataUtilTest.java
plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/NetconfDataTreeService.java
plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/tx/NetconfDOMDataBrokerFieldsExtension.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/CurrentSchemaContext.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/DOMDataTransactionValidator.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/MdsalNetconfOperationServiceFactory.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/TransactionProvider.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducer.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/NotificationsTransformUtil.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducer.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducer.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerRFC8525.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducerTest.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducerTest.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTest.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTestRFC8525.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/AbstractNetconfOperationTest.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/Bug8084.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/RuntimeRpcTest.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/SchemaServiceStub.java
plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/ValidateTest.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlChildBody.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/JsonNormalizedNodeBodyWriter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/errors/RestconfDocumentedExceptionMapper.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategy.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategy.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/DatabindContext.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/CapabilitiesWriter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/DataTreeChangeSource.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateFormatter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateSerializer.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/XMLDataTreeCandidateSerializer.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/AbstractNotificationSource.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/JSONNotificationFormatter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathInstanceIdentifierCodec.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/AbstractRestconfTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/Netconf799Test.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataDeleteTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataGetTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPutTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfModulesGetTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsGetTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsPostTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceMountTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/AbstractPatchBodyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlResourceBodyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/DataTreeChangeStreamTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketFactoryTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/test/incubate/InMemoryMdsalModule.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateNotificationStreamRpcTest.java
restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java
restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PropertyEntity.java
restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/mountpoints/MountPointOpenApi.java
transport/transport-ssh/pom.xml

index 656302190696a7aac255878fd94c8e46c947f6cb..c1df4d4def4d00f7c1ab53b993c9081dc89fc92c 100644 (file)
@@ -7,13 +7,12 @@
  */
 package org.opendaylight.netconf.callhome.mount;
 
-import com.google.common.collect.Iterables;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.security.GeneralSecurityException;
 import java.security.PublicKey;
-import java.util.Collection;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -21,8 +20,6 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 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.DataObjectModification.ModificationType;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
@@ -64,7 +61,7 @@ public final class CallHomeMountSshAuthProvider implements CallHomeSshAuthProvid
     public CallHomeMountSshAuthProvider(final @Reference DataBroker broker,
             final @Reference CallHomeMountStatusReporter statusReporter) {
         configReg = broker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+            DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                 InstanceIdentifier.create(NetconfCallhomeServer.class).child(Global.class)),
             globalConfig);
 
@@ -72,10 +69,10 @@ public final class CallHomeMountSshAuthProvider implements CallHomeSshAuthProvid
             InstanceIdentifier.create(NetconfCallhomeServer.class).child(AllowedDevices.class).child(Device.class);
 
         deviceReg = broker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, allowedDeviceWildcard),
+            DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, allowedDeviceWildcard),
             deviceConfig);
         deviceOpReg = broker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, allowedDeviceWildcard),
+            DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, allowedDeviceWildcard),
             deviceOp);
 
         this.statusReporter = statusReporter;
@@ -144,18 +141,18 @@ public final class CallHomeMountSshAuthProvider implements CallHomeSshAuthProvid
     private abstract static class AbstractDeviceListener implements DataTreeChangeListener<Device> {
 
         @Override
-        public final void onDataTreeChanged(final Collection<DataTreeModification<Device>> mods) {
-            for (DataTreeModification<Device> dataTreeModification : mods) {
-                final DataObjectModification<Device> deviceMod = dataTreeModification.getRootNode();
-                final ModificationType modType = deviceMod.getModificationType();
+        public final void onDataTreeChanged(final List<DataTreeModification<Device>> mods) {
+            for (var dataTreeModification : mods) {
+                final var deviceMod = dataTreeModification.getRootNode();
+                final var modType = deviceMod.modificationType();
                 switch (modType) {
                     case DELETE:
-                        deleteDevice(deviceMod.getDataBefore());
+                        deleteDevice(deviceMod.dataBefore());
                         break;
                     case SUBTREE_MODIFIED:
                     case WRITE:
-                        deleteDevice(deviceMod.getDataBefore());
-                        writeDevice(deviceMod.getDataAfter());
+                        deleteDevice(deviceMod.dataBefore());
+                        writeDevice(deviceMod.dataAfter());
                         break;
                     default:
                         throw new IllegalStateException("Unhandled modification type " + modType);
@@ -262,9 +259,9 @@ public final class CallHomeMountSshAuthProvider implements CallHomeSshAuthProvid
         private volatile Global current = null;
 
         @Override
-        public void onDataTreeChanged(final Collection<DataTreeModification<Global>> mods) {
+        public void onDataTreeChanged(final List<DataTreeModification<Global>> mods) {
             if (!mods.isEmpty()) {
-                current = Iterables.getLast(mods).getRootNode().getDataAfter();
+                current = mods.get(mods.size() - 1).getRootNode().dataAfter();
             }
         }
 
index 5a136d96c80e5a770c59fad60618385814950770..843c0d9060f71b63a691263b92b501555fbcc30b 100644 (file)
@@ -18,7 +18,7 @@ import java.security.PublicKey;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.util.Base64;
-import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -27,10 +27,9 @@ import java.util.stream.Collectors;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -70,13 +69,13 @@ public final class CallHomeMountTlsAuthProvider implements CallHomeTlsAuthProvid
     public CallHomeMountTlsAuthProvider(
             final @Reference SslHandlerFactoryProvider sslHandlerFactoryProvider,
             final @Reference DataBroker dataBroker) {
-        this.sslHandlerFactory = sslHandlerFactoryProvider.getSslHandlerFactory(null);
-        allowedDevicesReg = dataBroker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+        sslHandlerFactory = sslHandlerFactoryProvider.getSslHandlerFactory(null);
+        allowedDevicesReg = dataBroker.registerTreeChangeListener(
+            DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                 InstanceIdentifier.create(NetconfCallhomeServer.class).child(AllowedDevices.class).child(Device.class)),
             new AllowedDevicesMonitor());
-        certificatesReg = dataBroker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)),
+        certificatesReg = dataBroker.registerTreeChangeListener(
+            DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)),
             new CertificatesMonitor());
     }
 
@@ -105,12 +104,15 @@ public final class CallHomeMountTlsAuthProvider implements CallHomeTlsAuthProvid
         // In real world scenario it is not possible to have multiple certificates with the same private/public key,
         // but in theory/synthetic tests it is practically possible to generate multiple certificates from a single
         // private key. In such case it's not possible to pin certificate to particular device.
-        if (deviceNames.size() > 1) {
-            LOG.error("Unable to find device by provided certificate. Possible reason: one certificate configured "
-                + "with multiple devices/names or multiple certificates contain same public key");
-            return null;
-        }
-        return deviceNames.isEmpty() ? null : deviceNames.get(0);
+        return switch (deviceNames.size()) {
+            case 0 -> null;
+            case 1 -> deviceNames.get(0);
+            default -> {
+                LOG.error("Unable to find device by provided certificate. Possible reason: one certificate configured "
+                    + "with multiple devices/names or multiple certificates contain same public key");
+                yield null;
+            }
+        };
     }
 
     @Override
@@ -118,28 +120,27 @@ public final class CallHomeMountTlsAuthProvider implements CallHomeTlsAuthProvid
         return sslHandlerFactory.createSslHandler(Set.copyOf(deviceToPrivateKey.values()));
     }
 
-    private final class CertificatesMonitor implements ClusteredDataTreeChangeListener<Keystore> {
+    private final class CertificatesMonitor implements DataTreeChangeListener<Keystore> {
         @Override
-        public void onDataTreeChanged(@NonNull final Collection<DataTreeModification<Keystore>> changes) {
-            changes.stream().map(DataTreeModification::getRootNode)
-                .flatMap(v -> v.getModifiedChildren().stream())
-                .filter(v -> v.getDataType().equals(TrustedCertificate.class))
+        public void onDataTreeChanged(final List<DataTreeModification<Keystore>> changes) {
+            changes.stream()
+                .map(DataTreeModification::getRootNode)
+                .flatMap(v -> v.modifiedChildren().stream())
+                .filter(v -> v.dataType().equals(TrustedCertificate.class))
                 .map(v -> (DataObjectModification<TrustedCertificate>) v)
                 .forEach(this::updateCertificate);
         }
 
         private void updateCertificate(final DataObjectModification<TrustedCertificate> change) {
-            switch (change.getModificationType()) {
-                case DELETE:
-                    deleteCertificate(change.getDataBefore());
-                    break;
-                case SUBTREE_MODIFIED:
-                case WRITE:
-                    deleteCertificate(change.getDataBefore());
-                    writeCertificate(change.getDataAfter());
-                    break;
-                default:
-                    break;
+            switch (change.modificationType()) {
+                case DELETE -> deleteCertificate(change.dataBefore());
+                case SUBTREE_MODIFIED, WRITE -> {
+                    deleteCertificate(change.dataBefore());
+                    writeCertificate(change.dataAfter());
+                }
+                default -> {
+                    // Should never happen
+                }
             }
         }
 
@@ -171,22 +172,20 @@ public final class CallHomeMountTlsAuthProvider implements CallHomeTlsAuthProvid
         }
     }
 
-    private final class AllowedDevicesMonitor implements ClusteredDataTreeChangeListener<Device> {
+    private final class AllowedDevicesMonitor implements DataTreeChangeListener<Device> {
         @Override
-        public void onDataTreeChanged(final Collection<DataTreeModification<Device>> mods) {
-            for (final DataTreeModification<Device> dataTreeModification : mods) {
-                final DataObjectModification<Device> deviceMod = dataTreeModification.getRootNode();
-                switch (deviceMod.getModificationType()) {
-                    case DELETE:
-                        deleteDevice(deviceMod.getDataBefore());
-                        break;
-                    case SUBTREE_MODIFIED:
-                    case WRITE:
-                        deleteDevice(deviceMod.getDataBefore());
-                        writeDevice(deviceMod.getDataAfter());
-                        break;
-                    default:
-                        break;
+        public void onDataTreeChanged(final List<DataTreeModification<Device>> mods) {
+            for (var dataTreeModification : mods) {
+                final var deviceMod = dataTreeModification.getRootNode();
+                switch (deviceMod.modificationType()) {
+                    case DELETE -> deleteDevice(deviceMod.dataBefore());
+                    case SUBTREE_MODIFIED, WRITE -> {
+                        deleteDevice(deviceMod.dataBefore());
+                        writeDevice(deviceMod.dataAfter());
+                    }
+                    default -> {
+                        // Should never happen
+                    }
                 }
             }
         }
index 736a2766c7f92d6bd3f155b2caaacdb1a00e8b01..4883042ba388a11e1c0a371f76c9d2f82426f3af 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.netconf.topology.impl;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.util.Collection;
+import java.util.List;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -92,7 +92,7 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology
             mountPointService, builderFactory, deviceActionFactory, baseSchemas);
 
         LOG.debug("Registering datastore listener");
-        dtclReg = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(
+        dtclReg = dataBroker.registerLegacyTreeChangeListener(DataTreeIdentifier.of(
             LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(NetworkTopology.class)
                 .child(Topology.class, new TopologyKey(new TopologyId(topologyId)))
                 .child(Node.class)
@@ -119,15 +119,15 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<Node>> changes) {
+    public void onDataTreeChanged(final List<DataTreeModification<Node>> changes) {
         for (var change : changes) {
             final var rootNode = change.getRootNode();
-            final var modType = rootNode.getModificationType();
+            final var modType = rootNode.modificationType();
             switch (modType) {
-                case SUBTREE_MODIFIED -> ensureNode("updated", rootNode.getDataAfter());
-                case WRITE -> ensureNode("created", rootNode.getDataAfter());
+                case SUBTREE_MODIFIED -> ensureNode("updated", rootNode.dataAfter());
+                case WRITE -> ensureNode("created", rootNode.dataAfter());
                 case DELETE -> {
-                    final var nodeId = InstanceIdentifier.keyOf(change.getRootPath().getRootIdentifier()).getNodeId();
+                    final var nodeId = InstanceIdentifier.keyOf(change.getRootPath().path()).getNodeId();
                     LOG.debug("Config for node {} deleted", nodeId);
                     deleteNode(nodeId);
                 }
index 117efbc2174cbd70c90ba750d3ec525dca29f9b1..d9bff3595eea80306e4671ef2e8638a4dcfd5ef7 100644 (file)
@@ -123,10 +123,10 @@ class NetconfTopologyImplTest {
                     .build())
                 .build();
 
-            doReturn(DataObjectModification.ModificationType.WRITE).when(objMod).getModificationType();
-            doReturn(node).when(objMod).getDataAfter();
+            doReturn(DataObjectModification.ModificationType.WRITE).when(objMod).modificationType();
+            doReturn(node).when(objMod).dataAfter();
 
-            doReturn(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+            doReturn(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                 TOPOLOGY_PATH.child(Node.class, key))).when(treeMod).getRootPath();
             final var changes = List.of(treeMod);
 
@@ -134,11 +134,11 @@ class NetconfTopologyImplTest {
             spyTopology.onDataTreeChanged(changes);
             verify(spyTopology).ensureNode(node);
 
-            doReturn(DataObjectModification.ModificationType.DELETE).when(objMod).getModificationType();
+            doReturn(DataObjectModification.ModificationType.DELETE).when(objMod).modificationType();
             spyTopology.onDataTreeChanged(changes);
             verify(spyTopology).deleteNode(key.getNodeId());
 
-            doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(objMod).getModificationType();
+            doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(objMod).modificationType();
             spyTopology.onDataTreeChanged(changes);
 
             // one in previous creating and deleting node and one in updating
index 62d8d5e00ec7c4e3387443d64c9d050ff0c9e7da..1fdaca1447bd97bca6273e9b88c962431ae029cc 100644 (file)
@@ -56,7 +56,7 @@
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
-            <artifactId>mdsal-singleton-common-api</artifactId>
+            <artifactId>mdsal-singleton-api</artifactId>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal.model</groupId>
@@ -78,7 +78,7 @@
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
-            <artifactId>mdsal-singleton-dom-impl</artifactId>
+            <artifactId>mdsal-singleton-impl</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
index c942f989286327da0016e5306e8765d8ddf8f2f9..dd1c09187c32d7cda9c9d4428b45038cd633cbfa 100644 (file)
@@ -35,7 +35,7 @@ import org.opendaylight.netconf.topology.singleton.messages.CreateInitialMasterA
 import org.opendaylight.netconf.topology.spi.NetconfDeviceTopologyAdapter;
 import org.opendaylight.netconf.topology.spi.NetconfNodeUtils;
 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -154,8 +154,7 @@ class MasterSalFacade implements RemoteDeviceHandler, AutoCloseable {
             actorResponseWaitTime);
         final NetconfDataTreeService proxyNetconfService = new ProxyNetconfDataTreeService(id, masterActorRef,
             actorSystem.dispatcher(), actorResponseWaitTime);
-        mount.onDeviceConnected(mountContext.getEffectiveModelContext(), deviceServices,
-            proxyDataBroker, proxyNetconfService);
+        mount.onDeviceConnected(mountContext.modelContext(), deviceServices, proxyDataBroker, proxyNetconfService);
     }
 
     protected DOMDataBroker newDeviceDataBroker(final MountPointContext mountContext,
@@ -170,7 +169,7 @@ class MasterSalFacade implements RemoteDeviceHandler, AutoCloseable {
 
     private Future<Object> sendInitialDataToActor() {
         final List<SourceIdentifier> sourceIdentifiers = List.copyOf(SchemaContextUtil.getConstituentModuleIdentifiers(
-            currentSchema.mountContext().getEffectiveModelContext()));
+            currentSchema.mountContext().modelContext()));
 
         LOG.debug("{}: Sending CreateInitialMasterActorData with sourceIdentifiers {} to {}", id, sourceIdentifiers,
             masterActorRef);
index 04fbd3204e4d243343875a54a1dbdf4278721866..d22952a014b3c345b4b2bcfff764dc5baf67dda9 100644 (file)
@@ -14,11 +14,11 @@ import akka.dispatch.OnComplete;
 import akka.pattern.AskTimeoutException;
 import akka.pattern.Patterns;
 import akka.util.Timeout;
-import java.util.Collection;
+import java.util.List;
 import org.checkerframework.checker.lock.qual.GuardedBy;
 import org.checkerframework.checker.lock.qual.Holding;
-import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -35,7 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev23
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,14 +44,14 @@ import org.slf4j.LoggerFactory;
  * Managing and reacting on data tree changes in specific netconf node when master writes status to the operational
  * data store (e.g. handling lifecycle of slave mount point).
  */
-class NetconfNodeManager implements ClusteredDataTreeChangeListener<Node>, AutoCloseable {
+class NetconfNodeManager implements DataTreeChangeListener<Node>, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(NetconfNodeManager.class);
 
     private final Timeout actorResponseWaitTime;
     private final DOMMountPointService mountPointService;
 
     private volatile NetconfTopologySetup setup;
-    private volatile ListenerRegistration<NetconfNodeManager> dataChangeListenerRegistration;
+    private volatile Registration dataChangeListenerRegistration;
     private volatile RemoteDeviceId id;
 
     @GuardedBy("this")
@@ -72,23 +72,22 @@ class NetconfNodeManager implements ClusteredDataTreeChangeListener<Node>, AutoC
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<Node>> changes) {
-        for (final DataTreeModification<Node> change : changes) {
-            final DataObjectModification<Node> rootNode = change.getRootNode();
-            final NodeId nodeId = NetconfTopologyUtils.getNodeId(rootNode.getIdentifier());
-            switch (rootNode.getModificationType()) {
+    public void onDataTreeChanged(final List<DataTreeModification<Node>> changes) {
+        for (var change : changes) {
+            final var rootNode = change.getRootNode();
+            final NodeId nodeId = NetconfTopologyUtils.getNodeId(rootNode.step());
+            switch (rootNode.modificationType()) {
                 case SUBTREE_MODIFIED:
-                    LOG.debug("{}: Operational state for node {} - subtree modified from {} to {}",
-                            id, nodeId, rootNode.getDataBefore(), rootNode.getDataAfter());
+                    LOG.debug("{}: Operational state for node {} - subtree modified from {} to {}", id, nodeId,
+                        rootNode.dataBefore(), rootNode.dataAfter());
                     handleSlaveMountPoint(rootNode);
                     break;
                 case WRITE:
-                    if (rootNode.getDataBefore() != null) {
-                        LOG.debug("{}: Operational state for node {} updated from {} to {}",
-                                id, nodeId, rootNode.getDataBefore(), rootNode.getDataAfter());
+                    if (rootNode.dataBefore() != null) {
+                        LOG.debug("{}: Operational state for node {} updated from {} to {}", id, nodeId,
+                            rootNode.dataBefore(), rootNode.dataAfter());
                     } else {
-                        LOG.debug("{}: Operational state for node {} created: {}",
-                                id, nodeId, rootNode.getDataAfter());
+                        LOG.debug("{}: Operational state for node {} created: {}", id, nodeId, rootNode.dataAfter());
                     }
                     handleSlaveMountPoint(rootNode);
                     break;
@@ -136,8 +135,8 @@ class NetconfNodeManager implements ClusteredDataTreeChangeListener<Node>, AutoC
     void registerDataTreeChangeListener(final String topologyId, final NodeKey key) {
         final InstanceIdentifier<Node> path = NetconfTopologyUtils.createTopologyNodeListPath(key, topologyId);
         LOG.debug("{}: Registering data tree change listener on path {}", id, path);
-        dataChangeListenerRegistration = setup.getDataBroker().registerDataTreeChangeListener(
-                DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, path), this);
+        dataChangeListenerRegistration = setup.getDataBroker().registerTreeChangeListener(
+                DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, path), this);
     }
 
     private synchronized void handleSlaveMountPoint(final DataObjectModification<Node> rootNode) {
@@ -146,7 +145,7 @@ class NetconfNodeManager implements ClusteredDataTreeChangeListener<Node>, AutoC
         }
 
         @SuppressWarnings("ConstantConditions")
-        final NetconfNode netconfNodeAfter = rootNode.getDataAfter().augmentation(NetconfNode.class);
+        final NetconfNode netconfNodeAfter = rootNode.dataAfter().augmentation(NetconfNode.class);
 
         if (ConnectionStatus.Connected == netconfNodeAfter.getConnectionStatus()) {
             lastUpdateCount++;
index 7cab45ee663ca8a9f0ff92ac562f3fa531cb21f1..bc6c73e763ddb398d2d24da7c0754d33bdf12fe6 100644 (file)
@@ -14,8 +14,8 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.util.concurrent.ListenableFuture;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
-import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.mdsal.singleton.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier;
 import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
 import org.opendaylight.netconf.client.mdsal.api.SchemaResourceManager;
index 85eac7f715b453118eefba4cf6fbbaa9cd604725..4b3a259839c8c61f31871238e5ce0df5aedb9579 100644 (file)
@@ -16,7 +16,7 @@ import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.MoreExecutors;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.time.Duration;
-import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import javax.annotation.PreDestroy;
@@ -24,9 +24,8 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
 import org.opendaylight.controller.cluster.ActorSystemProvider;
-import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
@@ -34,9 +33,8 @@ import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
-import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier;
 import org.opendaylight.netconf.client.NetconfClientFactory;
 import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas;
 import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory;
@@ -57,7 +55,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.osgi.service.component.annotations.Activate;
@@ -74,7 +72,7 @@ import org.slf4j.LoggerFactory;
 @Component(service = { }, configurationPid = "org.opendaylight.netconf.topology.singleton")
 @Designate(ocd = NetconfTopologyManager.Configuration.class)
 // Non-final for testing
-public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<Node>, AutoCloseable {
+public class NetconfTopologyManager implements DataTreeChangeListener<Node>, AutoCloseable {
     @ObjectClassDefinition
     public @interface Configuration {
         @AttributeDefinition(min = "1", description = "Name of the Network Topology instance to manage")
@@ -89,8 +87,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
     private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyManager.class);
 
     private final Map<InstanceIdentifier<Node>, NetconfTopologyContext> contexts = new ConcurrentHashMap<>();
-    private final Map<InstanceIdentifier<Node>, ClusterSingletonServiceRegistration>
-            clusterRegistrations = new ConcurrentHashMap<>();
+    private final Map<InstanceIdentifier<Node>, Registration> clusterRegistrations = new ConcurrentHashMap<>();
 
     private final BaseNetconfSchemas baseSchemas;
     private final DataBroker dataBroker;
@@ -106,7 +103,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
     private final NetconfClientConfigurationBuilderFactory builderFactory;
     private final SchemaResourceManager resourceManager;
 
-    private ListenerRegistration<NetconfTopologyManager> dataChangeListenerRegistration;
+    private Registration dataChangeListenerRegistration;
     private NetconfTopologyRPCProvider rpcProvider;
 
     @Activate
@@ -173,23 +170,23 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<Node>> changes) {
-        for (final DataTreeModification<Node> change : changes) {
-            final DataObjectModification<Node> rootNode = change.getRootNode();
-            final InstanceIdentifier<Node> dataModifIdent = change.getRootPath().getRootIdentifier();
-            final NodeId nodeId = NetconfTopologyUtils.getNodeId(rootNode.getIdentifier());
-            switch (rootNode.getModificationType()) {
+    public void onDataTreeChanged(final List<DataTreeModification<Node>> changes) {
+        for (var change : changes) {
+            final var rootNode = change.getRootNode();
+            final var dataModifIdent = change.getRootPath().path();
+            final NodeId nodeId = NetconfTopologyUtils.getNodeId(rootNode.step());
+            switch (rootNode.modificationType()) {
                 case SUBTREE_MODIFIED:
                     LOG.debug("Config for node {} updated", nodeId);
-                    refreshNetconfDeviceContext(dataModifIdent, rootNode.getDataAfter());
+                    refreshNetconfDeviceContext(dataModifIdent, rootNode.dataAfter());
                     break;
                 case WRITE:
                     if (contexts.containsKey(dataModifIdent)) {
                         LOG.debug("RemoteDevice{{}} was already configured, reconfiguring node...", nodeId);
-                        refreshNetconfDeviceContext(dataModifIdent, rootNode.getDataAfter());
+                        refreshNetconfDeviceContext(dataModifIdent, rootNode.dataAfter());
                     } else {
                         LOG.debug("Config for node {} created", nodeId);
-                        startNetconfDeviceContext(dataModifIdent, rootNode.getDataAfter());
+                        startNetconfDeviceContext(dataModifIdent, rootNode.dataAfter());
                     }
                     break;
                 case DELETE:
@@ -218,8 +215,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
         final Timeout actorResponseWaitTime = Timeout.create(
                 Duration.ofSeconds(netconfNode.getActorResponseWaitTime().toJava()));
 
-        final ServiceGroupIdentifier serviceGroupIdent =
-                ServiceGroupIdentifier.create(instanceIdentifier.toString());
+        final ServiceGroupIdentifier serviceGroupIdent = new ServiceGroupIdentifier(instanceIdentifier.toString());
 
         final NetconfTopologyContext newNetconfTopologyContext = newNetconfTopologyContext(
             createSetup(instanceIdentifier, node), serviceGroupIdent, actorResponseWaitTime, deviceActionFactory);
@@ -227,7 +223,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
         int tries = 3;
         while (true) {
             try {
-                final ClusterSingletonServiceRegistration clusterSingletonServiceRegistration =
+                final var clusterSingletonServiceRegistration =
                         clusterSingletonServiceProvider.registerClusterSingletonService(newNetconfTopologyContext);
                 clusterRegistrations.put(instanceIdentifier, clusterSingletonServiceRegistration);
                 contexts.put(instanceIdentifier, newNetconfTopologyContext);
@@ -290,7 +286,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
         }
     }
 
-    private ListenerRegistration<NetconfTopologyManager> registerDataTreeChangeListener() {
+    private Registration registerDataTreeChangeListener() {
         final WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
         // FIXME: how does this play out with lifecycle? In a cluster, someone needs to ensure this call happens, but
         //        also we need to to make sure config -> oper is properly synchronized. Non-clustered case relies on
@@ -311,7 +307,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
         }, MoreExecutors.directExecutor());
 
         LOG.debug("Registering datastore listener");
-        return dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+        return dataBroker.registerTreeChangeListener(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
             NetconfTopologyUtils.createTopologyListPath(topologyId).child(Node.class)), this);
     }
 
index 050e2105bdf2373193bbaf0e3d348c6426afef57..522b335259a456ac8c98e4aa4bfe873df3c11a54 100644 (file)
@@ -14,15 +14,12 @@ import akka.actor.ActorSystem;
 import akka.dispatch.OnComplete;
 import akka.pattern.Patterns;
 import akka.util.Timeout;
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.SettableFuture;
 import java.util.Collection;
 import org.opendaylight.mdsal.dom.api.DOMActionResult;
 import org.opendaylight.mdsal.dom.api.DOMActionService;
-import org.opendaylight.mdsal.dom.api.DOMActionServiceExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.mdsal.dom.spi.SimpleDOMActionResult;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
@@ -119,9 +116,4 @@ public class ProxyDOMActionService implements Actions.Normalized {
 
         return FluentFuture.from(settableFuture);
     }
-
-    @Override
-    public ClassToInstanceMap<DOMActionServiceExtension> getExtensions() {
-        return ImmutableClassToInstanceMap.of();
-    }
 }
index 1ab77571c7d89506c60593b4690032eb171a2a9d..437832ad7bbb33072458da53bd487e0b8f6ff87d 100644 (file)
@@ -10,14 +10,10 @@ package org.opendaylight.netconf.topology.singleton.impl;
 import akka.actor.ActorRef;
 import akka.pattern.Patterns;
 import akka.util.Timeout;
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ImmutableClassToInstanceMap;
-import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
 import org.opendaylight.mdsal.dom.spi.PingPongMergingDOMDataBroker;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
 import org.opendaylight.netconf.topology.singleton.impl.tx.ProxyReadTransaction;
@@ -73,12 +69,7 @@ public class ProxyDOMDataBroker implements PingPongMergingDOMDataBroker {
     }
 
     @Override
-    public DOMTransactionChain createTransactionChain(final DOMTransactionChainListener listener) {
+    public DOMTransactionChain createTransactionChain() {
         throw new UnsupportedOperationException(id + ": Transaction chains not supported for netconf mount point");
     }
-
-    @Override
-    public ClassToInstanceMap<DOMDataBrokerExtension> getExtensions() {
-        return ImmutableClassToInstanceMap.of();
-    }
 }
index d527704e2a742ccf1803bf0f40177ab9b49837ea..7b5b5ab3484dd343284ed6fb1996824a847d206d 100644 (file)
@@ -27,7 +27,7 @@ import org.opendaylight.netconf.topology.singleton.messages.SchemaPathMessage;
 import org.opendaylight.netconf.topology.singleton.messages.rpc.InvokeRpcMessage;
 import org.opendaylight.netconf.topology.singleton.messages.rpc.InvokeRpcMessageReply;
 import org.opendaylight.netconf.topology.singleton.messages.transactions.EmptyResultResponse;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -98,7 +98,7 @@ public class ProxyDOMRpcService implements DOMRpcService {
     }
 
     @Override
-    public <T extends DOMRpcAvailabilityListener> ListenerRegistration<T> registerRpcListener(final T listener) {
+    public Registration registerRpcListener(final DOMRpcAvailabilityListener listener) {
         // NOOP, only proxy
         throw new UnsupportedOperationException("RegisterRpcListener: DOMRpc service not working in cluster.");
     }
index 4bb45457a84d9843663f3a561361c3ee337af16a..c5e6418ed5cdda3e1280617b132b4f04e7a4e4fc 100644 (file)
@@ -16,7 +16,7 @@ import java.util.Set;
 import org.opendaylight.controller.cluster.schema.provider.RemoteYangTextSourceProvider;
 import org.opendaylight.controller.cluster.schema.provider.impl.YangTextSchemaSourceSerializationProxy;
 import org.opendaylight.netconf.topology.singleton.messages.YangTextSchemaSourceRequest;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 import scala.concurrent.ExecutionContext;
 import scala.concurrent.Future;
 
index 1cf783775faf846575504809d4a7e9efac21f9ce..906799fae0e9c3dcdca0e7a481398b74a8a04d8e 100644 (file)
@@ -66,17 +66,17 @@ import org.opendaylight.netconf.topology.singleton.messages.transactions.EmptyRe
 import org.opendaylight.netconf.topology.singleton.messages.transactions.NewReadTransactionRequest;
 import org.opendaylight.netconf.topology.singleton.messages.transactions.NewReadWriteTransactionRequest;
 import org.opendaylight.netconf.topology.singleton.messages.transactions.NewWriteTransactionRequest;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
 
 public class NetconfNodeActor extends AbstractUntypedActor {
@@ -96,7 +96,7 @@ public class NetconfNodeActor extends AbstractUntypedActor {
     private NetconfDataTreeService netconfService;
     //readTxActor can be shared
     private ActorRef readTxActor;
-    private List<SchemaSourceRegistration<YangTextSchemaSource>> registeredSchemas;
+    private List<Registration> registeredSchemas;
 
     public static Props props(final NetconfTopologySetup setup, final RemoteDeviceId id,
             final Timeout actorResponseWaitTime, final DOMMountPointService mountPointService) {
@@ -213,24 +213,24 @@ public class NetconfNodeActor extends AbstractUntypedActor {
     }
 
     private void sendYangTextSchemaSourceProxy(final SourceIdentifier sourceIdentifier, final ActorRef sender) {
-        final var schemaSourceFuture = schemaRepository.getSchemaSource(sourceIdentifier, YangTextSchemaSource.class);
-        Futures.addCallback(schemaSourceFuture, new FutureCallback<>() {
-            @Override
-            public void onSuccess(final YangTextSchemaSource yangTextSchemaSource) {
-                try {
-                    LOG.debug("{}: getSchemaSource for {} succeeded", id, sourceIdentifier);
-                    sender.tell(new YangTextSchemaSourceSerializationProxy(yangTextSchemaSource), getSelf());
-                } catch (IOException e) {
-                    sender.tell(new Failure(e), getSelf());
+        Futures.addCallback(schemaRepository.getSchemaSource(sourceIdentifier, YangTextSource.class),
+            new FutureCallback<>() {
+                @Override
+                public void onSuccess(final YangTextSource yangTextSchemaSource) {
+                    try {
+                        LOG.debug("{}: getSchemaSource for {} succeeded", id, sourceIdentifier);
+                        sender.tell(new YangTextSchemaSourceSerializationProxy(yangTextSchemaSource), getSelf());
+                    } catch (IOException e) {
+                        sender.tell(new Failure(e), getSelf());
+                    }
                 }
-            }
 
-            @Override
-            public void onFailure(final Throwable throwable) {
-                LOG.debug("{}: getSchemaSource for {} failed", id, sourceIdentifier, throwable);
-                sender.tell(new Failure(throwable), getSelf());
-            }
-        }, MoreExecutors.directExecutor());
+                @Override
+                public void onFailure(final Throwable throwable) {
+                    LOG.debug("{}: getSchemaSource for {} failed", id, sourceIdentifier, throwable);
+                    sender.tell(new Failure(throwable), getSelf());
+                }
+            }, MoreExecutors.directExecutor());
     }
 
     private void invokeSlaveRpc(final QName qname, final NormalizedNodeMessage normalizedNodeMessage,
@@ -320,7 +320,7 @@ public class NetconfNodeActor extends AbstractUntypedActor {
         registeredSchemas = sourceIdentifiers.stream()
                 .map(sourceId ->
                         schemaRegistry.registerSchemaSource(remoteProvider, PotentialSchemaSource.create(sourceId,
-                                YangTextSchemaSource.class, PotentialSchemaSource.Costs.REMOTE_IO.getValue())))
+                                YangTextSource.class, PotentialSchemaSource.Costs.REMOTE_IO.getValue())))
                 .collect(Collectors.toList());
 
         return schemaRepository.createEffectiveModelContextFactory();
@@ -328,8 +328,7 @@ public class NetconfNodeActor extends AbstractUntypedActor {
 
     private void resolveSchemaContext(final EffectiveModelContextFactory schemaContextFactory,
             final SlaveSalFacade localSlaveSalManager, final ActorRef masterReference, final int tries) {
-        final ListenableFuture<EffectiveModelContext> schemaContextFuture =
-                schemaContextFactory.createEffectiveModelContext(sourceIdentifiers);
+        final var schemaContextFuture = schemaContextFactory.createEffectiveModelContext(sourceIdentifiers);
         Futures.addCallback(schemaContextFuture, new FutureCallback<>() {
             @Override
             public void onSuccess(final EffectiveModelContext result) {
@@ -337,8 +336,8 @@ public class NetconfNodeActor extends AbstractUntypedActor {
                     // Make sure the slaveSalManager instance hasn't changed since we initiated the schema context
                     // resolution.
                     if (slaveSalManager == localSlaveSalManager) {
-                        LOG.info("{}: Schema context resolved: {} - registering slave mount point",
-                                id, result.getModules());
+                        LOG.info("{}: Schema context resolved: {} - registering slave mount point", id,
+                            result.getModules());
                         final var actorSystem = setup.getActorSystem();
                         final var rpcProxy = new ProxyDOMRpcService(actorSystem, masterReference, id,
                             actorResponseWaitTime);
@@ -374,7 +373,7 @@ public class NetconfNodeActor extends AbstractUntypedActor {
 
     private void closeSchemaSourceRegistrations() {
         if (registeredSchemas != null) {
-            registeredSchemas.forEach(SchemaSourceRegistration::close);
+            registeredSchemas.forEach(Registration::close);
             registeredSchemas = null;
         }
     }
index d393a7121e0df5b1ca2d96d957f9f23e4e3e331f..50660b443fc0ec15b2bdedd2ce7d9fc66db843fd 100644 (file)
@@ -16,6 +16,7 @@ import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.SettableFuture;
 import java.util.Objects;
 import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.common.api.ReadFailedException;
@@ -36,7 +37,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import scala.concurrent.ExecutionContext;
-import scala.concurrent.Future;
 
 /**
  * ProxyTransactionFacade implementation that interfaces with an actor.
@@ -46,6 +46,8 @@ import scala.concurrent.Future;
 class ActorProxyTransactionFacade implements ProxyTransactionFacade {
     private static final Logger LOG = LoggerFactory.getLogger(ActorProxyTransactionFacade.class);
 
+    private final SettableFuture<CommitInfo> settableFuture = SettableFuture.create();
+    private final @NonNull FluentFuture<CommitInfo> fluentFuture = FluentFuture.from(settableFuture);
     private final ActorRef masterTxActor;
     private final RemoteDeviceId id;
     private final ExecutionContext executionContext;
@@ -64,13 +66,16 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade {
         return id;
     }
 
+    @Override
+    public FluentFuture<?> completionFuture() {
+        return fluentFuture;
+    }
+
     @Override
     public boolean cancel() {
         LOG.debug("{}: Cancel via actor {}", id, masterTxActor);
 
-        final Future<Object> future = Patterns.ask(masterTxActor, new CancelRequest(), askTimeout);
-
-        future.onComplete(new OnComplete<>() {
+        Patterns.ask(masterTxActor, new CancelRequest(), askTimeout).onComplete(new OnComplete<>() {
             @Override
             public void onComplete(final Throwable failure, final Object response) {
                 if (failure != null) {
@@ -90,10 +95,8 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade {
             final YangInstanceIdentifier path) {
         LOG.debug("{}: Read {} {} via actor {}", id, store, path, masterTxActor);
 
-        final Future<Object> future = Patterns.ask(masterTxActor, new ReadRequest(store, path), askTimeout);
-
-        final SettableFuture<Optional<NormalizedNode>> settableFuture = SettableFuture.create();
-        future.onComplete(new OnComplete<>() {
+        final var future = SettableFuture.<Optional<NormalizedNode>>create();
+        Patterns.ask(masterTxActor, new ReadRequest(store, path), askTimeout).onComplete(new OnComplete<>() {
             @Override
             public void onComplete(final Throwable failure, final Object response) {
                 if (failure != null) {
@@ -101,9 +104,9 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade {
 
                     final Throwable processedFailure = processFailure(failure);
                     if (processedFailure instanceof ReadFailedException) {
-                        settableFuture.setException(processedFailure);
+                        future.setException(processedFailure);
                     } else {
-                        settableFuture.setException(new ReadFailedException("Read of store " + store + " path " + path
+                        future.setException(new ReadFailedException("Read of store " + store + " path " + path
                             + " failed", processedFailure));
                     }
                     return;
@@ -112,27 +115,26 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade {
                 LOG.debug("{}: Read {} {} succeeded: {}", id, store, path, response);
 
                 if (response instanceof EmptyReadResponse) {
-                    settableFuture.set(Optional.empty());
+                    future.set(Optional.empty());
                     return;
                 }
 
                 if (response instanceof NormalizedNodeMessage data) {
-                    settableFuture.set(Optional.of(data.getNode()));
+                    future.set(Optional.of(data.getNode()));
                 }
             }
         }, executionContext);
 
-        return FluentFuture.from(settableFuture);
+        return FluentFuture.from(future);
     }
 
     @Override
     public FluentFuture<Boolean> exists(final LogicalDatastoreType store, final YangInstanceIdentifier path) {
         LOG.debug("{}: Exists {} {} via actor {}", id, store, path, masterTxActor);
 
-        final Future<Object> future = Patterns.ask(masterTxActor, new ExistsRequest(store, path), askTimeout);
+        final var future = SettableFuture.<Boolean>create();
 
-        final SettableFuture<Boolean> settableFuture = SettableFuture.create();
-        future.onComplete(new OnComplete<>() {
+        Patterns.ask(masterTxActor, new ExistsRequest(store, path), askTimeout).onComplete(new OnComplete<>() {
             @Override
             public void onComplete(final Throwable failure, final Object response) {
                 if (failure != null) {
@@ -140,9 +142,9 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade {
 
                     final Throwable processedFailure = processFailure(failure);
                     if (processedFailure instanceof ReadFailedException) {
-                        settableFuture.setException(processedFailure);
+                        future.setException(processedFailure);
                     } else {
-                        settableFuture.setException(new ReadFailedException("Exists of store " + store + " path " + path
+                        future.setException(new ReadFailedException("Exists of store " + store + " path " + path
                             + " failed", processedFailure));
                     }
                     return;
@@ -150,11 +152,11 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade {
 
                 LOG.debug("{}: Exists {} {} succeeded: {}", id, store, path, response);
 
-                settableFuture.set((Boolean) response);
+                future.set((Boolean) response);
             }
         }, executionContext);
 
-        return FluentFuture.from(settableFuture);
+        return FluentFuture.from(future);
     }
 
     @Override
@@ -179,10 +181,7 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade {
     public FluentFuture<? extends CommitInfo> commit() {
         LOG.debug("{}: Commit via actor {}", id, masterTxActor);
 
-        final Future<Object> future = Patterns.ask(masterTxActor, new SubmitRequest(), askTimeout);
-
-        final SettableFuture<CommitInfo> settableFuture = SettableFuture.create();
-        future.onComplete(new OnComplete<>() {
+        Patterns.ask(masterTxActor, new SubmitRequest(), askTimeout).onComplete(new OnComplete<>() {
             @Override
             public void onComplete(final Throwable failure, final Object response) {
                 if (failure != null) {
index 4050acecaae1d7cc8766a18b654269630e6d3d51..9b2e47866a9a28105f4fe182d425e40cd9cb0832 100644 (file)
@@ -30,12 +30,16 @@ import org.slf4j.LoggerFactory;
 class FailedProxyTransactionFacade implements ProxyTransactionFacade {
     private static final Logger LOG = LoggerFactory.getLogger(FailedProxyTransactionFacade.class);
 
+    private final @NonNull FluentFuture<CommitInfo> completionFuture;
     private final RemoteDeviceId id;
     private final Throwable failure;
 
     FailedProxyTransactionFacade(final RemoteDeviceId id, final Throwable failure) {
         this.id = Objects.requireNonNull(id);
         this.failure = Objects.requireNonNull(failure);
+        completionFuture = FluentFutures.immediateFailedFluentFuture(
+            failure instanceof TransactionCommitFailedException commitFailed ? commitFailed
+                : new TransactionCommitFailedException("commit", failure));
     }
 
     @Override
@@ -43,6 +47,11 @@ class FailedProxyTransactionFacade implements ProxyTransactionFacade {
         return id;
     }
 
+    @Override
+    public FluentFuture<?> completionFuture() {
+        return completionFuture;
+    }
+
     @Override
     public boolean cancel() {
         return true;
@@ -80,14 +89,8 @@ class FailedProxyTransactionFacade implements ProxyTransactionFacade {
     }
 
     @Override
-    public @NonNull FluentFuture<? extends @NonNull CommitInfo> commit() {
+    public FluentFuture<CommitInfo> commit() {
         LOG.debug("{}: Commit - failure", id, failure);
-        final TransactionCommitFailedException txCommitEx;
-        if (failure instanceof TransactionCommitFailedException) {
-            txCommitEx = (TransactionCommitFailedException) failure;
-        } else {
-            txCommitEx = new TransactionCommitFailedException("commit", failure);
-        }
-        return FluentFutures.immediateFailedFluentFuture(txCommitEx);
+        return completionFuture;
     }
 }
index 8fb5fdf132844059772b1ebb1eb1418ee406d7ef..71b114f341b10aeb305dc3718f714b32a1a7a94b 100644 (file)
@@ -40,11 +40,12 @@ import scala.concurrent.Future;
 public class ProxyReadWriteTransaction implements DOMDataTreeReadWriteTransaction {
     private static final Logger LOG = LoggerFactory.getLogger(ProxyReadWriteTransaction.class);
 
-    private final RemoteDeviceId id;
-    private final AtomicBoolean opened = new AtomicBoolean(true);
-
     @GuardedBy("queuedTxOperations")
     private final List<Consumer<ProxyTransactionFacade>> queuedTxOperations = new ArrayList<>();
+    private final SettableFuture<CommitInfo> settableFuture = SettableFuture.create();
+    private final @NonNull FluentFuture<CommitInfo> completionFuture = FluentFuture.from(settableFuture);
+    private final AtomicBoolean opened = new AtomicBoolean(true);
+    private final RemoteDeviceId id;
 
     private volatile ProxyTransactionFacade transactionFacade;
 
@@ -70,6 +71,11 @@ public class ProxyReadWriteTransaction implements DOMDataTreeReadWriteTransactio
         }, executionContext);
     }
 
+    @Override
+    public FluentFuture<?> completionFuture() {
+        return completionFuture;
+    }
+
     @Override
     public boolean cancel() {
         if (!opened.compareAndSet(true, false)) {
@@ -122,13 +128,12 @@ public class ProxyReadWriteTransaction implements DOMDataTreeReadWriteTransactio
     }
 
     @Override
-    public @NonNull FluentFuture<? extends @NonNull CommitInfo> commit() {
+    public FluentFuture<CommitInfo> commit() {
         Preconditions.checkState(opened.compareAndSet(true, false), "%s: Transaction is already closed", id);
         LOG.debug("{}: Commit", id);
 
-        final SettableFuture<CommitInfo> returnFuture = SettableFuture.create();
-        processTransactionOperation(facade -> returnFuture.setFuture(facade.commit()));
-        return FluentFuture.from(returnFuture);
+        processTransactionOperation(facade -> settableFuture.setFuture(facade.commit()));
+        return completionFuture;
     }
 
     @Override
index e44ad70a961050cf5357940189fae9a65ba9e83a..59cf563d0829fc610d38a5c93efcee10c255eb37 100644 (file)
@@ -13,7 +13,7 @@ import akka.actor.ActorSystem;
 import java.time.Duration;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider;
 import org.opendaylight.netconf.client.NetconfClientFactory;
 import org.opendaylight.netconf.client.mdsal.NetconfDevice;
 import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas;
index 1e7157a0aa8eb931bcc003b24d87450353799f88..3794a80df9080fc05ce6db47e20313ff2abfdf51 100644 (file)
@@ -17,9 +17,9 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
+import org.opendaylight.yangtools.yang.binding.DataObjectStep;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.binding.KeyStep;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.ErrorSeverity;
@@ -49,9 +49,8 @@ public final class NetconfTopologyUtils {
         return masterAddress.replace("//", "") + "_" + name;
     }
 
-    public static @NonNull NodeId getNodeId(final PathArgument pathArgument) {
-        if (pathArgument instanceof IdentifiableItem<?, ?> identifiableItem
-            && identifiableItem.getKey() instanceof NodeKey nodeKey) {
+    public static @NonNull NodeId getNodeId(final DataObjectStep<?> pathArgument) {
+        if (pathArgument instanceof KeyStep identifiableItem && identifiableItem.key() instanceof NodeKey nodeKey) {
             return nodeKey.getNodeId();
         }
         throw new IllegalStateException("Unable to create NodeId from: " + pathArgument);
index a17f24877cf71ba70ad5b9eb9a9a9792f6291d8f..f242046baa0356ba6b6fa555cd33bb640c6bc8f3 100644 (file)
@@ -11,7 +11,7 @@ import java.util.List;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 
 /**
  * Master sends this message to the own actor to set necessary parameters.
index c47d2c4dfedf1f46c65c92b258a4dd5083320adb..e2a72b44f63a780efa875664bf53c55d624a4528 100644 (file)
@@ -5,14 +5,13 @@
  * 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.topology.singleton.messages;
 
 import akka.actor.ActorRef;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.List;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 
 /**
  * Master sends the message to slave with necessary parameters for creating slave mount point.
@@ -24,7 +23,7 @@ public class RegisterMountPoint implements Serializable {
     private final List<SourceIdentifier> allSourceIdentifiers;
     private final ActorRef masterActorRef;
 
-    public RegisterMountPoint(final List<SourceIdentifier> allSourceIdentifiers, ActorRef masterActorRef) {
+    public RegisterMountPoint(final List<SourceIdentifier> allSourceIdentifiers, final ActorRef masterActorRef) {
         this.allSourceIdentifiers = allSourceIdentifiers;
         this.masterActorRef = masterActorRef;
     }
index a3f3dabc132f0e53a264a71b6e98df1749e8717e..23d2b90721904e3ac80af47d7da66420f803bb50 100644 (file)
@@ -5,19 +5,17 @@
  * 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.topology.singleton.messages;
 
-import java.io.Serial;
 import java.io.Serializable;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 
 /**
  * Slave sends message to master when tries to resolve schema with particular sourceIdentifier (proxy call).
  * Master responds with resolved schema source.
  */
 public class YangTextSchemaSourceRequest implements Serializable {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final SourceIdentifier sourceIdentifier;
index 8cc00f1e92dc4a0d57b362f870d3039f0630ea9e..56745ed61e02bcde5fb3a14999114377eb73c404 100644 (file)
@@ -28,6 +28,7 @@ import akka.util.Timeout;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.FluentFuture;
+import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
@@ -52,14 +53,10 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
-import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.mdsal.binding.api.Transaction;
 import org.opendaylight.mdsal.binding.api.TransactionChain;
-import org.opendaylight.mdsal.binding.api.TransactionChainListener;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
@@ -82,10 +79,10 @@ import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter;
 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
 import org.opendaylight.mdsal.dom.spi.FixedDOMSchemaService;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
-import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
-import org.opendaylight.mdsal.singleton.dom.impl.DOMClusterSingletonServiceProviderImpl;
+import org.opendaylight.mdsal.eos.dom.simple.SimpleDOMEntityOwnershipService;
+import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier;
+import org.opendaylight.mdsal.singleton.impl.EOSClusterSingletonServiceProvider;
 import org.opendaylight.netconf.api.CapabilityURN;
 import org.opendaylight.netconf.client.NetconfClientFactory;
 import org.opendaylight.netconf.client.mdsal.NetconfDeviceCapabilities;
@@ -135,6 +132,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -154,9 +152,10 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
+import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource;
 import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -200,7 +199,7 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
     private final DOMMountPointService masterMountPointService = new DOMMountPointServiceImpl();
     private Rpcs.Normalized deviceRpcService;
 
-    private DOMClusterSingletonServiceProviderImpl masterClusterSingletonServiceProvider;
+    private EOSClusterSingletonServiceProvider masterClusterSingletonServiceProvider;
     private DataBroker masterDataBroker;
     private DOMDataBroker deviceDOMDataBroker;
     private ActorSystem masterSystem;
@@ -211,7 +210,7 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
     @Mock
     private ClusterSingletonServiceProvider mockSlaveClusterSingletonServiceProvider;
     @Mock
-    private ClusterSingletonServiceRegistration mockSlaveClusterSingletonServiceReg;
+    private Registration mockSlaveClusterSingletonServiceReg;
     @Mock
     private DOMMountPointListener slaveMountPointListener;
     private final DOMMountPointService slaveMountPointService = new DOMMountPointServiceImpl();
@@ -247,15 +246,15 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
 
         deviceSchemaContext = BindingRuntimeHelpers.createEffectiveModel(Top.class);
 
-        final var router = new DOMRpcRouter(FixedDOMSchemaService.of(deviceSchemaContext));
+        final var router = new DOMRpcRouter(new FixedDOMSchemaService(deviceSchemaContext));
 
         putTopRpcSchemaPath = findRpcDefinition("put-top").getQName();
         getTopRpcSchemaPath = findRpcDefinition("get-top").getQName();
 
-        router.getRpcProviderService().registerRpcImplementation(topRpcImplementation,
+        router.rpcProviderService().registerRpcImplementation(topRpcImplementation,
                 DOMRpcIdentifier.create(putTopRpcSchemaPath), DOMRpcIdentifier.create(getTopRpcSchemaPath));
 
-        final var rpcService = router.getRpcService();
+        final var rpcService = router.rpcService();
         deviceRpcService = () -> rpcService;
 
         builderFactory = new NetconfClientConfigurationBuilderFactoryImpl(mockEncryptionService, credentialProvider,
@@ -293,16 +292,15 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
 
         masterSystem = ActorSystem.create(ACTOR_SYSTEM_NAME, ConfigFactory.load().getConfig("Master"));
 
-        masterClusterSingletonServiceProvider = new DOMClusterSingletonServiceProviderImpl();
-        masterClusterSingletonServiceProvider.initializeProvider();
+        masterClusterSingletonServiceProvider = new EOSClusterSingletonServiceProvider(
+            new SimpleDOMEntityOwnershipService());
 
         final var resources =  resourceManager.getSchemaResources(TEST_DEFAULT_SUBDIR, "test");
         resources.getSchemaRegistry().registerSchemaSource(
-            id -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(id,
-                    topModuleInfo.getYangTextCharSource())),
+            id -> Futures.immediateFuture(new DelegatedYangTextSource(id, topModuleInfo.getYangTextCharSource())),
             PotentialSchemaSource.create(new SourceIdentifier(TOP_MODULE_NAME,
                     topModuleInfo.getName().getRevision().map(Revision::toString).orElse(null)),
-                YangTextSchemaSource.class, 1));
+                YangTextSource.class, 1));
 
         masterNetconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, masterDataBroker,
                 masterClusterSingletonServiceProvider, mockTimer, schemaAssembler, masterSystem,
@@ -358,15 +356,15 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
 
         verifyTopologyNodesCreated(slaveDataBroker);
 
-        slaveTxChain = slaveDataBroker.createTransactionChain(new TransactionChainListener() {
+        slaveTxChain = slaveDataBroker.createTransactionChain();
+        slaveTxChain.addCallback(new FutureCallback<Empty>() {
             @Override
-            public void onTransactionChainSuccessful(final TransactionChain chain) {
+            public void onSuccess(final Empty result) {
                 // No-op
             }
 
             @Override
-            public void onTransactionChainFailed(final TransactionChain chain, final Transaction transaction,
-                    final Throwable cause) {
+            public void onFailure(final Throwable cause) {
                 LOG.error("Slave transaction chain failed", cause);
             }
         });
@@ -418,16 +416,16 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
         // Since the master and slave use separate DataBrokers we need to copy the master's oper node to the slave.
         // This is essentially what happens in a clustered environment but we'll use a DTCL here.
 
-        masterDataBroker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, NODE_INSTANCE_ID), changes -> {
+        masterDataBroker.registerTreeChangeListener(
+            DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, NODE_INSTANCE_ID), changes -> {
                 final WriteTransaction slaveTx = slaveTxChain.newWriteOnlyTransaction();
-                for (DataTreeModification<Node> dataTreeModification : changes) {
-                    DataObjectModification<Node> rootNode = dataTreeModification.getRootNode();
-                    InstanceIdentifier<Node> path = dataTreeModification.getRootPath().getRootIdentifier();
-                    switch (rootNode.getModificationType()) {
+                for (var dataTreeModification : changes) {
+                    var rootNode = dataTreeModification.getRootNode();
+                    var path = dataTreeModification.getRootPath().path();
+                    switch (rootNode.modificationType()) {
                         case WRITE:
                         case SUBTREE_MODIFIED:
-                            slaveTx.merge(LogicalDatastoreType.OPERATIONAL, path, rootNode.getDataAfter());
+                            slaveTx.merge(LogicalDatastoreType.OPERATIONAL, path, rootNode.dataAfter());
                             break;
                         case DELETE:
                             slaveTx.delete(LogicalDatastoreType.OPERATIONAL, path);
@@ -697,9 +695,10 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
         return getMountPointService(mountPoint, DOMActionService.class);
     }
 
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     private static <T extends DOMService> T getMountPointService(final DOMMountPoint mountPoint,
             final Class<T> serviceClass) {
-        return mountPoint.getService(serviceClass).orElseThrow();
+        return (T) mountPoint.getService((Class) serviceClass).orElseThrow();
     }
 
     private DOMMountPoint awaitMountPoint(final DOMMountPointService mountPointService) {
index 53104ca035d043ad4b835cab34d77acd2ce48a9b..5db53a0019b6506451d691380b9dcc7a3a62d910 100644 (file)
@@ -100,6 +100,7 @@ import org.opendaylight.netconf.topology.singleton.messages.RefreshSetupMasterAc
 import org.opendaylight.netconf.topology.singleton.messages.RegisterMountPoint;
 import org.opendaylight.netconf.topology.singleton.messages.UnregisterSlaveMountPoint;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -112,16 +113,16 @@ import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory;
 import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
+import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource;
 import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository;
 import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
 import scala.concurrent.Await;
@@ -158,9 +159,9 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest {
     @Mock
     private NetconfDataTreeService netconfService;
     @Mock
-    private SchemaSourceRegistration<?> mockSchemaSourceReg1;
+    private Registration mockSchemaSourceReg1;
     @Mock
-    private SchemaSourceRegistration<?> mockSchemaSourceReg2;
+    private Registration mockSchemaSourceReg2;
     @Mock
     private SchemaSourceRegistry mockRegistry;
     @Mock
@@ -280,7 +281,7 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest {
 
         doReturn(mockSchemaSourceReg1).when(mockRegistry).registerSchemaSource(any(), withSourceId(SOURCE_IDENTIFIER1));
 
-        final SchemaSourceRegistration<?> newMockSchemaSourceReg = mock(SchemaSourceRegistration.class);
+        final var newMockSchemaSourceReg = mock(Registration.class);
 
         final EffectiveModelContextFactory newMockSchemaContextFactory = mock(EffectiveModelContextFactory.class);
         doReturn(Futures.immediateFuture(mockSchemaContext))
@@ -345,7 +346,8 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest {
 
         // Test unrecoverable failure.
 
-        doReturn(Futures.immediateFailedFuture(new SchemaResolutionException("mock")))
+        doReturn(Futures.immediateFailedFuture(
+            new SchemaResolutionException("mock", new SourceIdentifier("foo"), null)))
                 .when(mockSchemaContextFactory).createEffectiveModelContext(anyCollection());
 
         slaveRef.tell(new RegisterMountPoint(ImmutableList.of(SOURCE_IDENTIFIER1, SOURCE_IDENTIFIER2),
@@ -364,7 +366,7 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest {
 
         reset(mockSchemaSourceReg1, mockSchemaSourceReg2);
 
-        doReturn(Futures.immediateFailedFuture(new SchemaResolutionException("mock",
+        doReturn(Futures.immediateFailedFuture(new SchemaResolutionException("mock", new SourceIdentifier("foo"),
                 new AskTimeoutException("timeout"))))
             .doReturn(Futures.immediateFuture(mockSchemaContext))
             .when(mockSchemaContextFactory).createEffectiveModelContext(anyCollection());
@@ -396,7 +398,8 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest {
                 slaveRef.tell(new RegisterMountPoint(ImmutableList.of(SOURCE_IDENTIFIER1, SOURCE_IDENTIFIER2),
                         masterRef), testKit.getRef());
 
-                future.setException(new SchemaResolutionException("mock", new AskTimeoutException("timeout")));
+                future.setException(new SchemaResolutionException("mock", new SourceIdentifier("foo"),
+                    new AskTimeoutException("timeout")));
             }).start();
             return future;
         }).when(mockSchemaContextFactory).createEffectiveModelContext(anyCollection());
@@ -443,21 +446,21 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest {
         final ProxyYangTextSourceProvider proxyYangProvider =
                 new ProxyYangTextSourceProvider(masterRef, system.dispatcher(), TIMEOUT);
 
-        final YangTextSchemaSource yangTextSchemaSource = YangTextSchemaSource.delegateForCharSource(sourceIdentifier,
-                CharSource.wrap("YANG"));
+        final YangTextSource yangTextSchemaSource = new DelegatedYangTextSource(sourceIdentifier,
+            CharSource.wrap("YANG"));
 
         // Test success.
 
-        final SchemaSourceRegistration<YangTextSchemaSource> schemaSourceReg = masterSchemaRepository
-                .registerSchemaSource(id -> Futures.immediateFuture(yangTextSchemaSource),
-                     PotentialSchemaSource.create(sourceIdentifier, YangTextSchemaSource.class, 1));
+        final var schemaSourceReg = masterSchemaRepository.registerSchemaSource(
+            id -> Futures.immediateFuture(yangTextSchemaSource),
+            PotentialSchemaSource.create(sourceIdentifier, YangTextSource.class, 1));
 
         final Future<YangTextSchemaSourceSerializationProxy> resolvedSchemaFuture =
                 proxyYangProvider.getYangTextSchemaSource(sourceIdentifier);
 
         final YangTextSchemaSourceSerializationProxy success = Await.result(resolvedSchemaFuture, TIMEOUT.duration());
 
-        assertEquals(sourceIdentifier, success.getRepresentation().getIdentifier());
+        assertEquals(sourceIdentifier, success.getRepresentation().sourceId());
         assertEquals("YANG", success.getRepresentation().read());
 
         // Test missing source failure.
index a13e81be805318b2b5dec989ae815a52a429a114..92ac0b78de816c0cd843c205f36f8c4bdd083ca6 100644 (file)
@@ -83,14 +83,15 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
+import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource;
 import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository;
 import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
 
@@ -153,9 +154,9 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
 
         SOURCE_IDENTIFIERS.stream().map(
             sourceId -> masterSchemaRepository.registerSchemaSource(
-                id -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(id,
+                id -> Futures.immediateFuture(new DelegatedYangTextSource(id,
                         CharSource.wrap(yangTemplate.replaceAll("ID", id.name().getLocalName())))),
-                PotentialSchemaSource.create(sourceId, YangTextSchemaSource.class, 1)))
+                PotentialSchemaSource.create(sourceId, YangTextSource.class, 1)))
         .collect(Collectors.toList());
 
         NetconfTopologySetup masterSetup = NetconfTopologySetup.builder()
@@ -199,8 +200,8 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
     public void testSlaveMountPointRegistration() throws InterruptedException, ExecutionException, TimeoutException {
         initializeMaster();
 
-        ListenerRegistration<?> mockListenerReg = mock(ListenerRegistration.class);
-        doReturn(mockListenerReg).when(mockDataBroker).registerDataTreeChangeListener(any(), any());
+        Registration mockListenerReg = mock(Registration.class);
+        doReturn(mockListenerReg).when(mockDataBroker).registerTreeChangeListener(any(), any());
 
         final NodeId nodeId = new NodeId("device");
         final NodeKey nodeKey = new NodeKey(nodeId);
@@ -209,7 +210,7 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
                 nodeKey, topologyId);
 
         netconfNodeManager.registerDataTreeChangeListener(topologyId, nodeKey);
-        verify(mockDataBroker).registerDataTreeChangeListener(any(), eq(netconfNodeManager));
+        verify(mockDataBroker).registerTreeChangeListener(any(), eq(netconfNodeManager));
 
         // Invoke onDataTreeChanged with a NetconfNode WRITE to simulate the master writing the operational state to
         // Connected. Expect the slave mount point created and registered.
@@ -218,12 +219,12 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
         final Node node = new NodeBuilder().setNodeId(nodeId).addAugmentation(netconfNode).build();
 
         DataObjectModification<Node> mockDataObjModification = mock(DataObjectModification.class);
-        doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).getIdentifier();
-        doReturn(WRITE).when(mockDataObjModification).getModificationType();
-        doReturn(node).when(mockDataObjModification).getDataAfter();
+        doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).step();
+        doReturn(WRITE).when(mockDataObjModification).modificationType();
+        doReturn(node).when(mockDataObjModification).dataAfter();
 
         netconfNodeManager.onDataTreeChanged(List.of(
-                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(
+                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of(
                         LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
 
         verify(mockMountPointBuilder, timeout(5000)).register();
@@ -234,10 +235,10 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
 
         // Notify that the NetconfNode operational state was deleted. Expect the slave mount point closed.
 
-        doReturn(DELETE).when(mockDataObjModification).getModificationType();
+        doReturn(DELETE).when(mockDataObjModification).modificationType();
 
         netconfNodeManager.onDataTreeChanged(List.of(
-                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(
+                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of(
                         LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
 
         verify(mockMountPointReg, timeout(5000)).close();
@@ -246,12 +247,12 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
 
         setupMountPointMocks();
 
-        doReturn(WRITE).when(mockDataObjModification).getModificationType();
-        doReturn(null).when(mockDataObjModification).getDataBefore();
-        doReturn(node).when(mockDataObjModification).getDataAfter();
+        doReturn(WRITE).when(mockDataObjModification).modificationType();
+        doReturn(null).when(mockDataObjModification).dataBefore();
+        doReturn(node).when(mockDataObjModification).dataAfter();
 
         netconfNodeManager.onDataTreeChanged(List.of(
-                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(
+                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of(
                         LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
 
         verify(mockMountPointBuilder, timeout(5000)).register();
@@ -261,10 +262,10 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
 
         setupMountPointMocks();
 
-        doReturn(node).when(mockDataObjModification).getDataBefore();
+        doReturn(node).when(mockDataObjModification).dataBefore();
 
         netconfNodeManager.onDataTreeChanged(List.of(
-                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(
+                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of(
                         LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
 
         verify(mockMountPointReg, timeout(5000)).close();
@@ -282,12 +283,12 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
                     .build())
                 .build();
 
-        doReturn(SUBTREE_MODIFIED).when(mockDataObjModification).getModificationType();
-        doReturn(node).when(mockDataObjModification).getDataBefore();
-        doReturn(updatedNode).when(mockDataObjModification).getDataAfter();
+        doReturn(SUBTREE_MODIFIED).when(mockDataObjModification).modificationType();
+        doReturn(node).when(mockDataObjModification).dataBefore();
+        doReturn(updatedNode).when(mockDataObjModification).dataAfter();
 
         netconfNodeManager.onDataTreeChanged(List.of(
-                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(
+                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of(
                         LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
 
         verify(mockMountPointReg, timeout(5000)).close();
@@ -310,14 +311,14 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
         final Node node = new NodeBuilder().setNodeId(nodeId).addAugmentation(netconfNode).build();
 
         DataObjectModification<Node> mockDataObjModification = mock(DataObjectModification.class);
-        doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).getIdentifier();
-        doReturn(WRITE).when(mockDataObjModification).getModificationType();
-        doReturn(node).when(mockDataObjModification).getDataAfter();
+        doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).step();
+        doReturn(WRITE).when(mockDataObjModification).modificationType();
+        doReturn(node).when(mockDataObjModification).dataAfter();
 
         // First try the registration where the perceived master hasn't been initialized as the master.
 
         netconfNodeManager.onDataTreeChanged(List.of(
-                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(
+                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of(
                         LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
 
         verify(mockMountPointBuilder, after(1000).never()).register();
@@ -332,7 +333,7 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
                 yangTextSchemaSourceRequestFuture);
 
         netconfNodeManager.onDataTreeChanged(List.of(
-                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(
+                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of(
                         LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
 
         yangTextSchemaSourceRequestFuture.get(5, TimeUnit.SECONDS);
@@ -348,7 +349,7 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest {
                 askForMasterMountPointFuture);
 
         netconfNodeManager.onDataTreeChanged(List.of(
-                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(
+                new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of(
                         LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
 
         askForMasterMountPointFuture.get(5, TimeUnit.SECONDS);
index 64a36ce299df314fea66ed09fcd1cd23ded1669b..9928f1dd8fa1cea28913310e0520c45c83755bee 100644 (file)
@@ -51,9 +51,8 @@ import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTest;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
-import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier;
 import org.opendaylight.netconf.client.NetconfClientFactory;
 import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory;
 import org.opendaylight.netconf.client.mdsal.impl.DefaultSchemaResourceManager;
@@ -73,9 +72,9 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyStep;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory;
@@ -90,7 +89,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
     @Mock
     private ClusterSingletonServiceProvider clusterSingletonServiceProvider;
     @Mock
-    private ListenerRegistration<?> mockListenerReg;
+    private Registration mockListenerReg;
     @Mock
     private Registration mockRpcReg;
     @Mock
@@ -133,7 +132,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         dataBroker = spy(dataBrokerTest.getDataBroker());
 
         doNothing().when(mockListenerReg).close();
-        doReturn(mockListenerReg).when(dataBroker).registerDataTreeChangeListener(any(), any());
+        doReturn(mockListenerReg).when(dataBroker).registerTreeChangeListener(any(), any());
         doReturn(mockRpcReg).when(rpcProviderService).registerRpcImplementations(any());
 
         netconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, dataBroker, clusterSingletonServiceProvider,
@@ -167,8 +166,8 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
 
         // verify registration is called with right parameters
 
-        verify(dataBroker).registerDataTreeChangeListener(
-                DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, NetconfTopologyUtils
+        verify(dataBroker).registerTreeChangeListener(
+                DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, NetconfTopologyUtils
                         .createTopologyListPath(TOPOLOGY_ID).child(Node.class)), netconfTopologyManager);
 
         netconfTopologyManager.close();
@@ -198,10 +197,10 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         final Node node1 = new NodeBuilder().setNodeId(nodeId1).addAugmentation(netconfNode1).build();
 
         final DataObjectModification<Node> dataObjectModification1 = mock(DataObjectModification.class);
-        doReturn(WRITE).when(dataObjectModification1).getModificationType();
-        doReturn(node1).when(dataObjectModification1).getDataAfter();
-        doReturn(InstanceIdentifier.IdentifiableItem.of(Node.class, new NodeKey(nodeId1)))
-                .when(dataObjectModification1).getIdentifier();
+        doReturn(WRITE).when(dataObjectModification1).modificationType();
+        doReturn(node1).when(dataObjectModification1).dataAfter();
+        doReturn(new KeyStep<>(Node.class, new NodeKey(nodeId1)))
+                .when(dataObjectModification1).step();
 
         final NetconfNode netconfNode2 = new NetconfNodeBuilder()
                 .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1"))))
@@ -211,10 +210,9 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         final Node node2 = new NodeBuilder().setNodeId(nodeId2).addAugmentation(netconfNode2).build();
 
         final DataObjectModification<Node> dataObjectModification2 = mock(DataObjectModification.class);
-        doReturn(WRITE).when(dataObjectModification2).getModificationType();
-        doReturn(node2).when(dataObjectModification2).getDataAfter();
-        doReturn(InstanceIdentifier.IdentifiableItem.of(Node.class, new NodeKey(nodeId2)))
-                .when(dataObjectModification2).getIdentifier();
+        doReturn(WRITE).when(dataObjectModification2).modificationType();
+        doReturn(node2).when(dataObjectModification2).dataAfter();
+        doReturn(new KeyStep<>(Node.class, new NodeKey(nodeId2))).when(dataObjectModification2).step();
 
         final NetconfTopologyContext mockContext1 = mock(NetconfTopologyContext.class);
         mockContextMap.put(nodeInstanceId1, setup -> {
@@ -230,8 +228,8 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
             return mockContext2;
         });
 
-        ClusterSingletonServiceRegistration mockClusterRegistration1 = mock(ClusterSingletonServiceRegistration.class);
-        ClusterSingletonServiceRegistration mockClusterRegistration2 = mock(ClusterSingletonServiceRegistration.class);
+        final var mockClusterRegistration1 = mock(Registration.class);
+        final var mockClusterRegistration2 = mock(Registration.class);
 
         doReturn(mockClusterRegistration1).when(clusterSingletonServiceProvider)
                 .registerClusterSingletonService(mockContext1);
@@ -239,9 +237,9 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
                 .registerClusterSingletonService(mockContext2);
 
         netconfTopologyManager.onDataTreeChanged(List.of(
-                new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+                new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1),
-                new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+                new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId2), dataObjectModification2)));
 
         verify(clusterSingletonServiceProvider).registerClusterSingletonService(mockContext1);
@@ -254,19 +252,19 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
                 .setPort(new PortNumber(Uint16.valueOf(33333))).build();
         final Node updatedNode1 = new NodeBuilder().setNodeId(nodeId1).addAugmentation(updatedNetconfNode1).build();
 
-        doReturn(WRITE).when(dataObjectModification1).getModificationType();
-        doReturn(updatedNode1).when(dataObjectModification1).getDataAfter();
+        doReturn(WRITE).when(dataObjectModification1).modificationType();
+        doReturn(updatedNode1).when(dataObjectModification1).dataAfter();
 
-        doReturn(SUBTREE_MODIFIED).when(dataObjectModification2).getModificationType();
-        doReturn(node2).when(dataObjectModification2).getDataAfter();
+        doReturn(SUBTREE_MODIFIED).when(dataObjectModification2).modificationType();
+        doReturn(node2).when(dataObjectModification2).dataAfter();
 
         doNothing().when(mockContext1).refresh(any());
         doNothing().when(mockContext2).refresh(any());
 
         netconfTopologyManager.onDataTreeChanged(List.of(
-                new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+                new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1),
-                new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+                new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId2), dataObjectModification2)));
 
         ArgumentCaptor<NetconfTopologySetup> mockContext1Setup = ArgumentCaptor.forClass(NetconfTopologySetup.class);
@@ -278,10 +276,10 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         verifyNoMoreInteractions(clusterSingletonServiceProvider);
 
         // Notify of Node 1 deleted.
-        doReturn(DELETE).when(dataObjectModification1).getModificationType();
+        doReturn(DELETE).when(dataObjectModification1).modificationType();
 
         netconfTopologyManager.onDataTreeChanged(List.of(
-                new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+                new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1)));
 
         verify(mockClusterRegistration1).close();
@@ -292,14 +290,13 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         reset(clusterSingletonServiceProvider);
 
         final NetconfTopologyContext newMockContext1 = mock(NetconfTopologyContext.class);
-        final ClusterSingletonServiceRegistration newMockClusterRegistration1 =
-                mock(ClusterSingletonServiceRegistration.class);
+        final var newMockClusterRegistration1 = mock(Registration.class);
 
         doThrow(new RuntimeException("mock error")).doReturn(newMockClusterRegistration1)
                 .when(clusterSingletonServiceProvider).registerClusterSingletonService(newMockContext1);
 
-        doReturn(WRITE).when(dataObjectModification1).getModificationType();
-        doReturn(node1).when(dataObjectModification1).getDataAfter();
+        doReturn(WRITE).when(dataObjectModification1).modificationType();
+        doReturn(node1).when(dataObjectModification1).dataAfter();
 
         mockContextMap.put(nodeInstanceId1, setup -> {
             assertEquals(node1, setup.getNode());
@@ -308,7 +305,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         });
 
         netconfTopologyManager.onDataTreeChanged(List.of(
-                new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+                new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1)));
 
         verify(clusterSingletonServiceProvider, times(2)).registerClusterSingletonService(newMockContext1);
@@ -345,10 +342,9 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
                 .build();
 
         final DataObjectModification<Node> dataObjectModification = mock(DataObjectModification.class);
-        doReturn(WRITE).when(dataObjectModification).getModificationType();
-        doReturn(node).when(dataObjectModification).getDataAfter();
-        doReturn(InstanceIdentifier.IdentifiableItem.of(Node.class, new NodeKey(nodeId)))
-                .when(dataObjectModification).getIdentifier();
+        doReturn(WRITE).when(dataObjectModification).modificationType();
+        doReturn(node).when(dataObjectModification).dataAfter();
+        doReturn(new KeyStep<>(Node.class, new NodeKey(nodeId))).when(dataObjectModification).step();
 
         final NetconfTopologyContext mockContext = mock(NetconfTopologyContext.class);
         mockContextMap.put(nodeInstanceId, setup -> mockContext);
@@ -357,7 +353,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
                 .registerClusterSingletonService(mockContext);
 
         netconfTopologyManager.onDataTreeChanged(List.of(
-                new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+                new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId), dataObjectModification)));
 
         verify(clusterSingletonServiceProvider, times(3)).registerClusterSingletonService(mockContext);
index df2550d9af90755187d1f9721d180cfef0cea1d0..afa2a7757fbb983975be33c8dd691d3143669e03 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.netconf.topology.singleton.impl;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThrows;
 
 import akka.actor.ActorSystem;
 import akka.actor.Status.Success;
@@ -16,6 +16,7 @@ import akka.testkit.TestProbe;
 import akka.testkit.javadsl.TestKit;
 import akka.util.Timeout;
 import java.net.InetSocketAddress;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 import org.junit.AfterClass;
 import org.junit.Test;
@@ -87,13 +88,13 @@ public class ProxyDOMDataBrokerTest {
         masterActor.expectMsgClass(ReadRequest.class);
     }
 
-    @Test(expected = UnsupportedOperationException.class)
+    @Test
     public void testCreateTransactionChain() {
-        proxy.createTransactionChain(null);
+        assertThrows(UnsupportedOperationException.class, proxy::createTransactionChain);
     }
 
     @Test
     public void testGetSupportedExtensions() {
-        assertTrue(proxy.getExtensions().isEmpty());
+        assertEquals(List.of(), proxy.supportedExtensions());
     }
 }
index f48a6394f9309ee54deac28c86b5239906365223..af6c65ecfca50068276b9e338fd39c97dff78b52 100644 (file)
             <artifactId>javax.inject</artifactId>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk18on</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.aaa</groupId>
             <artifactId>aaa-encrypt-service</artifactId>
index ad5c935f446ae8323c5e478f21e465d34cc80fcb..1e9ef1e57fec97788fed7abce442c5abe607a636 100644 (file)
@@ -13,6 +13,8 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
 import java.io.IOException;
 import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
+import java.security.GeneralSecurityException;
 import java.security.KeyPair;
 import java.security.Provider;
 import java.security.Security;
@@ -119,8 +121,16 @@ public final class NetconfClientConfigurationBuilderFactoryImpl implements Netco
         } else if (credentials instanceof LoginPw loginPw) {
             final var loginPassword = loginPw.getLoginPassword();
             final var username = loginPassword.getUsername();
-            final var password = Base64.getEncoder().encodeToString(loginPassword.getPassword());
-            sshParamsBuilder.setClientIdentity(loginPasswordIdentity(username, encryptionService.decrypt(password)));
+
+            final byte[] plainBytes;
+            try {
+                plainBytes = encryptionService.decrypt(loginPassword.getPassword());
+            } catch (GeneralSecurityException e) {
+                throw new IllegalStateException("Failed to decrypt password", e);
+            }
+
+            sshParamsBuilder.setClientIdentity(loginPasswordIdentity(username,
+                new String(plainBytes, StandardCharsets.UTF_8)));
         } else if (credentials instanceof KeyAuth keyAuth) {
             final var keyBased = keyAuth.getKeyBased();
             sshParamsBuilder.setClientIdentity(new ClientIdentityBuilder().setUsername(keyBased.getUsername()).build());
@@ -156,13 +166,24 @@ public final class NetconfClientConfigurationBuilderFactoryImpl implements Netco
         }
         final var passPhrase = Strings.isNullOrEmpty(dsKeypair.getPassphrase()) ? "" : dsKeypair.getPassphrase();
         try {
-            return decodePrivateKey(encryptionService.decrypt(dsKeypair.getPrivateKey()),
-                encryptionService.decrypt(passPhrase));
+            return decodePrivateKey(decryptString(dsKeypair.getPrivateKey()), decryptString(passPhrase));
         } catch (IOException e) {
             throw new IllegalStateException("Could not decode private key with keyId=" + keyId, e);
         }
     }
 
+    private String decryptString(final String encrypted) {
+        final byte[] cryptobytes = Base64.getDecoder().decode(encrypted);
+        final byte[] clearbytes;
+        try {
+            clearbytes = encryptionService.decrypt(cryptobytes);
+        } catch (GeneralSecurityException e) {
+            throw new IllegalStateException("Failed to decrypt", e);
+        }
+        return new String(clearbytes, StandardCharsets.UTF_8);
+    }
+
+
     @VisibleForTesting
     static KeyPair decodePrivateKey(final String privateKey, final String passphrase) throws IOException {
         try (var keyReader = new PEMParser(new StringReader(privateKey.replace("\\n", "\n")))) {
index 771ef72f0093215f5dbc3f5daa5775a5d47d7048..9a10add288c40a3dbfe00cc592ae5ead3edfe1d3 100644 (file)
@@ -17,9 +17,7 @@ import com.google.common.util.concurrent.SettableFuture;
 import org.checkerframework.checker.lock.qual.GuardedBy;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.Transaction;
 import org.opendaylight.mdsal.binding.api.TransactionChain;
-import org.opendaylight.mdsal.binding.api.TransactionChainListener;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -48,7 +46,7 @@ import org.opendaylight.yangtools.yang.common.Uint16;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class NetconfDeviceTopologyAdapter implements TransactionChainListener {
+public final class NetconfDeviceTopologyAdapter implements FutureCallback<Empty> {
     private static final Logger LOG = LoggerFactory.getLogger(NetconfDeviceTopologyAdapter.class);
 
     private final @NonNull KeyedInstanceIdentifier<Topology, TopologyKey> topologyPath;
@@ -65,7 +63,8 @@ public final class NetconfDeviceTopologyAdapter implements TransactionChainListe
         this.dataBroker = requireNonNull(dataBroker);
         this.topologyPath = requireNonNull(topologyPath);
         this.id = requireNonNull(id);
-        txChain = dataBroker.createMergingTransactionChain(this);
+        txChain = dataBroker.createMergingTransactionChain();
+        txChain.addCallback(this);
 
         final var tx = txChain.newWriteOnlyTransaction();
         LOG.trace("{}: Init device state transaction {} putting if absent operational data started.", id,
@@ -186,25 +185,25 @@ public final class NetconfDeviceTopologyAdapter implements TransactionChainListe
     }
 
     @Override
-    public synchronized void onTransactionChainFailed(final TransactionChain chain, final Transaction transaction,
-            final Throwable cause) {
-        LOG.warn("{}: TransactionChain({}) {} FAILED!", id, chain, transaction.getIdentifier(), cause);
+    public synchronized void onFailure(final Throwable cause) {
+        LOG.warn("{}: transaction chain FAILED!", id, cause);
         if (closeFuture != null) {
             closeFuture.setException(cause);
             return;
         }
 
         // FIXME: move this up once we have MDSAL-838 fixed
-        chain.close();
+        txChain.close();
 
-        txChain = dataBroker.createMergingTransactionChain(this);
+        txChain = dataBroker.createMergingTransactionChain();
         LOG.info("{}: TransactionChain reset to {}", id, txChain);
+        txChain.addCallback(this);
         // FIXME: restart last update
     }
 
     @Override
-    public synchronized void onTransactionChainSuccessful(final TransactionChain chain) {
-        LOG.trace("{}: TransactionChain({}) SUCCESSFUL", id, chain);
+    public synchronized void onSuccess(final Empty result) {
+        LOG.trace("{}: transaction chain SUCCESSFUL", id);
         closeFuture.set(Empty.value());
     }
 
index 9084c4a158ddd41058281059b13ae3fda9c32363..d3962ac22d17d278e1dcce7c738d27b2879dd615 100644 (file)
@@ -49,9 +49,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev22
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -106,7 +106,7 @@ public final class NetconfNodeHandler extends AbstractRegistration implements Re
 
     private static final Logger LOG = LoggerFactory.getLogger(NetconfNodeHandler.class);
 
-    private final @NonNull List<SchemaSourceRegistration<?>> yanglibRegistrations;
+    private final @NonNull List<Registration> yanglibRegistrations;
     private final @NonNull NetconfClientFactory clientFactory;
     private final @NonNull NetconfClientConfiguration clientConfig;
     private final @NonNull NetconfDeviceCommunicator communicator;
@@ -259,7 +259,7 @@ public final class NetconfNodeHandler extends AbstractRegistration implements Re
 
         communicator.close();
         delegate.close();
-        yanglibRegistrations.forEach(SchemaSourceRegistration::close);
+        yanglibRegistrations.forEach(Registration::close);
     }
 
     @Override
@@ -337,13 +337,13 @@ public final class NetconfNodeHandler extends AbstractRegistration implements Re
         }
     }
 
-    private static List<SchemaSourceRegistration<?>> registerDeviceSchemaSources(final RemoteDeviceId remoteDeviceId,
+    private static List<Registration> registerDeviceSchemaSources(final RemoteDeviceId remoteDeviceId,
             final NetconfNode node, final SchemaResourcesDTO resources) {
         final var yangLibrary = node.getYangLibrary();
         if (yangLibrary != null) {
             final Uri uri = yangLibrary.getYangLibraryUrl();
             if (uri != null) {
-                final var registrations = new ArrayList<SchemaSourceRegistration<?>>();
+                final var registrations = new ArrayList<Registration>();
                 final var yangLibURL = uri.getValue();
                 final var schemaRegistry = resources.getSchemaRegistry();
 
@@ -357,7 +357,7 @@ public final class NetconfNodeHandler extends AbstractRegistration implements Re
                 for (var entry : schemas.getAvailableModels().entrySet()) {
                     registrations.add(schemaRegistry.registerSchemaSource(new LibrarySchemaSourceProvider(
                         remoteDeviceId, schemas.getAvailableModels()),
-                        PotentialSchemaSource.create(entry.getKey(), YangTextSchemaSource.class,
+                        PotentialSchemaSource.create(entry.getKey(), YangTextSource.class,
                             PotentialSchemaSource.Costs.REMOTE_IO.getValue())));
                 }
                 return List.copyOf(registrations);
index 75458b19eb8f426f75fef5eec525321e85a66f7d..a750dd115d6d04e1e0bfeda7839bcfed7327277f 100644 (file)
@@ -15,7 +15,8 @@ import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.SettableFuture;
-import java.util.Base64;
+import java.nio.charset.StandardCharsets;
+import java.security.GeneralSecurityException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
 import org.opendaylight.mdsal.binding.api.DataBroker;
@@ -119,7 +120,6 @@ public final class NetconfTopologyRPCProvider implements AutoCloseable {
         final SettableFuture<RpcResult<DeleteDeviceOutput>> rpcFuture = SettableFuture.create();
 
         wtx.commit().addCallback(new FutureCallback<CommitInfo>() {
-
             @Override
             public void onSuccess(final CommitInfo result) {
                 LOG.info("delete-device RPC: Removed netconf node successfully.");
@@ -147,10 +147,18 @@ public final class NetconfTopologyRPCProvider implements AutoCloseable {
     private Credentials translate(final RpcCredentials credentialsRpc) {
         if (credentialsRpc instanceof LoginPw loginPw) {
             final var loginPassword = loginPw.getLoginPassword();
+            final byte[] cipherBytes;
+
+            try {
+                cipherBytes = encryptionService.encrypt(loginPassword.getPassword().getBytes(StandardCharsets.UTF_8));
+            } catch (GeneralSecurityException e) {
+                throw new IllegalArgumentException("Failed to encrypt password", e);
+            }
+
             return new LoginPwBuilder()
                 .setLoginPassword(new LoginPasswordBuilder()
                     .setUsername(loginPassword.getUsername())
-                    .setPassword(Base64.getDecoder().decode(encryptionService.encrypt(loginPassword.getPassword())))
+                    .setPassword(cipherBytes)
                     .build())
                 .build();
         } else if (credentialsRpc instanceof LoginPwUnencrypted loginPwUnencrypted) {
index 2b00def16726531616fd71d727f4d6247b634ab9..08b604e24801d9151831fc611598c2dba05536f0 100644 (file)
@@ -17,6 +17,7 @@ import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
+import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutionException;
@@ -29,7 +30,6 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.TransactionChain;
-import org.opendaylight.mdsal.binding.api.TransactionChainListener;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -61,7 +61,7 @@ public class NetconfDeviceTopologyAdapterTest {
     @Mock
     private WriteTransaction mockTx;
     @Captor
-    private ArgumentCaptor<TransactionChainListener> listeners;
+    private ArgumentCaptor<FutureCallback<Empty>> listeners;
 
     private NetconfDeviceTopologyAdapter adapter;
 
@@ -74,7 +74,8 @@ public class NetconfDeviceTopologyAdapterTest {
         doReturn("test transaction").when(mockTx).getIdentifier();
         doReturn(CommitInfo.emptyFluentFuture()).when(mockTx).commit();
 
-        doReturn(mockChain).when(mockBroker).createMergingTransactionChain(listeners.capture());
+        doReturn(mockChain).when(mockBroker).createMergingTransactionChain();
+        doNothing().when(mockChain).addCallback(listeners.capture());
         adapter = new NetconfDeviceTopologyAdapter(mockBroker, TEST_TOPOLOGY_ID, id);
     }
 
@@ -82,8 +83,8 @@ public class NetconfDeviceTopologyAdapterTest {
     public void replaceChainIfFailed() {
         doNothing().when(mockChain).close();
         doReturn("mockChain").when(mockChain).toString();
-        adapter.onTransactionChainFailed(mockChain, mockTx, new Exception("chain failed"));
-        verify(mockBroker, times(2)).createMergingTransactionChain(any());
+        adapter.onFailure(new Exception("chain failed"));
+        verify(mockBroker, times(2)).createMergingTransactionChain();
     }
 
     @Test
@@ -131,7 +132,7 @@ public class NetconfDeviceTopologyAdapterTest {
         assertSame(future, adapter.shutdown());
 
         // future completes
-        listeners.getValue().onTransactionChainSuccessful(mockChain);
+        listeners.getValue().onSuccess(Empty.value());
         assertSame(Empty.value(), Futures.getDone(future));
     }
 
@@ -155,7 +156,7 @@ public class NetconfDeviceTopologyAdapterTest {
 
         // future completes
         final var cause = new Throwable();
-        listeners.getValue().onTransactionChainFailed(mockChain, mockTx, cause);
+        listeners.getValue().onFailure(cause);
         final var ex = assertThrows(ExecutionException.class, () -> Futures.getDone(future));
         assertSame(cause, ex.getCause());
     }
index 7931b653e86061d2669fd5f2584f5dce11980c37..de7db95e4cfae0c1606f61e38a63f9cd1a839dd7 100644 (file)
@@ -7,12 +7,13 @@
  */
 package org.opendaylight.netconf.topology.spi;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 
-import java.util.Base64;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -59,22 +60,18 @@ public class NetconfTopologyRPCProviderTest {
     private NetconfTopologyRPCProvider rpcProvider;
 
     @Before
-    public void setUp() {
-        doReturn(ENC_PWD).when(encryptionService).encrypt(TEST_PWD);
+    public void setUp() throws Exception {
+        doReturn(ENC_PWD.getBytes()).when(encryptionService).encrypt(TEST_PWD.getBytes());
         doReturn(rpcReg).when(rpcProviderService).registerRpcImplementations(any());
         rpcProvider = new NetconfTopologyRPCProvider(rpcProviderService, dataBroker, encryptionService, TOPOLOGY_ID);
     }
 
     @Test
     public void testEncryptPassword() {
+        final var encryptedPwNode = rpcProvider.encryptPassword(getInput(true));
+        final var loginPw = assertInstanceOf(LoginPw.class, encryptedPwNode.getCredentials());
 
-        final NetconfNode encryptedPwNode = rpcProvider.encryptPassword(getInput(true));
-
-        final Credentials credentials = encryptedPwNode.getCredentials();
-        assertTrue(credentials instanceof LoginPw);
-        final LoginPw loginPw = (LoginPw) credentials;
-
-        assertEquals(ENC_PWD, Base64.getEncoder().encodeToString(loginPw.getLoginPassword().getPassword()));
+        assertArrayEquals(ENC_PWD.getBytes(), loginPw.getLoginPassword().getPassword());
     }
 
     @Test
index 773e0371f61982feb55125caf484950e8da281a2..0436dca8f61a2266ca7794a3b67a9315a3635615 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.netconf.yanglib.writer;
 
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.concurrent.ExecutionException;
@@ -26,7 +27,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.librar
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -43,10 +43,9 @@ import org.slf4j.LoggerFactory;
  * state to operational data store.
  */
 @Singleton
-@Component(immediate = true, configurationPid = "org.opendaylight.netconf.yanglib")
+@Component(service = { }, configurationPid = "org.opendaylight.netconf.yanglib")
 @Designate(ocd = YangLibraryWriter.Configuration.class)
-public final class YangLibraryWriter implements EffectiveModelContextListener, AutoCloseable {
-
+public final class YangLibraryWriter implements AutoCloseable {
     @ObjectClassDefinition
     public @interface Configuration {
         @AttributeDefinition(description = "Enables legacy content to be written")
@@ -72,10 +71,10 @@ public final class YangLibraryWriter implements EffectiveModelContextListener, A
     @Inject
     @Activate
     public YangLibraryWriter(final @Reference DOMSchemaService schemaService,
-        final @Reference DataBroker dataBroker, final Configuration configuration) {
+            final @Reference DataBroker dataBroker, final Configuration configuration) {
         this.dataBroker = requireNonNull(dataBroker);
-        this.writeLegacy = configuration.write$_$legacy();
-        reg = schemaService.registerSchemaContextListener(this);
+        writeLegacy = configuration.write$_$legacy();
+        reg = schemaService.registerSchemaContextListener(this::onModelContextUpdated);
     }
 
     @Deactivate
@@ -114,8 +113,7 @@ public final class YangLibraryWriter implements EffectiveModelContextListener, A
         future.get();
     }
 
-    @Override
-    public void onModelContextUpdated(final EffectiveModelContext context) {
+    @VisibleForTesting void onModelContextUpdated(final EffectiveModelContext context) {
         if (context.findModule(YangLibrary.QNAME.getModule()).isPresent()) {
             updateYangLibrary(context);
         } else {
index 2e4112fccf1125b6bff0b167ec44b765a0706859..e1b013439ea364525bbbba3ca3abc77864123fa9 100644 (file)
@@ -57,10 +57,9 @@ 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.yang.library.parameters.ModuleSetBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.SchemaBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
 
 @ExtendWith(MockitoExtension.class)
 class YangLibraryWriterTest {
@@ -82,7 +81,7 @@ class YangLibraryWriterTest {
     @Mock
     private WriteTransaction writeTransaction;
     @Mock
-    private ListenerRegistration<EffectiveModelContextListener> registration;
+    private Registration registration;
     @Mock
     private YangLibraryWriter.Configuration config;
     @Captor
index 3b0f8a4b5929fa2b99f541d4fc1f3d11665b7c31..c766ecba368cb06db36d9846aabce359e342ecaf 100644 (file)
@@ -7,6 +7,6 @@
  -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-aaa-netconf-plugin">
     <feature name="odl-aaa-netconf-plugin">
-        <feature version="[0.18,1)">odl-aaa-shiro</feature>
+        <feature version="[0.19,1)">odl-aaa-shiro</feature>
     </feature>
 </features>
index 496c9002d799ee30835808a7f0d97dd1ba27be14..1ce22d9279ef2f86ed98920242252e7d699436c1 100644 (file)
@@ -9,6 +9,6 @@
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-api" version="${project.version}">
         <feature version="[13,14)">odl-netty-4</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8525</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8525</feature>
     </feature>
 </features>
index 25836d6db5ab38611045c6fcf4eb660f90ff61a8..4f64bcae5b3f686469c0405972e91f29b40dc44e 100644 (file)
@@ -8,8 +8,8 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-connector" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal</feature>
-        <feature version="[8,9)">odl-mdsal-broker</feature>
-        <feature version="[0.18,1)">odl-aaa-encryption-service</feature>
+        <feature version="[13,14)">odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal</feature>
+        <feature version="[9,10)">odl-mdsal-broker</feature>
+        <feature version="[0.19,1)">odl-aaa-encryption-service</feature>
     </feature>
 </features>
index 3bf3acf6990fd01b64c11e0838d425128a1e380f..c19cb30ae7bce5a9e1dcfbc54ea7aac3343afd21 100644 (file)
@@ -8,6 +8,6 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-model-rfc5277" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc6991</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc6991</feature>
     </feature>
 </features>
index d1e0bad69241f93bfb7a521860be5754fc055948..0bbe4b9aa926b034af20252fa044fd1096cc8743 100644 (file)
@@ -8,6 +8,6 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-model-rfc6022" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc6991</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc6991</feature>
     </feature>
 </features>
index 6af212fd2dd68bcf1249380647258c3f7b6b4038..fe136e1c1aa15f376fa398b264527cc3470d1446 100644 (file)
@@ -8,6 +8,6 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-model-rfc6241" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc6991</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc6991</feature>
     </feature>
 </features>
index d083b39d46199ba4673b0e1ee1537f4c30a764f2..5fb7da631a0ea6c99c162317ba9a2460d3edef8c 100644 (file)
@@ -8,6 +8,6 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-model-rfc8040" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc6991</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc6991</feature>
     </feature>
 </features>
index 37e0626c9fdc89e49e8f406035684dc157996442..4e002ee1fbcae34f7c8ee16e793ae5f1f5068aa2 100644 (file)
@@ -8,6 +8,6 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-model-rfc8341" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc6991</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc6991</feature>
     </feature>
 </features>
index 4dd9b2915aeda22d2dad81916c2dd9453e6e5082..cf4571675fc22ac6102135fb68507da6729002b4 100644 (file)
@@ -8,6 +8,6 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-model-rfc8526" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc8342</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8342</feature>
     </feature>
 </features>
index 9fdffe4621bd0b53885ce038202cafe87c2466a0..8192bac86cfe946e882c427ea7e1ab4c59780e73 100644 (file)
@@ -8,9 +8,9 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-model-rfc8639" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc8040</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8343</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8528</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8529</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8040</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8343</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8528</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8529</feature>
     </feature>
 </features>
index 3fc1d58273835d58bb06cb87e488489ef639ac14..2844cc49a5a2fd0246bb2ee42e3acf95ff9d7863 100644 (file)
@@ -8,7 +8,7 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-model-rfc8641" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc8072</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8342</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8072</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8342</feature>
     </feature>
 </features>
index aa63f407ceb52005ec71f8f836c11c399b3006a8..895b663d6e5a901bb9a7fca220a9312a06224643 100644 (file)
@@ -9,6 +9,6 @@
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-transport-api" version="${project.version}">
         <feature version="[13,14)">odl-netty-4</feature>
-        <feature version="[11,12)">odl-yangtools-common</feature>
+        <feature version="[13,14)">odl-yangtools-common</feature>
     </feature>
 </features>
index bb732998b743b11d2ddcb0f56ee7be5ea0eb14c8..0bcc93f8b3a808ce42f02c01345227697e07bc2f 100644 (file)
@@ -8,6 +8,6 @@
  -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="odl-netconf-${project.version}">
     <feature name="odl-netconf-util" version="${project.version}">
-        <feature version="[11,12)">odl-yangtools-codec</feature>
+        <feature version="[13,14)">odl-yangtools-codec</feature>
     </feature>
 </features>
index 340049952782e1a388b32ff9bb78b7d6faffa903..4b078b5a09f77678a1b8939ce2ec9cf856471e3e 100644 (file)
@@ -9,11 +9,11 @@
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-netconf-${project.version}">
     <feature name="odl-restconf-common" version="${project.version}">
         <feature version="[13,14)">odl-karaf-feat-jetty</feature>
-        <feature version="[11,12)">odl-yangtools-export</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8040</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8072</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8525</feature>
-        <feature version="[8,9)">odl-mdsal-broker</feature>
-        <feature version="[0.18,1)">odl-aaa-shiro</feature>
+        <feature version="[13,14)">odl-yangtools-export</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8040</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8072</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8525</feature>
+        <feature version="[9,10)">odl-mdsal-broker</feature>
+        <feature version="[0.19,1)">odl-aaa-shiro</feature>
     </feature>
 </features>
index 622ce6a682b95c3c97f8d35e91a592771ca103b0..a5b97e76dce2388b0d23ecaa167817384c5e4eeb 100644 (file)
@@ -8,6 +8,6 @@
   -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-restconf-nb-${project.version}">
     <feature name="odl-restconf-nb" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc8072</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8072</feature>
     </feature>
 </features>
index 49a66f7f07c53c20e5e9dd651bace4df5f05e4ad..36bd7f2ba0c5c496679e0c8c0316cbd30b709f64 100644 (file)
@@ -8,7 +8,7 @@
 -->
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-netconf-${project.version}">
     <feature name="odl-yanglib-mdsal-writer" version="${project.version}">
-        <feature version="[12,13)">odl-mdsal-model-rfc8525</feature>
-        <feature version="[8,9)">odl-mdsal-broker</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8525</feature>
+        <feature version="[9,10)">odl-mdsal-broker</feature>
     </feature>
 </features>
index 5f8a7c27983ddd9a511937c5136f5aa4d7250174..74b1f561bf389d9536df022494de068f550d37f4 100644 (file)
@@ -9,6 +9,6 @@
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-netconf-${project.version}">
     <feature name="odl-yanglib" version="${project.version}">
         <feature version="[13,14)">odl-karaf-feat-jetty</feature>
-        <feature version="[12,13)">odl-mdsal-model-rfc8525</feature>
+        <feature version="[13,14)">odl-mdsal-model-rfc8525</feature>
     </feature>
 </features>
index d7c6c8a71b27d0645a5584f0c90351c7c6d7afa8..6b73eb49656f21b19ebfd5e43d5838667413612f 100644 (file)
@@ -31,7 +31,7 @@
       <dependency>
         <groupId>org.opendaylight.controller</groupId>
         <artifactId>controller-artifacts</artifactId>
-        <version>8.0.4</version>
+        <version>9.0.0</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
index 01e5e503d86a6ab141bbb417688fabfe9f57fec4..d25c4cba36d8e5a3666afcbd5969080d447dc9de 100644 (file)
@@ -13,7 +13,6 @@ import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
-import java.util.Iterator;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import javax.annotation.PreDestroy;
@@ -33,7 +32,7 @@ import org.opendaylight.yang.gen.v1.org.opendaylight.coretutorials.ncmount.examp
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
@@ -54,10 +53,10 @@ public final class MountedDeviceListener implements DOMMountPointListener {
     private static final QName CREATE_SUBSCRIPTION_QNAME = QName.create(CreateSubscriptionInput.QNAME,
         "create-subscription");
 
-    private final ConcurrentMap<YangInstanceIdentifier, ListenerRegistration<?>> listeners = new ConcurrentHashMap<>();
+    private final ConcurrentMap<YangInstanceIdentifier, Registration> listeners = new ConcurrentHashMap<>();
     private final DOMMountPointService mountPointService;
     private final BindingNormalizedNodeSerializer serializer;
-    private final ListenerRegistration<?> reg;
+    private final Registration reg;
 
     @Inject
     @Activate
@@ -72,7 +71,7 @@ public final class MountedDeviceListener implements DOMMountPointListener {
     @Deactivate
     public void stop() {
         reg.close();
-        final Iterator<ListenerRegistration<?>> it = listeners.values().iterator();
+        final var it = listeners.values().iterator();
         while (it.hasNext()) {
             it.next().close();
             it.remove();
@@ -91,7 +90,7 @@ public final class MountedDeviceListener implements DOMMountPointListener {
 
     @Override
     public void onMountPointRemoved(final YangInstanceIdentifier path) {
-        final ListenerRegistration<?> listener = listeners.remove(path);
+        final var listener = listeners.remove(path);
         if (listener != null) {
             listener.close();
         }
index f8cc723b908092f38411232dd02a34fd1cc075d6..81d396a37ad229dbd9f81feaa8f91910afe26088 100644 (file)
@@ -16,10 +16,12 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker;
 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
 import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStoreFactory;
@@ -43,8 +45,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.Yang;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.schemas.Schema;
-import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.util.concurrent.SpecialExecutors;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -60,9 +60,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBui
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,12 +68,12 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory {
 
     private final Set<Capability> caps;
     private final EffectiveModelContext schemaContext;
-    private final SchemaSourceProvider<YangTextSchemaSource> sourceProvider;
+    private final YangTextSourceExtension sourceProvider;
 
     MdsalOperationProvider(final SessionIdProvider idProvider,
                            final Set<Capability> caps,
                            final EffectiveModelContext schemaContext,
-                           final SchemaSourceProvider<YangTextSchemaSource> sourceProvider) {
+                           final YangTextSourceExtension sourceProvider) {
         this.caps = caps;
         this.schemaContext = schemaContext;
         this.sourceProvider = sourceProvider;
@@ -104,11 +101,10 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory {
         private final Set<Capability> caps;
         private final DOMSchemaService schemaService;
         private final DOMDataBroker dataBroker;
-        private final SchemaSourceProvider<YangTextSchemaSource> sourceProvider;
+        private final YangTextSourceExtension sourceProvider;
 
         MdsalOperationService(final SessionIdType currentSessionId, final EffectiveModelContext schemaContext,
-                              final Set<Capability> caps,
-                              final SchemaSourceProvider<YangTextSchemaSource> sourceProvider) {
+                              final Set<Capability> caps, final YangTextSourceExtension sourceProvider) {
             this.currentSessionId = requireNonNull(currentSessionId);
             this.schemaContext = schemaContext;
             this.caps = caps;
@@ -116,7 +112,6 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory {
             schemaService = createSchemaService();
 
             dataBroker = createDataStore(schemaService, currentSessionId);
-
         }
 
         @Override
@@ -219,14 +214,10 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory {
                 }
 
                 @Override
-                public ListenerRegistration<EffectiveModelContextListener> registerSchemaContextListener(
-                        final EffectiveModelContextListener listener) {
-                    listener.onModelContextUpdated(getGlobalContext());
-                    return new AbstractListenerRegistration<>(listener) {
-                        @Override
-                        protected void removeRegistration() {
-                            // No-op
-                        }
+                public Registration registerSchemaContextListener(final Consumer<EffectiveModelContext> listener) {
+                    listener.accept(getGlobalContext());
+                    return () -> {
+                        // No-op
                     };
                 }
             };
index 1e2a2002939158c99dac83b75952d779de1d8af5..80af56ea9fd3f129b0dcebaf4dd4091bc69d8426 100644 (file)
@@ -24,6 +24,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.IntStream;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.netconf.api.CapabilityURN;
 import org.opendaylight.netconf.api.TransportConstants;
 import org.opendaylight.netconf.common.impl.DefaultNetconfTimer;
@@ -62,13 +63,13 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.ModuleLike;
 import org.opendaylight.yangtools.yang.model.api.Submodule;
-import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.fs.FilesystemSchemaSourceCache;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceListener;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
 import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository;
 import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
 import org.slf4j.Logger;
@@ -93,7 +94,7 @@ public class NetconfDeviceSimulator implements Closeable {
     }
 
     private ServerTransportInitializer createTransportInitializer(final Set<Capability> capabilities,
-            final SchemaSourceProvider<YangTextSchemaSource> sourceProvider) {
+            final YangTextSourceExtension sourceProvider) {
         final var transformedCapabilities = new HashSet<>(Collections2.transform(capabilities, input -> {
             if (sendFakeSchema) {
                 sendFakeSchema = false;
@@ -115,7 +116,7 @@ public class NetconfDeviceSimulator implements Closeable {
     }
 
     private NetconfOperationServiceFactory createOperationServiceFactory(
-            final SchemaSourceProvider<YangTextSchemaSource> sourceProvider,
+            final YangTextSourceExtension sourceProvider,
             final Set<Capability> transformedCapabilities, final NetconfMonitoringService monitoringService1,
             final SessionIdProvider idProvider) {
         final AggregatedNetconfOperationServiceFactory aggregatedNetconfOperationServiceFactory =
@@ -166,7 +167,7 @@ public class NetconfDeviceSimulator implements Closeable {
         final var schemaRepo = new SharedSchemaRepository("netconf-simulator");
         final var capabilities = parseSchemasToModuleCapabilities(schemaRepo);
         final var transportInitializer = createTransportInitializer(capabilities,
-            sourceIdentifier -> schemaRepo.getSchemaSource(sourceIdentifier, YangTextSchemaSource.class));
+            sourceIdentifier -> schemaRepo.getSchemaSource(sourceIdentifier, YangTextSource.class));
 
         final var ipAddress = getIpAddress(configuration);
         final var startingPort = getStartingPort(configuration);
@@ -232,7 +233,7 @@ public class NetconfDeviceSimulator implements Closeable {
         consumer.registerSchemaSourceListener(TextToIRTransformer.create(consumer, consumer));
         consumer.registerSchemaSourceListener(new SchemaSourceListener() {
             @Override
-            public void schemaSourceEncountered(final SchemaSourceRepresentation schemaSourceRepresentation) {
+            public void schemaSourceEncountered(final SourceRepresentation schemaSourceRepresentation) {
 
             }
 
@@ -251,13 +252,13 @@ public class NetconfDeviceSimulator implements Closeable {
 
         if (configuration.getSchemasDir() != null) {
             LOG.info("Loading models from directory.");
-            final FilesystemSchemaSourceCache<YangTextSchemaSource> cache = new FilesystemSchemaSourceCache<>(
-                consumer, YangTextSchemaSource.class, configuration.getSchemasDir());
+            final FilesystemSchemaSourceCache<YangTextSource> cache = new FilesystemSchemaSourceCache<>(
+                consumer, YangTextSource.class, configuration.getSchemasDir());
             consumer.registerSchemaSourceListener(cache);
         } else if (configuration.getModels() != null) {
             LOG.info("Loading models from classpath.");
-            final SchemaSourceCache<YangTextSchemaSource> cache = new SchemaSourceCache<>(
-                    consumer, YangTextSchemaSource.class, configuration.getModels());
+            final SchemaSourceCache<YangTextSource> cache = new SchemaSourceCache<>(
+                    consumer, YangTextSource.class, configuration.getModels());
             consumer.registerSchemaSourceListener(cache);
         } else {
             LOG.info("Custom module loading skipped.");
@@ -296,7 +297,7 @@ public class NetconfDeviceSimulator implements Closeable {
 
         final String moduleContent;
         try {
-            moduleContent = consumer.getSchemaSource(sourceId, YangTextSchemaSource.class).get().read();
+            moduleContent = consumer.getSchemaSource(sourceId, YangTextSource.class).get().read();
         } catch (ExecutionException | InterruptedException | IOException e) {
             throw new IllegalStateException(
                 "Cannot retrieve schema source for module " + sourceId + " from schema repository", e);
@@ -308,8 +309,8 @@ public class NetconfDeviceSimulator implements Closeable {
     private static void registerSource(final SharedSchemaRepository consumer, final String resource,
             final SourceIdentifier sourceId) {
         consumer.registerSchemaSource(sourceIdentifier -> Futures.immediateFuture(
-            YangTextSchemaSource.forResource(NetconfDeviceSimulator.class, resource)),
-            PotentialSchemaSource.create(sourceId, YangTextSchemaSource.class,
+            new URLYangTextSource(NetconfDeviceSimulator.class.getResource(resource))),
+            PotentialSchemaSource.create(sourceId, YangTextSource.class,
                 PotentialSchemaSource.Costs.IMMEDIATE.getValue()));
     }
 
index 70e3744366a36a7682046f992d1bc12fd4c5305a..65087d74d55449332edc84fbee2b199e361f568f 100644 (file)
@@ -14,11 +14,11 @@ import java.util.List;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.Credentials;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.credentials.login.pw.unencrypted.LoginPasswordUnencrypted;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.$YangModuleInfoImpl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNodeFields;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.svc.v1.urn.opendaylight.netconf.node.topology.rev231121.YangModuleInfoImpl;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
@@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory;
 final class PayloadCreator {
     private static final Logger LOG = LoggerFactory.getLogger(PayloadCreator.class);
     private static final EffectiveModelContext NETWORK_TOPOLOGY_SCHEMA_CONTEXT =
-        BindingRuntimeHelpers.createEffectiveModel(List.of($YangModuleInfoImpl.getInstance()));
+        BindingRuntimeHelpers.createEffectiveModel(List.of(YangModuleInfoImpl.getInstance()));
     private static final JSONCodecFactory NETWORK_TOPOLOGY_JSON_CODEC_FACTORY =
         JSONCodecFactorySupplier.RFC7951.getShared(NETWORK_TOPOLOGY_SCHEMA_CONTEXT);
 
index f475872e34f18bf57295c01ae1eeff25914a38f1..8ddc2ddcbc9787c8e08190a8b396e28e06cb8d69 100644 (file)
@@ -17,21 +17,20 @@ import java.util.stream.Collectors;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation;
 import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
-import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.AbstractSchemaSourceCache;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource.Costs;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
+import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Cache implementation that stores schemas in form of files under provided folder.
  */
-public final class SchemaSourceCache<T extends SchemaSourceRepresentation> extends AbstractSchemaSourceCache<T> {
-
+public final class SchemaSourceCache<T extends SourceRepresentation> extends AbstractSchemaSourceCache<T> {
     private static final Logger LOG = LoggerFactory.getLogger(SchemaSourceCache.class);
 
     private final Class<T> representation;
@@ -98,17 +97,17 @@ public final class SchemaSourceCache<T extends SchemaSourceRepresentation> exten
     public synchronized ListenableFuture<? extends T> getSource(final SourceIdentifier sourceIdentifier) {
         final YangModuleInfo yangModuleInfo = cachedSchemas.get(sourceIdentifier);
         if (yangModuleInfo != null) {
-            final YangTextSchemaSource yangTextSchemaSource = YangTextSchemaSource.delegateForCharSource(
-                    sourceIdentifier, yangModuleInfo.getYangTextCharSource());
+            final var yangTextSchemaSource = new DelegatedYangTextSource(sourceIdentifier,
+                yangModuleInfo.getYangTextCharSource());
             return Futures.immediateFuture(representation.cast(yangTextSchemaSource));
         }
 
         LOG.debug("Source {} not found in cache", sourceIdentifier);
-        return Futures.immediateFailedFuture(new MissingSchemaSourceException("Source not found", sourceIdentifier));
+        return Futures.immediateFailedFuture(new MissingSchemaSourceException(sourceIdentifier, "Source not found"));
     }
 
     @Override
     protected synchronized void offer(final T source) {
-        LOG.trace("Source {} offered to cache", source.getIdentifier());
+        LOG.trace("Source {} offered to cache", source.sourceId());
     }
 }
index c7b29d4b627bcfd5ffccde2394e6a6b11d6cdebb..cb8c0f4ddd3c2763a6736c249a4c4900421aab29 100644 (file)
@@ -39,15 +39,15 @@ 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.module.list.ModuleKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier;
 import org.opendaylight.yanglib.api.YangLibService;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
-import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.fs.FilesystemSchemaSourceCache;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaListenerRegistration;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceListener;
 import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
 import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository;
@@ -91,14 +91,13 @@ public final class YangLibProvider implements YangLibService, SchemaSourceListen
     private static final Logger LOG = LoggerFactory.getLogger(YangLibProvider.class);
 
     private static final Predicate<PotentialSchemaSource<?>> YANG_SCHEMA_SOURCE =
-        input -> YangTextSchemaSource.class.isAssignableFrom(input.getRepresentation());
+        input -> YangTextSource.class.isAssignableFrom(input.getRepresentation());
 
     private final DataBroker dataBroker;
     private final String bindingAddress;
     private final Uint32 bindingPort;
     private final SharedSchemaRepository schemaRepository;
-
-    private final SchemaListenerRegistration schemaListenerRegistration;
+    private final Registration schemaListenerRegistration;
 
     @Inject
     @Activate
@@ -126,8 +125,7 @@ public final class YangLibProvider implements YangLibService, SchemaSourceListen
         checkArgument(cacheFolderFile.isDirectory(), "cache-folder %s is not a directory", cacheFolderFile);
 
         schemaRepository = new SharedSchemaRepository("yang-library", parserFactory);
-        final var cache = new FilesystemSchemaSourceCache<>(schemaRepository, YangTextSchemaSource.class,
-            cacheFolderFile);
+        final var cache = new FilesystemSchemaSourceCache<>(schemaRepository, YangTextSource.class, cacheFolderFile);
         schemaRepository.registerSchemaSourceListener(cache);
 
         schemaListenerRegistration = schemaRepository.registerSchemaSourceListener(this);
@@ -143,7 +141,7 @@ public final class YangLibProvider implements YangLibService, SchemaSourceListen
     }
 
     @Override
-    public void schemaSourceEncountered(final SchemaSourceRepresentation source) {
+    public void schemaSourceEncountered(final SourceRepresentation source) {
         // NOOP
     }
 
@@ -226,7 +224,7 @@ public final class YangLibProvider implements YangLibService, SchemaSourceListen
 
     private String getYangModel(final String name, final String revision) {
         final var sourceId = new SourceIdentifier(name, revision);
-        final var yangTextSchemaFuture = schemaRepository.getSchemaSource(sourceId, YangTextSchemaSource.class);
+        final var yangTextSchemaFuture = schemaRepository.getSchemaSource(sourceId, YangTextSource.class);
         try {
             final var yangTextSchemaSource = yangTextSchemaFuture.get();
             return yangTextSchemaSource.read();
index 3dd93cc31870e8cbb894b1b363b2d01025aea951..4f0cc40c4222caaa55001fd908b268e009d54c20 100644 (file)
@@ -38,12 +38,12 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
 import org.opendaylight.yangtools.yang.common.Uint32;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangIRSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.api.YinSchemaSourceRepresentation;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.api.source.YinSourceRepresentation;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource.Costs;
+import org.opendaylight.yangtools.yang.model.spi.source.YangIRSource;
 import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
@@ -101,9 +101,9 @@ public class YangLibProviderTest {
         // test list of non yang schema sources registered
         yangLibProvider.schemaSourceRegistered(List.of(
             PotentialSchemaSource.create(new SourceIdentifier("yin-source-representation"),
-                YinSchemaSourceRepresentation.class, Costs.IMMEDIATE.getValue()),
+                YinSourceRepresentation.class, Costs.IMMEDIATE.getValue()),
             PotentialSchemaSource.create(new SourceIdentifier("asts-schema-source"),
-                YangIRSchemaSource.class, Costs.IMMEDIATE.getValue())));
+                YangIRSource.class, Costs.IMMEDIATE.getValue())));
 
         // expected behavior is to do nothing
         verifyNoMoreInteractions(dataBroker, writeTransaction);
@@ -116,7 +116,7 @@ public class YangLibProviderTest {
         // try to unregister YANG source with revision
         final var schemaSourceWithRevision = PotentialSchemaSource.create(
             new SourceIdentifier("unregistered-yang-with-revision", "2016-04-28"),
-            YangTextSchemaSource.class, Costs.LOCAL_IO.getValue());
+            YangTextSource.class, Costs.LOCAL_IO.getValue());
         yangLibProvider.schemaSourceUnregistered(schemaSourceWithRevision);
 
         // source is unregistered
@@ -135,7 +135,7 @@ public class YangLibProviderTest {
 
         // try to unregister YANG source without revision
         final var schemaSourceWithoutRevision = PotentialSchemaSource.create(
-            new SourceIdentifier("unregistered-yang-schema-without-revision"), YangTextSchemaSource.class,
+            new SourceIdentifier("unregistered-yang-schema-without-revision"), YangTextSource.class,
             Costs.LOCAL_IO.getValue());
         yangLibProvider.schemaSourceUnregistered(schemaSourceWithoutRevision);
 
@@ -155,7 +155,7 @@ public class YangLibProviderTest {
 
         // try to unregister non-YANG source
         final var nonYangSources = PotentialSchemaSource.create(new SourceIdentifier("yin-source-representation"),
-            YinSchemaSourceRepresentation.class, Costs.IMMEDIATE.getValue());
+            YinSourceRepresentation.class, Costs.IMMEDIATE.getValue());
         yangLibProvider.schemaSourceUnregistered(nonYangSources);
 
         // expected behaviour is to do nothing if non yang based source is unregistered
index c6ef1dfc1b4ddf3eb4c744bd827fd1175ea13eda..be60c06816b65e1911b3a7f4c1cdedb36885a6bb 100644 (file)
@@ -11,7 +11,7 @@
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>12.0.4</version>
+    <version>13.0.0</version>
     <relativePath/>
   </parent>
 
       <dependency>
         <groupId>org.opendaylight.aaa</groupId>
         <artifactId>aaa-artifacts</artifactId>
-        <version>0.18.4</version>
+        <version>0.19.1</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.controller</groupId>
         <artifactId>bundle-parent</artifactId>
-        <version>8.0.4</version>
+        <version>9.0.0</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
index 126613d5d44ebe6c4c43799ab0975821e43c1d39..19207ecc2057ec9c3d56bcfe81abb0826a930169 100644 (file)
     <packaging>bundle</packaging>
 
     <dependencies>
+        <dependency>
+            <groupId>com.github.spotbugs</groupId>
+            <artifactId>spotbugs-annotations</artifactId>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
index 1e222233d03ca8d8db8985eae30e7b7ce4ebf04f..76b9c7e8729f6b9f6fd1ff4353eb2d7a1c849210 100644 (file)
@@ -12,39 +12,46 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.base.MoreObjects;
 import java.io.Reader;
 import java.io.StringReader;
-import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 
 /**
- * A {@link YangTextSchemaSource} cached from a remote service.
+ * A {@link YangTextSource} cached from a remote service.
  */
-public final class CachedYangTextSchemaSource extends YangTextSchemaSource {
-    private final RemoteDeviceId id;
-    private final String schemaString;
-    private final String symbolicName;
+// FIXME: subclass StringYangTextSource and cleanup addToStringAttributes()
+public final class CachedYangTextSchemaSource extends YangTextSource {
+    private final @NonNull SourceIdentifier sourceId;
+    private final @NonNull RemoteDeviceId id;
+    private final @NonNull String symbolicName;
+    private final @NonNull String schemaString;
 
-    public CachedYangTextSchemaSource(final RemoteDeviceId id, final SourceIdentifier sourceIdentifier,
+    public CachedYangTextSchemaSource(final RemoteDeviceId id, final SourceIdentifier sourceId,
             final String symbolicName, final String schemaString) {
-        super(sourceIdentifier);
-        this.symbolicName = requireNonNull(symbolicName);
         this.id = requireNonNull(id);
+        this.sourceId = requireNonNull(sourceId);
+        this.symbolicName = requireNonNull(symbolicName);
         this.schemaString = requireNonNull(schemaString);
     }
 
     @Override
-    protected MoreObjects.ToStringHelper addToStringAttributes(final MoreObjects.ToStringHelper toStringHelper) {
-        return toStringHelper.add("device", id);
+    public Reader openStream() {
+        return new StringReader(schemaString);
     }
 
     @Override
-    public Reader openStream() {
-        return new StringReader(schemaString);
+    public SourceIdentifier sourceId() {
+        return sourceId;
+    }
+
+    @Override
+    public String symbolicName() {
+        return symbolicName;
     }
 
     @Override
-    public Optional<String> getSymbolicName() {
-        return Optional.of(symbolicName);
+    protected MoreObjects.ToStringHelper addToStringAttributes(final MoreObjects.ToStringHelper toStringHelper) {
+        return toStringHelper.add("device", id);
     }
 }
\ No newline at end of file
index 8024bfff9e4b3585b90f7c77454c52b47c0112e9..4b3678ee336294015c2a976f577f88d0860de73f 100644 (file)
@@ -32,13 +32,11 @@ import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.spi.AbstractEffectiveModelContextProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 // TODO: this should really come from rfc8528-data-util
-final class DeviceMountPointContext extends AbstractEffectiveModelContextProvider implements Immutable,
-        MountPointContext {
+final class DeviceMountPointContext implements Immutable, MountPointContext {
     private static final Logger LOG = LoggerFactory.getLogger(DeviceMountPointContext.class);
     private static final NodeIdentifier MOUNT_POINT = NodeIdentifier.create(
         QName.create(SchemaMountConstants.RFC8528_MODULE, "mount-point").intern());
@@ -58,10 +56,11 @@ final class DeviceMountPointContext extends AbstractEffectiveModelContextProvide
         QName.create(SchemaMountConstants.RFC8528_MODULE, "parent-reference").intern());
 
     private final ImmutableMap<MountPointLabel, NetconfMountPointContextFactory> mountPoints;
+    private final @NonNull EffectiveModelContext modelContext;
 
-    private DeviceMountPointContext(final EffectiveModelContext schemaContext,
+    private DeviceMountPointContext(final EffectiveModelContext modelContext,
             final Map<MountPointLabel, NetconfMountPointContextFactory> mountPoints) {
-        super(schemaContext);
+        this.modelContext = requireNonNull(modelContext);
         this.mountPoints = ImmutableMap.copyOf(mountPoints);
     }
 
@@ -72,7 +71,7 @@ final class DeviceMountPointContext extends AbstractEffectiveModelContextProvide
             return emptyContext;
         }
 
-        final EffectiveModelContext schemaContext = emptyContext.getEffectiveModelContext();
+        final EffectiveModelContext schemaContext = emptyContext.modelContext();
         final DataContainerChild mountPoint = optMountPoint.orElseThrow();
         checkArgument(mountPoint instanceof MapNode, "mount-point list %s is not a MapNode", mountPoint);
 
@@ -113,6 +112,11 @@ final class DeviceMountPointContext extends AbstractEffectiveModelContextProvide
         return new DeviceMountPointContext(schemaContext, mountPoints);
     }
 
+    @Override
+    public EffectiveModelContext modelContext() {
+        return modelContext;
+    }
+
     @Override
     public Optional<MountPointContextFactory> findMountPoint(@NonNull final MountPointLabel label) {
         return Optional.ofNullable(mountPoints.get(requireNonNull(label)));
index b2269870fd7250dde0d98685bf424e5185e0c7ea..d7d2d54a80201c5101c1de98ce31e844216d4066 100644 (file)
@@ -15,8 +15,8 @@ import java.util.stream.Collectors;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
@@ -27,10 +27,10 @@ import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
 final class DeviceSources {
     private final Set<QName> requiredSources;
     private final Set<QName> providedSources;
-    private final SchemaSourceProvider<YangTextSchemaSource> sourceProvider;
+    private final SchemaSourceProvider<YangTextSource> sourceProvider;
 
     DeviceSources(final Set<QName> requiredSources, final Set<QName> providedSources,
-            final SchemaSourceProvider<YangTextSchemaSource> sourceProvider) {
+            final SchemaSourceProvider<YangTextSource> sourceProvider) {
         this.requiredSources = requireNonNull(requiredSources);
         this.providedSources = requireNonNull(providedSources);
         this.sourceProvider = requireNonNull(sourceProvider);
@@ -52,7 +52,7 @@ final class DeviceSources {
         return providedSources.stream()
             .map(DeviceSources::toSourceId)
             .map(sourceId -> schemaRegistry.registerSchemaSource(sourceProvider,
-                PotentialSchemaSource.create(sourceId, YangTextSchemaSource.class,
+                PotentialSchemaSource.create(sourceId, YangTextSource.class,
                     PotentialSchemaSource.Costs.REMOTE_IO.getValue())))
             .collect(Collectors.toUnmodifiableList());
     }
index 57b5050978e51d70b0aa4054fd8dcaa9ab89696f..98521c1bb1478f2d37e833a03a07a59006c98416 100644 (file)
@@ -45,7 +45,7 @@ final class DeviceSourcesResolver implements Callable<DeviceSources> {
     @Override
     public DeviceSources call() {
         final var availableSchemas = stateSchemasResolver.resolve(deviceRpc, remoteSessionCapabilities, id,
-            baseSchema.getEffectiveModelContext());
+            baseSchema.modelContext());
         LOG.debug("{}: Schemas exposed by ietf-netconf-monitoring: {}", id,
             availableSchemas.getAvailableYangSchemasQNames());
 
index abe1626465cddff2b32a89543cc221b216bef6fb..091e2ab63e9ff8a6167dcdaf6728649ba3b1b33d 100644 (file)
@@ -71,7 +71,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 import org.slf4j.Logger;
index 165261de705115698ec8dc6532da9cb90e7dc01b..34305f2f9e7be1f7245b3615ace98e54d0d40e25 100644 (file)
@@ -18,9 +18,9 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory;
  * Provides YANG schema sources from YANG library. The set of available sources is pre-determined when this provider
  * is created, but each source is acquired on demand.
  */
-public final class LibrarySchemaSourceProvider implements SchemaSourceProvider<YangTextSchemaSource> {
+public final class LibrarySchemaSourceProvider implements SchemaSourceProvider<YangTextSource> {
     private static final Logger LOG = LoggerFactory.getLogger(LibrarySchemaSourceProvider.class);
 
     private final ImmutableMap<SourceIdentifier, URL> availableSources;
@@ -41,7 +41,7 @@ public final class LibrarySchemaSourceProvider implements SchemaSourceProvider<Y
     }
 
     @Override
-    public ListenableFuture<? extends YangTextSchemaSource> getSource(final SourceIdentifier sourceIdentifier) {
+    public ListenableFuture<? extends YangTextSource> getSource(final SourceIdentifier sourceIdentifier) {
         final var url = availableSources.get(requireNonNull(sourceIdentifier));
         checkArgument(url != null);
 
@@ -50,7 +50,7 @@ public final class LibrarySchemaSourceProvider implements SchemaSourceProvider<Y
             schemaContent = in.readAllBytes();
         } catch (IOException e) {
             LOG.warn("Unable to download source {} from a yang library's url {}", sourceIdentifier, url, e);
-            return Futures.immediateFailedFuture(new SchemaSourceException(
+            return Futures.immediateFailedFuture(new SchemaSourceException(sourceIdentifier,
                 "Unable to download remote schema for " + sourceIdentifier + " from " + url, e));
         }
 
index 18f82fbd4fb0660ed45d2ab6508ccdaf12ba6104..a20df879ed5b84c9d8e317a2de748c3f519af25f 100644 (file)
@@ -30,19 +30,19 @@ import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
 /**
- * A {@link SchemaSourceProvider} producing {@link YangTextSchemaSource}s based on a device's
+ * A {@link SchemaSourceProvider} producing {@link YangTextSource}s based on a device's
  * {@code ietf-netconf-monitoring} interface. The set of available sources is not pre-determined and each request is
  * dispatched to the device, i.e. this provider reflects real-time updates to available schemas.
  */
-public final class MonitoringSchemaSourceProvider implements SchemaSourceProvider<YangTextSchemaSource> {
+public final class MonitoringSchemaSourceProvider implements SchemaSourceProvider<YangTextSource> {
     private static final Logger LOG = LoggerFactory.getLogger(MonitoringSchemaSourceProvider.class);
     private static final NodeIdentifier FORMAT_PATHARG =
             NodeIdentifier.create(QName.create(GetSchema.QNAME, "format").intern());
@@ -90,7 +90,7 @@ public final class MonitoringSchemaSourceProvider implements SchemaSourceProvide
     }
 
     @Override
-    public ListenableFuture<YangTextSchemaSource> getSource(final SourceIdentifier sourceIdentifier) {
+    public ListenableFuture<YangTextSource> getSource(final SourceIdentifier sourceIdentifier) {
         final String moduleName = sourceIdentifier.name().getLocalName();
 
         final Optional<String> revision = Optional.ofNullable(sourceIdentifier.revision()).map(Revision::toString);
index d349afd2f346dd9a9887ff0b38ac8f83d835a74f..1e3ca9148befb53663b3abbe0536b9e0f667ff1f 100644 (file)
@@ -68,13 +68,14 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory;
 import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -142,7 +143,7 @@ public class NetconfDevice implements RemoteDevice<NetconfDeviceCommunicator> {
         LOG.debug("{}: Session to remote device established with {}", id, remoteSessionCapabilities);
 
         final BaseSchema baseSchema = resolveBaseSchema(remoteSessionCapabilities.isNotificationsSupported());
-        final NetconfDeviceRpc initRpc = new NetconfDeviceRpc(baseSchema.getEffectiveModelContext(), listener,
+        final NetconfDeviceRpc initRpc = new NetconfDeviceRpc(baseSchema.modelContext(), listener,
             new NetconfMessageTransformer(baseSchema.getMountPointContext(), false, baseSchema));
         final var sourceResolverFuture = Futures.submit(new DeviceSourcesResolver(id, baseSchema, initRpc,
                 remoteSessionCapabilities, stateSchemasResolver), processingExecutor);
@@ -288,7 +289,7 @@ public class NetconfDevice implements RemoteDevice<NetconfDeviceCommunicator> {
         final NetconfDeviceRpc deviceRpc = new NetconfDeviceRpc(schemaContext, listener,
             new NetconfMessageTransformer(emptyContext, false, baseSchema));
 
-        return Futures.transform(deviceRpc.domRpcService().invokeRpc(Get.QNAME, Builders.containerBuilder()
+        return Futures.transform(deviceRpc.domRpcService().invokeRpc(Get.QNAME, ImmutableNodes.newContainerBuilder()
             .withNodeIdentifier(NETCONF_GET_NODEID)
             .withChild(NetconfMessageTransformUtil.toFilterStructure(RFC8528_SCHEMA_MOUNTS, schemaContext))
             .build()), rpcResult -> processSchemaMounts(rpcResult, emptyContext), MoreExecutors.directExecutor());
@@ -325,7 +326,7 @@ public class NetconfDevice implements RemoteDevice<NetconfDeviceCommunicator> {
 
     protected NetconfDeviceRpc getDeviceSpecificRpc(final MountPointContext result,
             final RemoteDeviceCommunicator listener, final BaseSchema schema) {
-        return new NetconfDeviceRpc(result.getEffectiveModelContext(), listener,
+        return new NetconfDeviceRpc(result.modelContext(), listener,
             new NetconfMessageTransformer(result, true, schema));
     }
 
@@ -413,10 +414,10 @@ public class NetconfDevice implements RemoteDevice<NetconfDeviceCommunicator> {
             if (remoteSessionCapabilities.containsNonModuleCapability(CapabilityURN.NOTIFICATION)) {
                 // FIXME: mutable collection modification!
                 deviceSources.getRequiredSourcesQName().addAll(List.of(
-                    org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
-                        .$YangModuleInfoImpl.getInstance().getName(),
-                    org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
-                        .$YangModuleInfoImpl.getInstance().getName())
+                    org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
+                        .YangModuleInfoImpl.getInstance().getName(),
+                    org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
+                        .YangModuleInfoImpl.getInstance().getName())
                 );
             }
 
@@ -492,7 +493,7 @@ public class NetconfDevice implements RemoteDevice<NetconfDeviceCommunicator> {
         private List<SourceIdentifier> filterMissingSources(final Collection<SourceIdentifier> origSources) {
             return origSources.parallelStream().filter(sourceIdentifier -> {
                 try {
-                    schemaRepository.getSchemaSource(sourceIdentifier, YangTextSchemaSource.class).get();
+                    schemaRepository.getSchemaSource(sourceIdentifier, YangTextSource.class).get();
                     return false;
                 } catch (InterruptedException | ExecutionException e) {
                     return true;
@@ -509,7 +510,7 @@ public class NetconfDevice implements RemoteDevice<NetconfDeviceCommunicator> {
         private List<SourceIdentifier> handleMissingSchemaSourceException(
                 final MissingSchemaSourceException exception) {
             // In case source missing, try without it
-            final SourceIdentifier missingSource = exception.getSourceId();
+            final SourceIdentifier missingSource = exception.sourceId();
             LOG.warn("{}: Unable to build schema context, missing source {}, will reattempt without it",
                 id, missingSource);
             LOG.debug("{}: Unable to build schema context, missing source {}, will reattempt without it",
@@ -526,16 +527,16 @@ public class NetconfDevice implements RemoteDevice<NetconfDeviceCommunicator> {
             // In case resolution error, try only with resolved sources
             // There are two options why schema resolution exception occurred : unsatisfied imports or flawed model
             // FIXME Do we really have assurance that these two cases cannot happen at once?
-            if (resolutionException.getFailedSource() != null) {
+            final var failedSourceId = resolutionException.sourceId();
+            if (failedSourceId != null) {
                 // flawed model - exclude it
-                final SourceIdentifier failedSourceId = resolutionException.getFailedSource();
                 LOG.warn("{}: Unable to build schema context, failed to resolve source {}, will reattempt without it",
                     id, failedSourceId);
                 LOG.warn("{}: Unable to build schema context, failed to resolve source {}, will reattempt without it",
                     id, failedSourceId, resolutionException);
                 addUnresolvedCapabilities(getQNameFromSourceIdentifiers(List.of(failedSourceId)),
                         UnavailableCapability.FailureReason.UnableToResolve);
-                return stripUnavailableSource(resolutionException.getFailedSource());
+                return stripUnavailableSource(failedSourceId);
             }
             // unsatisfied imports
             addUnresolvedCapabilities(
index 481a78408c62cade2244344bcfc92ba13d64f826..cc953c703cd91a8cb01f5aecb36c8f8ecf80d76b 100644 (file)
@@ -12,7 +12,7 @@ import org.opendaylight.netconf.client.mdsal.api.NetconfDeviceSchemasResolver;
 import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
 import org.opendaylight.netconf.client.mdsal.spi.NetconfDeviceRpc;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.$YangModuleInfoImpl;
+import org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangModuleInfoImpl;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.Revision;
@@ -22,7 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
  * Default implementation resolving schemas QNames from netconf-state or from modules-state.
  */
 public final class NetconfStateSchemasResolverImpl implements NetconfDeviceSchemasResolver {
-    private static final QName RFC8525_YANG_LIBRARY_CAPABILITY = $YangModuleInfoImpl.getInstance().getName();
+    private static final QName RFC8525_YANG_LIBRARY_CAPABILITY = YangModuleInfoImpl.getInstance().getName();
     private static final QName RFC7895_YANG_LIBRARY_CAPABILITY = RFC8525_YANG_LIBRARY_CAPABILITY
         .bindTo(QNameModule.create(RFC8525_YANG_LIBRARY_CAPABILITY.getNamespace(), Revision.of("2016-06-21"))).intern();
 
index 67b1e30f4eac58b9e88377c8a8be3989f61dff02..3a9d683cc696eb31c5ea0e714d5be42f5df9cd61 100644 (file)
@@ -9,11 +9,9 @@ package org.opendaylight.netconf.client.mdsal.api;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.dom.api.DOMExtensibleService;
 import org.opendaylight.mdsal.dom.api.DOMRpcException;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
 import org.opendaylight.mdsal.dom.api.DOMService;
-import org.opendaylight.mdsal.dom.api.DOMServiceExtension;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.CancelCommit;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.CloseSession;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Commit;
@@ -36,7 +34,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
  * A {@link DOMService} capturing the ability to invoke NETCONF RPCs through
  * {@link #invokeNetconf(QName, ContainerNode)}.
  */
-public interface NetconfRpcService extends DOMExtensibleService<NetconfRpcService, NetconfRpcService.Extension> {
+public interface NetconfRpcService extends DOMService<NetconfRpcService, NetconfRpcService.Extension> {
     /**
      * Invoke a well-known RPC. This method is guaranteed to support the following RPCs:
      * <ul>
@@ -52,7 +50,7 @@ public interface NetconfRpcService extends DOMExtensibleService<NetconfRpcServic
      * </ul>
      *
      * <p>
-     * The support for other RPCs is advertized through {@link #getExtensions()}.
+     * The support for other RPCs is advertized through {@link #supportedExtensions()}.
      *
      * @param type QName of the RPC to be invoked
      * @param input Input arguments, null if the RPC does not take any.
@@ -65,7 +63,7 @@ public interface NetconfRpcService extends DOMExtensibleService<NetconfRpcServic
      * Extensions to {@link NetconfRpcService} defining additional RPC availability.
      */
     // Note: This is not an interface on purpose, to make the set of extensions well-known
-    enum Extension implements DOMServiceExtension<NetconfRpcService, Extension> {
+    enum Extension implements DOMService.Extension<NetconfRpcService, Extension> {
         /**
          * This device supports
          * <a href="https://www.rfc-editor.org/rfc/rfc4741#section-8.3">Candidate Configuration Capability</a>.
index 807a925c7bf4d7f895104361b8055f7868cfa7de..9ee6745392c5917e993075aa424524f92a7b6ba5 100644 (file)
@@ -26,8 +26,8 @@ import org.opendaylight.netconf.api.CapabilityURN;
 import org.opendaylight.netconf.client.NetconfClientSession;
 import org.opendaylight.netconf.client.mdsal.impl.NetconfMessageTransformUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.$YangModuleInfoImpl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability.CapabilityOrigin;
+import org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.YangModuleInfoImpl;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
 import org.slf4j.Logger;
@@ -164,7 +164,7 @@ public record NetconfSessionPreferences(
 
     public boolean isNotificationsSupported() {
         return containsPartialNonModuleCapability(CapabilityURN.NOTIFICATION)
-            || containsModuleCapability($YangModuleInfoImpl.getInstance().getName());
+            || containsModuleCapability(YangModuleInfoImpl.getInstance().getName());
     }
 
     public boolean isMonitoringSupported() {
index dad79dd4c236d4d94236c97e3923e37494cfd6fe..f28fe4d54dfe132f24aa43e4adeebfab8982b13b 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.annotations.Beta;
 import com.google.common.util.concurrent.ListenableFuture;
 import javax.xml.transform.dom.DOMSource;
 import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMService;
 import org.opendaylight.yangtools.yang.common.QName;
 
@@ -18,7 +19,13 @@ import org.opendaylight.yangtools.yang.common.QName;
  * A {@link DOMService} exposing RPC invocation model based either {@code ContainerNode} or {@code AnyxmlNode}.
  */
 @Beta
-public interface SchemalessRpcService extends DOMService {
+public interface SchemalessRpcService extends DOMService<SchemalessRpcService, SchemalessRpcService.Extension> {
+    /**
+     * Marker interface for an extension to {@link DOMRpcService}.
+     */
+    interface Extension extends DOMService.Extension<SchemalessRpcService, Extension> {
+        // Marker interface
+    }
 
     @NonNull ListenableFuture<? extends DOMSource> invokeRpc(@NonNull QName type, @NonNull DOMSource payload);
 }
index 231cc1ba802160b3aaf84990d61e2495e2bf4f7e..17ba164267a14c94beffcbb234064288b86daa48 100644 (file)
@@ -25,9 +25,8 @@ import org.opendaylight.netconf.client.mdsal.api.RpcTransformer;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
@@ -45,7 +44,7 @@ public class BaseRpcSchemalessTransformer implements RpcTransformer<NormalizedNo
     public BaseRpcSchemalessTransformer(final BaseNetconfSchemas baseSchemas, final MessageCounter counter) {
         final var baseSchema = baseSchemas.baseSchema();
         mappedRpcs = baseSchema.getMappedRpcs();
-        modelContext = baseSchema.getEffectiveModelContext();
+        modelContext = baseSchema.modelContext();
         this.counter = counter;
     }
 
@@ -89,14 +88,14 @@ public class BaseRpcSchemalessTransformer implements RpcTransformer<NormalizedNo
             final Element xmlData = NetconfMessageTransformUtil.getDataSubtree(message.getDocument());
             final Document data = XmlUtil.newDocument();
             data.appendChild(data.importNode(xmlData, true));
-            DOMSourceAnyxmlNode xmlDataNode = Builders.anyXmlBuilder()
+
+            normalizedNode = ImmutableNodes.newContainerBuilder()
+                .withNodeIdentifier(NetconfMessageTransformUtil.NETCONF_RPC_REPLY_NODEID)
+                .withChild(ImmutableNodes.newAnyxmlBuilder(DOMSource.class)
                     .withNodeIdentifier(NetconfMessageTransformUtil.NETCONF_DATA_NODEID)
                     .withValue(new DOMSource(data))
-                    .build();
-
-            normalizedNode = Builders.containerBuilder()
-                    .withNodeIdentifier(NetconfMessageTransformUtil.NETCONF_RPC_REPLY_NODEID)
-                    .withChild(xmlDataNode).build();
+                    .build())
+                .build();
         } else {
             //other base rpcs don't have any output, we can simply construct the payload here
             checkArgument(isOkPresent(message.getDocument()),
index bc40068392adcaa7fca6c70e27fe36fb3dfea661..ed3cd04cde82c3982fcbdcc2dfd3fb6a55719436 100644 (file)
@@ -14,10 +14,9 @@ import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 
-public final class BaseSchema implements EffectiveModelContextProvider, Immutable {
+public final class BaseSchema implements Immutable {
     private final @NonNull ImmutableMap<QName, ? extends RpcDefinition> mappedRpcs;
     private final @NonNull MountPointContext mountContext;
 
@@ -26,6 +25,10 @@ public final class BaseSchema implements EffectiveModelContextProvider, Immutabl
         mappedRpcs = Maps.uniqueIndex(context.getOperations(), RpcDefinition::getQName);
     }
 
+    public @NonNull EffectiveModelContext modelContext() {
+        return mountContext.modelContext();
+    }
+
     @NonNull ImmutableMap<QName, ? extends RpcDefinition> getMappedRpcs() {
         return mappedRpcs;
     }
@@ -33,9 +36,4 @@ public final class BaseSchema implements EffectiveModelContextProvider, Immutabl
     public @NonNull MountPointContext getMountPointContext() {
         return mountContext;
     }
-
-    @Override
-    public @NonNull EffectiveModelContext getEffectiveModelContext() {
-        return mountContext.getEffectiveModelContext();
-    }
 }
index 3f7bde9b8d84cd7b278e1b0ffc94edb2ee68982d..64d85572eac88971630e0e9f0cda4ee1027d2be6 100644 (file)
@@ -36,18 +36,18 @@ public record DefaultBaseNetconfSchemas(BaseSchema baseSchema, BaseSchema baseSc
     public DefaultBaseNetconfSchemas(@Reference final YangParserFactory parserFactory) throws YangParserException {
         this(
             new BaseSchema(BindingRuntimeHelpers.createEffectiveModel(parserFactory, List.of(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601
-                    .$YangModuleInfoImpl.getInstance(),
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004
-                    .$YangModuleInfoImpl.getInstance()))),
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601
+                    .YangModuleInfoImpl.getInstance(),
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004
+                    .YangModuleInfoImpl.getInstance()))),
             new BaseSchema(BindingRuntimeHelpers.createEffectiveModel(parserFactory, List.of(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
-                    .$YangModuleInfoImpl.getInstance(),
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601
-                    .$YangModuleInfoImpl.getInstance(),
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004
-                    .$YangModuleInfoImpl.getInstance(),
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206
-                    .$YangModuleInfoImpl.getInstance()))));
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
+                    .YangModuleInfoImpl.getInstance(),
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601
+                    .YangModuleInfoImpl.getInstance(),
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004
+                    .YangModuleInfoImpl.getInstance(),
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206
+                    .YangModuleInfoImpl.getInstance()))));
     }
 }
index ff3d96e64238ef8c412c3209440e2fb34fcf710b..b188ab6f5237d7eefbad82d69bb294dac68e5ff0 100644 (file)
@@ -7,17 +7,14 @@
  */
 package org.opendaylight.netconf.client.mdsal.impl;
 
-import com.google.common.collect.Iterables;
-import java.util.Collection;
 import java.util.Map;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
-import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netconf.client.mdsal.api.CredentialProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.Keystore;
@@ -34,8 +31,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 @Component(service = CredentialProvider.class)
-public final class DefaultCredentialProvider
-        implements CredentialProvider, ClusteredDataTreeChangeListener<Keystore>, AutoCloseable {
+public final class DefaultCredentialProvider implements CredentialProvider, DataListener<Keystore>, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(DefaultCredentialProvider.class);
 
     private final @NonNull Registration reg;
@@ -45,9 +41,8 @@ public final class DefaultCredentialProvider
     @Inject
     @Activate
     public DefaultCredentialProvider(@Reference final DataBroker dataBroker) {
-        reg = dataBroker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)),
-            this);
+        reg = dataBroker.registerDataListener(
+            DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)), this);
     }
 
     @Deactivate
@@ -63,9 +58,8 @@ public final class DefaultCredentialProvider
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<Keystore>> changes) {
-        final var keystore = Iterables.getLast(changes).getRootNode().getDataAfter();
-        final var newCredentials = keystore != null ? keystore.nonnullKeyCredential()
+    public void dataChangedTo(final Keystore data) {
+        final var newCredentials = data != null ? data.nonnullKeyCredential()
             : Map.<KeyCredentialKey, KeyCredential>of();
         LOG.debug("Updating to {} credentials", newCredentials.size());
         credentials = newCredentials;
index 07bd2713dbcb867d4867da926f5cb049c374441e..0d59f0edfbcfacfa3ece8ace9b2e7d27be2a48cc 100644 (file)
@@ -21,11 +21,11 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.netconf.client.mdsal.NetconfDevice.SchemaResourcesDTO;
 import org.opendaylight.netconf.client.mdsal.NetconfStateSchemasResolverImpl;
 import org.opendaylight.netconf.client.mdsal.api.SchemaResourceManager;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaContextFactoryConfiguration;
-import org.opendaylight.yangtools.yang.model.repo.api.YangIRSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.fs.FilesystemSchemaSourceCache;
 import org.opendaylight.yangtools.yang.model.repo.spi.SoftSchemaSourceCache;
+import org.opendaylight.yangtools.yang.model.spi.source.YangIRSource;
 import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
 import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository;
 import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
@@ -113,13 +113,13 @@ public final class DefaultSchemaResourceManager implements SchemaResourceManager
         // for a consistent set of modules, as it skips the need to re-parse the text sources multiple times. It also
         // helps establishing different sets of contexts, as they can share this pre-made cache.
         repository.registerSchemaSourceListener(
-            new SoftSchemaSourceCache<>(repository, YangIRSchemaSource.class));
+            new SoftSchemaSourceCache<>(repository, YangIRSource.class));
 
         // Attach the filesystem cache, providing persistence capability, so that restarts do not require us to
         // re-populate the cache. This also acts as a side-load capability, as anything pre-populated into that
         // directory will not be fetched from the device.
         repository.registerSchemaSourceListener(new FilesystemSchemaSourceCache<>(repository,
-                YangTextSchemaSource.class, new File(rootDirectory + File.separator + subdir)));
+                YangTextSource.class, new File(rootDirectory + File.separator + subdir)));
 
         return new SchemaResourcesDTO(repository, repository,
             repository.createEffectiveModelContextFactory(SchemaContextFactoryConfiguration.getDefault()),
index 8d418a9e7c5e90fa9bb31b3b23ef15216a93a7c5..165e5ab710cae74e4c90cfd24f6f584125abde28 100644 (file)
@@ -23,17 +23,17 @@ import java.security.cert.X509Certificate;
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.util.Base64;
-import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -56,7 +56,7 @@ import org.slf4j.LoggerFactory;
 @Singleton
 @Component(service = SslHandlerFactoryProvider.class)
 public final class DefaultSslHandlerFactoryProvider
-        implements SslHandlerFactoryProvider, ClusteredDataTreeChangeListener<Keystore>, AutoCloseable {
+        implements SslHandlerFactoryProvider, DataTreeChangeListener<Keystore>, AutoCloseable {
     /**
      * Internal state, updated atomically.
      */
@@ -136,9 +136,8 @@ public final class DefaultSslHandlerFactoryProvider
     @Inject
     @Activate
     public DefaultSslHandlerFactoryProvider(@Reference final DataBroker dataBroker) {
-        reg = dataBroker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)),
-            this);
+        reg = dataBroker.registerTreeChangeListener(
+            DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)), this);
     }
 
     @Deactivate
@@ -232,7 +231,7 @@ public final class DefaultSslHandlerFactoryProvider
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<Keystore>> changes) {
+    public void onDataTreeChanged(final List<DataTreeModification<Keystore>> changes) {
         LOG.debug("Starting update with {} changes", changes.size());
         final var builder = state.newBuilder();
         onDataTreeChanged(builder, changes);
@@ -241,15 +240,15 @@ public final class DefaultSslHandlerFactoryProvider
     }
 
     private static void onDataTreeChanged(final StateBuilder builder,
-            final Collection<DataTreeModification<Keystore>> changes) {
+            final List<DataTreeModification<Keystore>> changes) {
         for (var change : changes) {
             LOG.debug("Processing change {}", change);
             final var rootNode = change.getRootNode();
 
-            for (var changedChild : rootNode.getModifiedChildren()) {
-                if (changedChild.getDataType().equals(PrivateKey.class)) {
+            for (var changedChild : rootNode.modifiedChildren()) {
+                if (changedChild.dataType().equals(PrivateKey.class)) {
                     onPrivateKeyChanged(builder.privateKeys, (DataObjectModification<PrivateKey>)changedChild);
-                } else if (changedChild.getDataType().equals(TrustedCertificate.class)) {
+                } else if (changedChild.dataType().equals(TrustedCertificate.class)) {
                     onTrustedCertificateChanged(builder.trustedCertificates,
                         (DataObjectModification<TrustedCertificate>)changedChild);
                 }
@@ -259,14 +258,14 @@ public final class DefaultSslHandlerFactoryProvider
 
     private static void onPrivateKeyChanged(final HashMap<String, PrivateKey> privateKeys,
             final DataObjectModification<PrivateKey> objectModification) {
-        switch (objectModification.getModificationType()) {
+        switch (objectModification.modificationType()) {
             case SUBTREE_MODIFIED:
             case WRITE:
-                final var privateKey = objectModification.getDataAfter();
+                final var privateKey = objectModification.dataAfter();
                 privateKeys.put(privateKey.getName(), privateKey);
                 break;
             case DELETE:
-                privateKeys.remove(objectModification.getDataBefore().getName());
+                privateKeys.remove(objectModification.dataBefore().getName());
                 break;
             default:
                 break;
@@ -275,14 +274,14 @@ public final class DefaultSslHandlerFactoryProvider
 
     private static void onTrustedCertificateChanged(final HashMap<String, TrustedCertificate> trustedCertificates,
             final DataObjectModification<TrustedCertificate> objectModification) {
-        switch (objectModification.getModificationType()) {
+        switch (objectModification.modificationType()) {
             case SUBTREE_MODIFIED:
             case WRITE:
-                final var trustedCertificate = objectModification.getDataAfter();
+                final var trustedCertificate = objectModification.dataAfter();
                 trustedCertificates.put(trustedCertificate.getName(), trustedCertificate);
                 break;
             case DELETE:
-                trustedCertificates.remove(objectModification.getDataBefore().getName());
+                trustedCertificates.remove(objectModification.dataBefore().getName());
                 break;
             default:
                 break;
index abba6ceb8e65b974b24cc4be9781b3ce86b26661..1d0483adc2b08eceb443133eabf929469b336097 100644 (file)
@@ -283,7 +283,7 @@ public final class NetconfBaseOps {
         return addCallback(requireNonNull(callback), rpc.invokeNetconf(Get.QNAME,
             nonEmptyFilter(filterPath)
                 .map(path -> NetconfMessageTransformUtil.wrap(NETCONF_GET_NODEID,
-                    toFilterStructure(path, mountContext.getEffectiveModelContext())))
+                    toFilterStructure(path, mountContext.modelContext())))
                 .orElse(NetconfMessageTransformUtil.GET_RPC_CONTENT)));
     }
 
index bc7011282c2b5e878c1a39e103af642767698b40..5e61f2f88da6a90068d21d0ff155785668d941f2 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.netconf.client.mdsal.impl;
 
 import static java.util.Objects.requireNonNull;
-import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.$YangModuleInfoImpl.qnameOf;
+import static org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.YangModuleInfoImpl.qnameOf;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -248,9 +248,9 @@ public final class NetconfMessageTransformUtil {
      * @param lastChildOverride Optional of {@code NormalizedNode} data on which action will be invoked
      * @return {@link DOMSourceAnyxmlNode} containing edit-config structure
      */
-    public static DOMSourceAnyxmlNode createEditConfigAnyxml(
-            final EffectiveModelContext ctx, final YangInstanceIdentifier dataPath,
-            final Optional<EffectiveOperation> operation, final Optional<NormalizedNode> lastChildOverride) {
+    public static AnyxmlNode<DOMSource> createEditConfigAnyxml(final EffectiveModelContext ctx,
+            final YangInstanceIdentifier dataPath, final Optional<EffectiveOperation> operation,
+            final Optional<NormalizedNode> lastChildOverride) {
         if (dataPath.isEmpty()) {
             final var override = lastChildOverride.orElseThrow(() -> new IllegalArgumentException(
                 "Data has to be present when creating structure for top level element"));
@@ -387,7 +387,7 @@ public final class NetconfMessageTransformUtil {
         final Element actionNS = document.createElementNS(YangConstants.RFC6020_YANG_NAMESPACE_STRING, "action");
         final DataSchemaContext rootSchemaContextNode = dataSchemaContextTree.getRoot();
         final Element actionData = prepareActionData(rootSchemaContextNode, actionNS,
-                domDataTreeIdentifier.getRootIdentifier().getPathArguments().iterator(), document);
+                domDataTreeIdentifier.path().getPathArguments().iterator(), document);
 
         final Element specificActionElement =
                 document.createElementNS(action.getNamespace().toString(), action.getLocalName());
index 85d3779d2ec41aac56f96313c6b0dc4f5ef099a4..51476e82c1de489236dc80fa5d00b2a05f4a52ae 100644 (file)
@@ -30,7 +30,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Deque;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -122,14 +121,14 @@ public class NetconfMessageTransformer
         counter = new MessageCounter();
         this.mountContext = requireNonNull(mountContext);
 
-        final EffectiveModelContext schemaContext = mountContext.getEffectiveModelContext();
-        contextTree = DataSchemaContextTree.from(schemaContext);
+        final EffectiveModelContext modelContext = mountContext.modelContext();
+        contextTree = DataSchemaContextTree.from(modelContext);
 
-        mappedRpcs = Maps.uniqueIndex(schemaContext.getOperations(), SchemaNode::getQName);
-        actions = getActions(schemaContext);
+        mappedRpcs = Maps.uniqueIndex(modelContext.getOperations(), SchemaNode::getQName);
+        actions = getActions(modelContext);
 
         // RFC6020 normal notifications
-        mappedNotifications = Multimaps.index(schemaContext.getNotifications(),
+        mappedNotifications = Multimaps.index(modelContext.getNotifications(),
             node -> node.getQName().withoutRevision());
         this.baseSchema = baseSchema;
         this.strictParsing = strictParsing;
@@ -201,8 +200,7 @@ public class NetconfMessageTransformer
         try {
             final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
             final XmlParserStream xmlParser = XmlParserStream.create(writer, mountContext,
-                    SchemaInferenceStack.of(mountContext.getEffectiveModelContext(), notificationPath).toInference(),
-                    strictParsing);
+                SchemaInferenceStack.of(mountContext.modelContext(), notificationPath).toInference(), strictParsing);
             xmlParser.traverse(new DOMSource(element));
         } catch (XMLStreamException | IOException | UnsupportedOperationException e) {
             throw new IllegalArgumentException(String.format("Failed to parse notification %s", element), e);
@@ -212,8 +210,8 @@ public class NetconfMessageTransformer
 
     private Optional<NestedNotificationInfo> findNestedNotification(final NetconfMessage message,
             final Element element) {
-        final Iterator<? extends Module> modules = mountContext.getEffectiveModelContext()
-                .findModules(XMLNamespace.of(element.getNamespaceURI())).iterator();
+        final var modules = mountContext.modelContext().findModules(XMLNamespace.of(element.getNamespaceURI()))
+            .iterator();
         if (!modules.hasNext()) {
             throw new IllegalArgumentException(
                     "Unable to parse notification " + message + ", cannot find top level module");
@@ -257,7 +255,7 @@ public class NetconfMessageTransformer
             schemaBuilder.add(schemaNode.getQName());
 
             return new NestedNotificationInfo(Absolute.of(schemaBuilder),
-                    new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, instanceBuilder.build()), xmlNode);
+                DOMDataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, instanceBuilder.build()), xmlNode);
         }
         throw new IllegalStateException("No notification found");
     }
@@ -354,9 +352,8 @@ public class NetconfMessageTransformer
             // If the schema context for netconf device does not contain model for base netconf operations,
             // use default pre build context with just the base model
             // This way operations like lock/unlock are supported even if the source for base model was not provided
-            final EffectiveModelContext ctx = needToUseBaseCtx ? baseSchema.getEffectiveModelContext()
-                    : mountContext.getEffectiveModelContext();
-            NetconfMessageTransformUtil.writeNormalizedOperationInput(payload, result, Absolute.of(rpc), ctx);
+            final var modelContext = needToUseBaseCtx ? baseSchema.modelContext() : mountContext.modelContext();
+            NetconfMessageTransformUtil.writeNormalizedOperationInput(payload, result, Absolute.of(rpc), modelContext);
         } catch (final XMLStreamException | IOException | IllegalStateException e) {
             throw new IllegalStateException("Unable to serialize input of " + rpc, e);
         }
@@ -386,7 +383,7 @@ public class NetconfMessageTransformer
             domDataTreeIdentifier, counter, actionDef.getQName());
         try {
             NetconfMessageTransformUtil.writeNormalizedOperationInput((ContainerNode) payload, result, action,
-                mountContext.getEffectiveModelContext());
+                mountContext.modelContext());
         } catch (final XMLStreamException | IOException | IllegalStateException e) {
             throw new IllegalStateException("Unable to serialize input of " + action, e);
         }
@@ -469,8 +466,7 @@ public class NetconfMessageTransformer
             .add(operOutput.getQName())
             .build());
         // FIXME: we should have a cached inference here, or XMLParserStream should accept Absolute instead
-        final var inference = SchemaInferenceStack.of(mountContext.getEffectiveModelContext(), outputPath)
-            .toInference();
+        final var inference = SchemaInferenceStack.of(mountContext.modelContext(), outputPath).toInference();
 
         final NormalizationResultHolder resultHolder = new NormalizationResultHolder();
         final Element element = message.getDocument().getDocumentElement();
index 8048f72226296ee81ac7450af93ef3e458848c94..2b0b26d5b56c6ddc6ccf586ad5cd6ec35e1bc80e 100644 (file)
@@ -12,6 +12,7 @@ import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Optional;
 import javax.xml.stream.XMLStreamException;
+import javax.xml.transform.dom.DOMSource;
 import org.opendaylight.netconf.api.EffectiveOperation;
 import org.opendaylight.netconf.common.mdsal.NormalizedDataUtil;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -57,23 +58,22 @@ class NetconfRpcStructureTransformer implements RpcStructureTransformer {
     }
 
     @Override
-    public DOMSourceAnyxmlNode createEditConfigStructure(final Optional<NormalizedNode> data,
-                                                         final YangInstanceIdentifier dataPath,
-                                                         final Optional<EffectiveOperation> operation) {
+    public AnyxmlNode<DOMSource> createEditConfigStructure(final Optional<NormalizedNode> data,
+            final YangInstanceIdentifier dataPath, final Optional<EffectiveOperation> operation) {
         // FIXME: propagate MountPointContext
-        return NetconfMessageTransformUtil.createEditConfigAnyxml(mountContext.getEffectiveModelContext(), dataPath,
-            operation, data);
+        return NetconfMessageTransformUtil.createEditConfigAnyxml(mountContext.modelContext(), dataPath, operation,
+            data);
     }
 
     @Override
     public AnyxmlNode<?> toFilterStructure(final YangInstanceIdentifier path) {
         // FIXME: propagate MountPointContext
-        return NetconfMessageTransformUtil.toFilterStructure(path, mountContext.getEffectiveModelContext());
+        return NetconfMessageTransformUtil.toFilterStructure(path, mountContext.modelContext());
     }
 
     @Override
     public AnyxmlNode<?> toFilterStructure(final List<FieldsFilter> fieldsFilters) {
         // FIXME: propagate MountPointContext
-        return NetconfMessageTransformUtil.toFilterStructure(fieldsFilters, mountContext.getEffectiveModelContext());
+        return NetconfMessageTransformUtil.toFilterStructure(fieldsFilters, mountContext.modelContext());
     }
 }
index 4f4cb6db789ecf7d15855829ae97f4fd06c30911..691a319ec2edaeaa866cdd2207f253d31404e174 100644 (file)
@@ -12,11 +12,14 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.SettableFuture;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.nio.charset.StandardCharsets;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Base64;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -26,6 +29,7 @@ import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.dom.api.DefaultDOMRpcException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddKeystoreEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddKeystoreEntryInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddKeystoreEntryOutput;
@@ -141,21 +145,26 @@ public final class NetconfSalKeystoreRpcs implements AutoCloseable {
     private ListenableFuture<RpcResult<AddKeystoreEntryOutput>> addKeystoreEntry(final AddKeystoreEntryInput input) {
         LOG.debug("Adding keypairs: {}", input);
 
-        final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
-        final List<KeyCredential> keypairs = input.nonnullKeyCredential().values().stream()
-            .map(keypair -> new KeyCredentialBuilder(keypair)
-                .setPrivateKey(encryptionService.encrypt(keypair.getPrivateKey()))
-                .setPassphrase(encryptionService.encrypt(keypair.getPassphrase()))
-                .build())
-            .collect(Collectors.toList());
-
-        for (KeyCredential keypair : keypairs) {
+        final var plain = input.nonnullKeyCredential();
+        final var encrypted = new ArrayList<KeyCredential>(plain.size());
+        for (var credential : plain.values()) {
+            try {
+                encrypted.add(new KeyCredentialBuilder(credential)
+                    .setPrivateKey(encryptString(credential.getPrivateKey()))
+                    .setPassphrase(encryptString(credential.getPassphrase()))
+                    .build());
+            } catch (GeneralSecurityException e) {
+                return Futures.immediateFailedFuture(new DefaultDOMRpcException("Failed to decrypt " + credential, e));
+            }
+        }
+
+        final var writeTransaction = dataBroker.newWriteOnlyTransaction();
+        for (var keypair : encrypted) {
             writeTransaction.merge(LogicalDatastoreType.CONFIGURATION,
                 KEYSTORE_IID.child(KeyCredential.class, keypair.key()), keypair);
         }
 
-        final SettableFuture<RpcResult<AddKeystoreEntryOutput>> rpcResult = SettableFuture.create();
-
+        final var rpcResult = SettableFuture.<RpcResult<AddKeystoreEntryOutput>>create();
         writeTransaction.commit().addCallback(new FutureCallback<CommitInfo>() {
             @Override
             public void onSuccess(final CommitInfo result) {
@@ -169,10 +178,13 @@ public final class NetconfSalKeystoreRpcs implements AutoCloseable {
                 rpcResult.setException(throwable);
             }
         }, MoreExecutors.directExecutor());
-
         return rpcResult;
     }
 
+    private String encryptString(final String plain) throws GeneralSecurityException {
+        return Base64.getEncoder().encodeToString(encryptionService.encrypt(plain.getBytes(StandardCharsets.UTF_8)));
+    }
+
     @VisibleForTesting
     ListenableFuture<RpcResult<AddTrustedCertificateOutput>> addTrustedCertificate(
             final AddTrustedCertificateInput input) {
index deccbc51d49bd6d3626d4692f49eccd13668b37d..f1de13a3ef63d44a14299e3230ab8ae3e8352978 100644 (file)
@@ -9,10 +9,10 @@ package org.opendaylight.netconf.client.mdsal.impl;
 
 import java.util.List;
 import java.util.Optional;
+import javax.xml.transform.dom.DOMSource;
 import org.opendaylight.netconf.api.EffectiveOperation;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.AnyxmlNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
@@ -29,8 +29,8 @@ interface RpcStructureTransformer {
      * @param operation operation
      * @return config structure
      */
-    DOMSourceAnyxmlNode createEditConfigStructure(Optional<NormalizedNode> data, YangInstanceIdentifier dataPath,
-                                                  Optional<EffectiveOperation> operation);
+    AnyxmlNode<DOMSource> createEditConfigStructure(Optional<NormalizedNode> data, YangInstanceIdentifier dataPath,
+        Optional<EffectiveOperation> operation);
 
     /**
      * Transforms path to filter structure.
index 332f500272a8197a79a646b500a7f159d40655b4..b5aae3bdd22d0875cdc61e35f146d9db91c01430 100644 (file)
@@ -7,21 +7,16 @@
  */
 package org.opendaylight.netconf.client.mdsal.impl;
 
-import java.time.Instant;
-import java.util.Map;
 import javax.xml.transform.dom.DOMSource;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.netconf.api.messages.NetconfMessage;
 import org.opendaylight.netconf.api.xml.MissingNameSpaceException;
-import org.opendaylight.netconf.api.xml.XmlElement;
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
 import org.opendaylight.netconf.client.mdsal.api.NotificationTransformer;
 import org.opendaylight.netconf.client.mdsal.api.RpcTransformer;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -44,7 +39,7 @@ public class SchemalessMessageTransformer implements NotificationTransformer, Rp
 
     @Override
     public DOMNotification toNotification(final NetconfMessage message) {
-        final Map.Entry<Instant, XmlElement> stripped = NetconfMessageTransformUtil.stripNotification(message);
+        final var stripped = NetconfMessageTransformUtil.stripNotification(message);
         final QName notificationNoRev;
         try {
             notificationNoRev =
@@ -54,17 +49,13 @@ public class SchemalessMessageTransformer implements NotificationTransformer, Rp
                     + message + ", cannot find namespace", e);
         }
 
-        final DOMSourceAnyxmlNode notificationPayload = Builders.anyXmlBuilder()
+        return new NetconfMessageTransformer.NetconfDeviceNotification(Builders.containerBuilder()
+            .withNodeIdentifier(SCHEMALESS_NOTIFICATION_PAYLOAD)
+            .withChild(Builders.anyXmlBuilder()
                 .withNodeIdentifier(new NodeIdentifier(notificationNoRev))
                 .withValue(new DOMSource(stripped.getValue().getDomElement()))
-                .build();
-
-        final ContainerNode notificationBody = Builders.containerBuilder()
-                .withNodeIdentifier(SCHEMALESS_NOTIFICATION_PAYLOAD)
-                .withChild(notificationPayload)
-                .build();
-
-        return new NetconfMessageTransformer.NetconfDeviceNotification(notificationBody, stripped.getKey());
+                .build())
+            .build(), stripped.getKey());
     }
 
     @Override
index 85b028ae8dd3ae5b88d457572fb5802ee6a1d615..8ad942e2b59d942d578b38773cef4ed156b7d786 100644 (file)
@@ -75,7 +75,7 @@ class SchemalessRpcStructureTransformer implements RpcStructureTransformer {
      * @return config structure
      */
     @Override
-    public DOMSourceAnyxmlNode createEditConfigStructure(final Optional<NormalizedNode> data,
+    public AnyxmlNode<DOMSource> createEditConfigStructure(final Optional<NormalizedNode> data,
             final YangInstanceIdentifier dataPath, final Optional<EffectiveOperation> operation) {
         final var dataValue = data.orElseThrow();
         if (!(dataValue instanceof DOMSourceAnyxmlNode anxmlData)) {
index 9f27d14112d11916fc3849821cd362ff773b852c..ed2bc0adcae460caa8faa8c99b9c9862b4a68ded 100644 (file)
@@ -8,27 +8,29 @@
 package org.opendaylight.netconf.client.mdsal.spi;
 
 import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
 
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
 import java.util.HashMap;
 import java.util.Map;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChainClosedException;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.common.Empty;
 
 /**
  * {@link DOMTransactionChain} implementation for Netconf connector.
  */
 abstract class AbstractTxChain implements DOMTransactionChain, TxListener {
-    /**
-     * Submitted transactions that haven't completed yet.
-     */
+    // Submitted transactions that haven't completed yet.
     private final Map<DOMDataTreeWriteTransaction, Registration> pendingTransactions = new HashMap<>();
+    private final @NonNull SettableFuture<Empty> future = SettableFuture.create();
 
     final DOMDataBroker dataBroker;
-    final DOMTransactionChainListener listener;
 
     /**
      * Transaction created by this chain that hasn't been submitted or cancelled yet.
@@ -37,17 +39,23 @@ abstract class AbstractTxChain implements DOMTransactionChain, TxListener {
     private boolean closed = false;
     private boolean successful = true;
 
-    AbstractTxChain(final DOMDataBroker dataBroker, final DOMTransactionChainListener listener) {
-        this.dataBroker = dataBroker;
-        this.listener = listener;
+    AbstractTxChain(final DOMDataBroker dataBroker) {
+        this.dataBroker = requireNonNull(dataBroker);
+    }
+
+    @Override
+    public final ListenableFuture<Empty> future() {
+        return future;
     }
 
     @Override
     public final synchronized AbstractWriteTx newWriteOnlyTransaction() {
         checkOperationPermitted();
-        final DOMDataTreeWriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
-        checkState(writeTransaction instanceof AbstractWriteTx);
-        final AbstractWriteTx pendingWriteTx = (AbstractWriteTx) writeTransaction;
+
+        final var writeTransaction = dataBroker.newWriteOnlyTransaction();
+        if (!(writeTransaction instanceof AbstractWriteTx pendingWriteTx)) {
+            throw new IllegalStateException("Unexpected transaction " + writeTransaction);
+        }
         pendingTransactions.put(pendingWriteTx, pendingWriteTx.addListener(this));
         currentTransaction = pendingWriteTx;
         return pendingWriteTx;
@@ -74,7 +82,7 @@ abstract class AbstractTxChain implements DOMTransactionChain, TxListener {
         if (currentTransaction != null) {
             currentTransaction.cancel();
         }
-        listener.onTransactionChainFailed(this, transaction, cause);
+        future.setException(cause);
     }
 
     @Override
@@ -104,7 +112,7 @@ abstract class AbstractTxChain implements DOMTransactionChain, TxListener {
 
     private void notifyChainListenerSuccess() {
         if (closed && pendingTransactions.isEmpty() && successful) {
-            listener.onTransactionChainSuccessful(this);
+            future.set(Empty.value());
         }
     }
 }
index 8d1fca00632ca3c1d5f2a80014f6ad53588e574c..b727db9f76a3f8ca20d11cc04dc50f1d37722451 100644 (file)
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
@@ -52,6 +53,9 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction {
     final boolean rollbackSupport;
     final List<ListenableFuture<? extends DOMRpcResult>> resultsFutures = new ArrayList<>();
     private final List<TxListener> listeners = new CopyOnWriteArrayList<>();
+    private final SettableFuture<CommitInfo> resultFuture = SettableFuture.create();
+    private final @NonNull FluentFuture<CommitInfo> completionFuture = FluentFuture.from(resultFuture);
+
     // Allow commit to be called only once
     volatile boolean finished = false;
     final boolean isLockAllowed;
@@ -76,6 +80,11 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction {
 
     abstract void cleanup();
 
+    @Override
+    public final FluentFuture<?> completionFuture() {
+        return completionFuture;
+    }
+
     @Override
     public synchronized boolean cancel() {
         if (isFinished()) {
@@ -145,8 +154,7 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction {
     @Override
     // Non-final for testing
     public FluentFuture<? extends CommitInfo> commit() {
-        final SettableFuture<CommitInfo> resultFuture = SettableFuture.create();
-        Futures.addCallback(commitConfiguration(), new FutureCallback<RpcResult<Void>>() {
+        Futures.addCallback(commitConfiguration(), new FutureCallback<>() {
             @Override
             public void onSuccess(final RpcResult<Void> result) {
                 if (!result.isSuccessful()) {
@@ -166,15 +174,15 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction {
             }
         }, MoreExecutors.directExecutor());
 
-        return FluentFuture.from(resultFuture);
+        return completionFuture;
     }
 
     final ListenableFuture<RpcResult<Void>> commitConfiguration() {
         listeners.forEach(listener -> listener.onTransactionSubmitted(this));
         checkNotFinished();
         finished = true;
-        final ListenableFuture<RpcResult<Void>> result = performCommit();
-        Futures.addCallback(result, new FutureCallback<RpcResult<Void>>() {
+        final var result = performCommit();
+        Futures.addCallback(result, new FutureCallback<>() {
             @Override
             public void onSuccess(final RpcResult<Void> rpcResult) {
                 if (rpcResult.isSuccessful()) {
@@ -210,7 +218,7 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction {
     final ListenableFuture<RpcResult<Void>> resultsToTxStatus() {
         final var transformed = SettableFuture.<RpcResult<Void>>create();
 
-        Futures.addCallback(Futures.allAsList(resultsFutures), new FutureCallback<List<DOMRpcResult>>() {
+        Futures.addCallback(Futures.allAsList(resultsFutures), new FutureCallback<>() {
             @Override
             public void onSuccess(final List<DOMRpcResult> domRpcResults) {
                 if (!transformed.isDone()) {
index af0c36fb75fae9b0ee795a8adeaf13167ed5b78a..05f998792f4f174042fca63fc74ac0d60e724d49 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.netconf.client.mdsal.spi;
 import static java.util.Objects.requireNonNull;
 
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
 import org.opendaylight.netconf.dom.api.tx.NetconfDOMDataBrokerFieldsExtension;
 import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadTransaction;
 import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadWriteTransaction;
@@ -19,9 +18,9 @@ import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsTransactionChain;
 public final class FieldsAwareTxChain extends AbstractTxChain implements NetconfDOMFieldsTransactionChain {
     private final NetconfDOMDataBrokerFieldsExtension dataBrokerFieldsExtension;
 
-    FieldsAwareTxChain(final DOMDataBroker dataBroker, final DOMTransactionChainListener listener,
-                              final NetconfDOMDataBrokerFieldsExtension dataBrokerFieldsExtension) {
-        super(dataBroker, listener);
+    FieldsAwareTxChain(final DOMDataBroker dataBroker,
+            final NetconfDOMDataBrokerFieldsExtension dataBrokerFieldsExtension) {
+        super(dataBroker);
         this.dataBrokerFieldsExtension = requireNonNull(dataBrokerFieldsExtension);
     }
 
index 8517cbf70a5799c6fd46abe611942baeefc40a00..5ba3b42bc9a91ab75dfca70d6b76a8ebfa3a9f04 100644 (file)
@@ -40,7 +40,7 @@ import org.opendaylight.netconf.client.mdsal.api.SchemalessRpcService;
 import org.opendaylight.netconf.client.mdsal.impl.NetconfMessageTransformUtil;
 import org.opendaylight.netconf.common.NetconfTimer;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.GetConfig;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.slf4j.Logger;
@@ -394,12 +394,10 @@ public final class KeepaliveSalFacade implements RemoteDeviceHandler {
         }
 
         @Override
-        public <T extends DOMRpcAvailabilityListener> ListenerRegistration<T> registerRpcListener(
-                final T rpcListener) {
+        public Registration registerRpcListener(final DOMRpcAvailabilityListener rpcListener) {
             // There is no real communication with the device (yet), hence no recordActivity() or anything
             return delegate.registerRpcListener(rpcListener);
         }
-
     }
 
     /**
index 3ef69252f71a60bf719c80a96a34f5c6603d1c07..569fe91a3350f014d89f9a87b6a97c604787e571 100644 (file)
@@ -24,8 +24,7 @@ import org.opendaylight.mdsal.dom.api.DefaultDOMRpcException;
 import org.opendaylight.netconf.api.messages.NetconfMessage;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceCommunicator;
 import org.opendaylight.netconf.client.mdsal.api.RpcTransformer;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.NoOpListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
@@ -71,9 +70,11 @@ record NetconfDeviceDOMRpcService(
     }
 
     @Override
-    public <T extends DOMRpcAvailabilityListener> ListenerRegistration<T> registerRpcListener(final T listener) {
+    public Registration registerRpcListener(final DOMRpcAvailabilityListener listener) {
         listener.onRpcAvailable(Collections2.transform(modelContext.getOperations(),
             input -> DOMRpcIdentifier.create(input.getQName())));
-        return NoOpListenerRegistration.of(listener);
+        return () -> {
+            // No-op
+        };
     }
 }
\ No newline at end of file
index 4bebd93230c006878ed2e5b1adf74e6e1320b647..dc8ee56cfd0f0012c4b407ffa20990f733f73aea 100644 (file)
@@ -9,14 +9,11 @@ package org.opendaylight.netconf.client.mdsal.spi;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ImmutableClassToInstanceMap;
-import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension;
+import java.util.List;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
 import org.opendaylight.mdsal.dom.spi.PingPongMergingDOMDataBroker;
 import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
@@ -76,13 +73,13 @@ public final class NetconfDeviceDataBroker implements PingPongMergingDOMDataBrok
     }
 
     @Override
-    public DOMTransactionChain createTransactionChain(final DOMTransactionChainListener listener) {
-        return new TxChain(this, listener);
+    public DOMTransactionChain createTransactionChain() {
+        return new TxChain(this);
     }
 
     @Override
-    public ClassToInstanceMap<DOMDataBrokerExtension> getExtensions() {
-        return ImmutableClassToInstanceMap.of(NetconfDOMDataBrokerFieldsExtension.class, fieldsExtension);
+    public List<Extension> supportedExtensions() {
+        return List.of(fieldsExtension);
     }
 
     private final class NetconfDOMDataBrokerFieldsExtensionImpl implements NetconfDOMDataBrokerFieldsExtension {
@@ -97,8 +94,8 @@ public final class NetconfDeviceDataBroker implements PingPongMergingDOMDataBrok
         }
 
         @Override
-        public NetconfDOMFieldsTransactionChain createTransactionChain(final DOMTransactionChainListener listener) {
-            return new FieldsAwareTxChain(NetconfDeviceDataBroker.this, listener, this);
+        public NetconfDOMFieldsTransactionChain createTransactionChain() {
+            return new FieldsAwareTxChain(NetconfDeviceDataBroker.this, this);
         }
     }
 }
\ No newline at end of file
index 0be46207c1a3300c53f66c264c20209e24013513..895c8d5231dc5f469b31b86e104fa20c31a83052 100644 (file)
@@ -64,7 +64,7 @@ public class NetconfDeviceMount implements AutoCloseable {
         checkState(topologyRegistration == null, "Already initialized");
 
         final var mountBuilder = mountService.createMountPoint(mountPath);
-        mountBuilder.addService(DOMSchemaService.class, FixedDOMSchemaService.of(() -> initialCtx));
+        mountBuilder.addService(DOMSchemaService.class, new FixedDOMSchemaService(initialCtx));
 
         final var rpcs = services.rpcs();
         mountBuilder.addService(NetconfRpcService.class, rpcs);
index 63dbc30d2cad53b333c0fe6b0aa01cb8b8686a38..2ea1a4d956d832126fe2cbde5dd8a345effde730 100644 (file)
@@ -20,9 +20,7 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
-import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.slf4j.Logger;
@@ -48,16 +46,13 @@ public final class NetconfDeviceNotificationService implements DOMNotificationSe
     }
 
     @Override
-    public <T extends DOMNotificationListener> ListenerRegistration<T> registerNotificationListener(final T listener,
+    public Registration registerNotificationListener(final DOMNotificationListener listener,
             final Collection<Absolute> types) {
         final var lsnr = requireNonNull(listener);
         final var typesArray = types.stream().map(Objects::requireNonNull).distinct().toArray(Absolute[]::new);
         return switch (typesArray.length) {
-            case 0 -> new AbstractListenerRegistration<>(lsnr) {
-                @Override
-                protected void removeRegistration() {
-                    // No-op
-                }
+            case 0 -> () -> {
+                // No-op
             };
             case 1 -> registerOne(lsnr, typesArray[0]);
             default -> registerMultiple(lsnr, typesArray);
@@ -65,8 +60,7 @@ public final class NetconfDeviceNotificationService implements DOMNotificationSe
     }
 
     @Override
-    public <T extends DOMNotificationListener> ListenerRegistration<T> registerNotificationListener(final T listener,
-            final Absolute... types) {
+    public Registration registerNotificationListener(final DOMNotificationListener listener, final Absolute... types) {
         return registerNotificationListener(listener, Arrays.asList(types));
     }
 
@@ -90,30 +84,30 @@ public final class NetconfDeviceNotificationService implements DOMNotificationSe
         return listeners.size();
     }
 
-    private synchronized <T extends DOMNotificationListener> @NonNull ListenerRegistration<T> registerOne(
-            final @NonNull T listener, final Absolute type) {
+    private synchronized @NonNull Registration registerOne(final @NonNull DOMNotificationListener listener,
+            final Absolute type) {
         listeners.put(type, listener);
-        return new AbstractListenerRegistration<>(listener) {
+        return new AbstractRegistration() {
             @Override
             protected void removeRegistration() {
                 synchronized (NetconfDeviceNotificationService.this) {
-                    listeners.remove(type, getInstance());
+                    listeners.remove(type, listener);
                 }
             }
         };
     }
 
-    private synchronized <T extends DOMNotificationListener> @NonNull ListenerRegistration<T> registerMultiple(
-            final @NonNull T listener, final Absolute[] types) {
+    private synchronized @NonNull Registration registerMultiple(final @NonNull DOMNotificationListener listener,
+            final Absolute[] types) {
         for (var type : types) {
             listeners.put(type, listener);
         }
-        return new AbstractListenerRegistration<>(listener) {
+        return new AbstractRegistration() {
             @Override
             protected void removeRegistration() {
                 synchronized (NetconfDeviceNotificationService.this) {
                     for (var type : types) {
-                        listeners.remove(type, getInstance());
+                        listeners.remove(type, listener);
                     }
                 }
             }
index 0aa9d0a56ef420618aff8c95e35f5549bb5d1bf4..994e8c1ea681212745c9e6e33feb69b27cea2170 100644 (file)
@@ -45,7 +45,7 @@ public class NetconfDeviceSalFacade implements RemoteDeviceHandler, AutoCloseabl
     public synchronized void onDeviceConnected(final NetconfDeviceSchema deviceSchema,
             final NetconfSessionPreferences sessionPreferences, final RemoteDeviceServices services) {
         final var mountContext = deviceSchema.mountContext();
-        final var modelContext = mountContext.getEffectiveModelContext();
+        final var modelContext = mountContext.modelContext();
 
         final var deviceRpc = services.rpcs();
 
index ab88d04da98859e2508ace0c9b4c186be0e822d7..6e38296a16e0f733f9eb2f0d4c39deeaec607a1f 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.netconf.client.mdsal.spi;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.util.concurrent.FluentFuture;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
@@ -23,8 +25,13 @@ class ReadWriteTx<T extends DOMDataTreeReadTransaction> implements DOMDataTreeRe
     final T delegateReadTx;
 
     ReadWriteTx(final T delegateReadTx, final DOMDataTreeWriteTransaction delegateWriteTx) {
-        this.delegateReadTx = delegateReadTx;
-        this.delegateWriteTx = delegateWriteTx;
+        this.delegateReadTx = requireNonNull(delegateReadTx);
+        this.delegateWriteTx = requireNonNull(delegateWriteTx);
+    }
+
+    @Override
+    public final FluentFuture<?> completionFuture() {
+        return delegateWriteTx.completionFuture();
     }
 
     @Override
index 0b47742d7dbed7c0fc9004d071f509bfc4df4b6d..d24ad3d3cb7313e29f3fc7aff859fbf426b72213 100644 (file)
@@ -11,14 +11,13 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
 
 /**
  * {@link DOMTransactionChain} implementation for Netconf connector.
  */
 final class TxChain extends AbstractTxChain {
-    TxChain(final DOMDataBroker dataBroker, final DOMTransactionChainListener listener) {
-        super(dataBroker, listener);
+    TxChain(final DOMDataBroker dataBroker) {
+        super(dataBroker);
     }
 
     @Override
index 5b38d7451191b37230f7b59b8c0b2befdfce73a2..6fd0f539aa2ab805d0136035c86222fe15f127ad 100644 (file)
@@ -13,7 +13,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Map;
 import org.junit.Test;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 
 public class LibraryModulesSchemasTest {
 
index 77d889a68d922d0b488f95f15d43985874f125e2..8651fc062692182698ffe10cefa0544facfb92bf 100644 (file)
@@ -20,8 +20,8 @@ import java.util.concurrent.ExecutionException;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 
 public class LibrarySchemaYangSourceProviderTest {
     private SourceIdentifier workingSid;
index f029d8d0cbf6e6c545eee7bc4075266172f5968d..3b0f632a6db5925423202afd018bb8e72520f812 100644 (file)
@@ -34,8 +34,8 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -59,8 +59,8 @@ public class MonitoringSchemaSourceProviderTest {
     @Test
     public void testGetSource() throws Exception {
         final SourceIdentifier identifier = new SourceIdentifier("test", "2016-02-08");
-        final YangTextSchemaSource source = provider.getSource(identifier).get();
-        assertEquals(identifier, source.getIdentifier());
+        final YangTextSource source = provider.getSource(identifier).get();
+        assertEquals(identifier, source.sourceId());
         verify(service).invokeRpc(GetSchema.QNAME,
                 MonitoringSchemaSourceProvider.createGetSchemaRequest("test", Optional.of("2016-02-08")));
     }
index 7fdb6a819d1ef6b175130f00481724b803e9727b..a95eed54b784b1b8ef01ee7030ee60f5805df57e 100644 (file)
@@ -25,7 +25,6 @@ import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
@@ -56,16 +55,16 @@ import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability.CapabilityOrigin;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory;
 import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
@@ -123,7 +122,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
             return new NetconfStateSchemas(Sets.newHashSet(source1, source2));
         };
 
-        doReturn(mock(SchemaSourceRegistration.class)).when(schemaRegistry).registerSchemaSource(any(), any());
+        doReturn(mock(Registration.class)).when(schemaRegistry).registerSchemaSource(any(), any());
         final NetconfDevice.SchemaResourcesDTO schemaResourcesDTO = new NetconfDevice
                 .SchemaResourcesDTO(schemaRegistry, schemaRepository, schemaFactory, stateSchemasResolver);
 
@@ -154,7 +153,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         // Make fallback attempt to fail due to empty resolved sources
         final SchemaResolutionException schemaResolutionException = new SchemaResolutionException("fail first",
-                List.of(), ImmutableMultimap.of());
+            new SourceIdentifier("test-module", "2013-07-22"), new Throwable());
         doReturn(Futures.immediateFailedFuture(schemaResolutionException))
                 .when(schemaFactory).createEffectiveModelContext(anyCollection());
 
@@ -191,11 +190,11 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         // Make fallback attempt to fail due to empty resolved sources
         final MissingSchemaSourceException schemaResolutionException =
-                new MissingSchemaSourceException("fail first", TEST_SID);
+                new MissingSchemaSourceException(TEST_SID, "fail first");
         doReturn(Futures.immediateFailedFuture(schemaResolutionException))
-                .when(schemaRepository).getSchemaSource(eq(TEST_SID), eq(YangTextSchemaSource.class));
+                .when(schemaRepository).getSchemaSource(eq(TEST_SID), eq(YangTextSource.class));
         doAnswer(invocation -> {
-            if (((Collection<?>) invocation.getArguments()[0]).size() == 2) {
+            if (invocation.getArgument(0, Collection.class).size() == 2) {
                 return Futures.immediateFailedFuture(schemaResolutionException);
             } else {
                 return Futures.immediateFuture(SCHEMA_CONTEXT);
@@ -212,7 +211,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
             return new NetconfStateSchemas(Sets.newHashSet(source1, source2));
         };
 
-        doReturn(mock(SchemaSourceRegistration.class)).when(schemaRegistry).registerSchemaSource(any(), any());
+        doReturn(mock(Registration.class)).when(schemaRegistry).registerSchemaSource(any(), any());
         final NetconfDevice.SchemaResourcesDTO schemaResourcesDTO = new NetconfDevice
                 .SchemaResourcesDTO(schemaRegistry, schemaRepository, schemaFactory, stateSchemasResolver);
 
@@ -236,9 +235,9 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
     private static SchemaRepository getSchemaRepository() {
         final SchemaRepository mock = mock(SchemaRepository.class);
-        final YangTextSchemaSource mockRep = mock(YangTextSchemaSource.class);
+        final YangTextSource mockRep = mock(YangTextSource.class);
         doReturn(Futures.immediateFuture(mockRep))
-                .when(mock).getSchemaSource(any(SourceIdentifier.class), eq(YangTextSchemaSource.class));
+                .when(mock).getSchemaSource(any(SourceIdentifier.class), eq(YangTextSource.class));
         return mock;
     }
 
@@ -441,10 +440,10 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
                 any(RemoteDeviceServices.class));
 
         List<String> notificationModulesName = List.of(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
-                        .$YangModuleInfoImpl.getInstance().getName().toString(),
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
-                        .$YangModuleInfoImpl.getInstance().getName().toString());
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
+                        .YangModuleInfoImpl.getInstance().getName().toString(),
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
+                        .YangModuleInfoImpl.getInstance().getName().toString());
 
         final Set<AvailableCapability> resolvedCapabilities = argument.getValue().capabilities().resolvedCapabilities();
 
@@ -481,10 +480,10 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
         final NetconfDeviceCapabilities netconfDeviceCaps = argument.getValue().capabilities();
 
         List<String> notificationModulesName = List.of(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
-                        .$YangModuleInfoImpl.getInstance().getName().toString(),
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
-                        .$YangModuleInfoImpl.getInstance().getName().toString());
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
+                        .YangModuleInfoImpl.getInstance().getName().toString(),
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
+                        .YangModuleInfoImpl.getInstance().getName().toString());
 
         assertFalse(netconfDeviceCaps.resolvedCapabilities().stream()
             .anyMatch(entry -> notificationModulesName.contains(entry.getCapability())));
@@ -509,27 +508,27 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
         final NetconfSessionPreferences sessionCaps = getSessionCaps(false, List.of());
 
-        final Map<QName, CapabilityOrigin> moduleBasedCaps = new HashMap<>();
-        moduleBasedCaps.put(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
-                        .$YangModuleInfoImpl.getInstance().getName(),
+        final var moduleBasedCaps = new HashMap<QName, CapabilityOrigin>();
+        moduleBasedCaps.put(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
+                        .YangModuleInfoImpl.getInstance().getName(),
                 CapabilityOrigin.DeviceAdvertised);
-        moduleBasedCaps.put(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
-                        .$YangModuleInfoImpl.getInstance().getName(),
+        moduleBasedCaps.put(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
+                        .YangModuleInfoImpl.getInstance().getName(),
                 CapabilityOrigin.DeviceAdvertised);
 
 
         netconfSpy.onRemoteSessionUp(sessionCaps.replaceModuleCaps(moduleBasedCaps), listener);
 
-        final ArgumentCaptor<NetconfDeviceSchema> argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
+        final var argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class);
         verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class),
                 any(RemoteDeviceServices.class));
         final Set<AvailableCapability> resolvedCapabilities = argument.getValue().capabilities().resolvedCapabilities();
 
-        List<String> notificationModulesName = List.of(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
-                        .$YangModuleInfoImpl.getInstance().getName().toString(),
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
-                        .$YangModuleInfoImpl.getInstance().getName().toString());
+        final var notificationModulesName = List.of(
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
+                        .YangModuleInfoImpl.getInstance().getName().toString(),
+                org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
+                        .YangModuleInfoImpl.getInstance().getName().toString());
 
         assertEquals(2, resolvedCapabilities.size());
         assertTrue(resolvedCapabilities.stream().anyMatch(entry -> notificationModulesName
index f1aadbc2864db0352a32af9ce1d39fa3b7d1cd45..67f5eb97d30c796eedbfc2a7b94d67b3bd834a10 100644 (file)
@@ -51,9 +51,9 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
+import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.slf4j.Logger;
@@ -74,16 +74,16 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest {
     @Mock
     private DOMRpcService rpc;
 
-    private EffectiveModelContext schemaContext;
+    private EffectiveModelContext modelContext;
 
     @Before
     public void setUp() throws Exception {
-        schemaContext = BASE_SCHEMAS.baseSchemaWithNotifications().getEffectiveModelContext();
+        modelContext = BASE_SCHEMAS.baseSchemaWithNotifications().modelContext();
 
         final var resultHolder = new NormalizationResultHolder();
         final var writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
         final var xmlParser = XmlParserStream.create(writer,
-            SchemaInferenceStack.ofDataTreePath(schemaContext, NetconfState.QNAME, Schemas.QNAME).toInference(), false);
+            SchemaInferenceStack.ofDataTreePath(modelContext, NetconfState.QNAME, Schemas.QNAME).toInference(), false);
 
         xmlParser.parse(UntrustedXML.createXMLStreamReader(getClass().getResourceAsStream(
                 "/netconf-state.schemas.payload.xml")));
@@ -104,21 +104,21 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest {
     @Ignore
     @Test
     public void testCreate2() throws Exception {
-        final ContainerNode netconfState = Builders.containerBuilder()
+        final ContainerNode netconfState = ImmutableNodes.newContainerBuilder()
                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(NetconfState.QNAME))
                 .withChild(compositeNodeSchemas)
                 .build();
-        final ContainerNode data = Builders.containerBuilder()
+        final ContainerNode data = ImmutableNodes.newContainerBuilder()
                 .withNodeIdentifier(NetconfMessageTransformUtil.NETCONF_DATA_NODEID)
                 .withChild(netconfState)
                 .build();
-        final ContainerNode rpcReply = Builders.containerBuilder()
+        final ContainerNode rpcReply = ImmutableNodes.newContainerBuilder()
                 .withNodeIdentifier(new YangInstanceIdentifier
                         .NodeIdentifier(NetconfMessageTransformUtil.NETCONF_RPC_REPLY_QNAME))
                 .withChild(data)
                 .build();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult(rpcReply))).when(rpc).invokeRpc(eq(Get.QNAME), any());
-        final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext);
+        final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, modelContext);
         final Set<QName> availableYangSchemasQNames = stateSchemas.getAvailableYangSchemasQNames();
         assertEquals(numberOfLegalSchemas, availableYangSchemasQNames.size());
 
@@ -129,7 +129,7 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest {
     @Test
     public void testCreateMonitoringNotSupported() throws Exception {
         final var caps = NetconfSessionPreferences.fromStrings(Set.of());
-        final var stateSchemas = NetconfStateSchemas.create(rpc, caps, deviceId, schemaContext);
+        final var stateSchemas = NetconfStateSchemas.create(rpc, caps, deviceId, modelContext);
         assertEquals(Set.of(), stateSchemas.getAvailableYangSchemasQNames());
     }
 
@@ -137,7 +137,7 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest {
     public void testCreateFail() throws Exception {
         when(rpc.invokeRpc(eq(Get.QNAME), any())).thenReturn(
                 Futures.immediateFailedFuture(new DOMRpcImplementationNotAvailableException("not available")));
-        final var stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext);
+        final var stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, modelContext);
         assertEquals(Set.of(), stateSchemas.getAvailableYangSchemasQNames());
     }
 
@@ -146,7 +146,7 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest {
         final RpcError rpcError = RpcResultBuilder.newError(ErrorType.RPC, new ErrorTag("fail"), "fail");
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult(rpcError))).when(rpc)
             .invokeRpc(eq(Get.QNAME), any());
-        final var stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext);
+        final var stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, modelContext);
         assertEquals(Set.of(), stateSchemas.getAvailableYangSchemasQNames());
     }
 
@@ -158,7 +158,7 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest {
             try {
                 when(interruptedFuture.get()).thenThrow(new InterruptedException("interrupted"));
                 doReturn(interruptedFuture).when(rpc).invokeRpc(eq(Get.QNAME), any());
-                NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext);
+                NetconfStateSchemas.create(rpc, CAPS, deviceId, modelContext);
             } catch (final InterruptedException | ExecutionException e) {
                 LOG.info("Operation failed.", e);
             }
index 1db8fa459fe2a9f8dafa80c94cbf0f531857751c..aabe79a73073d47b8748f33e1080eead2f0ac037 100644 (file)
@@ -35,7 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificate;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificateBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificateKey;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -53,12 +53,12 @@ public class DefaultSslHandlerFactoryProviderTest {
     @Mock
     private DataBroker dataBroker;
     @Mock
-    private ListenerRegistration<?> listenerRegistration;
+    private Registration listenerRegistration;
 
     @Before
     public void setUp() {
         doReturn(listenerRegistration).when(dataBroker)
-            .registerDataTreeChangeListener(any(DataTreeIdentifier.class), any(DefaultSslHandlerFactoryProvider.class));
+            .registerTreeChangeListener(any(DataTreeIdentifier.class), any(DefaultSslHandlerFactoryProvider.class));
     }
 
     @Test
@@ -76,13 +76,13 @@ public class DefaultSslHandlerFactoryProviderTest {
         doReturn(keystoreObjectModification).when(dataTreeModification).getRootNode();
 
         DataObjectModification<?> childObjectModification = mock(DataObjectModification.class);
-        doReturn(List.of(childObjectModification)).when(keystoreObjectModification).getModifiedChildren();
-        doReturn(PrivateKey.class).when(childObjectModification).getDataType();
+        doReturn(List.of(childObjectModification)).when(keystoreObjectModification).modifiedChildren();
+        doReturn(PrivateKey.class).when(childObjectModification).dataType();
 
-        doReturn(DataObjectModification.ModificationType.WRITE).when(childObjectModification).getModificationType();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(childObjectModification).modificationType();
 
         final var privateKey = getPrivateKey();
-        doReturn(privateKey).when(childObjectModification).getDataAfter();
+        doReturn(privateKey).when(childObjectModification).dataAfter();
 
         final var keystoreAdapter = new DefaultSslHandlerFactoryProvider(dataBroker);
         keystoreAdapter.onDataTreeChanged(List.of(dataTreeModification));
@@ -100,13 +100,13 @@ public class DefaultSslHandlerFactoryProviderTest {
         doReturn(keystoreObjectModification1).when(dataTreeModification1).getRootNode();
 
         DataObjectModification<?> childObjectModification1 = mock(DataObjectModification.class);
-        doReturn(List.of(childObjectModification1)).when(keystoreObjectModification1).getModifiedChildren();
-        doReturn(PrivateKey.class).when(childObjectModification1).getDataType();
+        doReturn(List.of(childObjectModification1)).when(keystoreObjectModification1).modifiedChildren();
+        doReturn(PrivateKey.class).when(childObjectModification1).dataType();
 
-        doReturn(DataObjectModification.ModificationType.WRITE).when(childObjectModification1).getModificationType();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(childObjectModification1).modificationType();
 
         final var privateKey = getPrivateKey();
-        doReturn(privateKey).when(childObjectModification1).getDataAfter();
+        doReturn(privateKey).when(childObjectModification1).dataAfter();
 
         // Prepare TrustedCertificate configuration
         DataTreeModification<Keystore> dataTreeModification2 = mock(DataTreeModification.class);
@@ -114,14 +114,14 @@ public class DefaultSslHandlerFactoryProviderTest {
         doReturn(keystoreObjectModification2).when(dataTreeModification2).getRootNode();
 
         DataObjectModification<?> childObjectModification2 = mock(DataObjectModification.class);
-        doReturn(List.of(childObjectModification2)).when(keystoreObjectModification2).getModifiedChildren();
-        doReturn(TrustedCertificate.class).when(childObjectModification2).getDataType();
+        doReturn(List.of(childObjectModification2)).when(keystoreObjectModification2).modifiedChildren();
+        doReturn(TrustedCertificate.class).when(childObjectModification2).dataType();
 
         doReturn(DataObjectModification.ModificationType.WRITE)
-            .when(childObjectModification2).getModificationType();
+            .when(childObjectModification2).modificationType();
 
         final var trustedCertificate = geTrustedCertificate();
-        doReturn(trustedCertificate).when(childObjectModification2).getDataAfter();
+        doReturn(trustedCertificate).when(childObjectModification2).dataAfter();
 
         // Apply configurations
         final var keystoreAdapter = new DefaultSslHandlerFactoryProvider(dataBroker);
index 59f61e842e81557065d4c7a987151e3ba70172c0..df1398fcb51f50edbbfa9375cec2a341cb86cb5b 100644 (file)
@@ -46,7 +46,7 @@ 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.netconf.base._1._0.rev110601.EditConfig;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Get;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.GetConfig;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Lock;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.get.config.output.Data;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscription;
@@ -164,7 +164,7 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest {
     @BeforeClass
     public static void beforeClass() {
         PARTIAL_SCHEMA = BindingRuntimeHelpers.createEffectiveModel(NetconfState.class);
-        SCHEMA = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class, NetconfState.class,
+        SCHEMA = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class, NetconfState.class,
             NetconfConfigChange.class);
         ACTION_SCHEMA = YangParserTestUtils.parseYangResources(NetconfMessageTransformerTest.class,
             "/schemas/example-server-farm.yang","/schemas/example-server-farm-2.yang",
@@ -421,7 +421,7 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest {
                 .node(NetconfState.QNAME).node(Schemas.QNAME).node(Schema.QNAME)
                 .nodeWithKey(Schema.QNAME, keys).build();
         final var editConfigStructure =
-                createEditConfigStructure(BASE_SCHEMAS.baseSchemaWithNotifications().getEffectiveModelContext(), id,
+                createEditConfigStructure(BASE_SCHEMAS.baseSchemaWithNotifications().modelContext(), id,
                     Optional.empty(), Optional.ofNullable(schemaNode));
 
         final var target = NetconfBaseOps.getTargetNode(NETCONF_CANDIDATE_NODEID);
@@ -1173,7 +1173,7 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest {
         YangInstanceIdentifier yangInstanceIdentifier =
                 YangInstanceIdentifier.builder().append(nodeIdentifiers).build();
         DOMDataTreeIdentifier domDataTreeIdentifier =
-                new DOMDataTreeIdentifier(org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION,
+                DOMDataTreeIdentifier.of(org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION,
                         yangInstanceIdentifier);
         return domDataTreeIdentifier;
     }
index 1b9ffa76bed61e04051cd08dbc450fed672d5d08..a2ceb77bcc7d280ab043189e0c2cace1d680483e 100644 (file)
@@ -95,7 +95,7 @@ public class SchemalessRpcStructureTransformerTest {
 
     @Test
     public void testCreateEditConfigStructure() throws Exception {
-        DOMSourceAnyxmlNode data = Builders.anyXmlBuilder()
+        final var data = Builders.anyXmlBuilder()
                 .withNodeIdentifier(createNodeId(path.getLastPathArgument().getNodeType().getLocalName()))
                 .withValue(source)
                 .build();
index 1b08d398d6468978651a208cd1e2ea2b9acd1d10..e590e80a8010a2a85ef91aeab494f1b09b582287 100644 (file)
@@ -31,7 +31,7 @@ import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices.Rpcs;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -61,7 +61,7 @@ public class MountInstanceTest {
 
     @BeforeClass
     public static void suiteSetUp() throws Exception {
-        SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class);
+        SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class);
     }
 
     @Before
index d992e472f7bfe5dc7f33921566ad070d8fc3a95f..7153f05f5d1f7b8accdb36a349f48b2a29207c4d 100644 (file)
@@ -40,7 +40,7 @@ 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.netconf.base._1._0.rev110601.EditConfig;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Get;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.GetConfig;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Lock;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Unlock;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
@@ -61,7 +61,7 @@ public class NetconfDataTreeServiceImplTest extends AbstractTestModelTest {
     public void setUp() {
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(rpcService).invokeNetconf(any(), any());
         netconService = getNetconService();
-        final var model = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class, NetconfState.class);
+        final var model = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class, NetconfState.class);
         netconfMessageTransformer = new NetconfMessageTransformer(MountPointContext.of(model), true,
                 BASE_SCHEMAS.baseSchema());
     }
index b66e3560c66ea0c75cd4e035161645de1ee04658..e2aadcf9caafd78184606e824578c8f05f8ed585 100644 (file)
@@ -39,7 +39,7 @@ import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadTransaction;
 import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadWriteTransaction;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Get;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.GetConfig;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netconf.monitoring.rev220718.NetconfTcp;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
@@ -55,7 +55,7 @@ public class NetconfDeviceDataBrokerTest {
 
     @BeforeClass
     public static void beforeClass() {
-        SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class, NetconfTcp.class);
+        SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class, NetconfTcp.class);
     }
 
     @AfterClass
@@ -100,8 +100,7 @@ public class NetconfDeviceDataBrokerTest {
 
     @Test
     public void testDOMFieldsExtensions() {
-        final NetconfDOMDataBrokerFieldsExtension fieldsExtension = dataBroker.getExtensions().getInstance(
-                NetconfDOMDataBrokerFieldsExtension.class);
+        final var fieldsExtension = dataBroker.extension(NetconfDOMDataBrokerFieldsExtension.class);
         assertNotNull(fieldsExtension);
 
         // read-only transaction
index 2d3fc9b6a583ec4fa78dac96181b523a875a5a19..3bf3973165b7ce21250303d6ea5d8283b4518711 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.netconf.client.mdsal.spi;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
@@ -20,7 +19,7 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
@@ -39,7 +38,7 @@ class NetconfDeviceNotificationServiceTest {
     private DOMNotification notification2;
 
     private final NetconfDeviceNotificationService service = new NetconfDeviceNotificationService();
-    private ListenerRegistration<DOMNotificationListener> registration;
+    private Registration registration;
 
     @BeforeEach
     void beforeEach() throws Exception {
@@ -65,7 +64,6 @@ class NetconfDeviceNotificationServiceTest {
     @Test
     void testCloseRegistration() throws Exception {
         service.publishNotification(notification2);
-        assertEquals(listener2, registration.getInstance());
         registration.close();
         service.publishNotification(notification2);
         verify(listener2, times(1)).onNotification(notification2);
index 1d319e8bf55f3f0834e6d07d89b201f6cf0f518f..70d1e8ce71b7998c8273ba9bdb249f830cda4b2e 100644 (file)
@@ -39,7 +39,7 @@ import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceCommunicator;
 import org.opendaylight.netconf.client.mdsal.api.RpcTransformer;
 import org.opendaylight.netconf.client.mdsal.impl.NetconfMessageTransformUtil;
 import org.opendaylight.netconf.client.mdsal.impl.NetconfMessageTransformer;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
@@ -68,7 +68,7 @@ public class NetconfDeviceRpcTest extends AbstractBaseSchemasTest {
 
     @BeforeClass
     public static void beforeClass() {
-        SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class);
+        SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class);
     }
 
     @AfterClass
index 82f133635834505ba0d568b1663ee1aa39b475b5..9e7a0bf3ed0f24ef426b3c0a927821ef220276e7 100644 (file)
@@ -78,7 +78,7 @@ public class ReadWriteTxTest {
 
     @Test
     public void getIdentifier() throws Exception {
-        final ReadWriteTx<?> tx2 = new ReadWriteTx<>(null, null);
+        final ReadWriteTx<?> tx2 = new ReadWriteTx<>(delegateReadTx, delegateWriteTx);
         assertNotEquals(tx.getIdentifier(), tx2.getIdentifier());
     }
 }
index 3fd48f69c142377b8b1131cbdca8f47134c32c6a..0bb132992a289911922b49e9ec0c08b26cde1ffb 100644 (file)
@@ -13,6 +13,7 @@ import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.google.common.util.concurrent.FutureCallback;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -24,15 +25,15 @@ import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChainClosedException;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.common.Empty;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class TxChainTest {
     @Mock
     private DOMDataBroker broker;
     @Mock
-    private DOMTransactionChainListener listener;
+    private FutureCallback<Empty> listener;
     @Mock
     private DOMDataTreeReadTransaction readOnlyTx;
     @Mock
@@ -59,7 +60,8 @@ public class TxChainTest {
         when(writeOnlyTx1.addListener(any())).thenReturn(registration1);
         when(writeOnlyTx2.addListener(any())).thenReturn(registration2);
         when(writeOnlyTx3.addListener(any())).thenReturn(registration3);
-        chain = new TxChain(broker, listener);
+        chain = new TxChain(broker);
+        chain.addCallback(listener);
     }
 
     @Test
@@ -107,7 +109,7 @@ public class TxChainTest {
     @Test
     public void testCloseAfterFinished() {
         chain.close();
-        verify(listener).onTransactionChainSuccessful(chain);
+        verify(listener).onSuccess(Empty.value());
         assertThrows(DOMTransactionChainClosedException.class, chain::newReadOnlyTransaction);
     }
 
@@ -119,7 +121,7 @@ public class TxChainTest {
         final TransactionCommitFailedException cause = new TransactionCommitFailedException("fail");
         captor.getValue().onTransactionFailed(writeOnlyTx1, cause);
         verify(registration1).close();
-        verify(listener).onTransactionChainFailed(chain, writeOnlyTx1, cause);
+        verify(listener).onFailure(cause);
     }
 
     @Test
@@ -130,7 +132,7 @@ public class TxChainTest {
         writeTx.commit();
         captor.getValue().onTransactionSuccessful(writeOnlyTx1);
         verify(registration1).close();
-        verify(listener).onTransactionChainSuccessful(chain);
+        verify(listener).onSuccess(Empty.value());
     }
 
     @Test
@@ -146,7 +148,7 @@ public class TxChainTest {
     public void testMultiplePendingTransactions() {
         //create 1st tx
         final AbstractWriteTx writeTx1 = chain.newWriteOnlyTransaction();
-        final ArgumentCaptor<TxListener> captor1 = ArgumentCaptor.forClass(TxListener.class);
+        final var captor1 = ArgumentCaptor.forClass(TxListener.class);
         verify(writeOnlyTx1).addListener(captor1.capture());
         //submit 1st tx
         writeTx1.commit();
@@ -154,7 +156,7 @@ public class TxChainTest {
 
         //create 2nd tx
         final AbstractWriteTx writeTx2 = chain.newWriteOnlyTransaction();
-        final ArgumentCaptor<TxListener> captor2 = ArgumentCaptor.forClass(TxListener.class);
+        final var captor2 = ArgumentCaptor.forClass(TxListener.class);
         verify(writeTx2).addListener(captor2.capture());
         //submit 2nd tx
         writeTx2.commit();
@@ -162,7 +164,7 @@ public class TxChainTest {
 
         //create 3rd tx
         final AbstractWriteTx writeTx3 = chain.newWriteOnlyTransaction();
-        final ArgumentCaptor<TxListener> captor3 = ArgumentCaptor.forClass(TxListener.class);
+        final var captor3 = ArgumentCaptor.forClass(TxListener.class);
         verify(writeTx3).addListener(captor3.capture());
         //cancel 3rd tx
         writeTx3.cancel();
@@ -178,14 +180,14 @@ public class TxChainTest {
         verify(registration1).close();
         verify(registration2).close();
         verify(registration3).close();
-        verify(listener).onTransactionChainSuccessful(chain);
+        verify(listener).onSuccess(Empty.value());
     }
 
     @Test
     public void testMultiplePendingTransactionsFail() {
         //create 1st tx
         final AbstractWriteTx writeTx1 = chain.newWriteOnlyTransaction();
-        final ArgumentCaptor<TxListener> captor1 = ArgumentCaptor.forClass(TxListener.class);
+        final var captor1 = ArgumentCaptor.forClass(TxListener.class);
         verify(writeOnlyTx1).addListener(captor1.capture());
         //submit 1st tx
         writeTx1.commit();
@@ -193,7 +195,7 @@ public class TxChainTest {
 
         //create 2nd tx
         final AbstractWriteTx writeTx2 = chain.newWriteOnlyTransaction();
-        final ArgumentCaptor<TxListener> captor2 = ArgumentCaptor.forClass(TxListener.class);
+        final var captor2 = ArgumentCaptor.forClass(TxListener.class);
         verify(writeTx2).addListener(captor2.capture());
         //submit 2nd tx
         writeTx2.commit();
@@ -201,7 +203,7 @@ public class TxChainTest {
 
         //create 3rd tx
         final AbstractWriteTx writeTx3 = chain.newWriteOnlyTransaction();
-        final ArgumentCaptor<TxListener> captor3 = ArgumentCaptor.forClass(TxListener.class);
+        final var captor3 = ArgumentCaptor.forClass(TxListener.class);
         verify(writeTx3).addListener(captor3.capture());
 
         chain.close();
@@ -218,8 +220,8 @@ public class TxChainTest {
         verify(registration1).close();
         verify(registration2).close();
         verify(registration3).close();
-        verify(listener).onTransactionChainFailed(chain, writeOnlyTx1, cause1);
+        verify(listener).onFailure(cause1);
         // 1 transaction failed, onTransactionChainSuccessful must not be called
-        verify(listener, never()).onTransactionChainSuccessful(chain);
+        verify(listener, never()).onSuccess(any());
     }
 }
index e41231ba7781b88cdba7809c2675141dfe8d3b39..f066144953d243c78e00a2d37af78195f760a2bb 100644 (file)
@@ -33,8 +33,8 @@ final class ProxyMountPointContext implements Delegator<MountPointContext>, Moun
     }
 
     @Override
-    public EffectiveModelContext getEffectiveModelContext() {
-        return new ProxyEffectiveModelContext(delegate.getEffectiveModelContext());
+    public EffectiveModelContext modelContext() {
+        return new ProxyEffectiveModelContext(delegate.modelContext());
     }
 
     @Override
index a5e33ef82cfd54fb98b91e56d0f8afdf4246a422..9008e06e31971a68fde1bd2159e7be14f845ae99 100644 (file)
@@ -14,10 +14,10 @@ import javax.xml.transform.dom.DOMResult;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.netconf.api.xml.XmlUtil;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.$YangModuleInfoImpl;
 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.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.YangModuleInfoImpl;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
@@ -31,7 +31,7 @@ import org.xmlunit.diff.ElementSelectors;
 public class NormalizedDataUtilTest {
     @Test
     public void testWriteNormalizedNode() throws Exception {
-        final var context = BindingRuntimeHelpers.createEffectiveModel(List.of($YangModuleInfoImpl.getInstance()));
+        final var context = BindingRuntimeHelpers.createEffectiveModel(List.of(YangModuleInfoImpl.getInstance()));
         final var result = new DOMResult(XmlUtil.newDocument());
         NormalizedDataUtil.writeNormalizedNode(Builders.containerBuilder()
             .withNodeIdentifier(new NodeIdentifier(Sessions.QNAME))
index 5bad78aa2a826405e4cc8a53538b97be05e26c55..defedda8327ba95dcb881847a3bcf69ca575cfa2 100644 (file)
@@ -25,7 +25,14 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
  * The {@code <edit-config>} operation is extended according its attributes (merge, replace, create, delete, remove), as
  * per RFC6241.
  */
-public interface NetconfDataTreeService extends DOMService {
+public interface NetconfDataTreeService extends DOMService<NetconfDataTreeService, NetconfDataTreeService.Extension> {
+    /**
+     * Type capture of a {@link DOMService.Extension} applicable to {@link NetconfDataTreeService} implementations.
+     */
+    interface Extension extends DOMService.Extension<NetconfDataTreeService, Extension> {
+        // Marker interface
+    }
+
     /**
      * Return device identifier.
      *
index 846e5f0c48ff79942842d154f7093eec1750e6f9..76e6a816ad4ca1f2a69ca90ba7711b400635cdaa 100644 (file)
@@ -8,13 +8,12 @@
 package org.opendaylight.netconf.dom.api.tx;
 
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.Extension;
 
 /**
  * DOM data broker extension with an option to read only selected fields under parent data node.
  */
-public interface NetconfDOMDataBrokerFieldsExtension extends DOMDataBrokerExtension {
+public interface NetconfDOMDataBrokerFieldsExtension extends Extension {
     /**
      * Create a new read-only transaction with an option to read only selected fields from target data node.
      *
@@ -32,9 +31,7 @@ public interface NetconfDOMDataBrokerFieldsExtension extends DOMDataBrokerExtens
     /**
      * Create a new transaction chain with an option to read only selected fields from target data node.
      *
-     * @param listener Transaction chain event listener.
      * @return A new transaction chain.
-     * @throws NullPointerException if {@code listener} is null
      */
-    @NonNull NetconfDOMFieldsTransactionChain createTransactionChain(DOMTransactionChainListener listener);
+    @NonNull NetconfDOMFieldsTransactionChain createTransactionChain();
 }
index 7bb366c124a12ed3d06a2f92a3fce4135ae792bb..00922910e876178917e3133045ddb394c4e6166b 100644 (file)
@@ -15,31 +15,29 @@ import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.netconf.server.api.monitoring.CapabilityListener;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
 
 // Non-final for mocking
 @SuppressWarnings("checkstyle:FinalClass")
-public class CurrentSchemaContext implements EffectiveModelContextListener, AutoCloseable {
+public class CurrentSchemaContext implements AutoCloseable {
     private final AtomicReference<EffectiveModelContext> currentContext = new AtomicReference<>();
     private final Set<CapabilityListener> listeners = Collections.synchronizedSet(new HashSet<>());
-    private final SchemaSourceProvider<YangTextSchemaSource> rootSchemaSourceProvider;
+    private final YangTextSourceExtension yangTextSourceExtension;
 
     private Registration schemaContextListenerListenerRegistration;
 
-    private CurrentSchemaContext(final SchemaSourceProvider<YangTextSchemaSource> rootSchemaSourceProvider) {
-        this.rootSchemaSourceProvider = rootSchemaSourceProvider;
+    private CurrentSchemaContext(final YangTextSourceExtension yangTextSourceExtension) {
+        this.yangTextSourceExtension = yangTextSourceExtension;
     }
 
     // keep spotbugs from complaining about overridable method in constructor
     public static CurrentSchemaContext create(final DOMSchemaService schemaService,
-                         final SchemaSourceProvider<YangTextSchemaSource> rootSchemaSourceProvider) {
-        var context = new CurrentSchemaContext(rootSchemaSourceProvider);
-        final Registration registration = schemaService.registerSchemaContextListener(context);
+            final YangTextSourceExtension yangTextSourceExtension) {
+        var context = new CurrentSchemaContext(yangTextSourceExtension);
+        final var registration = schemaService.registerSchemaContextListener(context::onModelContextUpdated);
         context.setRegistration(registration);
         return context;
     }
@@ -54,12 +52,11 @@ public class CurrentSchemaContext implements EffectiveModelContextListener, Auto
         return ret;
     }
 
-    @Override
-    public void onModelContextUpdated(final EffectiveModelContext schemaContext) {
+    private void onModelContextUpdated(final EffectiveModelContext schemaContext) {
         currentContext.set(schemaContext);
         // FIXME is notifying all the listeners from this callback wise ?
         final var addedCaps = MdsalNetconfOperationServiceFactory.transformCapabilities(schemaContext,
-            rootSchemaSourceProvider);
+            yangTextSourceExtension);
         for (var listener : listeners) {
             listener.onCapabilitiesChanged(addedCaps, Set.of());
         }
@@ -74,7 +71,7 @@ public class CurrentSchemaContext implements EffectiveModelContextListener, Auto
 
     public Registration registerCapabilityListener(final CapabilityListener listener) {
         listener.onCapabilitiesChanged(MdsalNetconfOperationServiceFactory.transformCapabilities(currentContext.get(),
-                rootSchemaSourceProvider), Set.of());
+            yangTextSourceExtension), Set.of());
         listeners.add(listener);
         return () -> listeners.remove(listener);
     }
index e7cfca516550937e42cd662e3833d534b0155a28..bda397a5b714270d194a406e8f4e489daf4a138c 100644 (file)
@@ -11,21 +11,20 @@ import com.google.common.annotations.Beta;
 import com.google.common.util.concurrent.FluentFuture;
 import java.io.Serial;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.Extension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
-import org.opendaylight.mdsal.dom.api.DOMServiceExtension;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.OperationFailedException;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 
 /**
- * A {@link DOMServiceExtension} which allows users to provide Validate capability for {@link DOMDataBroker}.
+ * A {@link DOMDataBroker} {@link Extension} which allows users to provide Validate capability.
  *
  * <p> See <a href="https://tools.ietf.org/html/rfc4741#section-8.6">RFC4741 section 8.6</a> for details.
  */
 @Beta
-public interface DOMDataTransactionValidator extends DOMDataBrokerExtension {
+public interface DOMDataTransactionValidator extends Extension {
     /**
      * Validates state of the data tree associated with the provided {@link DOMDataTreeWriteTransaction}.
      *
index 75bcf3ed8045772bc51639310970628face036fa..2347901618b4acc4e0e5f0907201894e4ac3170d 100644 (file)
@@ -17,7 +17,7 @@ import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.netconf.api.CapabilityURN;
 import org.opendaylight.netconf.server.api.monitoring.BasicCapability;
 import org.opendaylight.netconf.server.api.monitoring.Capability;
@@ -31,9 +31,7 @@ import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.ModuleLike;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -50,7 +48,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati
     private final DOMRpcService rpcService;
 
     private final CurrentSchemaContext currentSchemaContext;
-    private final SchemaSourceProvider<YangTextSchemaSource> rootSchemaSourceProviderDependency;
+    private final YangTextSourceExtension yangTextSourceExtension;
     private final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener;
 
     @Activate
@@ -62,10 +60,8 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati
         this.rpcService = requireNonNull(rpcService);
         this.netconfOperationServiceFactoryListener = requireNonNull(netconfOperationServiceFactoryListener);
 
-        rootSchemaSourceProviderDependency = schemaService.getExtensions()
-                .getInstance(DOMYangTextSourceProvider.class);
-        currentSchemaContext = CurrentSchemaContext.create(requireNonNull(schemaService),
-                rootSchemaSourceProviderDependency);
+        yangTextSourceExtension = schemaService.extension(YangTextSourceExtension.class);
+        currentSchemaContext = CurrentSchemaContext.create(requireNonNull(schemaService), yangTextSourceExtension);
         netconfOperationServiceFactoryListener.onAddNetconfOperationServiceFactory(this);
     }
 
@@ -84,12 +80,12 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati
     @Override
     public Set<Capability> getCapabilities() {
         // FIXME: cache returned set
-        return transformCapabilities(currentSchemaContext.getCurrentContext(), rootSchemaSourceProviderDependency);
+        return transformCapabilities(currentSchemaContext.getCurrentContext(), yangTextSourceExtension);
     }
 
     // FIXME: ImmutableSet
     static Set<Capability> transformCapabilities(final EffectiveModelContext currentContext,
-            final SchemaSourceProvider<YangTextSchemaSource> rootSchemaSourceProviderDependency) {
+            final YangTextSourceExtension rootSchemaSourceProviderDependency) {
         final var capabilities = new HashSet<Capability>();
 
         // Added by netconf-impl by default
@@ -107,7 +103,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati
     }
 
     private static Optional<YangModuleCapability> moduleToCapability(final ModuleLike module,
-            final SchemaSourceProvider<YangTextSchemaSource> rootSchemaSourceProviderDependency) {
+            final YangTextSourceExtension yangTextSourceExtension) {
         final String moduleNamespace = module.getNamespace().toString();
         final String moduleName = module.getName();
         final String revision = module.getRevision().map(Revision::toString).orElse(null);
@@ -115,7 +111,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati
 
         String source;
         try {
-            source = rootSchemaSourceProviderDependency.getSource(moduleSourceIdentifier).get().read();
+            source = yangTextSourceExtension.getYangTexttSource(moduleSourceIdentifier).get().read();
         } catch (ExecutionException | InterruptedException | IOException e) {
             LOG.warn("Ignoring source for module {}. Unable to read content", moduleSourceIdentifier, e);
             source = null;
@@ -133,7 +129,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati
     @Override
     public Registration registerCapabilityListener(final CapabilityListener listener) {
         // Advertise validate capability only if DOMDataBroker provides DOMDataTransactionValidator
-        if (dataBroker.getExtensions().get(DOMDataTransactionValidator.class) != null) {
+        if (dataBroker.extension(DOMDataTransactionValidator.class) != null) {
             // FIXME: support VALIDATE_1_1 as well!
             listener.onCapabilitiesChanged(Set.of(VALIDATE_CAPABILITY), Set.of());
         }
index 11bfb7b2a500abc6ee22f8e889ee895bdfb0d1ce..2ea038e2b5cfe18772eefe5c2cf0cb38e43d2f09 100644 (file)
@@ -37,7 +37,7 @@ public final class TransactionProvider implements AutoCloseable {
     public TransactionProvider(final DOMDataBroker dataBroker, final SessionIdType sessionId) {
         this.dataBroker = dataBroker;
         this.sessionId = sessionId;
-        transactionValidator = dataBroker.getExtensions().getInstance(DOMDataTransactionValidator.class);
+        transactionValidator = dataBroker.extension(DOMDataTransactionValidator.class);
     }
 
     @Override
index 92e0f34419a9c978126d7f37ebef70f5e10e72b6..b0211e473faf7da13a665b41c7ab1eb8e6c25b90 100644 (file)
@@ -9,10 +9,9 @@ package org.opendaylight.netconf.server.mdsal.notifications;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import java.util.Collection;
+import java.util.List;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
@@ -25,7 +24,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChangeBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.ChangedByBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.changed.by.server.or.user.ServerBuilder;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Empty;
 import org.osgi.service.component.annotations.Activate;
@@ -43,15 +42,15 @@ public final class CapabilityChangeNotificationProducer implements DataTreeChang
     private static final Logger LOG = LoggerFactory.getLogger(CapabilityChangeNotificationProducer.class);
 
     private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
-    private final ListenerRegistration<?> capabilityChangeListenerRegistration;
+    private final Registration capabilityChangeListenerRegistration;
 
     @Activate
     public CapabilityChangeNotificationProducer(
             @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager,
             @Reference final DataBroker dataBroker) {
         baseNotificationPublisherRegistration = notifManager.registerBaseNotificationPublisher();
-        capabilityChangeListenerRegistration = dataBroker.registerDataTreeChangeListener(
-                DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
+        capabilityChangeListenerRegistration = dataBroker.registerTreeChangeListener(
+                DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL,
                     InstanceIdentifier.builder(NetconfState.class).child(Capabilities.class).build()), this);
     }
 
@@ -67,14 +66,14 @@ public final class CapabilityChangeNotificationProducer implements DataTreeChang
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<Capabilities>> changes) {
-        for (DataTreeModification<Capabilities> change : changes) {
-            final DataObjectModification<Capabilities> rootNode = change.getRootNode();
-            final DataObjectModification.ModificationType modificationType = rootNode.getModificationType();
+    public void onDataTreeChanged(final List<DataTreeModification<Capabilities>> changes) {
+        for (var change : changes) {
+            final var rootNode = change.getRootNode();
+            final var modificationType = rootNode.modificationType();
             switch (modificationType) {
                 case WRITE: {
-                    final Capabilities dataAfter = rootNode.getDataAfter();
-                    final Capabilities dataBefore = rootNode.getDataBefore();
+                    final Capabilities dataAfter = rootNode.dataAfter();
+                    final Capabilities dataBefore = rootNode.dataBefore();
                     final Set<Uri> before = dataBefore != null ? ImmutableSet.copyOf(dataBefore.getCapability())
                         : Set.of();
                     final Set<Uri> after = dataAfter != null ? ImmutableSet.copyOf(dataAfter.getCapability())
@@ -85,7 +84,7 @@ public final class CapabilityChangeNotificationProducer implements DataTreeChang
                     break;
                 }
                 case DELETE: {
-                    final Capabilities dataBeforeDelete = rootNode.getDataBefore();
+                    final Capabilities dataBeforeDelete = rootNode.dataBefore();
                     if (dataBeforeDelete != null) {
                         final Set<Uri> removed = ImmutableSet.copyOf(dataBeforeDelete.getCapability());
                         publishNotification(Set.of(), removed);
index 3df435c9c65cfae0ae2b3e3048b3cab596f91225..1d45d31fc4e8f7f6f754b9e8ae145dff00d16dd0 100644 (file)
@@ -33,15 +33,15 @@ import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
 import org.w3c.dom.Document;
 
 final class NotificationsTransformUtil {
-    private final EffectiveModelContext schemaContext;
+    private final EffectiveModelContext modelContext;
     private final BindingNormalizedNodeSerializer serializer;
 
     NotificationsTransformUtil(final YangParserFactory parserFactory, final BindingRuntimeGenerator generator,
             final BindingDOMCodecFactory codecFactory) throws YangParserException {
         final var ctx = BindingRuntimeHelpers.createRuntimeContext(parserFactory, generator,
             Netconf.class, NetconfConfigChange.class, YangLibraryChange.class, YangLibraryUpdate.class);
-        schemaContext = ctx.getEffectiveModelContext();
-        verify(schemaContext.getOperations().stream()
+        modelContext = ctx.modelContext();
+        verify(modelContext.getOperations().stream()
                 .filter(input -> input.getQName().getLocalName().equals(CreateSubscription.CREATE_SUBSCRIPTION))
                 .findFirst()
                 .isPresent());
@@ -56,7 +56,7 @@ final class NotificationsTransformUtil {
         final var containerNode = serializer.toNormalizedNodeNotification(notification);
         final var result = new DOMResult(XmlUtil.newDocument());
         try {
-            NormalizedDataUtil.writeNormalizedNode(containerNode, result, schemaContext, path);
+            NormalizedDataUtil.writeNormalizedNode(containerNode, result, modelContext, path);
         } catch (final XMLStreamException | IOException e) {
             throw new IllegalStateException("Unable to serialize " + notification, e);
         }
index 7165729ff72dabc336eabcb08fe669649931619d..f2081ecfaa418d44561471bce0ac600da9deb8e6 100644 (file)
@@ -7,9 +7,8 @@
  */
 package org.opendaylight.netconf.server.mdsal.notifications;
 
-import java.util.Collection;
+import java.util.List;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
@@ -22,7 +21,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon
 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.NetconfSessionEndBuilder;
 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.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -39,7 +38,7 @@ public final class SessionNotificationProducer implements DataTreeChangeListener
     private static final Logger LOG = LoggerFactory.getLogger(SessionNotificationProducer.class);
 
     private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
-    private final ListenerRegistration<?> sessionListenerRegistration;
+    private final Registration sessionListenerRegistration;
 
     @Activate
     public SessionNotificationProducer(
@@ -47,7 +46,7 @@ public final class SessionNotificationProducer implements DataTreeChangeListener
             @Reference final DataBroker dataBroker) {
         baseNotificationPublisherRegistration = notifManager.registerBaseNotificationPublisher();
         sessionListenerRegistration = dataBroker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
+            DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL,
                 InstanceIdentifier.builder(NetconfState.class).child(Sessions.class).child(Session.class).build()),
             this);
     }
@@ -64,19 +63,19 @@ public final class SessionNotificationProducer implements DataTreeChangeListener
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<Session>> changes) {
-        for (DataTreeModification<Session> change : changes) {
-            final DataObjectModification<Session> rootNode = change.getRootNode();
-            final DataObjectModification.ModificationType modificationType = rootNode.getModificationType();
+    public void onDataTreeChanged(final List<DataTreeModification<Session>> changes) {
+        for (var change : changes) {
+            final var rootNode = change.getRootNode();
+            final var modificationType = rootNode.modificationType();
             switch (modificationType) {
                 case WRITE:
-                    final Session created = rootNode.getDataAfter();
-                    if (created != null && rootNode.getDataBefore() == null) {
+                    final Session created = rootNode.dataAfter();
+                    if (created != null && rootNode.dataBefore() == null) {
                         publishStartedSession(created);
                     }
                     break;
                 case DELETE:
-                    final Session removed = rootNode.getDataBefore();
+                    final Session removed = rootNode.dataBefore();
                     if (removed != null) {
                         publishEndedSession(removed);
                     }
index 35b1e5fc33c10bb7fbdf87245f0e7da87bf2f6e3..198acf82e7ff142eb2704221569fa364f7cd282a 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.netconf.server.mdsal.notifications;
 
-import java.util.Collection;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
-import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netconf.server.api.notifications.NetconfNotificationCollector;
 import org.opendaylight.netconf.server.api.notifications.YangLibraryPublisherRegistration;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryChangeBuilder;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -33,8 +31,8 @@ import org.osgi.service.component.annotations.Reference;
  */
 @Component(service = { })
 @Deprecated(forRemoval = true)
-public final class YangLibraryNotificationProducer implements DataTreeChangeListener<ModulesState>, AutoCloseable {
-    private final ListenerRegistration<?> yangLibraryChangeListenerRegistration;
+public final class YangLibraryNotificationProducer implements DataListener<ModulesState>, AutoCloseable {
+    private final Registration yangLibraryChangeListenerRegistration;
     private final YangLibraryPublisherRegistration yangLibraryPublisherRegistration;
 
     @Activate
@@ -42,8 +40,8 @@ public final class YangLibraryNotificationProducer implements DataTreeChangeList
             @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager,
             @Reference final DataBroker dataBroker) {
         yangLibraryPublisherRegistration = notifManager.registerYangLibraryPublisher();
-        yangLibraryChangeListenerRegistration = dataBroker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ModulesState.class)),
+        yangLibraryChangeListenerRegistration = dataBroker.registerDataListener(
+            DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ModulesState.class)),
             this);
     }
 
@@ -59,14 +57,11 @@ public final class YangLibraryNotificationProducer implements DataTreeChangeList
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<ModulesState>> changes) {
-        for (DataTreeModification<ModulesState> change : changes) {
-            final ModulesState dataAfter = change.getRootNode().getDataAfter();
-            if (dataAfter != null) {
-                yangLibraryPublisherRegistration.onYangLibraryChange(new YangLibraryChangeBuilder()
-                    .setModuleSetId(dataAfter.getModuleSetId())
-                    .build());
-            }
+    public void dataChangedTo(final ModulesState data) {
+        if (data != null) {
+            yangLibraryPublisherRegistration.onYangLibraryChange(new YangLibraryChangeBuilder()
+                .setModuleSetId(data.getModuleSetId())
+                .build());
         }
     }
 }
index ee61c9a9401bcb540e0a4e91b13f744bd3c26975..2125c862399478aed03ce47e7c48b68ac0bb8b5c 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.netconf.server.mdsal.notifications;
 
-import java.util.Collection;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
-import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netconf.server.api.notifications.NetconfNotificationCollector;
 import org.opendaylight.netconf.server.api.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.YangLibraryUpdateBuilder;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -31,8 +29,8 @@ import org.osgi.service.component.annotations.Reference;
  */
 @Component(service = { })
 public final class YangLibraryNotificationProducerRFC8525
-        implements DataTreeChangeListener<YangLibrary>, AutoCloseable {
-    private final ListenerRegistration<?> yangLibraryChangeListenerRegistration;
+        implements DataListener<YangLibrary>, AutoCloseable {
+    private final Registration yangLibraryChangeListenerRegistration;
     private final YangLibraryPublisherRegistration yangLibraryPublisherRegistration;
 
     @Activate
@@ -40,8 +38,8 @@ public final class YangLibraryNotificationProducerRFC8525
             @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager,
             @Reference final DataBroker dataBroker) {
         yangLibraryPublisherRegistration = notifManager.registerYangLibraryPublisher();
-        yangLibraryChangeListenerRegistration = dataBroker.registerDataTreeChangeListener(
-            DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(YangLibrary.class)),
+        yangLibraryChangeListenerRegistration = dataBroker.registerDataListener(
+            DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(YangLibrary.class)),
             this);
     }
 
@@ -57,14 +55,11 @@ public final class YangLibraryNotificationProducerRFC8525
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeModification<YangLibrary>> changes) {
-        for (DataTreeModification<YangLibrary> change : changes) {
-            final YangLibrary dataAfter = change.getRootNode().getDataAfter();
-            if (dataAfter != null) {
-                yangLibraryPublisherRegistration.onYangLibraryUpdate(new YangLibraryUpdateBuilder()
-                    .setContentId(dataAfter.getContentId())
-                    .build());
-            }
+    public void dataChangedTo(final YangLibrary data) {
+        if (data != null) {
+            yangLibraryPublisherRegistration.onYangLibraryUpdate(new YangLibraryUpdateBuilder()
+                .setContentId(data.getContentId())
+                .build());
         }
     }
 }
index b21813e7a909b63a21b5f9d955080c7ffde71017..4ce0757f96cefb447e0a8eb76d2e240058aa51d5 100644 (file)
@@ -37,7 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.not
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChangeBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.ChangedByBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.changed.by.server.or.user.ServerBuilder;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Empty;
@@ -47,7 +47,7 @@ public class CapabilityChangeNotificationProducerTest {
     @Mock
     private BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
     @Mock
-    private ListenerRegistration<?> listenerRegistration;
+    private Registration listenerRegistration;
     @Mock
     private NetconfNotificationCollector netconfNotificationCollector;
     @Mock
@@ -57,7 +57,7 @@ public class CapabilityChangeNotificationProducerTest {
 
     @Before
     public void setUp() {
-        doReturn(listenerRegistration).when(dataBroker).registerDataTreeChangeListener(any(DataTreeIdentifier.class),
+        doReturn(listenerRegistration).when(dataBroker).registerTreeChangeListener(any(DataTreeIdentifier.class),
                 any(DataTreeChangeListener.class));
 
         doNothing().when(baseNotificationPublisherRegistration).onCapabilityChanged(any(NetconfCapabilityChange.class));
@@ -109,10 +109,10 @@ public class CapabilityChangeNotificationProducerTest {
                                       final NetconfCapabilityChange expectedChange) {
         final DataTreeModification<Capabilities> treeChange2 = mock(DataTreeModification.class);
         final DataObjectModification<Capabilities> objectChange2 = mock(DataObjectModification.class);
-        doReturn(modificationType).when(objectChange2).getModificationType();
+        doReturn(modificationType).when(objectChange2).modificationType();
         doReturn(objectChange2).when(treeChange2).getRootNode();
-        doReturn(originalCapabilities).when(objectChange2).getDataBefore();
-        doReturn(updatedCapabilities).when(objectChange2).getDataAfter();
+        doReturn(originalCapabilities).when(objectChange2).dataBefore();
+        doReturn(updatedCapabilities).when(objectChange2).dataAfter();
         capabilityChangeNotificationProducer.onDataTreeChanged(List.of(treeChange2));
         verify(baseNotificationPublisherRegistration).onCapabilityChanged(expectedChange);
     }
index aa639b0f32a974f80641271c4986835084b6e548..8b273e951f49b75a203f3fe23c38eb746535e79c 100644 (file)
@@ -89,9 +89,9 @@ public class SessionNotificationProducerTest {
         final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
         final Session sessionBefore = createSessionWithInRpcCount(Uint32.ONE, Uint32.ZERO);
         final Session sessionAfter = createSessionWithInRpcCount(Uint32.ONE, Uint32.ONE);
-        doReturn(sessionBefore).when(changeObject).getDataBefore();
-        doReturn(sessionAfter).when(changeObject).getDataAfter();
-        doReturn(ModificationType.WRITE).when(changeObject).getModificationType();
+        doReturn(sessionBefore).when(changeObject).dataBefore();
+        doReturn(sessionAfter).when(changeObject).dataAfter();
+        doReturn(ModificationType.WRITE).when(changeObject).modificationType();
         doReturn(changeObject).when(treeChange).getRootNode();
         publisher.onDataTreeChanged(List.of(treeChange));
         //session didn't start, only stats changed. No notification should be produced
@@ -132,16 +132,16 @@ public class SessionNotificationProducerTest {
         final DataObjectModification<Session> changeObject = mock(DataObjectModification.class);
         switch (type) {
             case WRITE:
-                doReturn(null).when(changeObject).getDataBefore();
-                doReturn(session).when(changeObject).getDataAfter();
+                doReturn(null).when(changeObject).dataBefore();
+                doReturn(session).when(changeObject).dataAfter();
                 break;
             case DELETE:
-                doReturn(session).when(changeObject).getDataBefore();
+                doReturn(session).when(changeObject).dataBefore();
                 break;
             default:
                 LOG.debug("Received intentionally unhandled type: {}.", type);
         }
-        doReturn(type).when(changeObject).getModificationType();
+        doReturn(type).when(changeObject).modificationType();
         doReturn(changeObject).when(treeChange).getRootNode();
         return treeChange;
     }
index b85183d0df17885f3ab0769d097300d2927caadd..ba060465205fea179d8206360839801c557f1009 100644 (file)
@@ -10,26 +10,20 @@ package org.opendaylight.netconf.server.mdsal.notifications;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
-import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 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.server.api.notifications.NetconfNotificationCollector;
 import org.opendaylight.netconf.server.api.notifications.YangLibraryPublisherRegistration;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesStateBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryChange;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryChangeBuilder;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class YangLibraryNotificationProducerTest {
@@ -40,7 +34,7 @@ public class YangLibraryNotificationProducerTest {
     @Mock
     private DataBroker dataBroker;
     @Mock
-    private ListenerRegistration<?> registration;
+    private Registration registration;
 
     private YangLibraryNotificationProducer yangLibraryNotificationProducer;
 
@@ -49,25 +43,19 @@ public class YangLibraryNotificationProducerTest {
         doNothing().when(yangLibraryPublisherRegistration).onYangLibraryChange(any(YangLibraryChange.class));
         doReturn(yangLibraryPublisherRegistration).when(netconfNotificationCollector)
                 .registerYangLibraryPublisher();
-        doReturn(registration).when(dataBroker).registerDataTreeChangeListener(any(), any());
+        doReturn(registration).when(dataBroker).registerDataListener(any(), any());
 
-        yangLibraryNotificationProducer = new YangLibraryNotificationProducer(netconfNotificationCollector,
-                dataBroker);
+        yangLibraryNotificationProducer = new YangLibraryNotificationProducer(netconfNotificationCollector, dataBroker);
     }
 
     @Test
     public void testOnDataTreeChanged() {
         final String moduleSetId = "1";
-        ModulesState modulesStateAfter = new ModulesStateBuilder().setModuleSetId(moduleSetId).build();
+        final var modulesStateAfter = new ModulesStateBuilder().setModuleSetId(moduleSetId).build();
 
-        final DataTreeModification<ModulesState> treeChange = mock(DataTreeModification.class);
-        final DataObjectModification<Capabilities> objectChange = mock(DataObjectModification.class);
-        doReturn(objectChange).when(treeChange).getRootNode();
-        doReturn(modulesStateAfter).when(objectChange).getDataAfter();
-
-        YangLibraryChange yangLibraryChange = new YangLibraryChangeBuilder().setModuleSetId(moduleSetId).build();
-        yangLibraryNotificationProducer.onDataTreeChanged(List.of(treeChange));
+        yangLibraryNotificationProducer.dataChangedTo(modulesStateAfter);
 
+        final var yangLibraryChange = new YangLibraryChangeBuilder().setModuleSetId(moduleSetId).build();
         verify(yangLibraryPublisherRegistration).onYangLibraryChange(yangLibraryChange);
     }
 }
\ No newline at end of file
index 2bb2efd19d1c3a9d499f07f13aa5cac81c2e79e1..d7adab0eca751d255855b03d9e630be8988eeadb 100644 (file)
@@ -10,25 +10,20 @@ package org.opendaylight.netconf.server.mdsal.notifications;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
-import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 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.server.api.notifications.NetconfNotificationCollector;
 import org.opendaylight.netconf.server.api.notifications.YangLibraryPublisherRegistration;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
-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.YangLibraryBuilder;
 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.Registration;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class YangLibraryNotificationProducerTestRFC8525 {
@@ -38,13 +33,16 @@ public class YangLibraryNotificationProducerTestRFC8525 {
     private NetconfNotificationCollector netconfNotificationCollector;
     @Mock
     private DataBroker dataBroker;
+    @Mock
+    private Registration registration;
 
     private YangLibraryNotificationProducerRFC8525 yangLibraryNotificationProducer;
 
     @Before
     public void setUp() {
-        doNothing().when(yangLibraryPublisherRegistration).onYangLibraryUpdate(any(YangLibraryUpdate.class));
+        doNothing().when(yangLibraryPublisherRegistration).onYangLibraryUpdate(any());
         doReturn(yangLibraryPublisherRegistration).when(netconfNotificationCollector).registerYangLibraryPublisher();
+        doReturn(registration).when(dataBroker).registerDataListener(any(), any());
 
         yangLibraryNotificationProducer = new YangLibraryNotificationProducerRFC8525(netconfNotificationCollector,
                 dataBroker);
@@ -53,16 +51,10 @@ public class YangLibraryNotificationProducerTestRFC8525 {
     @Test
     public void testOnDataTreeChanged() {
         final String contentId = "1";
-        YangLibrary yangLibraryAfter = new YangLibraryBuilder().setContentId(contentId).build();
 
-        final DataTreeModification<YangLibrary> treeChange = mock(DataTreeModification.class);
-        final DataObjectModification<Capabilities> objectChange = mock(DataObjectModification.class);
-        doReturn(objectChange).when(treeChange).getRootNode();
-        doReturn(yangLibraryAfter).when(objectChange).getDataAfter();
+        yangLibraryNotificationProducer.dataChangedTo(new YangLibraryBuilder().setContentId(contentId).build());
 
         YangLibraryUpdate yangLibraryUpdate = new YangLibraryUpdateBuilder().setContentId(contentId).build();
-        yangLibraryNotificationProducer.onDataTreeChanged(List.of(treeChange));
-
         verify(yangLibraryPublisherRegistration).onYangLibraryUpdate(yangLibraryUpdate);
     }
 }
\ No newline at end of file
index 44a96cf8f7eb4f4cbd8434db88a268fbab8aa3c7..c6b59d34dbb6e48859664f15aaf86c59c8860a2a 100644 (file)
@@ -50,7 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.re
 import org.opendaylight.yangtools.util.concurrent.SpecialExecutors;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -92,7 +92,7 @@ public abstract class AbstractNetconfOperationTest {
         final DOMStore configStore = InMemoryDOMDataStoreFactory.create("DOM-CFG", schemaService);
 
         currentSchemaContext = CurrentSchemaContext.create(schemaService,
-            sourceIdentifier -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(sourceIdentifier,
+            sourceIdentifier -> Futures.immediateFuture(new DelegatedYangTextSource(sourceIdentifier,
                 CharSource.wrap("module test"))));
 
         final var datastores = new EnumMap<LogicalDatastoreType, DOMStore>(LogicalDatastoreType.class);
index d3c9b684ab37b17bded58b3cc1319f11f48d852d..015991d2b89f63486585d1891a88a1b000cf8e36 100644 (file)
@@ -12,13 +12,16 @@ import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
 import com.google.common.collect.ImmutableMap;
-import java.math.BigDecimal;
-import java.math.BigInteger;
 import org.junit.Test;
 import org.opendaylight.netconf.api.xml.XmlElement;
 import org.opendaylight.netconf.api.xml.XmlUtil;
 import org.opendaylight.netconf.server.mdsal.CurrentSchemaContext;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
@@ -55,12 +58,12 @@ public class Bug8084 {
                 .put(QName.create(BASE, "id3"), Short.valueOf("-30000"))
                 .put(QName.create(BASE, "id4"), Integer.valueOf("-2000000000"))
                 .put(QName.create(BASE, "id5"), Long.valueOf("-2000000000000000"))
-                .put(QName.create(BASE, "id6"), Short.valueOf("9"))
-                .put(QName.create(BASE, "id7"), Integer.valueOf("30000"))
-                .put(QName.create(BASE, "id8"), Long.valueOf("2000000000"))
-                .put(QName.create(BASE, "id9"), BigInteger.valueOf(Long.parseLong("2000000000000000")))
+                .put(QName.create(BASE, "id6"), Uint8.valueOf(9))
+                .put(QName.create(BASE, "id7"), Uint16.valueOf(30000))
+                .put(QName.create(BASE, "id8"), Uint32.valueOf(2000000000))
+                .put(QName.create(BASE, "id9"), Uint64.valueOf(2000000000000000L))
                 .put(QName.create(BASE, "id10"), true)
-                .put(QName.create(BASE, "id11"), BigDecimal.valueOf(128.55))
+                .put(QName.create(BASE, "id11"), Decimal64.valueOf("128.55"))
                 .put(id12, idExpected)
                 .put(QName.create(BASE, "id13"),
                     QName.create("urn:opendaylight:mdsal:mapping:test", "2015-02-26", "foo"))
index 501b0051385795f2d69d78265d3c3090a66ebf12..77fc83c5c940d91c2df2864efbbd5d0e9d4819e3 100644 (file)
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.io.Serial;
 import java.util.Collection;
 import java.util.List;
+import java.util.function.Consumer;
 import javax.xml.parsers.ParserConfigurationException;
 import org.custommonkey.xmlunit.DetailedDiff;
 import org.custommonkey.xmlunit.Diff;
@@ -40,6 +41,7 @@ import org.opendaylight.mdsal.dom.api.DOMRpcException;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
 import org.opendaylight.netconf.api.DocumentedException;
 import org.opendaylight.netconf.api.xml.XmlUtil;
@@ -48,8 +50,7 @@ import org.opendaylight.netconf.server.api.operations.NetconfOperationChainedExe
 import org.opendaylight.netconf.server.mdsal.CurrentSchemaContext;
 import org.opendaylight.netconf.test.util.XmlFileLoader;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdType;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.NoOpListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.ErrorSeverity;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
@@ -61,12 +62,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -95,8 +94,8 @@ public class RuntimeRpcTest {
         }
 
         @Override
-        public <T extends DOMRpcAvailabilityListener> ListenerRegistration<T> registerRpcListener(final T listener) {
-            return NoOpListenerRegistration.of(listener);
+        public Registration registerRpcListener(final DOMRpcAvailabilityListener listener) {
+            return () -> { };
         }
     };
 
@@ -110,8 +109,8 @@ public class RuntimeRpcTest {
         }
 
         @Override
-        public <T extends DOMRpcAvailabilityListener> ListenerRegistration<T> registerRpcListener(final T listener) {
-            return NoOpListenerRegistration.of(listener);
+        public Registration registerRpcListener(final DOMRpcAvailabilityListener listener) {
+            return () -> { };
         }
     };
 
@@ -132,8 +131,8 @@ public class RuntimeRpcTest {
         }
 
         @Override
-        public <T extends DOMRpcAvailabilityListener> ListenerRegistration<T> registerRpcListener(final T lsnr) {
-            return NoOpListenerRegistration.of(lsnr);
+        public Registration registerRpcListener(final DOMRpcAvailabilityListener lsnr) {
+            return () -> { };
         }
     };
 
@@ -143,11 +142,11 @@ public class RuntimeRpcTest {
     @Mock
     private DOMSchemaService schemaService;
     @Mock
-    private EffectiveModelContextListener listener;
+    private Consumer<EffectiveModelContext> listener;
     @Mock
-    private ListenerRegistration<?> registration;
+    private Registration registration;
     @Mock
-    private SchemaSourceProvider<YangTextSchemaSource> sourceProvider;
+    private YangTextSourceExtension sourceProvider;
 
     @BeforeClass
     public static void beforeClass() {
@@ -163,16 +162,16 @@ public class RuntimeRpcTest {
     public void setUp() throws Exception {
         doNothing().when(registration).close();
         doAnswer(invocationOnMock -> {
-            ((EffectiveModelContextListener) invocationOnMock.getArguments()[0]).onModelContextUpdated(SCHEMA_CONTEXT);
+            ((Consumer<EffectiveModelContext>) invocationOnMock.getArgument(0)).accept(SCHEMA_CONTEXT);
             return registration;
-        }).when(schemaService).registerSchemaContextListener(any(EffectiveModelContextListener.class));
+        }).when(schemaService).registerSchemaContextListener(any());
 
         XMLUnit.setIgnoreWhitespace(true);
         XMLUnit.setIgnoreAttributeOrder(true);
 
-        doAnswer(invocationOnMock -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(
-            (SourceIdentifier) invocationOnMock.getArguments()[0], CharSource.wrap("module test"))))
-            .when(sourceProvider).getSource(any(SourceIdentifier.class));
+        doAnswer(invocationOnMock -> Futures.immediateFuture(new DelegatedYangTextSource(
+            invocationOnMock.getArgument(0, SourceIdentifier.class), CharSource.wrap("module test"))))
+            .when(sourceProvider).getYangTexttSource(any(SourceIdentifier.class));
 
         currentSchemaContext = CurrentSchemaContext.create(schemaService, sourceProvider);
     }
index 7124ad10d2f4acfd0a6191841568ef4270b3d68d..013c846e0b76befc26304a64bc0447089b2d6a46 100644 (file)
@@ -9,14 +9,10 @@ package org.opendaylight.netconf.server.mdsal.operations;
 
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ImmutableClassToInstanceMap;
+import java.util.function.Consumer;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMSchemaServiceExtension;
-import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
 
 final class SchemaServiceStub implements DOMSchemaService {
     private final EffectiveModelContext schemaContext;
@@ -31,19 +27,10 @@ final class SchemaServiceStub implements DOMSchemaService {
     }
 
     @Override
-    public ListenerRegistration<EffectiveModelContextListener> registerSchemaContextListener(
-        final EffectiveModelContextListener listener) {
-        listener.onModelContextUpdated(schemaContext);
-        return new AbstractListenerRegistration<>(listener) {
-            @Override
-            protected void removeRegistration() {
-                // No-op
-            }
+    public Registration registerSchemaContextListener(final Consumer<EffectiveModelContext> listener) {
+        listener.accept(schemaContext);
+        return () -> {
+            // No-op
         };
     }
-
-    @Override
-    public ClassToInstanceMap<DOMSchemaServiceExtension> getExtensions() {
-        return ImmutableClassToInstanceMap.of();
-    }
 }
index 1d43adcdfc68bcdd12cf8c36569c43e3d0665de7..4ebfc6d61d1e3c0577e26a8be784775fc3019ff6 100644 (file)
@@ -18,11 +18,12 @@ import static org.opendaylight.netconf.server.mdsal.operations.AbstractNetconfOp
 import static org.opendaylight.netconf.server.mdsal.operations.AbstractNetconfOperationTest.executeOperation;
 import static org.opendaylight.netconf.server.mdsal.operations.AbstractNetconfOperationTest.verifyResponse;
 
-import com.google.common.collect.ImmutableClassToInstanceMap;
+import java.util.List;
 import org.custommonkey.xmlunit.XMLUnit;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
@@ -45,7 +46,7 @@ public class ValidateTest {
     private DOMDataTransactionValidator failingValidator;
     @Mock
     private DOMDataTreeReadWriteTransaction readWriteTx;
-    @Mock
+    @Mock(answer = Answers.CALLS_REAL_METHODS)
     private DOMDataBroker dataBroker;
 
     @Before
@@ -114,12 +115,11 @@ public class ValidateTest {
     }
 
     private void whenValidatorIsNotDefined() {
-        doReturn(ImmutableClassToInstanceMap.of()).when(dataBroker).getExtensions();
+        doReturn(List.of()).when(dataBroker).supportedExtensions();
     }
 
     private void whenUsingValidator(final DOMDataTransactionValidator validator) {
-        doReturn(ImmutableClassToInstanceMap.of(DOMDataTransactionValidator.class, validator))
-            .when(dataBroker).getExtensions();
+        doReturn(List.of(validator)).when(dataBroker).supportedExtensions();
     }
 
     private TransactionProvider initCandidateTransaction() {
index 4c843d1c1081675980027d363af3f89992147d3e..00455db3cd64f30ea4dd338c0bb5262d9dca695d 100644 (file)
@@ -65,7 +65,7 @@ public final class XmlChildBody extends ChildBody {
 
         final DataSchemaNode parentNode;
         if (pathInference.isEmpty()) {
-            parentNode = pathInference.getEffectiveModelContext();
+            parentNode = pathInference.modelContext();
         } else {
             final var hackStack = pathInference.toSchemaInferenceStack();
             final var hackStmt = hackStack.currentStatement();
@@ -79,7 +79,7 @@ public final class XmlChildBody extends ChildBody {
         var schemaNode = parentNode;
         final String docRootElm = doc.getDocumentElement().getLocalName();
         final XMLNamespace docRootNamespace = XMLNamespace.of(doc.getDocumentElement().getNamespaceURI());
-        final var context = pathInference.getEffectiveModelContext();
+        final var context = pathInference.modelContext();
         final var it = context.findModuleStatements(docRootNamespace).iterator();
         checkState(it.hasNext(), "Failed to find module for %s", docRootNamespace);
         final var qname = QName.create(it.next().localQNameModule(), docRootElm);
index d47dafd0a75afe80a9275bebf288d6c2a914982d..c00fe2f99482600125ce6bd0de715ff0c6a35a6c 100644 (file)
@@ -87,7 +87,7 @@ public final class JsonNormalizedNodeBodyWriter extends AbstractNormalizedNodeBo
             final JsonWriter jsonWriter, final QueryParameters writerParameters,
             final @Nullable XMLNamespace initialNamespace) {
         // TODO: Performance: Cache JSON Codec factory and schema context
-        final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(inference.getEffectiveModelContext());
+        final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(inference.modelContext());
         return ParameterAwareNormalizedNodeWriter.forStreamWriter(
             JSONNormalizedNodeStreamWriter.createNestedWriter(codecs, inference,
                 initialNamespace, jsonWriter), writerParameters.depth(), writerParameters.fields());
index 73e5962ae2462ad72ff9b14caa092f634a6b3262..77e8b06ec87c5956dcc4f109ff94b88f155b792d 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.restconf.nb.rfc8040.jersey.providers.errors;
 
 import static java.util.Objects.requireNonNull;
-import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.$YangModuleInfoImpl.qnameOf;
+import static org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.YangModuleInfoImpl.qnameOf;
 
 import com.google.common.annotations.VisibleForTesting;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
index 286e91f032521db3177dad6affead75f6af4153e..df4ce465829de7b995473e96f6ddef6bad4e09ae 100644 (file)
@@ -23,8 +23,8 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.common.errors.RestconfFuture;
 import org.opendaylight.restconf.common.errors.SettableRestconfFuture;
@@ -53,7 +53,7 @@ public final class MdsalRestconfStrategy extends RestconfStrategy {
 
     public MdsalRestconfStrategy(final DatabindContext databind, final DOMDataBroker dataBroker,
             final @Nullable DOMRpcService rpcService, final @Nullable DOMActionService actionService,
-            final @Nullable DOMYangTextSourceProvider sourceProvider,
+            final @Nullable YangTextSourceExtension sourceProvider,
             final @Nullable DOMMountPointService mountPointService,
             final ImmutableMap<QName, RpcImplementation> localRpcs) {
         super(databind, localRpcs, rpcService, actionService, sourceProvider, mountPointService);
@@ -62,7 +62,7 @@ public final class MdsalRestconfStrategy extends RestconfStrategy {
 
     public MdsalRestconfStrategy(final DatabindContext databind, final DOMDataBroker dataBroker,
             final @Nullable DOMRpcService rpcService, final @Nullable DOMActionService actionService,
-            final @Nullable DOMYangTextSourceProvider sourceProvider,
+            final @Nullable YangTextSourceExtension sourceProvider,
             final @Nullable DOMMountPointService mountPointService) {
         this(databind, dataBroker, rpcService, actionService, sourceProvider, mountPointService, ImmutableMap.of());
     }
@@ -116,7 +116,7 @@ public final class MdsalRestconfStrategy extends RestconfStrategy {
         final var inference = path.inference();
         final var fields = params.fields();
         final var translatedFields = fields == null ? null
-            : WriterFieldsTranslator.translate(inference.getEffectiveModelContext(), path.schema(), fields);
+            : WriterFieldsTranslator.translate(inference.modelContext(), path.schema(), fields);
         return completeDataGET(inference, QueryParameters.of(params, translatedFields),
             readData(params.content(), path.instance(), params.withDefaults()), null);
     }
index 0ac402ac7f7d5837a744bf532bdcae18339fb69d..cd7186d231c61ffbe77048f0bb7627d06f732e79 100644 (file)
@@ -25,8 +25,8 @@ import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.mdsal.dom.api.DOMActionService;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
 import org.opendaylight.restconf.api.query.ContentParam;
 import org.opendaylight.restconf.api.query.WithDefaultsParam;
@@ -53,7 +53,7 @@ public final class NetconfRestconfStrategy extends RestconfStrategy {
 
     public NetconfRestconfStrategy(final DatabindContext databind, final NetconfDataTreeService netconfService,
             final @Nullable DOMRpcService rpcService, final @Nullable DOMActionService actionService,
-            final @Nullable DOMYangTextSourceProvider sourceProvider,
+            final @Nullable YangTextSourceExtension sourceProvider,
             final @Nullable DOMMountPointService mountPointService) {
         super(databind, ImmutableMap.of(), rpcService, actionService, sourceProvider, mountPointService);
         this.netconfService = requireNonNull(netconfService);
@@ -89,7 +89,7 @@ public final class NetconfRestconfStrategy extends RestconfStrategy {
         if (fields != null) {
             final List<YangInstanceIdentifier> tmp;
             try {
-                tmp = NetconfFieldsTranslator.translate(inference.getEffectiveModelContext(), path.schema(), fields);
+                tmp = NetconfFieldsTranslator.translate(inference.modelContext(), path.schema(), fields);
             } catch (RestconfDocumentedException e) {
                 return RestconfFuture.failed(e);
             }
index 98b767bd7bcc51638c9bcd7c75d99106abbbf482..803906f0c9785bcac40f577f6c211f002dc1cba0 100644 (file)
@@ -49,8 +49,8 @@ import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
 import org.opendaylight.mdsal.dom.spi.SimpleDOMActionResult;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
 import org.opendaylight.restconf.api.ApiPath;
@@ -136,13 +136,13 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.api.source.YinTextSource;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.api.YinTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 import org.slf4j.Logger;
@@ -188,14 +188,14 @@ public abstract class RestconfStrategy {
     private final @NonNull ImmutableMap<QName, RpcImplementation> localRpcs;
     private final @NonNull ApiPathNormalizer pathNormalizer;
     private final @NonNull DatabindContext databind;
-    private final DOMYangTextSourceProvider sourceProvider;
+    private final YangTextSourceExtension sourceProvider;
     private final DOMMountPointService mountPointService;
     private final DOMActionService actionService;
     private final DOMRpcService rpcService;
 
     RestconfStrategy(final DatabindContext databind, final ImmutableMap<QName, RpcImplementation> localRpcs,
             final @Nullable DOMRpcService rpcService, final @Nullable DOMActionService actionService,
-            final DOMYangTextSourceProvider sourceProvider, final @Nullable DOMMountPointService mountPointService) {
+            final YangTextSourceExtension sourceProvider, final @Nullable DOMMountPointService mountPointService) {
         this.databind = requireNonNull(databind);
         this.localRpcs = requireNonNull(localRpcs);
         this.rpcService = rpcService;
@@ -251,7 +251,7 @@ public abstract class RestconfStrategy {
         final var rpcService = mountPoint.getService(DOMRpcService.class).orElse(null);
         final var actionService = mountPoint.getService(DOMActionService.class).orElse(null);
         final var sourceProvider = mountPoint.getService(DOMSchemaService.class)
-            .flatMap(schema -> Optional.ofNullable(schema.getExtensions().getInstance(DOMYangTextSourceProvider.class)))
+            .flatMap(schema -> Optional.ofNullable(schema.extension(YangTextSourceExtension.class)))
             .orElse(null);
 
         final var netconfService = mountPoint.getService(NetconfDataTreeService.class);
@@ -1262,8 +1262,7 @@ public abstract class RestconfStrategy {
             return RestconfFuture.failed(e);
         }
 
-        return RestconfFuture.of(
-            new OperationsGetResult.Leaf(rpc.inference().getEffectiveModelContext(), rpc.rpc().argument()));
+        return RestconfFuture.of(new OperationsGetResult.Leaf(rpc.inference().modelContext(), rpc.rpc().argument()));
     }
 
     public @NonNull RestconfFuture<OperationsPostResult> operationsPOST(final URI restconfURI, final ApiPath apiPath,
@@ -1326,14 +1325,14 @@ public abstract class RestconfStrategy {
     }
 
     public @NonNull RestconfFuture<CharSource> resolveSource(final SourceIdentifier source,
-            final Class<? extends SchemaSourceRepresentation> representation) {
+            final Class<? extends SourceRepresentation> representation) {
         final var src = requireNonNull(source);
-        if (YangTextSchemaSource.class.isAssignableFrom(representation)) {
+        if (YangTextSource.class.isAssignableFrom(representation)) {
             if (sourceProvider != null) {
                 final var ret = new SettableRestconfFuture<CharSource>();
-                Futures.addCallback(sourceProvider.getSource(src), new FutureCallback<YangTextSchemaSource>() {
+                Futures.addCallback(sourceProvider.getYangTexttSource(src), new FutureCallback<>() {
                     @Override
-                    public void onSuccess(final YangTextSchemaSource result) {
+                    public void onSuccess(final YangTextSource result) {
                         ret.set(result);
                     }
 
@@ -1348,7 +1347,7 @@ public abstract class RestconfStrategy {
             }
             return exportSource(modelContext(), src, YangCharSource::new, YangCharSource::new);
         }
-        if (YinTextSchemaSource.class.isAssignableFrom(representation)) {
+        if (YinTextSource.class.isAssignableFrom(representation)) {
             return exportSource(modelContext(), src, YinCharSource.OfModule::new, YinCharSource.OfSubmodule::new);
         }
         return RestconfFuture.failed(new RestconfDocumentedException(
index befe466df6cdaeb467dc7cac0ec2cfa3db8a9495..3bb8035687f26564fd3e93f2a72ae41b5d71d884 100644 (file)
@@ -64,7 +64,7 @@ public final class DatabindContext {
     }
 
     public @NonNull EffectiveModelContext modelContext() {
-        return mountContext.getEffectiveModelContext();
+        return mountContext.modelContext();
     }
 
     public @NonNull DataSchemaContextTree schemaTree() {
@@ -84,7 +84,7 @@ public final class DatabindContext {
     }
 
     private @NonNull JSONCodecFactory createJsonCodecs() {
-        final var created = JSONCodecFactorySupplier.RFC7951.getShared(mountContext.getEffectiveModelContext());
+        final var created = JSONCodecFactorySupplier.RFC7951.getShared(mountContext.modelContext());
         final var witness = (JSONCodecFactory) JSON_CODECS.compareAndExchangeRelease(this, null, created);
         return witness != null ? witness : created;
     }
index be041f7619780a5571ba66768c8c89a474b7cf11..a38c2e72124ce13b13b40f9463ca22c3d584c41f 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.restconf.server.mdsal;
 
 import static java.util.Objects.requireNonNull;
-import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.$YangModuleInfoImpl.qnameOf;
+import static org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.YangModuleInfoImpl.qnameOf;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.util.concurrent.FutureCallback;
@@ -21,10 +21,8 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
 import org.opendaylight.restconf.api.query.AbstractReplayParam;
 import org.opendaylight.restconf.api.query.ChangedLeafNodesOnlyParam;
 import org.opendaylight.restconf.api.query.ChildNodesOnlyParam;
@@ -38,12 +36,12 @@ import org.opendaylight.restconf.api.query.WithDefaultsParam;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.RestconfState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.Capabilities;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -56,8 +54,7 @@ import org.slf4j.LoggerFactory;
  */
 @Singleton
 @Component(service = { })
-public final class CapabilitiesWriter
-        implements AutoCloseable, EffectiveModelContextListener, DOMTransactionChainListener {
+public final class CapabilitiesWriter implements AutoCloseable, FutureCallback<Empty> {
     private static final Logger LOG = LoggerFactory.getLogger(CapabilitiesWriter.class);
 
     @VisibleForTesting
@@ -78,7 +75,7 @@ public final class CapabilitiesWriter
     public CapabilitiesWriter(@Reference final DOMDataBroker dataBroker,
             @Reference final DOMSchemaService schemaService) {
         this.dataBroker = requireNonNull(dataBroker);
-        reg = schemaService.registerSchemaContextListener(this);
+        reg = schemaService.registerSchemaContextListener(this::onModelContextUpdated);
     }
 
     @PreDestroy
@@ -97,20 +94,18 @@ public final class CapabilitiesWriter
     }
 
     @Override
-    public synchronized void onTransactionChainFailed(final DOMTransactionChain chain,
-            final DOMDataTreeTransaction transaction, final Throwable cause) {
+    public synchronized void onFailure(final Throwable cause) {
         LOG.warn("Transaction chain failed, updates may not have been propagated", cause);
         txChain = null;
     }
 
     @Override
-    public synchronized void onTransactionChainSuccessful(final DOMTransactionChain chain) {
+    public synchronized void onSuccess(final Empty result) {
         LOG.debug("Transaction chain closed successfully");
         txChain = null;
     }
 
-    @Override
-    public synchronized void onModelContextUpdated(final EffectiveModelContext newModelContext) {
+    private synchronized void onModelContextUpdated(final EffectiveModelContext newModelContext) {
         if (reg != null) {
             LOG.debug("Ignoring model context update");
             return;
@@ -132,7 +127,8 @@ public final class CapabilitiesWriter
 
         LOG.debug("Removing ietf-restconf-monitoring state");
         if (txChain == null) {
-            txChain = dataBroker.createMergingTransactionChain(this);
+            txChain = dataBroker.createMergingTransactionChain();
+            txChain.addCallback(this);
         }
 
         final var tx = txChain.newWriteOnlyTransaction();
@@ -159,7 +155,8 @@ public final class CapabilitiesWriter
 
         LOG.debug("Updating state of ietf-restconf-monitoring");
         if (txChain == null) {
-            txChain = dataBroker.createMergingTransactionChain(this);
+            txChain = dataBroker.createMergingTransactionChain();
+            txChain.addCallback(this);
         }
 
         final var tx = txChain.newWriteOnlyTransaction();
@@ -194,7 +191,7 @@ public final class CapabilitiesWriter
      */
     @VisibleForTesting
     static @NonNull LeafSetNode<String> mapCapabilities() {
-        return Builders.<String>leafSetBuilder()
+        return ImmutableNodes.<String>newSystemLeafSetBuilder()
             .withNodeIdentifier(CAPABILITY)
             .withChildValue(DepthParam.capabilityUri().toString())
             .withChildValue(FieldsParam.capabilityUri().toString())
index edfe86e53d8e01d5b2c45b7b975250d91511afab..719e13081f6662ad24ba4b3fef59f04669276779 100644 (file)
@@ -30,7 +30,7 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.restconf.api.ApiPath;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.common.errors.RestconfFuture;
@@ -68,11 +68,10 @@ import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.common.YangNames;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
-import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
-import org.opendaylight.yangtools.yang.model.repo.api.YinTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.api.source.YinTextSource;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -86,8 +85,7 @@ import org.slf4j.LoggerFactory;
  */
 @Singleton
 @Component(service = { RestconfServer.class, DatabindProvider.class })
-public final class MdsalRestconfServer
-        implements RestconfServer, DatabindProvider, EffectiveModelContextListener, AutoCloseable {
+public final class MdsalRestconfServer implements RestconfServer, DatabindProvider, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(MdsalRestconfServer.class);
     private static final QName YANG_LIBRARY_VERSION = QName.create(Restconf.QNAME, "yang-library-version").intern();
     private static final VarHandle LOCAL_STRATEGY;
@@ -106,7 +104,7 @@ public final class MdsalRestconfServer
     private final @NonNull DOMDataBroker dataBroker;
     private final @Nullable DOMRpcService rpcService;
     private final @Nullable DOMActionService actionService;
-    private final @Nullable DOMYangTextSourceProvider sourceProvider;
+    private final @Nullable YangTextSourceExtension sourceProvider;
 
     private final Registration reg;
 
@@ -126,10 +124,10 @@ public final class MdsalRestconfServer
         this.actionService = requireNonNull(actionService);
         this.mountPointService = requireNonNull(mountPointService);
         this.localRpcs = Maps.uniqueIndex(localRpcs, RpcImplementation::qname);
-        sourceProvider = schemaService.getExtensions().getInstance(DOMYangTextSourceProvider.class);
+        sourceProvider = schemaService.extension(YangTextSourceExtension.class);
 
         localStrategy = createLocalStrategy(schemaService.getGlobalContext());
-        reg = schemaService.registerSchemaContextListener(this);
+        reg = schemaService.registerSchemaContextListener(this::onModelContextUpdated);
     }
 
     public MdsalRestconfServer(final DOMSchemaService schemaService, final DOMDataBroker dataBroker,
@@ -143,8 +141,7 @@ public final class MdsalRestconfServer
         return localStrategy().databind();
     }
 
-    @Override
-    public void onModelContextUpdated(final EffectiveModelContext newModelContext) {
+    private void onModelContextUpdated(final EffectiveModelContext newModelContext) {
         final var local = localStrategy();
         if (!newModelContext.equals(local.modelContext())) {
             LOCAL_STRATEGY.setRelease(this, createLocalStrategy(newModelContext));
@@ -263,33 +260,33 @@ public final class MdsalRestconfServer
 
     @Override
     public RestconfFuture<ModulesGetResult> modulesYangGET(final String fileName, final String revision) {
-        return modulesGET(fileName, revision, YangTextSchemaSource.class);
+        return modulesGET(fileName, revision, YangTextSource.class);
     }
 
     @Override
     public RestconfFuture<ModulesGetResult> modulesYangGET(final ApiPath mountPath, final String fileName,
             final String revision) {
-        return modulesGET(mountPath, fileName, revision, YangTextSchemaSource.class);
+        return modulesGET(mountPath, fileName, revision, YangTextSource.class);
     }
 
     @Override
     public RestconfFuture<ModulesGetResult> modulesYinGET(final String fileName, final String revision) {
-        return modulesGET(fileName, revision, YinTextSchemaSource.class);
+        return modulesGET(fileName, revision, YinTextSource.class);
     }
 
     @Override
     public RestconfFuture<ModulesGetResult> modulesYinGET(final ApiPath mountPath, final String fileName,
             final String revision) {
-        return modulesGET(mountPath, fileName, revision, YinTextSchemaSource.class);
+        return modulesGET(mountPath, fileName, revision, YinTextSource.class);
     }
 
     private @NonNull RestconfFuture<ModulesGetResult> modulesGET(final String fileName, final String revision,
-            final Class<? extends SchemaSourceRepresentation> representation) {
+            final Class<? extends SourceRepresentation> representation) {
         return modulesGET(localStrategy(), fileName, revision, representation);
     }
 
     private @NonNull RestconfFuture<ModulesGetResult> modulesGET(final ApiPath mountPath, final String fileName,
-            final String revision, final Class<? extends SchemaSourceRepresentation> representation) {
+            final String revision, final Class<? extends SourceRepresentation> representation) {
         final var mountOffset = mountPath.indexOf("yang-ext", "mount");
         if (mountOffset != mountPath.steps().size() - 1) {
             return RestconfFuture.failed(new RestconfDocumentedException("Mount path has to end with yang-ext:mount"));
@@ -307,7 +304,7 @@ public final class MdsalRestconfServer
 
     private static @NonNull RestconfFuture<ModulesGetResult> modulesGET(final RestconfStrategy strategy,
             final String moduleName, final String revisionStr,
-            final Class<? extends SchemaSourceRepresentation> representation) {
+            final Class<? extends SourceRepresentation> representation) {
         if (moduleName == null) {
             return RestconfFuture.failed(new RestconfDocumentedException("Module name must be supplied",
                 ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE));
@@ -379,7 +376,7 @@ public final class MdsalRestconfServer
             return RestconfFuture.failed(new RestconfDocumentedException("RESTCONF is not available"));
         }
         return RestconfFuture.of(new NormalizedNodePayload(stack.toInference(),
-            ImmutableNodes.leafNode(YANG_LIBRARY_VERSION, stack.getEffectiveModelContext()
+            ImmutableNodes.leafNode(YANG_LIBRARY_VERSION, stack.modelContext()
                 .findModuleStatements("ietf-yang-library").iterator().next().localQNameModule().getRevision()
                 .map(Revision::toString).orElse(""))));
     }
index 5493fc1685674a7d8d64d3006096bcf2f98e2697..1aeb27090ce8b59e2205512b9ea17c3ccdb0dacc 100644 (file)
@@ -15,7 +15,7 @@ import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.common.errors.RestconfFuture;
 import org.opendaylight.restconf.nb.rfc8040.utils.parser.YangInstanceIdentifierSerializer;
@@ -55,7 +55,7 @@ public final class CreateDataChangeEventSubscriptionRpc extends RpcImplementatio
         NodeIdentifier.create(CreateDataChangeEventSubscriptionOutput.QNAME);
 
     private final DatabindProvider databindProvider;
-    private final DOMDataTreeChangeService changeService;
+    private final DataTreeChangeExtension changeService;
     private final RestconfStream.Registry streamRegistry;
 
     @Inject
@@ -64,7 +64,7 @@ public final class CreateDataChangeEventSubscriptionRpc extends RpcImplementatio
             @Reference final DatabindProvider databindProvider, @Reference final DOMDataBroker dataBroker) {
         super(CreateDataChangeEventSubscription.QNAME);
         this.databindProvider = requireNonNull(databindProvider);
-        changeService = dataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
+        changeService = dataBroker.extension(DataTreeChangeExtension.class);
         if (changeService == null) {
             throw new UnsupportedOperationException("DOMDataBroker does not support the DOMDataTreeChangeService");
         }
index dfa696eae94ab096817149e67fbf44e6dec27041..584aa9dc0e3145983efd432faea68bb919050d9d 100644 (file)
@@ -17,7 +17,7 @@ import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.restconf.server.spi.DatabindProvider;
 import org.opendaylight.restconf.server.spi.RestconfStream;
@@ -37,12 +37,12 @@ public final class DataTreeChangeSource extends Source<List<DataTreeCandidate>>
         EncodingName.RFC8040_JSON, JSONDataTreeCandidateFormatter.FACTORY,
         EncodingName.RFC8040_XML, XMLDataTreeCandidateFormatter.FACTORY);
 
-    private final @NonNull DOMDataTreeChangeService changeService;
+    private final @NonNull DataTreeChangeExtension changeService;
     private final @NonNull DatabindProvider databindProvider;
     private final @NonNull LogicalDatastoreType datastore;
     private final @NonNull YangInstanceIdentifier path;
 
-    public DataTreeChangeSource(final DatabindProvider databindProvider, final DOMDataTreeChangeService changeService,
+    public DataTreeChangeSource(final DatabindProvider databindProvider, final DataTreeChangeExtension changeService,
             final LogicalDatastoreType datastore, final YangInstanceIdentifier path) {
         super(ENCODINGS);
         this.databindProvider = requireNonNull(databindProvider);
index 489979bc63d1cb3c6c03904433da5be906bfd928..a1e66a998a82502600f43e6071ef32cb28f82879 100644 (file)
@@ -15,16 +15,16 @@ import java.util.List;
 import javax.xml.xpath.XPathExpressionException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.restconf.server.spi.TextParameters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.$YangModuleInfoImpl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.DataChangedNotification;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.data.changed.notification.DataChangeEvent;
+import org.opendaylight.yang.svc.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.YangModuleInfoImpl;
 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
 final class JSONDataTreeCandidateFormatter extends DataTreeCandidateFormatter {
     private static final @NonNull String DATA_CHANGED_EVENT_NAME = DataChangeEvent.QNAME.getLocalName();
     private static final @NonNull String DATA_CHANGED_NOTIFICATION_NAME =
-        $YangModuleInfoImpl.getInstance().getName().getLocalName() + ":" + DataChangedNotification.QNAME.getLocalName();
+        YangModuleInfoImpl.getInstance().getName().getLocalName() + ":" + DataChangedNotification.QNAME.getLocalName();
     private static final JSONDataTreeCandidateFormatter EMPTY =
         new JSONDataTreeCandidateFormatter(TextParameters.EMPTY);
 
index c494ad8649b204fdbabc069b5f39623b7186f436..adeac10aafe8344fafd334730ab1df662d4694a0 100644 (file)
@@ -44,7 +44,7 @@ final class JSONDataTreeCandidateSerializer extends DataTreeCandidateSerializer<
 
         final var modificationType = candidate.modificationType();
         if (modificationType != ModificationType.UNMODIFIED) {
-            final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(parent.getEffectiveModelContext());
+            final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(parent.modelContext());
             try (var writer = createNestedWriter(codecs, DATA_CHANGE_EVENT, SAL_REMOTE_NS, jsonWriter)) {
                 writer.startLeafNode(PATH_NID);
                 writer.scalarValue(YangInstanceIdentifier.of(dataPath));
index 7e14708f090778e8d0f181f3fb5f3fcc8b414045..2476f0de749c47213c87109f3eacb0952a367ced 100644 (file)
@@ -41,7 +41,7 @@ final class XMLDataTreeCandidateSerializer extends DataTreeCandidateSerializer<E
             final DataTreeCandidateNode candidate, final boolean skipData) throws Exception {
         final var modificationType = candidate.modificationType();
         if (modificationType != ModificationType.UNMODIFIED) {
-            final var stack = SchemaInferenceStack.of(parent.getEffectiveModelContext());
+            final var stack = SchemaInferenceStack.of(parent.modelContext());
             stack.enterSchemaTree(DataChangedNotification.QNAME);
 
             final var writer = XMLStreamNormalizedNodeStreamWriter.create(xmlWriter, stack.toInference());
index 8eec4f70749290e0120f7bededfd37ad06a2b093..21c82e74beab47c8c0c1e6a7155e0be1b94283bd 100644 (file)
@@ -11,13 +11,14 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableMap;
 import java.time.Instant;
+import java.util.function.Supplier;
 import org.opendaylight.mdsal.dom.api.DOMEvent;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
 import org.opendaylight.restconf.server.spi.RestconfStream.EncodingName;
 import org.opendaylight.restconf.server.spi.RestconfStream.Sink;
 import org.opendaylight.restconf.server.spi.RestconfStream.Source;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
 /**
  * Abstract base class for functionality shared between {@link DOMNotification}-based sources.
@@ -25,16 +26,16 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
 public abstract class AbstractNotificationSource extends Source<DOMNotification> {
     protected static final class Listener implements DOMNotificationListener {
         private final Sink<DOMNotification> sink;
-        private final EffectiveModelContextProvider modelContext;
+        private final Supplier<EffectiveModelContext> modelContext;
 
-        public Listener(final Sink<DOMNotification> sink, final EffectiveModelContextProvider modelContext) {
+        public Listener(final Sink<DOMNotification> sink, final Supplier<EffectiveModelContext> modelContext) {
             this.sink = requireNonNull(sink);
             this.modelContext = requireNonNull(modelContext);
         }
 
         @Override
         public void onNotification(final DOMNotification notification) {
-            sink.publish(modelContext.getEffectiveModelContext(), notification,
+            sink.publish(modelContext.get(), notification,
                 notification instanceof DOMEvent domEvent ? domEvent.getEventInstant() : Instant.now());
         }
     }
index e62fda8b8a749d1b123b2795b8fc679a1e2e5733..12001395a266d6107219456a2ac18bafd320e871 100644 (file)
@@ -16,14 +16,14 @@ import javax.xml.xpath.XPathExpressionException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.restconf.server.spi.TextParameters;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.$YangModuleInfoImpl;
+import org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.YangModuleInfoImpl;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
 final class JSONNotificationFormatter extends NotificationFormatter {
     private static final @NonNull String NOTIFICATION_NAME =
-        $YangModuleInfoImpl.getInstance().getName().getLocalName() + ":notification";
+        YangModuleInfoImpl.getInstance().getName().getLocalName() + ":notification";
     @VisibleForTesting
     static final JSONNotificationFormatter EMPTY = new JSONNotificationFormatter(TextParameters.EMPTY);
 
index 9bde6cb53b09c771d45950cb13a63f3fedec8707..3bb26a499fe5513bc95df95842a92d4d13c71baa 100644 (file)
@@ -11,12 +11,15 @@ import static java.util.Objects.requireNonNull;
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.restconf.server.api.DatabindContext;
+import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
-import org.opendaylight.yangtools.yang.data.util.AbstractModuleStringInstanceIdentifierCodec;
+import org.opendaylight.yangtools.yang.data.util.AbstractStringInstanceIdentifierCodec;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
-import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.util.LeafrefResolver;
 
-final class ApiPathInstanceIdentifierCodec extends AbstractModuleStringInstanceIdentifierCodec {
+final class ApiPathInstanceIdentifierCodec extends AbstractStringInstanceIdentifierCodec {
     private final @NonNull DatabindContext databind;
 
     ApiPathInstanceIdentifierCodec(final DatabindContext databind) {
@@ -29,12 +32,22 @@ final class ApiPathInstanceIdentifierCodec extends AbstractModuleStringInstanceI
     }
 
     @Override
-    protected Module moduleForPrefix(final String prefix) {
-        return databind.modelContext().findModules(prefix).stream().findFirst().orElse(null);
+    protected QNameModule moduleForPrefix(final String prefix) {
+        return databind.modelContext().findModuleStatements(prefix).stream().findFirst()
+            .map(ModuleEffectiveStatement::localQNameModule)
+            .orElse(null);
     }
 
     @Override
     protected String prefixForNamespace(final XMLNamespace namespace) {
-        return databind.modelContext().findModule(namespace).stream().findFirst().map(Module::getName).orElse(null);
+        return databind.modelContext().findModuleStatements(namespace).stream().findFirst()
+            .map(module -> module.argument().getLocalName())
+            .orElse(null);
+    }
+
+    @Override
+    protected Object deserializeKeyValue(final DataSchemaNode schemaNode, final LeafrefResolver resolver,
+            final String value) {
+        throw new UnsupportedOperationException("FIXME: implement this method");
     }
 }
index b54bd85b091799157f3c07c96d859ecf744929c2..8323c2780f149f0ae330ba13c4361e0301667a21 100644 (file)
@@ -63,7 +63,7 @@ abstract class AbstractRestconfTest extends AbstractJukeboxTest {
 
     @BeforeEach
     final void setupRestconf() {
-        restconf = new JaxRsRestconf(new MdsalRestconfServer(FixedDOMSchemaService.of(modelContext()), dataBroker,
+        restconf = new JaxRsRestconf(new MdsalRestconfServer(new FixedDOMSchemaService(modelContext()), dataBroker,
             rpcService, actionService, mountPointService));
     }
 
index 9de4e5566d3280d97734231a79fe5bd4656dab01..d7ae761338583fad125e7f232243fe6111a34ebf 100644 (file)
@@ -63,8 +63,8 @@ class Netconf799Test extends AbstractInstanceIdentifierTest {
             Builders.containerBuilder().withNodeIdentifier(NodeIdentifier.create(OUTPUT_QNAME)).build())))
             .when(actionService).invokeAction(eq(Absolute.of(CONT_QNAME, CONT1_QNAME, RESET_QNAME)), any(), any());
 
-        final var restconf = new JaxRsRestconf(new MdsalRestconfServer(FixedDOMSchemaService.of(IID_SCHEMA), dataBroker,
-            rpcService, actionService, mountPointService));
+        final var restconf = new JaxRsRestconf(new MdsalRestconfServer(new FixedDOMSchemaService(IID_SCHEMA),
+            dataBroker, rpcService, actionService, mountPointService));
         doReturn(new MultivaluedHashMap<>()).when(uriInfo).getQueryParameters();
         doReturn(true).when(asyncResponse).resume(captor.capture());
         restconf.postDataJSON(ApiPath.parse("instance-identifier-module:cont/cont1/reset"),
index 1091df5486931a7b10e248022551b8cb6b9353a1..84a075d11dffed5423d1006db711e2057b6fcc1e 100644 (file)
@@ -72,7 +72,7 @@ class RestconfDataDeleteTest extends AbstractRestconfTest {
     @Test
     public void testDeleteDataMountPoint() {
         doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(any(YangInstanceIdentifier.class));
-        doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class);
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
index b6a9d7fc5fc4b2bb241283e2a092c3b2e0b7247f..bb86fb5d56dd26c2d41ff5449d56c8d1c12822cd 100644 (file)
@@ -116,7 +116,7 @@ class RestconfDataGetTest extends AbstractRestconfTest {
 
         doReturn(Optional.of(mountPoint)).when(mountPointService)
             .getMountPoint(any(YangInstanceIdentifier.class));
-        doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class);
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
index 49269eb778d80f0f49d626ff2c77cff1dafc6f42..5f6f8987fa52465701f53a2194c8d1fb69269a1b 100644 (file)
@@ -76,8 +76,8 @@ class RestconfDataPutTest extends AbstractRestconfTest {
         doReturn(immediateTrueFluentFuture()).when(readTx).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID);
         doNothing().when(rwTx).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX);
         doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(any());
-        doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint)
-        .getService(DOMSchemaService.class);
+        doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint)
+            .getService(DOMSchemaService.class);
         doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class);
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
index 8fec02ba8c224c5dab93b98a31b2e7ca3f1d5133..65112273d2626f0ab30d0267c7d7a63b873831dd 100644 (file)
@@ -26,7 +26,7 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.mdsal.dom.spi.FixedDOMSchemaService;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
 import org.opendaylight.restconf.api.ApiPath;
@@ -54,7 +54,7 @@ class RestconfModulesGetTest extends AbstractRestconfTest {
         QName.create("mount:point", "2016-06-02", "point-number"));
 
     @Mock
-    private DOMYangTextSourceProvider sourceProvider;
+    private YangTextSourceExtension sourceProvider;
     @Mock
     private DOMSchemaService schemaService;
 
@@ -174,7 +174,7 @@ class RestconfModulesGetTest extends AbstractRestconfTest {
     }
 
     private void mockMountPoint() {
-        doReturn(Optional.of(FixedDOMSchemaService.of(MODEL_CONTEXT_ON_MOUNT_POINT))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(MODEL_CONTEXT_ON_MOUNT_POINT))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(MOUNT_IID);
         doReturn(Optional.of(mountPointService)).when(mountPoint).getService(DOMMountPointService.class);
index 6fbf06e6a3a68886c4cd2cd37c8d6cc2a2f0d89a..5d04242bb8552dbbf6217d7b7a351b5468a08ad9 100644 (file)
@@ -53,7 +53,7 @@ class RestconfOperationsGetTest extends AbstractRestconfTest {
         </operations>""";
 
     private static final EffectiveModelContext MODEL_CONTEXT = BindingRuntimeHelpers.createRuntimeContext(
-        Module1Data.class, Module2Data.class, NetworkTopology.class).getEffectiveModelContext();
+        Module1Data.class, Module2Data.class, NetworkTopology.class).modelContext();
 
     @Override
     EffectiveModelContext modelContext() {
@@ -71,7 +71,7 @@ class RestconfOperationsGetTest extends AbstractRestconfTest {
     }
 
     private void mockMountPoint() {
-        doReturn(Optional.of(FixedDOMSchemaService.of(MODEL_CONTEXT))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(MODEL_CONTEXT))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMRpcService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
index 222c3c73b57b85bef486f4e3ed140689107e65f1..a8ab07a82f2fc5b24b879cebcd235199cfcfab92 100644 (file)
@@ -131,7 +131,7 @@ class RestconfOperationsPostTest extends AbstractRestconfTest {
 
     @Test
     void invokeRpcViaMountPointTest() throws Exception {
-        doReturn(Optional.of(FixedDOMSchemaService.of(MODEL_CONTEXT))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(MODEL_CONTEXT))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
@@ -158,7 +158,7 @@ class RestconfOperationsPostTest extends AbstractRestconfTest {
 
     @Test
     void invokeRpcMissingMountPointServiceTest() {
-        doReturn(Optional.of(FixedDOMSchemaService.of(MODEL_CONTEXT))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(MODEL_CONTEXT))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMRpcService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
index d5d2501f815d0df165f93a8d61d42bf213f36577..a99c000ab634069f034ddb0689e09247d3e41584 100644 (file)
@@ -8,13 +8,15 @@
 package org.opendaylight.restconf.nb.jaxrs;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 import static org.opendaylight.restconf.nb.jaxrs.AbstractRestconfTest.assertEntity;
 import static org.opendaylight.restconf.nb.jaxrs.AbstractRestconfTest.assertError;
 
-import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.io.CharStreams;
 import java.io.Reader;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -24,7 +26,7 @@ import org.opendaylight.mdsal.dom.api.DOMActionService;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
 import org.opendaylight.mdsal.dom.spi.FixedDOMSchemaService;
 import org.opendaylight.restconf.api.ApiPath;
@@ -35,7 +37,7 @@ import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
 /**
@@ -59,7 +61,7 @@ public class RestconfSchemaServiceMountTest {
     @Mock
     private DOMSchemaService schemaService;
     @Mock
-    private DOMYangTextSourceProvider sourceProvider;
+    private YangTextSourceExtension sourceProvider;
     @Mock
     private DOMDataBroker dataBroker;
     @Mock
@@ -67,7 +69,7 @@ public class RestconfSchemaServiceMountTest {
     @Mock
     private DOMRpcService rpcService;
     @Mock
-    private YangTextSchemaSource yangSource;
+    private YangTextSource yangSource;
     @Mock
     private Reader yangReader;
 
@@ -80,15 +82,15 @@ public class RestconfSchemaServiceMountTest {
         // create and register mount points
         mountPointService
                 .createMountPoint(YangInstanceIdentifier.of(QName.create("mount:point:1", "2016-01-01", "cont")))
-                .addService(DOMSchemaService.class, FixedDOMSchemaService.of(SCHEMA_CONTEXT_BEHIND_MOUNT_POINT))
+                .addService(DOMSchemaService.class, new FixedDOMSchemaService(SCHEMA_CONTEXT_BEHIND_MOUNT_POINT))
                 .addService(DOMDataBroker.class, dataBroker)
                 .register();
         mountPointService
                 .createMountPoint(YangInstanceIdentifier.of(QName.create("mount:point:2", "2016-01-01", "cont")))
                 .register();
 
-        doReturn(ImmutableClassToInstanceMap.of(DOMYangTextSourceProvider.class, sourceProvider)).when(schemaService)
-            .getExtensions();
+        doCallRealMethod().when(schemaService).extension(any());
+        doReturn(List.of(sourceProvider)).when(schemaService).supportedExtensions();
         doReturn(SCHEMA_CONTEXT_WITH_MOUNT_POINTS).when(schemaService).getGlobalContext();
 
         restconf = new JaxRsRestconf(new MdsalRestconfServer(schemaService, dataBroker, rpcService, actionService,
index 24ed46264f0e8fce7ff3949b28b01172d54e62ab..822f5ec60a86cd50c2b848b86c180a6c1fe5f0e2 100644 (file)
@@ -9,13 +9,15 @@ package org.opendaylight.restconf.nb.jaxrs;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 import static org.opendaylight.restconf.nb.jaxrs.AbstractRestconfTest.assertEntity;
 import static org.opendaylight.restconf.nb.jaxrs.AbstractRestconfTest.assertError;
 
-import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.util.concurrent.Futures;
 import java.io.Reader;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -26,14 +28,14 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension;
 import org.opendaylight.restconf.server.mdsal.MdsalRestconfServer;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
 /**
@@ -48,7 +50,7 @@ public class RestconfSchemaServiceTest {
     @Mock
     private DOMSchemaService schemaService;
     @Mock
-    private DOMYangTextSourceProvider sourceProvider;
+    private YangTextSourceExtension sourceProvider;
     @Mock
     private DOMDataBroker dataBroker;
     @Mock
@@ -58,7 +60,7 @@ public class RestconfSchemaServiceTest {
     @Mock
     private DOMMountPointService mountPointService;
     @Mock
-    private YangTextSchemaSource yangSource;
+    private YangTextSource yangSource;
     @Mock
     private Reader yangReader;
 
@@ -68,8 +70,8 @@ public class RestconfSchemaServiceTest {
     @Before
     public void setup() throws Exception {
         doReturn(SCHEMA_CONTEXT).when(schemaService).getGlobalContext();
-        doReturn(ImmutableClassToInstanceMap.of(DOMYangTextSourceProvider.class, sourceProvider)).when(schemaService)
-            .getExtensions();
+        doCallRealMethod().when(schemaService).extension(any());
+        doReturn(List.of(sourceProvider)).when(schemaService).supportedExtensions();
 
         restconf = new JaxRsRestconf(new MdsalRestconfServer(schemaService, dataBroker, rpcService, actionService,
             mountPointService));
@@ -81,7 +83,7 @@ public class RestconfSchemaServiceTest {
     @Test
     public void getSchemaTest() throws Exception {
         doReturn(Futures.immediateFuture(yangSource)).when(sourceProvider)
-            .getSource(new SourceIdentifier("module1", Revision.of("2014-01-01")));
+            .getYangTexttSource(new SourceIdentifier("module1", Revision.of("2014-01-01")));
         doReturn(yangReader).when(yangSource).openStream();
 
         assertSame(yangReader, assertEntity(Reader.class, 200,
index 55fbe8ab2f4bc3d543fe80a8f197f8f0622cb7d2..80e9b03dc160f5685b4ab6978eeeeed46dc3bd7d 100644 (file)
@@ -56,7 +56,8 @@ abstract class AbstractPatchBodyTest extends AbstractInstanceIdentifierTest {
     @Before
     public final void before() {
         doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(any(YangInstanceIdentifier.class));
-        doReturn(Optional.of(FixedDOMSchemaService.of(IID_SCHEMA))).when(mountPoint).getService(DOMSchemaService.class);
+        doReturn(Optional.of(new FixedDOMSchemaService(IID_SCHEMA))).when(mountPoint)
+            .getService(DOMSchemaService.class);
         doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMRpcService.class);
index 90645614cf93ac130017086d415878239897282f..9c84e36e44ce33426769abf236231f8926418a1e 100644 (file)
@@ -42,7 +42,7 @@ class XmlResourceBodyTest extends AbstractResourceBodyTest {
 
     private void mockMount() {
         doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(any(YangInstanceIdentifier.class));
-        doReturn(Optional.of(FixedDOMSchemaService.of(IID_SCHEMA))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(IID_SCHEMA))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
index ebadf4bf4855c15561ed95d705e0ca2ec9b55479..d0a4e9f95d2714a0d3b1778768e99c869d29b9cd 100644 (file)
@@ -427,7 +427,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(Optional.empty()).when(mountPoint).getService(NetconfDataTreeService.class);
         doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class);
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
-        doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMMountPointService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
@@ -443,7 +443,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
     public void testGetRestconfStrategyMountNetconfService() throws Exception {
         doReturn(Optional.of(netconfService)).when(mountPoint).getService(NetconfDataTreeService.class);
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
-        doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMMountPointService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
@@ -463,7 +463,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(Optional.empty()).when(mountPoint).getService(DOMMountPointService.class);
         doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class);
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
-        doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint)
+        doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint)
             .getService(DOMSchemaService.class);
         doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(YangInstanceIdentifier.of());
 
index 5dd4c6a3814812d1d97e4ff4add769d2760962ee..973fe9e525d2b0236c2514a0a5387f9071490461 100644 (file)
@@ -36,8 +36,8 @@ import org.opendaylight.yangtools.yang.common.ErrorSeverity;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.w3c.dom.DOMException;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
@@ -143,7 +143,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
 
     @Test
     public void testPutReplaceContainerData() {
-        doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
+        doReturn(immediateFluentFuture(Optional.of(mock(ContainerNode.class)))).when(netconfService)
             .getConfig(JUKEBOX_IID);
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
@@ -169,7 +169,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
 
     @Test
     public void testPutReplaceLeafData() {
-        doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
+        doReturn(immediateFluentFuture(Optional.of(mock(ContainerNode.class)))).when(netconfService)
             .getConfig(GAP_IID);
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
@@ -195,7 +195,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
 
     @Test
     public void testPutReplaceListData() {
-        doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
+        doReturn(immediateFluentFuture(Optional.of(mock(ContainerNode.class)))).when(netconfService)
             .getConfig(JUKEBOX_IID);
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
index 398f0cf73f482093a41f4e2973e5debf1adea8c2..3303fedbeae8fe1d642063293fd33807c6ff7b0c 100644 (file)
@@ -30,7 +30,7 @@ import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
 import org.opendaylight.restconf.api.query.ChangedLeafNodesOnlyParam;
 import org.opendaylight.restconf.api.query.ChildNodesOnlyParam;
 import org.opendaylight.restconf.api.query.LeafNodesOnlyParam;
@@ -231,7 +231,7 @@ public class DataTreeChangeStreamTest extends AbstractConcurrentDataBrokerTest {
             final boolean changedLeafNodesOnly, final boolean childNodesOnly) throws Exception {
         final var stream = streamRegistry.createStream(URI.create("baseURI"),
             new DataTreeChangeSource(databindProvider,
-                domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class),
+                domDataBroker.extension(DataTreeChangeExtension.class),
                 LogicalDatastoreType.CONFIGURATION, path), "test")
             .getOrThrow();
         final var handler = new TestHandler();
index 89b63b5f27085563d15d12b1bbba2222af6ae7a5..3987253f294c89527466161dcd69ddce4dbdbf24 100644 (file)
@@ -23,7 +23,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
@@ -49,7 +49,7 @@ class WebSocketFactoryTest extends AbstractNotificationListenerTest {
     @Mock
     private DOMDataTreeWriteTransaction tx;
     @Mock
-    private DOMDataTreeChangeService changeService;
+    private DataTreeChangeExtension changeService;
     @Mock
     private DatabindProvider databindProvider;
     @Mock
index 9477411bd0a97b2a8b0941533c956587078e1f3d..157177e65d0026027a9c13dcb7f5451f1b8c6e5d 100644 (file)
@@ -24,8 +24,6 @@ import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
 import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter;
-import org.opendaylight.mdsal.dom.spi.DOMNotificationSubscriptionListenerRegistry;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
 
 /**
  * Copy paste from org.opendaylight.controller.sal.restconf.impl.test.incubate.InMemoryMdsalModule.
@@ -44,7 +42,7 @@ public class InMemoryMdsalModule extends AbstractModule {
         };
         dataBrokerTest.setup();
 
-        domNotificationRouter = DOMNotificationRouter.create(NOTIFICATION_SERVICE_QUEUE_DEPTH);
+        domNotificationRouter = new DOMNotificationRouter(NOTIFICATION_SERVICE_QUEUE_DEPTH);
     }
 
     @Override
@@ -72,16 +70,6 @@ public class InMemoryMdsalModule extends AbstractModule {
         return dataBrokerTest.getDataBrokerTestCustomizer().getSchemaService();
     }
 
-    @Provides
-    @Singleton EffectiveModelContextProvider getSchemaContextProvider() {
-        DOMSchemaService schemaService = dataBrokerTest.getDataBrokerTestCustomizer().getSchemaService();
-        if (schemaService instanceof EffectiveModelContextProvider) {
-            return (EffectiveModelContextProvider) schemaService;
-        }
-        throw new IllegalStateException(
-                "The schema service isn't a SchemaContextProvider, it's a " + schemaService.getClass());
-    }
-
     @Provides
     @Singleton DOMMountPointService getDOMMountPoint() {
         return new DOMMountPointServiceImpl();
@@ -89,28 +77,23 @@ public class InMemoryMdsalModule extends AbstractModule {
 
     @Provides
     @Singleton DOMNotificationService getDOMNotificationService() {
-        return domNotificationRouter;
+        return domNotificationRouter.notificationService();
     }
 
     @Provides
     @Singleton DOMNotificationPublishService getDOMNotificationPublishService() {
-        return domNotificationRouter;
-    }
-
-    @Provides
-    @Singleton DOMNotificationSubscriptionListenerRegistry getDOMNotificationSubscriptionListenerRegistry() {
-        return domNotificationRouter;
+        return domNotificationRouter.notificationPublishService();
     }
 
     @Provides
     @Singleton DOMRpcService getDOMRpcService(final DOMSchemaService schemaService) {
-        return new DOMRpcRouter(schemaService).getRpcService();
+        return new DOMRpcRouter(schemaService).rpcService();
     }
 
     @Provides
     @Singleton
     DOMActionService getDOMActionService(final DOMSchemaService schemaService) {
-        return new DOMRpcRouter(schemaService).getActionService();
+        return new DOMRpcRouter(schemaService).actionService();
     }
 
     @PreDestroy
index a974f683a63ff650ba394d99f548649df4ef76f5..4a6281d77a508fb75c5cc538fc8389bc86ec8aab 100644 (file)
@@ -13,12 +13,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 
-import com.google.common.collect.ImmutableClassToInstanceMap;
 import java.net.URI;
+import java.util.List;
 import java.util.UUID;
 import org.eclipse.jdt.annotation.Nullable;
 import org.junit.jupiter.api.BeforeEach;
@@ -31,7 +33,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.server.api.DatabindContext;
@@ -67,7 +69,7 @@ class CreateNotificationStreamRpcTest {
     @Mock
     private DOMDataBroker dataBroker;
     @Mock
-    private DOMDataTreeChangeService treeChange;
+    private DataTreeChangeExtension treeChange;
     @Mock
     private DOMDataTreeWriteTransaction tx;
     @Captor
@@ -83,8 +85,8 @@ class CreateNotificationStreamRpcTest {
     public void before() {
         databindProvider = () -> DatabindContext.ofModel(SCHEMA_CTX);
 
-        doReturn(ImmutableClassToInstanceMap.of(DOMDataTreeChangeService.class, treeChange))
-            .when(dataBroker).getExtensions();
+        doReturn(List.of(treeChange)).when(dataBroker).supportedExtensions();
+        doCallRealMethod().when(dataBroker).extension(any());
         rpc = new CreateDataChangeEventSubscriptionRpc(new MdsalRestconfStreamRegistry(dataBroker), databindProvider,
             dataBroker);
     }
index 514f992fdfee08668735b4e4dafaa0257859c2d6..2c72fc672e1e27c04054dbd47961b5dbf752b3ad 100644 (file)
@@ -23,7 +23,6 @@ import java.util.Collection;
 import java.util.Deque;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
 import org.opendaylight.restconf.openapi.model.DeleteEntity;
 import org.opendaylight.restconf.openapi.model.GetEntity;
@@ -98,7 +97,7 @@ public final class PathsStream extends InputStream {
     }
 
     @Override
-    public int read(final byte @NonNull [] array, final int off, final int len) throws IOException {
+    public int read(final byte[] array, final int off, final int len) throws IOException {
         return super.read(array, off, len);
     }
 
index 735bafd56a315ed8b047a88f7fbaf2cf7402fc77..bb9a21fc2981a4b48bd756452a7a9d5cba8f4d10 100644 (file)
@@ -408,7 +408,7 @@ public class PropertyEntity {
         } else if (leafTypeDef instanceof EnumTypeDefinition enumType) {
             jsonType = processEnumType(enumType, def);
         } else if (leafTypeDef instanceof IdentityrefTypeDefinition identityrefType) {
-            jsonType = processIdentityRefType(identityrefType, stack.getEffectiveModelContext(), def);
+            jsonType = processIdentityRefType(identityrefType, stack.modelContext(), def);
         } else if (leafTypeDef instanceof StringTypeDefinition stringType) {
             jsonType = processStringType(stringType, schemaNode.getQName().getLocalName(), def);
         } else if (leafTypeDef instanceof UnionTypeDefinition unionType) {
@@ -427,7 +427,7 @@ public class PropertyEntity {
             jsonType = processNumberType(rangeRestrictedType, def);
         } else if (leafTypeDef instanceof InstanceIdentifierTypeDefinition instanceIdentifierType) {
             jsonType = processInstanceIdentifierType(instanceIdentifierType, schemaNode,
-                stack.getEffectiveModelContext(), def);
+                stack.modelContext(), def);
         } else {
             jsonType = STRING_TYPE;
         }
index d1c2375678c41693596a76c21063f1e970f6226e..3c5b7ad5e0c9cc6cd70191035d33deae6175f487 100644 (file)
@@ -28,7 +28,7 @@ import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator;
 import org.opendaylight.restconf.openapi.impl.OpenApiInputStream;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -58,7 +58,7 @@ public class MountPointOpenApi implements DOMMountPointListener, AutoCloseable {
 
     private final AtomicLong idKey = new AtomicLong(0);
 
-    private ListenerRegistration<DOMMountPointListener> registration;
+    private Registration registration;
 
     public MountPointOpenApi(final DOMSchemaService globalSchema, final DOMMountPointService mountService,
             final BaseYangOpenApiGenerator openApiGenerator) {
@@ -190,7 +190,7 @@ public class MountPointOpenApi implements DOMMountPointListener, AutoCloseable {
                 .values().getElement().toString();
     }
 
-    private OpenApiInputStream generateDataStoreOpenApi(EffectiveModelContext modelContext,
+    private OpenApiInputStream generateDataStoreOpenApi(final EffectiveModelContext modelContext,
             final UriInfo uriInfo, final String urlPrefix, final String deviceName) throws IOException {
         final var schema = openApiGenerator.createSchemaFromUriInfo(uriInfo);
         final var host = openApiGenerator.createHostFromUriInfo(uriInfo);
index 63e5b23f23046883b277400b3e69073ac085e4f9..1f84f2d2d909fd80c5b56077dff6e632c5bcdbdc 100644 (file)
             <artifactId>commons-codec</artifactId>
             <version>1.15</version>
         </dependency>
+        <dependency>
+            <groupId>com.github.spotbugs</groupId>
+            <artifactId>spotbugs-annotations</artifactId>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>com.google.errorprone</groupId>
             <artifactId>error_prone_annotations</artifactId>