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 com.google.common.collect.Maps;
import java.net.URI;
import java.util.Collection;
-import java.util.HashSet;
+import java.util.HashMap;
import java.util.Iterator;
+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.slf4j.Logger;
import org.slf4j.LoggerFactory;
}
};
- 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) {
+ NetconfSessionPreferences(final Map<String, CapabilityOrigin> nonModuleCaps,
+ final Map<QName, CapabilityOrigin> moduleBasedCaps) {
this.nonModuleCaps = Preconditions.checkNotNull(nonModuleCaps);
this.moduleBasedCaps = Preconditions.checkNotNull(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()) {
+ final Iterator<String> iterator = getNonModuleCaps().iterator();
+ while (iterator.hasNext()) {
if (iterator.next().startsWith(capability)) {
LOG.trace("capability {} partially matches {}", capability, nonModuleCaps);
return true;
}
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
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) {
}
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;
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;
}
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;