Allow specification of ODL's HELLO message
[netconf.git] / netconf / netconf-client / src / main / java / org / opendaylight / netconf / client / NetconfClientDispatcherImpl.java
index 780ce7ff59f4103810ba99462b89dbd1ff9f1e30..b8fdee2054e2aa53024a3df07d18bfa7a9a26f15 100644 (file)
@@ -11,9 +11,13 @@ package org.opendaylight.netconf.client;
 import io.netty.channel.EventLoopGroup;
 import io.netty.util.Timer;
 import io.netty.util.concurrent.Future;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
 import org.opendaylight.netconf.client.conf.NetconfReconnectingClientConfiguration;
 import org.opendaylight.protocol.framework.AbstractDispatcher;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -122,7 +126,19 @@ public class NetconfClientDispatcherImpl extends AbstractDispatcher<NetconfClien
     }
 
     protected NetconfClientSessionNegotiatorFactory getNegotiatorFactory(final NetconfClientConfiguration cfg) {
-        return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
-                cfg.getConnectionTimeoutMillis());
+        final List<Uri> odlHelloCapabilities = cfg.getOdlHelloCapabilities();
+        if (odlHelloCapabilities == null || odlHelloCapabilities.isEmpty()) {
+            return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
+                    cfg.getConnectionTimeoutMillis());
+        } else {
+            // LinkedHashSet since perhaps the device cares about order of hello message capabilities.
+            // This allows user control of the order while complying with the existing interface.
+            final Set<String> stringCapabilities = new LinkedHashSet<>();
+            for (final Uri uri : odlHelloCapabilities) {
+                stringCapabilities.add(uri.getValue());
+            }
+            return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
+                    cfg.getConnectionTimeoutMillis(), stringCapabilities);
+        }
     }
 }