From 9c900e9f7c483f5f7b0402da05f7f1dcb457cf56 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Thu, 17 Dec 2015 13:20:18 +0100 Subject: [PATCH] Fix empty revision handling in NETCONF capability If a capability exposed by a netconf server contains revision parameter but has no value there e.g. some-namespace=some-module&revision= connection would fail with NPE in netconf connector. Change-Id: I74a2548dffc524b06c2bcca04e9bd267ed8c7201 Signed-off-by: Maros Marsalek --- .../netconf/listener/NetconfSessionPreferences.java | 11 ++++++----- .../listener/NetconfSessionPreferencesTest.java | 7 +++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferences.java b/opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferences.java index b4f14eef05..5016067cd1 100644 --- a/opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferences.java +++ b/opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferences.java @@ -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 capabilities) { @@ -155,12 +156,12 @@ public final class NetconfSessionPreferences { final String namespace = capability.substring(0, qmark); final Iterable 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 { diff --git a/opendaylight/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferencesTest.java b/opendaylight/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferencesTest.java index 9b34fbf31f..0e5150949d 100644 --- a/opendaylight/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferencesTest.java +++ b/opendaylight/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfSessionPreferencesTest.java @@ -57,11 +57,14 @@ public class NetconfSessionPreferencesTest { "namespace:2?module=module2", "namespace:2?module=module2&revision=2012-12-12", "namespace:2?module=module1&RANDOMSTRING;revision=2013-12-12", - "namespace:2?module=module2&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&RANDOMSTRING;revision=", + // This one should be ignored(same as first), since revision is in wrong format + "namespace:2?module=module2&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) { -- 2.36.6