Close module URL stream as soon as possible 38/83938/1
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 23 Aug 2019 14:43:58 +0000 (16:43 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 23 Aug 2019 14:51:18 +0000 (16:51 +0200)
This refactors LibraryModulesSchemas.createFromURLConnection()
to close the stream before doing any further processing. This
lowers resource needs as well as makes for simpler code.

Change-Id: I08f242005185637f6dcbd37fe4ba86051624e56d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/LibraryModulesSchemas.java

index bb181ad4ca4879a37aacb3eb78e9aa5331dce098..8b0c3ebf804a05278d4f6141454fc3e9a9807e39 100644 (file)
@@ -221,20 +221,18 @@ public final class LibraryModulesSchemas implements NetconfDeviceSchemas {
      * @return Resolved URLs with YANG schema resources for all yang modules from yang library
      */
     public static LibraryModulesSchemas create(final String url) {
+        final URLConnection connection;
         try {
-            final URL urlConnection = new URL(requireNonNull(url));
-            final URLConnection connection = urlConnection.openConnection();
-
-            if (connection instanceof HttpURLConnection) {
-                connection.setRequestProperty("Accept", "application/xml");
-            }
-
-            return createFromURLConnection(connection);
-
+            connection = new URL(requireNonNull(url)).openConnection();
         } catch (final IOException e) {
             LOG.warn("Unable to download yang library from {}", url, e);
             return new LibraryModulesSchemas(ImmutableMap.of());
         }
+
+        if (connection instanceof HttpURLConnection) {
+            connection.setRequestProperty("Accept", "application/xml");
+        }
+        return createFromURLConnection(connection);
     }
 
     private static Optional<? extends NormalizedNode<?, ?>> findModulesStateNode(final NormalizedNode<?, ?> result) {
@@ -262,27 +260,26 @@ public final class LibraryModulesSchemas implements NetconfDeviceSchemas {
         requireNonNull(contentType, "Content type unknown");
         checkState(contentType.equals("application/json") || contentType.equals("application/xml"),
                 "Only XML and JSON types are supported.");
-        try (InputStream in = connection.getInputStream()) {
-            final Optional<NormalizedNode<?, ?>> optionalModulesStateNode =
-                    contentType.equals("application/json") ? readJson(in) : readXml(in);
-
-            if (!optionalModulesStateNode.isPresent()) {
-                return new LibraryModulesSchemas(ImmutableMap.of());
-            }
-
-            final NormalizedNode<?, ?> modulesStateNode = optionalModulesStateNode.get();
-            checkState(modulesStateNode instanceof ContainerNode,
-                "Expecting container containing module list, but was %s", modulesStateNode);
-            final ContainerNode modulesState = (ContainerNode) modulesStateNode;
-
-            final NodeIdentifier nodeName = modulesState.getIdentifier();
-            checkState(MODULES_STATE_NID.equals(nodeName), "Wrong container identifier %s", nodeName);
 
-            return create((ContainerNode) modulesStateNode);
+        Optional<NormalizedNode<?, ?>> optionalModulesStateNode = Optional.empty();
+        try (InputStream in = connection.getInputStream()) {
+            optionalModulesStateNode = contentType.equals("application/json") ? readJson(in) : readXml(in);
         } catch (final IOException e) {
             LOG.warn("Unable to download yang library from {}", connection.getURL(), e);
+        }
+
+        if (!optionalModulesStateNode.isPresent()) {
             return new LibraryModulesSchemas(ImmutableMap.of());
         }
+
+        final NormalizedNode<?, ?> modulesStateNode = optionalModulesStateNode.get();
+        checkState(modulesStateNode instanceof ContainerNode, "Expecting container containing module list, but was %s",
+            modulesStateNode);
+        final ContainerNode modulesState = (ContainerNode) modulesStateNode;
+        final NodeIdentifier nodeName = modulesState.getIdentifier();
+        checkState(MODULES_STATE_NID.equals(nodeName), "Wrong container identifier %s", nodeName);
+
+        return create((ContainerNode) modulesStateNode);
     }
 
     private static boolean guessJsonFromFileName(final String fileName) {