/* Copyright (C) 1999 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package gnu.gcj.protocol.jar; import java.net.URL; import java.net.JarURLConnection; import java.net.URLStreamHandler; import java.net.MalformedURLException; import java.net.ProtocolException; import java.io.IOException; import java.util.jar.JarFile; import java.util.Hashtable; /** * Written using on-line Java Platform 1.2 API Specification. * Status: Needs a way to download jar files and store them in the local file * system. I don't know how to do that in a portable way. For now, it can only handle * connections to a jar:file: url's. * * @author Kresten Krab Thorup * @date Aug 10, 1999. */ public class Connection extends JarURLConnection { static Hashtable file_cache = new Hashtable(); private JarFile jarfile; public Connection(URL url) throws MalformedURLException { super(url); } public synchronized JarFile getJarFile() throws java.io.IOException { if (!connected) connect(); if (! doInput) throw new ProtocolException("Can't open JarFile if doInput is false"); if (jarfile != null) return jarfile; URL jarFileURL = getJarFileURL (); if (jarFileURL.getProtocol ().equals ("file") && jarFileURL.getHost ().equals ("")) { if (getUseCaches()) { jarfile = (JarFile) file_cache.get(jarFileURL); if (jarfile == null) { jarfile = new JarFile (jarFileURL.getFile ()); file_cache.put (jarFileURL, jarfile); } } else jarfile = new JarFile (jarFileURL.getFile ()); } else { /* FIXME: Here we need to download and cache the jar file in the local file system! Stupid design. Why can't we just create a JarFile from a bag of bytes? */ throw new java.io.IOException("cannot create jar file from " + jarFileURL); } return jarfile; } }