Bump MRI upstreams
[netconf.git] / netconf / sal-netconf-connector / src / main / java / org / opendaylight / netconf / sal / connect / netconf / listener / NetconfSessionPreferences.java
index 084481eec736096ff700801aeb2efc1d75a9b75b..ba03a603ee70a111ceb745494fa18e496d962f87 100644 (file)
@@ -5,26 +5,27 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netconf.sal.connect.netconf.listener;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.base.MoreObjects;
 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.ImmutableMap;
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import java.net.URI;
+import com.google.common.collect.Maps;
 import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 import org.opendaylight.netconf.client.NetconfClientSession;
 import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability.CapabilityOrigin;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.XMLNamespace;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,17 +36,12 @@ public final class NetconfSessionPreferences {
         private final int skipLength;
 
         ParameterMatcher(final String name) {
-            predicate = new Predicate<String>() {
-                @Override
-                public boolean apply(final String input) {
-                    return input.startsWith(name);
-                }
-            };
+            predicate = input -> input.startsWith(name);
 
             this.skipLength = name.length();
         }
 
-        private String from(final Iterable<String> params) {
+        String from(final Iterable<String> params) {
             final Optional<String> o = Iterables.tryFind(params, predicate);
             if (!o.isPresent()) {
                 return null;
@@ -60,34 +56,37 @@ public final class NetconfSessionPreferences {
     private static final ParameterMatcher REVISION_PARAM = new ParameterMatcher("revision=");
     private static final ParameterMatcher BROKEN_REVISON_PARAM = new ParameterMatcher("amp;revision=");
     private static final Splitter AMP_SPLITTER = Splitter.on('&');
-    private static final Predicate<String> CONTAINS_REVISION = new Predicate<String>() {
-        @Override
-        public boolean apply(final String input) {
-            return input.contains("revision=");
-        }
-    };
+    private static final Predicate<String> CONTAINS_REVISION = input -> input.contains("revision=");
 
-    private final Set<QName> moduleBasedCaps;
-    private final Set<String> nonModuleCaps;
+    private final Map<QName, CapabilityOrigin> moduleBasedCaps;
+    private final Map<String, CapabilityOrigin> nonModuleCaps;
 
-    NetconfSessionPreferences(final Set<String> nonModuleCaps, final Set<QName> moduleBasedCaps) {
-        this.nonModuleCaps = Preconditions.checkNotNull(nonModuleCaps);
-        this.moduleBasedCaps = Preconditions.checkNotNull(moduleBasedCaps);
+    NetconfSessionPreferences(final Map<String, CapabilityOrigin> nonModuleCaps,
+                              final Map<QName, CapabilityOrigin> moduleBasedCaps) {
+        this.nonModuleCaps = requireNonNull(nonModuleCaps);
+        this.moduleBasedCaps = requireNonNull(moduleBasedCaps);
     }
 
     public Set<QName> getModuleBasedCaps() {
+        return moduleBasedCaps.keySet();
+    }
+
+    public Map<QName, CapabilityOrigin> getModuleBasedCapsOrigin() {
         return moduleBasedCaps;
     }
 
     public Set<String> getNonModuleCaps() {
+        return nonModuleCaps.keySet();
+    }
+
+    public Map<String, CapabilityOrigin> getNonModuleBasedCapsOrigin() {
         return nonModuleCaps;
     }
 
     // allows partial matches - assuming parameters are in the same order
     public boolean containsPartialNonModuleCapability(final String capability) {
-        final Iterator<String> iterator = nonModuleCaps.iterator();
-        while(iterator.hasNext()) {
-            if (iterator.next().startsWith(capability)) {
+        for (final String nonModuleCap : getNonModuleCaps()) {
+            if (nonModuleCap.startsWith(capability)) {
                 LOG.trace("capability {} partially matches {}", capability, nonModuleCaps);
                 return true;
             }
@@ -96,11 +95,11 @@ public final class NetconfSessionPreferences {
     }
 
     public boolean containsNonModuleCapability(final String capability) {
-        return nonModuleCaps.contains(capability);
+        return nonModuleCaps.containsKey(capability);
     }
 
     public boolean containsModuleCapability(final QName capability) {
-        return moduleBasedCaps.contains(capability);
+        return moduleBasedCaps.containsKey(capability);
     }
 
     @Override
@@ -134,32 +133,68 @@ public final class NetconfSessionPreferences {
 
     public boolean isMonitoringSupported() {
         return containsModuleCapability(NetconfMessageTransformUtil.IETF_NETCONF_MONITORING)
-                || containsPartialNonModuleCapability(NetconfMessageTransformUtil.IETF_NETCONF_MONITORING.getNamespace().toString());
+                || containsPartialNonModuleCapability(
+                        NetconfMessageTransformUtil.IETF_NETCONF_MONITORING.getNamespace().toString());
     }
 
     /**
-     * Merge module-based list of capabilities with current list of module-based capabilities
+     * Merge module-based list of capabilities with current list of module-based capabilities.
      *
      * @param netconfSessionModuleCapabilities capabilities to merge into this
      *
      * @return new instance of preferences with merged module-based capabilities
      */
     public NetconfSessionPreferences addModuleCaps(final NetconfSessionPreferences netconfSessionModuleCapabilities) {
-        final HashSet<QName> mergedCaps = Sets.newHashSetWithExpectedSize(moduleBasedCaps.size() + netconfSessionModuleCapabilities.getModuleBasedCaps().size());
-        mergedCaps.addAll(moduleBasedCaps);
-        mergedCaps.addAll(netconfSessionModuleCapabilities.getModuleBasedCaps());
-        return new NetconfSessionPreferences(getNonModuleCaps(), mergedCaps);
+        final Map<QName, CapabilityOrigin> mergedCaps = Maps.newHashMapWithExpectedSize(moduleBasedCaps.size()
+                + netconfSessionModuleCapabilities.getModuleBasedCaps().size());
+        mergedCaps.putAll(moduleBasedCaps);
+        mergedCaps.putAll(netconfSessionModuleCapabilities.getModuleBasedCapsOrigin());
+        return new NetconfSessionPreferences(getNonModuleBasedCapsOrigin(), mergedCaps);
     }
 
     /**
-     * Override current list of module-based capabilities
+     * Override current list of module-based capabilities.
      *
      * @param netconfSessionPreferences capabilities to override in this
      *
      * @return new instance of preferences with replaced module-based capabilities
      */
     public NetconfSessionPreferences replaceModuleCaps(final NetconfSessionPreferences netconfSessionPreferences) {
-        return new NetconfSessionPreferences(getNonModuleCaps(), netconfSessionPreferences.getModuleBasedCaps());
+        return new NetconfSessionPreferences(
+                getNonModuleBasedCapsOrigin(), netconfSessionPreferences.getModuleBasedCapsOrigin());
+    }
+
+    public NetconfSessionPreferences replaceModuleCaps(final Map<QName, CapabilityOrigin> newModuleBasedCaps) {
+        return new NetconfSessionPreferences(getNonModuleBasedCapsOrigin(), newModuleBasedCaps);
+    }
+
+
+    /**
+     * Merge list of non-module based capabilities with current list of non-module based capabilities.
+     *
+     * @param netconfSessionNonModuleCapabilities capabilities to merge into this
+     *
+     * @return new instance of preferences with merged non-module based capabilities
+     */
+    public NetconfSessionPreferences addNonModuleCaps(
+            final NetconfSessionPreferences netconfSessionNonModuleCapabilities) {
+        final Map<String, CapabilityOrigin> mergedCaps = Maps.newHashMapWithExpectedSize(
+                nonModuleCaps.size() + netconfSessionNonModuleCapabilities.getNonModuleCaps().size());
+        mergedCaps.putAll(getNonModuleBasedCapsOrigin());
+        mergedCaps.putAll(netconfSessionNonModuleCapabilities.getNonModuleBasedCapsOrigin());
+        return new NetconfSessionPreferences(mergedCaps, getModuleBasedCapsOrigin());
+    }
+
+    /**
+     * Override current list of non-module based capabilities.
+     *
+     * @param netconfSessionPreferences capabilities to override in this
+     *
+     * @return new instance of preferences with replaced non-module based capabilities
+     */
+    public NetconfSessionPreferences replaceNonModuleCaps(final NetconfSessionPreferences netconfSessionPreferences) {
+        return new NetconfSessionPreferences(
+                netconfSessionPreferences.getNonModuleBasedCapsOrigin(), getModuleBasedCapsOrigin());
     }
 
     public static NetconfSessionPreferences fromNetconfSession(final NetconfClientSession session) {
@@ -171,14 +206,21 @@ public final class NetconfSessionPreferences {
     }
 
     private static QName cachedQName(final String namespace, final String moduleName) {
-        return QName.create(URI.create(namespace), null, moduleName).withoutRevision().intern();
+        return QName.create(XMLNamespace.of(namespace), moduleName).withoutRevision().intern();
     }
 
     public static NetconfSessionPreferences fromStrings(final Collection<String> capabilities) {
-        final Set<QName> moduleBasedCaps = new HashSet<>();
-        final Set<String> nonModuleCaps = Sets.newHashSet(capabilities);
+        // we do not know origin of capabilities from only Strings, so we set it to default value
+        return fromStrings(capabilities, CapabilityOrigin.DeviceAdvertised);
+    }
+
+    public static NetconfSessionPreferences fromStrings(final Collection<String> capabilities,
+                                                        final CapabilityOrigin capabilityOrigin) {
+        final Map<QName, CapabilityOrigin> moduleBasedCaps = new HashMap<>();
+        final Map<String, CapabilityOrigin> nonModuleCaps = new HashMap<>();
 
         for (final String capability : capabilities) {
+            nonModuleCaps.put(capability, capabilityOrigin);
             final int qmark = capability.indexOf('?');
             if (qmark == -1) {
                 continue;
@@ -193,7 +235,8 @@ public final class NetconfSessionPreferences {
 
             String revision = REVISION_PARAM.from(queryParams);
             if (!Strings.isNullOrEmpty(revision)) {
-                addModuleQName(moduleBasedCaps, nonModuleCaps, capability, cachedQName(namespace, revision, moduleName));
+                addModuleQName(moduleBasedCaps, nonModuleCaps, capability, cachedQName(namespace, revision, moduleName),
+                        capabilityOrigin);
                 continue;
             }
 
@@ -207,27 +250,31 @@ public final class NetconfSessionPreferences {
                 revision = BROKEN_REVISON_PARAM.from(queryParams);
                 if (Strings.isNullOrEmpty(revision)) {
                     LOG.warn("Netconf device returned revision incorrectly escaped for {}, ignoring it", capability);
-                    addModuleQName(moduleBasedCaps, nonModuleCaps, capability, cachedQName(namespace, moduleName));
+                    addModuleQName(moduleBasedCaps, nonModuleCaps, capability,
+                            cachedQName(namespace, moduleName), capabilityOrigin);
                 } else {
-                    addModuleQName(moduleBasedCaps, nonModuleCaps, capability, cachedQName(namespace, revision, moduleName));
+                    addModuleQName(moduleBasedCaps, nonModuleCaps, capability,
+                            cachedQName(namespace, revision, moduleName), capabilityOrigin);
                 }
                 continue;
             }
 
             // Fallback, no revision provided for module
-            addModuleQName(moduleBasedCaps, nonModuleCaps, capability, cachedQName(namespace, moduleName));
+            addModuleQName(moduleBasedCaps, nonModuleCaps, capability,
+                    cachedQName(namespace, moduleName), capabilityOrigin);
         }
 
-        return new NetconfSessionPreferences(ImmutableSet.copyOf(nonModuleCaps), ImmutableSet.copyOf(moduleBasedCaps));
+        return new NetconfSessionPreferences(ImmutableMap.copyOf(nonModuleCaps), ImmutableMap.copyOf(moduleBasedCaps));
     }
 
-
-    private static void addModuleQName(final Set<QName> moduleBasedCaps, final Set<String> nonModuleCaps, final String capability, final QName qName) {
-        moduleBasedCaps.add(qName);
+    private static void addModuleQName(final Map<QName, CapabilityOrigin> moduleBasedCaps,
+                                       final Map<String, CapabilityOrigin> nonModuleCaps, final String capability,
+                                       final QName qualifiedName, final CapabilityOrigin capabilityOrigin) {
+        moduleBasedCaps.put(qualifiedName, capabilityOrigin);
         nonModuleCaps.remove(capability);
     }
 
-    private NetconfDeviceCapabilities capabilities = new NetconfDeviceCapabilities();
+    private final NetconfDeviceCapabilities capabilities = new NetconfDeviceCapabilities();
 
     public NetconfDeviceCapabilities getNetconfDeviceCapabilities() {
         return capabilities;