You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2018/02/23 17:43:55 UTC

lucene-solr:master: SOLR-12021: Fixed a bug in ApiSpec and other JSON resource loading that was causing unclosed file handles

Repository: lucene-solr
Updated Branches:
  refs/heads/master df0f14190 -> 9e0e301f9


SOLR-12021: Fixed a bug in ApiSpec and other JSON resource loading that was causing unclosed file handles


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9e0e301f
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9e0e301f
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9e0e301f

Branch: refs/heads/master
Commit: 9e0e301f9fe4a1b5e33925ae4d2848ead71cca25
Parents: df0f141
Author: Chris Hostetter <ho...@apache.org>
Authored: Fri Feb 23 10:43:22 2018 -0700
Committer: Chris Hostetter <ho...@apache.org>
Committed: Fri Feb 23 10:43:22 2018 -0700

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 ++
 .../java/org/apache/solr/common/util/Utils.java | 15 ++++++++++++---
 .../solr/common/util/ValidatingJsonMap.java     | 20 +++++++++++++-------
 3 files changed, 27 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e0e301f/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 8286065..df7db59 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -223,6 +223,8 @@ Bug Fixes
 * SOLR-11971: Don't allow referal to external resources in DataImportHandler's dataConfig request parameter.
   (麦 香浓郁, Uwe Schindler)
 
+* SOLR-12021: Fixed a bug in ApiSpec and other JSON resource loading that was causing unclosed file handles (hossman)
+
 Optimizations
 ----------------------
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e0e301f/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
index 4ab24d2..d35486e 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
@@ -23,6 +23,7 @@ import java.io.Reader;
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.lang.invoke.MethodHandles;
+import java.net.URL;
 import java.net.URLDecoder;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -200,9 +201,17 @@ public class Utils {
     }
   }
 
-  public static Object fromJSONResource(String resourceName){
-   return fromJSON(Utils.class.getClassLoader().getResourceAsStream(resourceName));
-
+  public static Object fromJSONResource(String resourceName) {
+    final URL resource = Utils.class.getClassLoader().getResource(resourceName);
+    if (null == resource) {
+      throw new IllegalArgumentException("invalid resource name: " + resourceName);
+    }
+    try (InputStream stream = resource.openStream()) {
+      return fromJSON(stream);
+    } catch (IOException e) {
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
+                              "Resource error: " + e.getMessage(), e);
+    }
   }
   public static JSONParser getJSONParser(Reader reader){
     JSONParser parser = new JSONParser(reader);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e0e301f/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
index 4edef90..28c0019 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -313,17 +314,22 @@ public class ValidatingJsonMap implements Map<String, Object> {
   }
 
   public static ValidatingJsonMap parse(String resourceName, String includeLocation) {
-    InputStream is = ValidatingJsonMap.class.getClassLoader().getResourceAsStream(resourceName);
-    if (is == null)
+    final URL resource = ValidatingJsonMap.class.getClassLoader().getResource(resourceName);
+    if (null == resource) {
       throw new RuntimeException("invalid API spec: " + resourceName);
+    }
     ValidatingJsonMap map = null;
-    try {
-      map = fromJSON(is, includeLocation);
-    } catch (Exception e) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error in JSON : " + resourceName, e);
+    try (InputStream is = resource.openStream()) {
+      try {
+        map = fromJSON(is, includeLocation);
+      } catch (Exception e) {
+        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error in JSON : " + resourceName, e);
+      }
+    } catch (IOException ioe) {
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
+                              "Unable to read resource: " + resourceName, ioe);
     }
     if (map == null) throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Empty value for " + resourceName);
-
     return getDeepCopy(map, 5, false);
   }