Merge pull request #187 from glyptodon/resource-leak

GUAC-587: Ensure resource streams are always closed.
This commit is contained in:
James Muehlner
2015-05-21 23:25:22 -07:00

View File

@@ -145,6 +145,42 @@ public class LanguageResourceService {
} }
/**
* Parses the given language resource, returning the resulting JsonNode.
* If the resource cannot be read because it does not exist, null is
* returned.
*
* @param resource
* The language resource to parse. Language resources must have the
* mimetype "application/json".
*
* @return
* A JsonNode representing the root of the parsed JSON tree, or null if
* the given resource does not exist.
*
* @throws IOException
* If an error occurs while parsing the resource as JSON.
*/
private JsonNode parseLanguageResource(Resource resource) throws IOException {
// Get resource stream
InputStream stream = resource.asStream();
if (stream == null)
return null;
// Parse JSON tree
try {
JsonNode tree = mapper.readTree(stream);
return tree;
}
// Ensure stream is always closed
finally {
stream.close();
}
}
/** /**
* Adds or overlays the given language resource, which need not exist in * Adds or overlays the given language resource, which need not exist in
* the ServletContext. If a language resource is already defined for the * the ServletContext. If a language resource is already defined for the
@@ -169,17 +205,19 @@ public class LanguageResourceService {
try { try {
// Get resource stream // Read the original language resource
InputStream existingStream = existing.asStream(); JsonNode existingTree = parseLanguageResource(existing);
InputStream resourceStream = resource.asStream(); if (existingTree == null) {
if (existingStream == null || resourceStream == null) { logger.warn("Base language resource \"{}\" does not exist.", key);
logger.warn("Language resource \"{}\" does not exist.", key);
return; return;
} }
// Read the original and new language resources // Read new language resource
JsonNode existingTree = mapper.readTree(existingStream); JsonNode resourceTree = parseLanguageResource(resource);
JsonNode resourceTree = mapper.readTree(resourceStream); if (resourceTree == null) {
logger.warn("Overlay language resource \"{}\" does not exist.", key);
return;
}
// Merge the language resources // Merge the language resources
JsonNode mergedTree = mergeTranslations(existingTree, resourceTree); JsonNode mergedTree = mergeTranslations(existingTree, resourceTree);