JarScanner: Fix resource leak flagged by infer

This fixes resource leak with JarFile instance acquired by call to
ctor of JarScanner.

Bug: Issue 5198
Change-Id: I80feabcf9e0bfd683d1d8c47f3fd6c9be3ff65a6
This commit is contained in:
David Ostrovsky 2016-12-26 09:06:23 +01:00 committed by David Pursehouse
parent 3e82acac08
commit 944b51634a
3 changed files with 26 additions and 21 deletions

View File

@ -163,7 +163,7 @@ public class SwitchSecureStore extends SiteProgram {
private String getNewSecureStoreClassName(Path secureStore) private String getNewSecureStoreClassName(Path secureStore)
throws IOException { throws IOException {
JarScanner scanner = new JarScanner(secureStore); try (JarScanner scanner = new JarScanner(secureStore)) {
List<String> newSecureStores = List<String> newSecureStores =
scanner.findSubClassesOf(SecureStore.class); scanner.findSubClassesOf(SecureStore.class);
if (newSecureStores.isEmpty()) { if (newSecureStores.isEmpty()) {
@ -178,6 +178,7 @@ public class SwitchSecureStore extends SiteProgram {
} }
return Iterables.getOnlyElement(newSecureStores); return Iterables.getOnlyElement(newSecureStores);
} }
}
private String getCurrentSecureStoreClassName(SitePaths sitePaths) { private String getCurrentSecureStoreClassName(SitePaths sitePaths) {
String current = getSecureStoreClassFromGerritConfig(sitePaths); String current = getSecureStoreClassFromGerritConfig(sitePaths);

View File

@ -310,13 +310,12 @@ public class BaseInit extends SiteProgram {
return null; return null;
} }
try {
Path secureStoreLib = Paths.get(secureStore); Path secureStoreLib = Paths.get(secureStore);
if (!Files.exists(secureStoreLib)) { if (!Files.exists(secureStoreLib)) {
throw new InvalidSecureStoreException(String.format( throw new InvalidSecureStoreException(String.format(
"File %s doesn't exist", secureStore)); "File %s doesn't exist", secureStore));
} }
JarScanner scanner = new JarScanner(secureStoreLib); try (JarScanner scanner = new JarScanner(secureStoreLib)) {
List<String> secureStores = List<String> secureStores =
scanner.findSubClassesOf(SecureStore.class); scanner.findSubClassesOf(SecureStore.class);
if (secureStores.isEmpty()) { if (secureStores.isEmpty()) {

View File

@ -53,7 +53,7 @@ import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.jar.Manifest; import java.util.jar.Manifest;
public class JarScanner implements PluginContentScanner { public class JarScanner implements PluginContentScanner, AutoCloseable {
private static final int SKIP_ALL = ClassReader.SKIP_CODE private static final int SKIP_ALL = ClassReader.SKIP_CODE
| ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES; | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES;
private final JarFile jarFile; private final JarFile jarFile;
@ -131,6 +131,11 @@ public class JarScanner implements PluginContentScanner {
return findSubClassesOf(superClass.getName()); return findSubClassesOf(superClass.getName());
} }
@Override
public void close() throws IOException {
jarFile.close();
}
private List<String> findSubClassesOf(String superClass) throws IOException { private List<String> findSubClassesOf(String superClass) throws IOException {
String name = superClass.replace('.', '/'); String name = superClass.replace('.', '/');