Always close the InputStreams returned from Jar.getResource (#46)
* Always close the InputStreams returned from Jar.getResource * Tentative change to not open inputstream when checking if a resource exists
This commit is contained in:
parent
7c09caa222
commit
908f24e8ec
@ -75,12 +75,26 @@ public class Jar implements Closeable {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean containsClass(String clazz) {
|
public boolean containsClass(String clazz) {
|
||||||
try {
|
if (contains.contains(clazz)) {
|
||||||
return contains.contains(clazz) ? true : getClass(clazz) != null;
|
return true;
|
||||||
} catch (IOException ex) {
|
}
|
||||||
// IO error - regardless we do not have access to the class, so we can ignore it and move on
|
|
||||||
|
if (containsResource(clazz + ".class")) {
|
||||||
|
contains.add(clazz);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this jar contains the given resource.
|
||||||
|
*
|
||||||
|
* @param name The name of the resource
|
||||||
|
* @return true Whether a resource with the given name exists
|
||||||
|
*/
|
||||||
|
public boolean containsResource(String name) {
|
||||||
|
JarFile jarFile = jarForResource.get(name);
|
||||||
|
return jarFile != null && jarFile.getEntry(name) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -128,8 +142,13 @@ public class Jar implements Closeable {
|
|||||||
try {
|
try {
|
||||||
InputStream is = getClass(clazz);
|
InputStream is = getClass(clazz);
|
||||||
if (is != null) {
|
if (is != null) {
|
||||||
|
ClassReader cr;
|
||||||
// Process it
|
// Process it
|
||||||
ClassReader cr = new ClassReader(is);
|
try {
|
||||||
|
cr = new ClassReader(is);
|
||||||
|
} finally {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
ClassNode node = new ClassNode();
|
ClassNode node = new ClassNode();
|
||||||
cr.accept(node, 0);
|
cr.accept(node, 0);
|
||||||
|
|
||||||
|
@ -299,8 +299,20 @@ public class SpecialSource {
|
|||||||
JarComparer visitor1 = visitors.first;
|
JarComparer visitor1 = visitors.first;
|
||||||
JarComparer visitor2 = visitors.second;
|
JarComparer visitor2 = visitors.second;
|
||||||
|
|
||||||
ClassReader clazz1 = new ClassReader(jars.first.getClass(classes.first));
|
ClassReader clazz1, clazz2;
|
||||||
ClassReader clazz2 = new ClassReader(jars.second.getClass(classes.second));
|
InputStream first = null;
|
||||||
|
InputStream second = null;
|
||||||
|
try {
|
||||||
|
clazz1 = new ClassReader(first = jars.second.getClass(classes.first));
|
||||||
|
clazz2 = new ClassReader(second = jars.first.getClass(classes.second));
|
||||||
|
} finally {
|
||||||
|
if (first != null) {
|
||||||
|
first.close();
|
||||||
|
}
|
||||||
|
if (second != null) {
|
||||||
|
second.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
clazz1.accept(visitor1, 0);
|
clazz1.accept(visitor1, 0);
|
||||||
clazz2.accept(visitor2, 0);
|
clazz2.accept(visitor2, 0);
|
||||||
|
|
||||||
|
@ -28,11 +28,8 @@
|
|||||||
*/
|
*/
|
||||||
package net.md_5.specialsource.repo;
|
package net.md_5.specialsource.repo;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import net.md_5.specialsource.Jar;
|
import net.md_5.specialsource.Jar;
|
||||||
import org.objectweb.asm.ClassReader;
|
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -42,23 +39,6 @@ public class JarRepo extends CachingRepo {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ClassNode findClass0(String internalName) {
|
protected ClassNode findClass0(String internalName) {
|
||||||
ClassNode node = null;
|
return jar.getNode(internalName);
|
||||||
|
|
||||||
try {
|
|
||||||
InputStream is = jar.getClass(internalName);
|
|
||||||
|
|
||||||
if (is != null) {
|
|
||||||
ClassReader reader = new ClassReader(is);
|
|
||||||
ClassNode node0 = new ClassNode();
|
|
||||||
reader.accept(node0, 0); // TODO
|
|
||||||
is.close();
|
|
||||||
|
|
||||||
node = node0;
|
|
||||||
}
|
|
||||||
} catch (IOException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user