This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI: Patch: jar connection handling


Hi list,


I commited the attached patch to move the implementation details from 
java.net.JarURLConnection to gnu.java.net.protocol.jar.Connection (where they 
belong).


Michael
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2474
diff -u -b -B -r1.2474 ChangeLog
--- ChangeLog	20 Dec 2003 22:36:02 -0000	1.2474
+++ ChangeLog	20 Dec 2003 22:53:49 -0000
@@ -1,5 +1,34 @@
 2003-12-20  Michael Koch  <konqueror@gmx.de>
 
+	* gnu/java/net/protocol/jar/Connection.java
+	(connectionCache): New field.
+	(connect): New method.
+	(getInputStream): New method.
+	(hdrHash): New field.
+	(hdrVec): New field.
+	(gotHeaders): New field.
+	(getHeaderField): New method.
+	(getHeaderFields): New method.
+	(getHeaderFieldKey): New method.
+	(getKey): New method.
+	(getField): New method.
+	(getHeaders): New method.
+	* java/net/JarURLConnection.java
+	(connectionCache): Removed.
+	(connect): Removed.
+	(getInputStream): Removed.
+	(hdrHash): Removed.
+	(hdrVec): Removed.
+	(gotHeaders): Removed.
+	(getHeaderField): Removed.
+	(getHeaderFields): Removed.
+	(getHeaderFieldKey): Removed.
+	(getKey): Removed.
+	(getField): Removed.
+	(getHeaders): Removed.
+
+2003-12-20  Michael Koch  <konqueror@gmx.de>
+
 	* java/io/ObjectStreamField.java (isUnshared): Added documentation.
 
 2003-12-20  Mohan Embar  <gnustuff@thisiscool.com>
Index: gnu/java/net/protocol/jar/Connection.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/net/protocol/jar/Connection.java,v
retrieving revision 1.3
diff -u -b -B -r1.3 Connection.java
--- gnu/java/net/protocol/jar/Connection.java	2 Dec 2003 14:19:34 -0000	1.3
+++ gnu/java/net/protocol/jar/Connection.java	20 Dec 2003 22:53:49 -0000
@@ -38,6 +38,8 @@
 
 package gnu.java.net.protocol.jar;
 
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
@@ -47,9 +49,15 @@
 import java.net.ProtocolException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.Map;
+import java.util.Vector;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.jar.JarFile;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
 import java.util.zip.ZipFile;
+import java.util.zip.ZipEntry;
 
 /**
  * This subclass of java.net.JarURLConnection models a URLConnection via
@@ -62,12 +70,109 @@
   private static Hashtable file_cache = new Hashtable();
   private JarFile jar_file;
 
+  /**
+   * Cached JarURLConnection objects .
+   */
+  static HashMap connectionCache = new HashMap();
+
   protected Connection(URL url)
     throws MalformedURLException
   {
     super(url);
   }
 
+  public synchronized void connect() throws IOException
+  {
+    // Call is ignored if already connected.
+    if (connected)
+      return;
+
+    if (getUseCaches())
+      {
+	jarFileURLConnection =
+          (URLConnection) connectionCache.get(getJarFileURL());
+
+	if (jarFileURLConnection == null)
+	  {
+	    jarFileURLConnection = getJarFileURL().openConnection();
+	    jarFileURLConnection.setUseCaches(true);
+	    jarFileURLConnection.connect();
+	    connectionCache.put(getJarFileURL(), jarFileURLConnection);
+	  }
+      }
+    else
+      {
+	jarFileURLConnection = getJarFileURL().openConnection();
+	jarFileURLConnection.connect();
+      }
+
+    connected = true;
+  }
+
+  public InputStream getInputStream() throws IOException
+  {
+    if (!connected)
+      connect();
+
+    if (! doInput)
+      throw new ProtocolException("Can't open InputStream if doInput is false");
+
+    if (getEntryName() == null)
+      {
+	// This is a JarURLConnection for the entire jar file.  
+
+	InputStream in = new BufferedInputStream
+	  (jarFileURLConnection.getInputStream());
+	return new JarInputStream(in);
+      }
+
+    // Reaching this point, we're looking for an entry of a jar file.
+
+    JarFile jarfile = null;
+
+    try
+      {
+	jarfile = getJarFile ();
+      }
+    catch (IOException x)
+      {
+	/* ignore */
+      }
+    
+    if (jarfile != null)
+      {
+	// this is the easy way...
+	ZipEntry entry = jarfile.getEntry(getEntryName());
+        
+	if (entry != null)
+	  return jarfile.getInputStream (entry);
+	else
+	  return null;
+      }
+    else
+      {
+	// If the jar file is not local, ...
+	JarInputStream zis = new JarInputStream(
+			jarFileURLConnection.getInputStream ());
+
+	// This is hideous, we're doing a linear search...
+	for (ZipEntry entry = zis.getNextEntry(); 
+	     entry != null; 
+	     entry = zis.getNextEntry())
+	  {
+	    if (getEntryName().equals(entry.getName()))
+	      {
+		int size = (int) entry.getSize();
+		byte[] data = new byte[size];
+		zis.read (data, 0, size);
+		return new ByteArrayInputStream (data);
+	      }
+	  }
+      }
+
+    return null;
+  }
+
   public synchronized JarFile getJarFile() throws IOException
   {
     if (!connected)
@@ -116,4 +221,128 @@
     return jar_file;
   }
 
