Rework NetconfStartExiMessage 29/107429/7
authormatus.matok <[email protected]>
Tue, 15 Aug 2023 11:21:00 +0000 (13:21 +0200)
committerRobert Varga <[email protected]>
Tue, 29 Aug 2023 13:23:31 +0000 (15:23 +0200)
Renamed NetconfStartExiMessage to NetconfStartExiMessageProvider as
it iss no longer a subclass of NetconfMessage. but instead it provides
a create() method that returns an RpcMessage with specific payload.

JIRA: NETCONF-1014
Change-Id: I9ab387523663854fd40bcd831bd00c0940467780
Signed-off-by: matus.matok <[email protected]>
Signed-off-by: Robert Varga <[email protected]>
netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessageProvider.java [moved from netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java with 81% similarity]
netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionTest.java
netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessageTest.java
protocol/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiator.java
protocol/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java
protocol/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java
protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/ConcurrentClientsTest.java

@@ -12,28 +12,24 @@ import com.google.common.annotations.VisibleForTesting;
 import java.util.ArrayList;
 import java.util.List;
 import org.opendaylight.netconf.api.NamespaceURN;
-import org.opendaylight.netconf.api.messages.NetconfMessage;
-import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
+import org.opendaylight.netconf.api.messages.RpcMessage;
 import org.opendaylight.netconf.api.xml.XmlUtil;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 /**
- * Start-exi netconf message.
+ * Start-exi netconf message provider.
  */
