summaryrefslogtreecommitdiff
path: root/gnu/java/net/protocol/jar/Connection.java
diff options
context:
space:
mode:
authorMichael Koch <konqueror@gmx.de>2003-10-18 10:04:09 +0000
committerMichael Koch <konqueror@gmx.de>2003-10-18 10:04:09 +0000
commit9e981aa163e1aa744eb28725cb4c82d1d4ee491a (patch)
tree5b54822ab8cc3372c42e34a7c6e11322b843ff45 /gnu/java/net/protocol/jar/Connection.java
parenta840e13389b068fc9c0cc0b4e3bb186031db19fe (diff)
downloadclasspath-9e981aa163e1aa744eb28725cb4c82d1d4ee491a.tar.gz
2003-10-18 Michael Koch <konqueror@gmx.de>
* gnu/java/net/protocol/file/FileURLConnection.java, gnu/java/net/protocol/http/HttpURLConnection.java, gnu/java/net/protocol/jar/JarURLConnection.java: Removed. * gnu/java/net/protocol/file/Connection.java, gnu/java/net/protocol/http/Connection.java, gnu/java/net/protocol/jar/Connection.java: New files. * gnu/java/net/protocol/jar/Handler.java, gnu/java/net/protocol/http/Handler.java, gnu/java/net/protocol/file/Handler.java, gnu/java/lang/SystemClassLoader.java: Use new files.
Diffstat (limited to 'gnu/java/net/protocol/jar/Connection.java')
-rw-r--r--gnu/java/net/protocol/jar/Connection.java176
1 files changed, 176 insertions, 0 deletions
diff --git a/gnu/java/net/protocol/jar/Connection.java b/gnu/java/net/protocol/jar/Connection.java
new file mode 100644
index 000000000..d45561b5d
--- /dev/null
+++ b/gnu/java/net/protocol/jar/Connection.java
@@ -0,0 +1,176 @@
+/* gnu.java.net.protocol.jar.JarURLConnection - jar url connection for java.net
+ Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.net.protocol.jar;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Hashtable;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.zip.ZipFile;
+
+/**
+ * This subclass of java.net.JarURLConnection models a URLConnection via
+ * the "jar" protocol.
+ *
+ */
+public class Connection extends JarURLConnection
+{
+ private JarFile jar_file;
+ private JarEntry jar_entry;
+ private URL jar_url;
+
+ public static class JarFileCache
+ {
+ private static Hashtable cache = new Hashtable();
+ private static final int READBUFSIZE = 4*1024;
+ private static boolean is_trying = false;
+
+ public static synchronized JarFile get (URL url) throws IOException
+ {
+ JarFile jf = (JarFile) cache.get (url);
+
+ if (jf != null)
+ return jf;
+
+ if (is_trying)
+ return null;
+
+ try
+ {
+ is_trying = true;
+
+ if ("file".equals (url.getProtocol()))
+ {
+ File f = new File (url.getFile());
+ jf = new JarFile (f, true, ZipFile.OPEN_READ);
+ }
+ else
+ {
+ URLConnection urlconn = url.openConnection();
+ InputStream is = urlconn.getInputStream();
+ byte[] buf = new byte [READBUFSIZE];
+ File f = File.createTempFile ("cache", "jar");
+ FileOutputStream fos = new FileOutputStream (f);
+ int len = 0;
+
+ while ((len = is.read (buf)) != -1)
+ {
+ fos.write (buf, 0, len);
+ }
+
+ fos.close();
+ // Always verify the Manifest, open read only and delete when done.
+ // XXX ZipFile.OPEN_DELETE not yet implemented.
+ // jf = new JarFile (f, true, ZipFile.OPEN_READ | ZipFile.OPEN_DELETE);
+ jf = new JarFile (f, true, ZipFile.OPEN_READ);
+ }
+
+ cache.put (url, jf);
+ }
+ finally
+ {
+ is_trying = false;
+ }
+
+ return jf;
+ }
+ }
+
+ public Connection (URL url) throws MalformedURLException, IOException
+ {
+ super (url);
+ jar_url = getJarFileURL();
+ }
+
+ public void connect() throws IOException
+ {
+ if (connected)
+ return;
+
+ jar_file = JarFileCache.get (jar_url);
+ String entry_name = getEntryName();
+
+ if (entry_name != null
+ && !entry_name.equals (""))
+ {
+ jar_entry = (JarEntry) jar_file.getEntry (entry_name);
+
+ //wgs
+ if(jar_entry == null)
+ throw new IOException ("No entry for " + entry_name + " exists.");
+ }
+
+ connected = true;
+ }
+
+ public JarFile getJarFile() throws IOException
+ {
+ if (!connected)
+ connect();
+
+ return jar_file;
+ }
+
+ public InputStream getInputStream() throws IOException
+ {
+ if (!connected)
+ connect();
+
+ if (jar_entry == null)
+ throw new IOException (jar_url + " couldn't be found.");
+
+ return jar_file.getInputStream (jar_entry);
+ }
+
+ public int getContentLength()
+ {
+ if (!connected)
+ return -1;
+
+ return (int) jar_entry.getSize();
+ }
+
+} // class JarURLConnection