+  // Steal and borrow from protocol/file/Connection.java
+
+  private Hashtable hdrHash = new Hashtable();
+  private Vector hdrVec = new Vector();
+  private boolean gotHeaders = false;
+
+  // Override default method in URLConnection.
+  public String getHeaderField(String name)
+  {
+    try
+      {
+	getHeaders();
+      }
+    catch (IOException x)
+      {
+	return null;
+      }
+    return (String) hdrHash.get(name.toLowerCase());
+  }
+
+  // Override default method in URLConnection.
+  public Map getHeaderFields()
+  {
+    try
+      {
+        getHeaders();
+      }
+    catch (IOException x)
+      {
+        return null;
+      }
+    return hdrHash;
+  }
+
+  // Override default method in URLConnection.
+  public String getHeaderField(int n)
+  {
+    try
+      {
+	getHeaders();
+      }
+    catch (IOException x)
+      {
+	return null;
+      }
+    if (n < hdrVec.size())
+      return getField((String) hdrVec.elementAt(n));
+
+    return null;
+  }
+
+  // Override default method in URLConnection.
+  public String getHeaderFieldKey(int n)
+  {
+    try
+      {
+	getHeaders();
+      }
+    catch (IOException x)
+      {
+	return null;
+      }
+    if (n < hdrVec.size())
+      return getKey((String) hdrVec.elementAt(n));
+
+    return null;
+  }
+
+  private String getKey(String str)
+  {
+    if (str == null)
+      return null;
+    int index = str.indexOf(':');
+    if (index >= 0)
+      return str.substring(0, index);
+    else
+      return null;
+  }
+
+  private String getField(String str)
+  {
+    if (str == null)
+      return null;
+    int index = str.indexOf(':');
+    if (index >= 0)
+      return str.substring(index + 1).trim();
+    else
+      return str;
+  }
+
+  private void getHeaders() throws IOException
+  {
+    if (gotHeaders)
+      return;
+    gotHeaders = true;
+
+    connect();
+
+    // Yes, it is overkill to use the hash table and vector here since
+    // we're only putting one header in the file, but in case we need
+    // to add others later and for consistency, we'll implement it this way.
+
+    // Add the only header we know about right now:  Content-length.
+    long len = -1;
+
+    if (getEntryName() == null)
+      if (jarFileURLConnection != null)
+	len = jarFileURLConnection.getContentLength ();
+    else
+      {
+	JarEntry entry = getJarEntry();
+	if (entry != null)
+	  len = entry.getSize ();
+      }
+
+    String line = "Content-length: " + len;
+    hdrVec.addElement(line);
+
+    // The key will never be null in this scenario since we build up the
+    // headers ourselves.  If we ever rely on getting a header from somewhere
+    // else, then we may have to check if the result of getKey() is null.
+    String key = getKey(line);
+    hdrHash.put(key.toLowerCase(), Long.toString(len));
+  }
 }
Index: java/net/JarURLConnection.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/net/JarURLConnection.java,v
retrieving revision 1.17
diff -u -b -B -r1.17 JarURLConnection.java
--- java/net/JarURLConnection.java	13 Oct 2003 05:34:53 -0000	1.17
+++ java/net/JarURLConnection.java	20 Dec 2003 22:53:49 -0000
@@ -38,9 +38,6 @@
 
 package java.net;
 
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
 import java.io.IOException;
 import java.util.jar.Attributes;
 import java.util.jar.JarEntry;
@@ -48,10 +45,6 @@
 import java.util.jar.JarInputStream;
 import java.util.jar.Manifest;
 import java.util.zip.ZipEntry;
