Specialize MessageTransformer to NetconfMessage 13/103213/3
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 11 Nov 2022 23:15:20 +0000 (00:15 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 13 Nov 2022 13:08:27 +0000 (14:08 +0100)
There is no use pretending we handle anything but NetconfMessage.

JIRA: NETCONF-912
Change-Id: I54127020da62f0b3c4d00be0b3a72a08db4aa916
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
13 files changed:
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/api/DeviceActionFactory.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/api/MessageTransformer.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/DeviceActionFactoryImpl.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfDevice.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NotificationHandler.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceRpc.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/SchemalessNetconfDeviceRpc.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/mapping/BaseRpcSchemalessTransformer.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/mapping/SchemalessMessageTransformer.java
netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/NetconfDeviceTest.java
netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceRpcTest.java
netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfBaseOpsTest.java

index 463b18927bfa2d57a8bbbdcc50e2f77665892903..c1b24a69f62bbe65e4b83e26aa15dc55c330abba 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.netconf.sal.connect.api;
 
 import org.opendaylight.mdsal.dom.api.DOMActionService;
-import org.opendaylight.netconf.api.NetconfMessage;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 public interface DeviceActionFactory {
@@ -20,7 +19,7 @@ public interface DeviceActionFactory {
      * @param schemaContext - schema context of device
      * @return {@link DOMActionService} of specific device
      */
-    default DOMActionService createDeviceAction(final MessageTransformer<NetconfMessage> messageTransformer,
+    default DOMActionService createDeviceAction(final MessageTransformer messageTransformer,
             final RemoteDeviceCommunicator listener, final SchemaContext schemaContext) {
         return null;
     }
index 6074b8fe2ea02ef5c87983352946048f6e551037..c387e2d80c8c2116ae88d13ed5131c7eccd5571a 100644 (file)
@@ -11,17 +11,18 @@ import org.opendaylight.mdsal.dom.api.DOMActionResult;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
+import org.opendaylight.netconf.api.NetconfMessage;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
-public interface MessageTransformer<M> {
+public interface MessageTransformer {
 
-    DOMNotification toNotification(M message);
+    DOMNotification toNotification(NetconfMessage message);
 
-    M toRpcRequest(QName rpc, NormalizedNode node);
+    NetconfMessage toRpcRequest(QName rpc, NormalizedNode node);
 
-    DOMRpcResult toRpcResult(M message, QName rpc);
+    DOMRpcResult toRpcResult(NetconfMessage message, QName rpc);
 
     /**
      * Parse action into message for request.
@@ -31,7 +32,7 @@ public interface MessageTransformer<M> {
      * @param payload - input of action
      * @return message
      */
-    default M toActionRequest(final Absolute action, final DOMDataTreeIdentifier domDataTreeIdentifier,
+    default NetconfMessage toActionRequest(final Absolute action, final DOMDataTreeIdentifier domDataTreeIdentifier,
             final NormalizedNode payload) {
         throw new UnsupportedOperationException();
     }
@@ -43,7 +44,7 @@ public interface MessageTransformer<M> {
      * @param message - message to parsing
      * @return {@link DOMActionResult}
      */
-    default DOMActionResult toActionResult(final Absolute action, final M message) {
+    default DOMActionResult toActionResult(final Absolute action, final NetconfMessage message) {
         throw new UnsupportedOperationException();
     }
 }
index 76d755fcd95f4c9b681cc212a1ed70e77c0ce7b3..9cfb27920b52b7f8a9a607b41ac495d158911da1 100644 (file)
@@ -36,7 +36,7 @@ public class DeviceActionFactoryImpl implements DeviceActionFactory {
     private static final Logger LOG = LoggerFactory.getLogger(DeviceActionFactoryImpl.class);
 
     @Override
-    public DOMActionService createDeviceAction(final MessageTransformer<NetconfMessage> messageTransformer,
+    public DOMActionService createDeviceAction(final MessageTransformer messageTransformer,
             final RemoteDeviceCommunicator listener, final SchemaContext schemaContext) {
         return (schemaPath, dataTreeIdentifier, input) -> {
             requireNonNull(schemaPath);
index 6e05e89a56cfd3c3d4ce1d5ee25eb560975935b1..20fe41c34849a9bfdd6a52ddd8c972ba203d26ea 100644 (file)
@@ -115,7 +115,7 @@ public class NetconfDevice implements RemoteDevice<NetconfSessionPreferences, Ne
     private boolean connected = false;
 
     // Message transformer is constructed once the schemas are available
-    private MessageTransformer<NetconfMessage> messageTransformer;
+    private MessageTransformer messageTransformer;
 
     public NetconfDevice(final SchemaResourcesDTO schemaResourcesDTO, final BaseNetconfSchemas baseSchemas,
             final RemoteDeviceId id, final RemoteDeviceHandler<NetconfSessionPreferences> salFacade,
@@ -277,7 +277,7 @@ public class NetconfDevice implements RemoteDevice<NetconfSessionPreferences, Ne
         updateTransformer(null);
     }
 
-    private synchronized void updateTransformer(final MessageTransformer<NetconfMessage> transformer) {
+    private synchronized void updateTransformer(final MessageTransformer transformer) {
         messageTransformer = transformer;
     }
 
index ce63849affb1a01b101d0386ee0d68880301b233..8c40dc4159c7cba2fe2425215a7f769c1d67992e 100644 (file)
@@ -27,16 +27,16 @@ import org.slf4j.LoggerFactory;
  * Handles incoming notifications. Either caches them(until onRemoteSchemaUp is called) or passes to sal Facade.
  */
 final class NotificationHandler {
-
     private static final Logger LOG = LoggerFactory.getLogger(NotificationHandler.class);
 
     private final RemoteDeviceHandler<?> salFacade;
+    // FIXME: better implementation?
     private final List<NetconfMessage> queue = new LinkedList<>();
     private final RemoteDeviceId id;
-    private boolean passNotifications = false;
 
+    private boolean passNotifications = false;
     private NotificationFilter filter;
-    private MessageTransformer<NetconfMessage> messageTransformer;
+    private MessageTransformer messageTransformer;
 
     NotificationHandler(final RemoteDeviceHandler<?> salFacade, final RemoteDeviceId id) {
         this.salFacade = requireNonNull(salFacade);
@@ -55,8 +55,8 @@ final class NotificationHandler {
      * Forward all cached notifications and pass all notifications from this point directly to sal facade.
      * @param transformer Message transformer
      */
-    synchronized void onRemoteSchemaUp(final MessageTransformer<NetconfMessage> transformer) {
-        this.messageTransformer = requireNonNull(transformer);
+    synchronized void onRemoteSchemaUp(final MessageTransformer transformer) {
+        messageTransformer = requireNonNull(transformer);
 
         passNotifications = true;
 
@@ -92,7 +92,7 @@ final class NotificationHandler {
     }
 
     synchronized void addNotificationFilter(final NotificationFilter newFilter) {
-        this.filter = newFilter;
+        filter = newFilter;
     }
 
     synchronized void onRemoteSchemaDown() {
index f0f01ec910460bfb2a8e3797db76168e0037a66f..3284b67e698e39d9993e6fe851c9d7c6b8c6c2b8 100644 (file)
@@ -37,11 +37,11 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
  */
 public final class NetconfDeviceRpc implements DOMRpcService {
     private final RemoteDeviceCommunicator communicator;
-    private final MessageTransformer<NetconfMessage> transformer;
+    private final MessageTransformer transformer;
     private final SchemaContext schemaContext;
 
     public NetconfDeviceRpc(final SchemaContext schemaContext, final RemoteDeviceCommunicator communicator,
-            final MessageTransformer<NetconfMessage> transformer) {
+            final MessageTransformer transformer) {
         this.communicator = communicator;
         this.transformer = transformer;
         this.schemaContext = requireNonNull(schemaContext);
index af6bd7515aa036a9f0ec0c813f21b0f85575d808..8a067b4db0c3833347e97c7bee538695fc98f463 100644 (file)
@@ -52,7 +52,7 @@ public final class SchemalessNetconfDeviceRpc implements DOMRpcService {
 
     @Override
     public ListenableFuture<DOMRpcResult> invokeRpc(final QName type, final NormalizedNode input) {
-        final MessageTransformer<NetconfMessage> transformer;
+        final MessageTransformer transformer;
         if (input instanceof DOMSourceAnyxmlNode) {
             transformer = schemalessTransformer;
         } else if (isBaseRpc(type)) {
@@ -65,7 +65,7 @@ public final class SchemalessNetconfDeviceRpc implements DOMRpcService {
     }
 
     private ListenableFuture<DOMRpcResult> handleRpc(final @NonNull QName type, final @NonNull NormalizedNode input,
-            final MessageTransformer<NetconfMessage> transformer) {
+            final MessageTransformer transformer) {
         final ListenableFuture<RpcResult<NetconfMessage>> delegateFuture = listener.sendRequest(
             transformer.toRpcRequest(type, input), type);
 
index 57e0c2a72e6298fa82514189a76db1e416b9dad2..f3a9d010d827b513626562f63013498429c2d521 100644 (file)
@@ -36,7 +36,7 @@ import org.w3c.dom.Element;
 /**
  * Transforms base netconf RPCs.
  */
-public class BaseRpcSchemalessTransformer implements MessageTransformer<NetconfMessage> {
+public class BaseRpcSchemalessTransformer implements MessageTransformer {
     private final ImmutableMap<QName, ? extends RpcDefinition> mappedRpcs;
     private final EffectiveModelContext modelContext;
     private final MessageCounter counter;
index 591a9402799c590df8bd0e15fc291917cd962495..779a2cc7c801737b59a5cca0526276dc05b81ac0 100644 (file)
@@ -100,7 +100,7 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
-public class NetconfMessageTransformer implements MessageTransformer<NetconfMessage> {
+public class NetconfMessageTransformer implements MessageTransformer {
     private static final Logger LOG = LoggerFactory.getLogger(NetconfMessageTransformer.class);
 
     private static final ImmutableSet<XMLNamespace> BASE_OR_NOTIFICATION_NS = ImmutableSet.of(
@@ -235,16 +235,14 @@ public class NetconfMessageTransformer implements MessageTransformer<NetconfMess
     private NestedNotificationInfo traverseXmlNodeContainingNotification(final Node xmlNode,
             final SchemaNode schemaNode, final List<QName> schemaBuilder,
             final InstanceIdentifierBuilder instanceBuilder) {
-        if (schemaNode instanceof ContainerSchemaNode) {
-            final var containerSchema = (ContainerSchemaNode) schemaNode;
+        if (schemaNode instanceof ContainerSchemaNode containerSchema) {
             instanceBuilder.node(QName.create(xmlNode.getNamespaceURI(), xmlNode.getLocalName()));
             schemaBuilder.add(containerSchema.getQName());
 
             Entry<Node, SchemaNode> xmlContainerChildPair = findXmlContainerChildPair(xmlNode, containerSchema);
             return traverseXmlNodeContainingNotification(xmlContainerChildPair.getKey(),
                     xmlContainerChildPair.getValue(), schemaBuilder, instanceBuilder);
-        } else if (schemaNode instanceof ListSchemaNode) {
-            final var listSchema = (ListSchemaNode) schemaNode;
+        } else if (schemaNode instanceof ListSchemaNode listSchema) {
             instanceBuilder.node(QName.create(xmlNode.getNamespaceURI(), xmlNode.getLocalName()));
             schemaBuilder.add(listSchema.getQName());
 
index b26d4c1e7c0f6c8e764e00266401a929041be481..58d8437e21a30aa81d742814ae47ec95778241e6 100644 (file)
@@ -31,7 +31,7 @@ import org.w3c.dom.Element;
 /**
  * Transforms anyxml rpcs for schemaless netconf devices.
  */
-public class SchemalessMessageTransformer implements MessageTransformer<NetconfMessage> {
+public class SchemalessMessageTransformer implements MessageTransformer {
     // TODO maybe we should move this somewhere else as this
     // might be used in applications using schemaless mountpoints
     public static final NodeIdentifier SCHEMALESS_NOTIFICATION_PAYLOAD =
index 656b6697873b03d7bb4bf06aae7d1aa93c7174c4..33c20999836745ff4840e285b71e9480a5532c75 100644 (file)
@@ -578,8 +578,8 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
         return MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
     }
 
-    public MessageTransformer<NetconfMessage> getMessageTransformer() throws Exception {
-        final MessageTransformer<NetconfMessage> messageTransformer = mockClass(MessageTransformer.class);
+    public MessageTransformer getMessageTransformer() throws Exception {
+        final MessageTransformer messageTransformer = mockClass(MessageTransformer.class);
         doReturn(NOTIFICATION).when(messageTransformer).toRpcRequest(any(QName.class), any(NormalizedNode.class));
         doReturn(RPC_RESULT).when(messageTransformer).toRpcResult(any(NetconfMessage.class), any(QName.class));
         doReturn(COMPOSITE_NODE).when(messageTransformer).toNotification(any(NetconfMessage.class));
index 87de50aac27f2f5d3a7103cca66b8396b7ba62db..e00e2cb18d2a071646f5a4cad620368e6e2fce1e 100644 (file)
@@ -98,7 +98,7 @@ public class NetconfDeviceRpcTest extends AbstractBaseSchemasTest {
     @Test
     public void testDeadlock() throws Exception {
         // when rpc is successful, but transformer fails for some reason
-        final MessageTransformer<NetconfMessage> failingTransformer = mock(MessageTransformer.class);
+        final MessageTransformer failingTransformer = mock(MessageTransformer.class);
         final RemoteDeviceCommunicator communicatorMock = mock(RemoteDeviceCommunicator.class);
         final NetconfMessage msg = null;
         final RpcResult<NetconfMessage> result = RpcResultBuilder.success(msg).build();
index ae7ad4b53f379c443a93b26b39002f367822c3ae..b522d267014a55d8025df1d314b31810e1d67cef 100644 (file)
@@ -115,8 +115,8 @@ public class NetconfBaseOpsTest extends AbstractTestModelTest {
                 .thenReturn(RpcResultBuilder.success(ok).buildFuture());
         when(listener.sendRequest(any(), eq(NetconfMessageTransformUtil.NETCONF_COMMIT_QNAME)))
                 .thenReturn(RpcResultBuilder.success(ok).buildFuture());
-        final MessageTransformer<NetconfMessage> transformer = new NetconfMessageTransformer(
-            new EmptyMountPointContext(SCHEMA_CONTEXT), true, BASE_SCHEMAS.getBaseSchema());
+        final MessageTransformer transformer = new NetconfMessageTransformer(new EmptyMountPointContext(SCHEMA_CONTEXT),
+            true, BASE_SCHEMAS.getBaseSchema());
         final DOMRpcService rpc = new NetconfDeviceRpc(SCHEMA_CONTEXT, listener, transformer);
         final RemoteDeviceId id =
                 new RemoteDeviceId("device-1", InetSocketAddress.createUnresolved("localhost", 17830));