You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xbean-scm@geronimo.apache.org by db...@apache.org on 2012/04/15 23:51:23 UTC
svn commit: r1326428 -
/geronimo/xbean/trunk/xbean-finder/src/main/java/org/apache/xbean/finder/archive/JarArchive.java
Author: dblevins
Date: Sun Apr 15 21:51:23 2012
New Revision: 1326428
URL: http://svn.apache.org/viewvc?rev=1326428&view=rev
Log:
XBEAN-206: use jarfile instead of jarinputstream when possible
Iterator changes based on patch from Romain Manni-Bucau.
Other JarArchive.getBytecode changes in similar vein.
Modified:
geronimo/xbean/trunk/xbean-finder/src/main/java/org/apache/xbean/finder/archive/JarArchive.java
Modified: geronimo/xbean/trunk/xbean-finder/src/main/java/org/apache/xbean/finder/archive/JarArchive.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-finder/src/main/java/org/apache/xbean/finder/archive/JarArchive.java?rev=1326428&r1=1326427&r2=1326428&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-finder/src/main/java/org/apache/xbean/finder/archive/JarArchive.java (original)
+++ geronimo/xbean/trunk/xbean-finder/src/main/java/org/apache/xbean/finder/archive/JarArchive.java Sun Apr 15 21:51:23 2012
@@ -16,19 +16,16 @@
*/
package org.apache.xbean.finder.archive;
-import java.io.BufferedInputStream;
-import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
-import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
-import java.util.jar.JarInputStream;
+import java.util.zip.ZipEntry;
/**
* @version $Rev$ $Date$
@@ -38,11 +35,25 @@ public class JarArchive implements Archi
private final ClassLoader loader;
private final URL url;
private List<String> list;
+ private final JarFile jar;
public JarArchive(ClassLoader loader, URL url) {
// if (!"jar".equals(url.getProtocol())) throw new IllegalArgumentException("not a jar url: " + url);
- this.loader = loader;
- this.url = url;
+
+ try {
+ this.loader = loader;
+ this.url = url;
+ URL u = url;
+
+ String jarPath = url.getFile();
+ if (jarPath.contains("!")) {
+ jarPath = jarPath.substring(0, jarPath.indexOf("!"));
+ u = new URL(jarPath);
+ }
+ jar = new JarFile(u.getFile().replace("%20", " ")); // no more an url
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
}
public URL getUrl() {
@@ -62,10 +73,10 @@ public class JarArchive implements Archi
className = className.replace('.', '/') + ".class";
}
- URL resource = loader.getResource(className);
- if (resource != null) return new BufferedInputStream(resource.openStream());
+ ZipEntry entry = jar.getEntry(className);
+ if (entry == null) throw new ClassNotFoundException(className);
- throw new ClassNotFoundException(className);
+ return jar.getInputStream(entry);
}
@@ -79,55 +90,33 @@ public class JarArchive implements Archi
private class JarIterator implements Iterator<Entry> {
- private final JarInputStream stream;
- private final NonClosable nonClosable;
+ private final Enumeration<JarEntry> stream;
private Entry next;
private JarIterator() {
- try {
- URL u = url;
-
- String jarPath = url.getFile();
- if (jarPath.contains("!")){
- jarPath = jarPath.substring(0, jarPath.indexOf("!"));
- u = new URL(jarPath);
- }
- InputStream in = u.openStream();
- in = new BufferedInputStream(in, 1024 * 50);
- stream = new JarInputStream(in);
- nonClosable = new NonClosable(stream);
- } catch (IOException e) {
- throw new IllegalStateException(e);
- }
+ stream = jar.entries();
}
private boolean advance() {
if (next != null) return true;
- try {
- final JarEntry entry = stream.getNextJarEntry();
+ if (!stream.hasMoreElements()) return false;
- if (entry == null) {
- next = null;
- return false;
- }
+ final JarEntry entry = stream.nextElement();
- if (entry.isDirectory() || !entry.getName().endsWith(".class")) {
- return advance();
- }
+ if (entry.isDirectory() || !entry.getName().endsWith(".class")) {
+ return advance();
+ }
- final String className = entry.getName().replaceFirst(".class$", "");
+ final String className = entry.getName().replaceFirst(".class$", "");
- if (className.contains(".")) {
- return advance();
- }
+ if (className.contains(".")) {
+ return advance();
+ }
- next = new ClassEntry(className.replace('/', '.'));
+ next = new ClassEntry(entry, className.replace('/', '.'));
- return true;
- } catch (IOException e) {
- throw new IllegalStateException(e);
- }
+ return true;
}
public boolean hasNext() {
@@ -147,9 +136,11 @@ public class JarArchive implements Archi
private class ClassEntry implements Entry {
private final String name;
+ private final JarEntry entry;
- private ClassEntry(String name) {
+ private ClassEntry(JarEntry entry, String name) {
this.name = name;
+ this.entry = entry;
}
public String getName() {
@@ -157,19 +148,9 @@ public class JarArchive implements Archi
}
public InputStream getBytecode() throws IOException {
- return nonClosable;
+ return jar.getInputStream(entry);
}
}
}
-
- public static class NonClosable extends FilterInputStream {
- public NonClosable(InputStream in) {
- super(in);
- }
-
- @Override
- public void close() throws IOException {
- }
- }
}