Fix empty revision handling in NETCONF capability 00/31500/1
authorMaros Marsalek <mmarsale@cisco.com>
Thu, 17 Dec 2015 12:20:18 +0000 (13:20 +0100)
committerMaros Marsalek <mmarsale@cisco.com>
Thu, 17 Dec 2015 12:31:01 +0000 (13:31 +0100)
If a capability exposed by a netconf server contains revision parameter
but has no value there e.g.
<capability>some-namespace=some-module&amp;revision=</capability>

connection would fail with NPE in netconf connector.

Change-Id: I74a2548dffc524b06c2bcca04e9bd267ed8c7201
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferences.java
opendaylight/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferencesTest.java

index b4f14eef05fc3aba89d428b048e9dc0a72b5ebff..5016067cd1862eacf6805f282069582d3adbc6a5 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
@@ -135,11 +136,11 @@ public final class NetconfSessionPreferences {
     }
 
     private static QName cachedQName(final String namespace, final String revision, final String moduleName) {
-        return QName.cachedReference(QName.create(namespace, revision, moduleName));
+        return QName.create(namespace, revision, moduleName).intern();
     }
 
     private static QName cachedQName(final String namespace, final String moduleName) {
-        return QName.cachedReference(QName.create(URI.create(namespace), null, moduleName).withoutRevision());
+        return QName.create(URI.create(namespace), null, moduleName).withoutRevision().intern();
     }
 
     public static NetconfSessionPreferences fromStrings(final Collection<String> capabilities) {
@@ -155,12 +156,12 @@ public final class NetconfSessionPreferences {
             final String namespace = capability.substring(0, qmark);
             final Iterable<String> queryParams = AMP_SPLITTER.split(capability.substring(qmark + 1));
             final String moduleName = MODULE_PARAM.from(queryParams);
-            if (moduleName == null) {
+            if (Strings.isNullOrEmpty(moduleName)) {
                 continue;
             }
 
             String revision = REVISION_PARAM.from(queryParams);
-            if (revision != null) {
+            if (!Strings.isNullOrEmpty(revision)) {
                 addModuleQName(moduleBasedCaps, nonModuleCaps, capability, cachedQName(namespace, revision, moduleName));
                 continue;
             }
@@ -173,7 +174,7 @@ public final class NetconfSessionPreferences {
 
                 LOG.debug("Netconf device was not reporting revision correctly, trying to get amp;revision=");
                 revision = BROKEN_REVISON_PARAM.from(queryParams);
-                if (revision == null) {
+                if (Strings.isNullOrEmpty(revision)) {
                     LOG.warn("Netconf device returned revision incorrectly escaped for {}, ignoring it", capability);
                     addModuleQName(moduleBasedCaps, nonModuleCaps, capability, cachedQName(namespace, moduleName));
                 } else {
index 9b34fbf31f9be463db6812eb68b672fd90b71ef0..0e5150949d4981853d27a2215e635d41e02bb912 100644 (file)
@@ -57,11 +57,14 @@ public class NetconfSessionPreferencesTest {
                 "namespace:2?module=module2",
                 "namespace:2?module=module2&amp;revision=2012-12-12",
                 "namespace:2?module=module1&amp;RANDOMSTRING;revision=2013-12-12",
-                "namespace:2?module=module2&amp;RANDOMSTRING;revision=2013-12-12" // This one should be ignored(same as first), since revision is in wrong format
+                // Revision parameter present, but no revision defined
+                "namespace:2?module=module4&amp;RANDOMSTRING;revision=",
+                // This one should be ignored(same as first), since revision is in wrong format
+                "namespace:2?module=module2&amp;RANDOMSTRING;revision=2013-12-12"
         );
 
         final NetconfSessionPreferences sessionCaps1 = NetconfSessionPreferences.fromStrings(caps1);
-        assertCaps(sessionCaps1, 0, 3);
+        assertCaps(sessionCaps1, 0, 4);
     }
 
     private void assertCaps(final NetconfSessionPreferences sessionCaps1, final int nonModuleCaps, final int moduleCaps) {