-public final class NetconfStartExiMessage extends NetconfMessage {
+public final class NetconfStartExiMessageProvider {
     @VisibleForTesting
     public static final String START_EXI = "start-exi";
 
-
-    private NetconfStartExiMessage(final Document doc) {
-        super(doc);
+    private NetconfStartExiMessageProvider() {
+        // hidden on purpose
     }
 
-    public static NetconfStartExiMessage create(final EXIParameters exiOptions, final String messageId) {
+    public static RpcMessage create(final EXIParameters exiOptions, final String messageId) {
         final Document doc = XmlUtil.newDocument();
-        final Element rpcElement = doc.createElementNS(NamespaceURN.BASE, XmlNetconfConstants.RPC_KEY);
-        rpcElement.setAttributeNS(NamespaceURN.BASE, XmlNetconfConstants.MESSAGE_ID, messageId);
 
         // TODO draft http://tools.ietf.org/html/draft-varga-netconf-exi-capability-02#section-3.5.1 has no namespace
         // for start-exi element in xml
@@ -43,10 +39,8 @@ public final class NetconfStartExiMessage extends NetconfMessage {
         addFidelity(exiOptions, doc, startExiElement);
         addSchema(exiOptions, doc, startExiElement);
 
-        rpcElement.appendChild(startExiElement);
-
-        doc.appendChild(rpcElement);
-        return new NetconfStartExiMessage(doc);
+        doc.appendChild(startExiElement);
+        return RpcMessage.ofOperation(messageId, doc);
     }
 
     private static void addAlignment(final EXIParameters exiOptions, final Document doc,
index 433d9fdae76dfd0fc7e790fa27eb7ade3bfd1beb..803a974fc99e4f5508d9fdd7178eecf0b72323f9 100644 (file)
@@ -40,7 +40,7 @@ import org.opendaylight.netconf.api.NetconfTerminationReason;
 import org.opendaylight.netconf.api.messages.HelloMessage;
 import org.opendaylight.netconf.api.messages.NetconfMessage;
 import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters;
-import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
+import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessageProvider;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdType;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
@@ -133,7 +133,7 @@ public class AbstractNetconfSessionTest {
         TestingNetconfSession testingNetconfSession = new TestingNetconfSession(listener, channel, SESSION_ID);
         testingNetconfSession = spy(testingNetconfSession);
 
-        testingNetconfSession.startExiCommunication(NetconfStartExiMessage.create(EXIParameters.empty(), "4"));
+        testingNetconfSession.startExiCommunication(NetconfStartExiMessageProvider.create(EXIParameters.empty(), "4"));
         verify(testingNetconfSession).addExiHandlers(any(ByteToMessageDecoder.class), any(MessageToByteEncoder.class));
     }
 
index bfeb73dba97897992ce8aab354f54ee109215d8a..c3c6e73cdcf32cdb81167116478751190e5033fa 100644 (file)
@@ -16,6 +16,7 @@ import org.custommonkey.xmlunit.XMLUnit;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.opendaylight.netconf.api.messages.RpcMessage;
 import org.opendaylight.netconf.shaded.exificient.core.CodingMode;
 import org.opendaylight.netconf.shaded.exificient.core.FidelityOptions;
 
@@ -24,16 +25,14 @@ public class NetconfStartExiMessageTest {
 
     @Parameterized.Parameters
     public static Iterable<Object[]> data() throws Exception {
-        final String noChangeXml = "<rpc xmlns:ns0=\"urn:ietf:params:xml:ns:netconf:base:1.0\" "
-                + "ns0:message-id=\"id\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
+        final String noChangeXml = "<rpc message-id=\"id\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
                 + "<start-exi xmlns=\"urn:ietf:params:xml:ns:netconf:exi:1.0\">\n"
                 + "<alignment>bit-packed</alignment>\n"
                 + "</start-exi>\n"
                 + "</rpc>";
 
 
-        final String fullOptionsXml = "<rpc xmlns:ns0=\"urn:ietf:params:xml:ns:netconf:base:1.0\" "
-                + "ns0:message-id=\"id\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
+        final String fullOptionsXml = "<rpc message-id=\"id\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
                 + "<start-exi xmlns=\"urn:ietf:params:xml:ns:netconf:exi:1.0\">\n"
                 + "<alignment>byte-aligned</alignment>\n"
                 + "<fidelity>\n"
@@ -69,7 +68,7 @@ public class NetconfStartExiMessageTest {
 
     @Test
     public void testCreate() throws Exception {
-        final NetconfStartExiMessage startExiMessage = NetconfStartExiMessage.create(exiOptions, "id");
+        final RpcMessage startExiMessage = NetconfStartExiMessageProvider.create(exiOptions, "id");
 
         XMLUnit.setIgnoreWhitespace(true);
         XMLUnit.setIgnoreAttributeOrder(true);
index a1e3446c47537d307ed19a19c31a89bdc52899eb..ab26db4e170aee68bd1e5e30a4a5926f66bbf909 100644 (file)
@@ -24,11 +24,11 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.netconf.api.NetconfDocumentedException;
 import org.opendaylight.netconf.api.messages.HelloMessage;
 import org.opendaylight.netconf.api.messages.NetconfMessage;
+import org.opendaylight.netconf.api.messages.RpcMessage;
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
 import org.opendaylight.netconf.api.xml.XmlUtil;
 import org.opendaylight.netconf.nettyutil.AbstractChannelInitializer;
 import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator;
-import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdType;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
@@ -52,9 +52,9 @@ class NetconfClientSessionNegotiator
 
     private static final Interner<Set<String>> INTERNER = Interners.newWeakInterner();
 
-    private final NetconfStartExiMessage startExi;
+    private final RpcMessage startExi;
 
-    NetconfClientSessionNegotiator(final HelloMessage hello, final NetconfStartExiMessage startExi,
+    NetconfClientSessionNegotiator(final HelloMessage hello, final RpcMessage startExi,
             final Promise<NetconfClientSession> promise, final Channel channel, final Timer timer,
             final NetconfClientSessionListener sessionListener, final long connectionTimeoutMillis,
             final @NonNegative int maximumIncomingChunkSize) {
@@ -95,7 +95,7 @@ class NetconfClientSessionNegotiator
      *
      * @param startExiMessage Exi message for initilization of exi communication.
      */
-    void tryToInitiateExi(final NetconfClientSession session, final NetconfStartExiMessage startExiMessage) {
+    void tryToInitiateExi(final NetconfClientSession session, final RpcMessage startExiMessage) {
         channel.pipeline().addAfter(AbstractChannelInitializer.NETCONF_MESSAGE_DECODER,
                 ExiConfirmationInboundHandler.EXI_CONFIRMED_HANDLER,
                 new ExiConfirmationInboundHandler(session, startExiMessage));
@@ -161,10 +161,10 @@ class NetconfClientSessionNegotiator
         private static final String EXI_CONFIRMED_HANDLER = "exiConfirmedHandler";
 
         private final NetconfClientSession session;
-        private final NetconfStartExiMessage startExiMessage;
+        private final RpcMessage startExiMessage;
 
         ExiConfirmationInboundHandler(final NetconfClientSession session,
-                                      final NetconfStartExiMessage startExiMessage) {
+                                      final RpcMessage startExiMessage) {
             this.session = session;
             this.startExiMessage = startExiMessage;
         }
index d5fdc02cc9e9151b194ce9ea59e99bfbed69bfc6..b1c0bc1bd7d71b72be42e7cb16448ca0062cbef5 100644 (file)
@@ -23,7 +23,7 @@ import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader
 import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator;
 import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiatorFactory;
 import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters;
-import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
+import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessageProvider;
 import org.opendaylight.netconf.shaded.exificient.core.CodingMode;
 import org.opendaylight.netconf.shaded.exificient.core.FidelityOptions;
 import org.opendaylight.netconf.shaded.exificient.core.exceptions.UnsupportedOption;
@@ -130,7 +130,7 @@ public class NetconfClientSessionNegotiatorFactory
             final Channel channel, final Promise<NetconfClientSession> promise) {
         return new NetconfClientSessionNegotiator(
             HelloMessage.createClientHello(clientCapabilities, additionalHeader),
-            NetconfStartExiMessage.create(options, START_EXI_MESSAGE_ID), promise, channel, timer,
+            NetconfStartExiMessageProvider.create(options, START_EXI_MESSAGE_ID), promise, channel, timer,
                 sessionListenerFactory.getSessionListener(), connectionTimeoutMillis, maximumIncomingChunkSize);
     }
 }
index 2a80583175d7c59b3bc6525b89d26b23a60c2920..9d8a0a72a908105769c443a4808b536f5cb5fed5 100644 (file)
@@ -40,13 +40,14 @@ import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.netconf.api.messages.HelloMessage;
 import org.opendaylight.netconf.api.messages.NetconfMessage;
+import org.opendaylight.netconf.api.messages.RpcMessage;
 import org.opendaylight.netconf.api.xml.XmlUtil;
 import org.opendaylight.netconf.nettyutil.handler.ChunkedFramingMechanismEncoder;
 import org.opendaylight.netconf.nettyutil.handler.NetconfEXIToMessageDecoder;
 import org.opendaylight.netconf.nettyutil.handler.NetconfXMLToHelloMessageDecoder;
 import org.opendaylight.netconf.nettyutil.handler.NetconfXMLToMessageDecoder;
 import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters;
-import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
+import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessageProvider;
 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.yang.common.Uint32;
@@ -126,7 +127,7 @@ public class NetconfClientSessionNegotiatorTest {
 
     private NetconfClientSessionNegotiator createNetconfClientSessionNegotiator(
             final Promise<NetconfClientSession> promise,
-            final NetconfStartExiMessage startExi) {
+            final RpcMessage startExi) {
         ChannelProgressivePromise progressivePromise = mock(ChannelProgressivePromise.class);
         doReturn(progressivePromise).when(promise).setFailure(any(Throwable.class));
 
@@ -174,7 +175,7 @@ public class NetconfClientSessionNegotiatorTest {
     @Test
     public void testNetconfClientSessionNegotiatorWithEXI() throws Exception {
         Promise<NetconfClientSession> promise = mock(Promise.class);
-        NetconfStartExiMessage exiMessage = NetconfStartExiMessage.create(EXIParameters.empty(), "msg-id");
+        RpcMessage exiMessage = NetconfStartExiMessageProvider.create(EXIParameters.empty(), "msg-id");
         doReturn(promise).when(promise).setSuccess(any());
         NetconfClientSessionNegotiator negotiator = createNetconfClientSessionNegotiator(promise, exiMessage);
 
index 5a5a9b2b9f030879b4b0730691e5372481de743d..dd1dee6991c4ebaec6c67207919efadd91b34025 100644 (file)
@@ -54,7 +54,7 @@ import org.opendaylight.netconf.client.SimpleNetconfClientSessionListener;
 import org.opendaylight.netconf.client.TestingNetconfClient;
 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
 import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
-import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
+import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessageProvider;
 import org.opendaylight.netconf.server.api.SessionIdProvider;
 import org.opendaylight.netconf.server.api.monitoring.Capability;
 import org.opendaylight.netconf.server.api.monitoring.CapabilityListener;
@@ -236,7 +236,7 @@ public class ConcurrentClientsTest {
 
         @Override
         public HandlingPriority canHandle(final Document message) {
-            return XmlUtil.toString(message).contains(NetconfStartExiMessage.START_EXI)
+            return XmlUtil.toString(message).contains(NetconfStartExiMessageProvider.START_EXI)
                     ? HandlingPriority.CANNOT_HANDLE :
                     HandlingPriority.HANDLE_WITH_MAX_PRIORITY;
         }