+
+ /**
+ * Extract {@link UserPreferences} from na {@link NetconfNode}.
+ *
+ * @param node A {@link NetconfNode}
+ * @return {@link UserPreferences}, potentially {@code null}
+ * @throws NullPointerException if {@code node} is {@code null}
+ * @throws IllegalArgumentException there are any non-module capabilities
+ */
+ public static @Nullable UserPreferences extractUserCapabilities(final NetconfNode node) {
+ final var moduleCaps = node.getYangModuleCapabilities();
+ final var nonModuleCaps = node.getNonModuleCapabilities();
+
+ if (moduleCaps == null && nonModuleCaps == null) {
+ // if none of yang-module-capabilities or non-module-capabilities is specified
+ return null;
+ }
+
+ final var capabilities = new ArrayList<String>();
+ final boolean overrideYangModuleCaps;
+ if (moduleCaps != null) {
+ capabilities.addAll(moduleCaps.getCapability());
+ overrideYangModuleCaps = moduleCaps.getOverride();
+ } else {
+ overrideYangModuleCaps = false;
+ }
+
+ //non-module capabilities should not exist in yang module capabilities
+ final var sessionPreferences = NetconfSessionPreferences.fromStrings(capabilities);
+ final var nonModulePrefs = sessionPreferences.getNonModuleCaps();
+ if (!nonModulePrefs.isEmpty()) {
+ throw new IllegalArgumentException("List yang-module-capabilities/capability should contain only module "
+ + "based capabilities. Non-module capabilities used: " + nonModulePrefs);
+ }
+
+ final boolean overrideNonModuleCaps;
+ if (nonModuleCaps != null) {
+ capabilities.addAll(nonModuleCaps.getCapability());
+ overrideNonModuleCaps = nonModuleCaps.getOverride();
+ } else {
+ overrideNonModuleCaps = false;
+ }
+
+ return new UserPreferences(NetconfSessionPreferences.fromStrings(capabilities, CapabilityOrigin.UserDefined),
+ overrideYangModuleCaps, overrideNonModuleCaps);
+ }