-import java.util.Map;
-import java.util.Vector;
-import java.util.HashMap;
-import java.util.Hashtable;
 import java.security.cert.Certificate;
 
 /**
@@ -101,11 +94,6 @@
   private final String entryName;
 
   /**
-   * Cached JarURLConnection objects .
-   */
-  static HashMap connectionCache = new HashMap();
-
-  /**
    * Creates a JarURLConnection from an URL object
    *
    * @param URL url The URL object for this connection.
@@ -157,97 +145,6 @@
     return entryName;
   }
 
-  public synchronized void connect() throws IOException
-  {
-    // Call is ignored if already connected.
-    if (connected)
-      return;
-
-    if (getUseCaches())
-      {
-	jarFileURLConnection = (URLConnection) connectionCache.get (jarFileURL);
-
-	if (jarFileURLConnection == null)
-	  {
-	    jarFileURLConnection = jarFileURL.openConnection ();
-	    jarFileURLConnection.setUseCaches (true);
-	    jarFileURLConnection.connect ();
-	    connectionCache.put (jarFileURL, jarFileURLConnection);
-	  }
-      }
-    else
-      {
-	jarFileURLConnection = jarFileURL.openConnection ();
-	jarFileURLConnection.connect ();
-      }
-
-    connected = true;
-  }
-
-  public InputStream getInputStream() throws IOException
-  {
-    if (!connected)
-      connect();
-
-    if (! doInput)
-      throw new ProtocolException("Can't open InputStream if doInput is false");
-
-    if (entryName == null)
-      {
-	// This is a JarURLConnection for the entire jar file.  
-
-	InputStream jar_is = new BufferedInputStream(
-			jarFileURLConnection.getInputStream ());
-	return new JarInputStream(jar_is);
-      }
-
-    // Reaching this point, we're looking for an entry of a jar file.
-
-    JarFile jarfile = null;
-
-    try
-      {
-	jarfile = getJarFile ();
-      }
-    catch (IOException x)
-      {
-	/* ignore */
-      }
-    
-    if (jarfile != null)
-      {
-	// this is the easy way...
-	ZipEntry entry = jarfile.getEntry (entryName);
-        
-	if (entry != null)
-	  return jarfile.getInputStream (entry);
-	else
-	  return null;
-      }
-    else
-      {
-	// If the jar file is not local, ...
-	JarInputStream zis = new JarInputStream(
-			jarFileURLConnection.getInputStream ());
-
-	// This is hideous, we're doing a linear search...
-	for (ZipEntry ent = zis.getNextEntry (); 
-	     ent != null; 
-	     ent = zis.getNextEntry ())
-	  {
-	    if (entryName.equals (ent.getName()))
-	      {
-		int size = (int)ent.getSize();
-		byte[] data = new byte[size];
-		zis.read (data, 0, size);
-		return new ByteArrayInputStream (data);
-	      }
-	  }
-      }
-
-    return null;
-  }
-
   /**
    * Returns the entry in this jar file specified by the URL.  
    * 
@@ -307,131 +204,6 @@
    * @exception IOException If an error occurs
    */
   public abstract JarFile getJarFile () throws IOException;
-
-  // Steal and borrow from protocol/file/Connection.java
-
-  private Hashtable hdrHash = new Hashtable();
-  private Vector hdrVec = new Vector();
-  private boolean gotHeaders = false;
-
-  // Override default method in URLConnection.
-  public String getHeaderField(String name)
-  {
-    try
-      {
-	getHeaders();
-      }
-    catch (IOException x)
-      {
-	return null;
-      }
-    return (String) hdrHash.get(name.toLowerCase());
-  }
-
-  // Override default method in URLConnection.
-  public Map getHeaderFields()
-  {
-    try
-      {
-        getHeaders();
-      }
-    catch (IOException x)
-      {
-        return null;
-      }
-    return hdrHash;
-  }
-
-  // Override default method in URLConnection.
-  public String getHeaderField(int n)
-  {
-    try
-      {
-	getHeaders();
-      }
-    catch (IOException x)
-      {
-	return null;
-      }
-    if (n < hdrVec.size())
-      return getField((String) hdrVec.elementAt(n));
-
-    return null;
-  }
-
-  // Override default method in URLConnection.
-  public String getHeaderFieldKey(int n)
-  {
-    try
-      {
-	getHeaders();
-      }
-    catch (IOException x)
-      {
-	return null;
-      }
-    if (n < hdrVec.size())
-      return getKey((String) hdrVec.elementAt(n));
-
-    return null;
-  }
-
-  private String getKey(String str)
-  {
-    if (str == null)
-      return null;
-    int index = str.indexOf(':');
-    if (index >= 0)
-      return str.substring(0, index);
-    else
-      return null;
-  }
-
-  private String getField(String str)
-  {
-    if (str == null)
-      return null;
-    int index = str.indexOf(':');
-    if (index >= 0)
-      return str.substring(index + 1).trim();
-    else
-      return str;
-  }
-
-  private void getHeaders() throws IOException
-  {
-    if (gotHeaders)
-      return;
-    gotHeaders = true;
-
-    connect();
-
-    // Yes, it is overkill to use the hash table and vector here since
-    // we're only putting one header in the file, but in case we need
-    // to add others later and for consistency, we'll implement it this way.
-
-    // Add the only header we know about right now:  Content-length.
-    long len = -1;
-
-    if (entryName == null)
-      if (jarFileURLConnection != null)
-	len = jarFileURLConnection.getContentLength ();
-    else
-      {
-	JarEntry entry = getJarEntry();
-	if (entry != null)
-	  len = entry.getSize ();
-      }
-
-    String line = "Content-length: " + len;
-    hdrVec.addElement(line);
-
-    // The key will never be null in this scenario since we build up the
-    // headers ourselves.  If we ever rely on getting a header from somewhere
-    // else, then we may have to check if the result of getKey() is null.
-    String key = getKey(line);
-    hdrHash.put(key.toLowerCase(), Long.toString(len));
-  }
 
   /**
    * Returns an array of Certificate objects for the jar file entry specified

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]