+ public static LibraryModulesSchemas create(final NetconfDeviceRpc deviceRpc, final RemoteDeviceId deviceId) {
+ final DOMRpcResult moduleListNodeResult;
+ try {
+ moduleListNodeResult =
+ deviceRpc.invokeRpc(toPath(NETCONF_GET_QNAME), GET_MODULES_STATE_MODULE_LIST_RPC).get();
+ } catch (final InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new RuntimeException(deviceId + ": Interrupted while waiting for response to "
+ + MODULES_STATE_MODULE_LIST, e);
+ } catch (final ExecutionException e) {
+ LOG.warn("{}: Unable to detect available schemas, get to {} failed", deviceId, MODULES_STATE_MODULE_LIST, e);
+ return new LibraryModulesSchemas(Collections.<QName, URL>emptyMap());
+ }
+
+ if(moduleListNodeResult.getErrors().isEmpty() == false) {
+ LOG.warn("{}: Unable to detect available schemas, get to {} failed, {}",
+ deviceId, MODULES_STATE_MODULE_LIST, moduleListNodeResult.getErrors());
+ return new LibraryModulesSchemas(Collections.<QName, URL>emptyMap());
+ }
+
+
+ final Optional<? extends NormalizedNode<?, ?>> modulesStateNode =
+ findModulesStateNode(moduleListNodeResult.getResult());
+ if(modulesStateNode.isPresent()) {
+ Preconditions.checkState(modulesStateNode.get() instanceof ContainerNode,
+ "Expecting container containing schemas, but was %s", modulesStateNode.get());
+ return create(((ContainerNode) modulesStateNode.get()));
+ } else {
+ LOG.warn("{}: Unable to detect available schemas, get to {} was empty", deviceId, toId(ModulesState.QNAME));
+ return new LibraryModulesSchemas(Collections.<QName, URL>emptyMap());
+ }
+ }
+
+ private static Optional<? extends NormalizedNode<?, ?>> findModulesStateNode(final NormalizedNode<?, ?> result) {
+ if(result == null) {
+ return Optional.absent();
+ }
+ final Optional<DataContainerChild<?, ?>> dataNode = ((DataContainerNode<?>) result).getChild(toId(NETCONF_DATA_QNAME));
+ if(dataNode.isPresent() == false) {
+ return Optional.absent();
+ }
+
+ return ((DataContainerNode<?>) dataNode.get()).getChild(toId(ModulesState.QNAME));
+ }
+
+ private static LibraryModulesSchemas create(final ContainerNode modulesStateNode) {
+ final YangInstanceIdentifier.NodeIdentifier moduleListNodeId =
+ new YangInstanceIdentifier.NodeIdentifier(Module.QNAME);
+ final Optional<DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?>> moduleListNode =
+ modulesStateNode.getChild(moduleListNodeId);
+ Preconditions.checkState(moduleListNode.isPresent(),
+ "Unable to find list: %s in %s", moduleListNodeId, modulesStateNode);
+ Preconditions.checkState(moduleListNode.get() instanceof MapNode,
+ "Unexpected structure for container: %s in : %s. Expecting a list",
+ moduleListNodeId, modulesStateNode);
+
+ final ImmutableMap.Builder<QName, URL> schemasMapping = new ImmutableMap.Builder<>();
+ for (final MapEntryNode moduleNode : ((MapNode) moduleListNode.get()).getValue()) {
+ final Optional<Map.Entry<QName, URL>> schemaMappingEntry = createFromEntry(moduleNode);
+ if (schemaMappingEntry.isPresent()) {
+ schemasMapping.put(createFromEntry(moduleNode).get());
+ }
+ }
+
+ return new LibraryModulesSchemas(schemasMapping.build());
+ }
+
+ private static LibraryModulesSchemas createFromURLConnection(final URLConnection connection) {