Makefile.am (ordinary_java_source_files): Added new Connection and Handler classes...
authorWarren Levy <warrenl@cygnus.com>
Thu, 15 Apr 1999 21:33:39 +0000 (21:33 +0000)
committerWarren Levy <warrenl@gcc.gnu.org>
Thu, 15 Apr 1999 21:33:39 +0000 (21:33 +0000)
* Makefile.am (ordinary_java_source_files): Added new Connection
and Handler classes in gnu.gcj.protocol.file package.
* Makefile.in: Rebuilt.
* gnu/gcj/protocol/file/Connection.java: New file.
* gnu/gcj/protocol/file/Handler.java: New file.
* gnu/gcj/protocol/http/Connection.java (getInputStream): Check
if doInput allows input.
(getOutputStream): Check if doOutput allows output.
* java/net/URLStreamHandler.java (parseURL): Fix indentation.

From-SVN: r26479

libjava/ChangeLog
libjava/Makefile.am
libjava/Makefile.in
libjava/gnu/gcj/protocol/file/Connection.java [new file with mode: 0644]
libjava/gnu/gcj/protocol/file/Handler.java [new file with mode: 0644]
libjava/gnu/gcj/protocol/http/Connection.java
libjava/java/net/URLStreamHandler.java

index beed92336d369e5ad880ae9263ebef4816512d58..92b21d11ed1be7ada37af7d3e105fa3111c73483 100644 (file)
@@ -1,3 +1,16 @@
+1999-04-15  Warren Levy  <warrenl@cygnus.com>
+
+       * Makefile.am (ordinary_java_source_files): Added new Connection 
+       and Handler classes in gnu.gcj.protocol.file package.
+       * Makefile.in: Rebuilt.
+
+       * gnu/gcj/protocol/file/Connection.java: New file.
+       * gnu/gcj/protocol/file/Handler.java: New file.
+       * gnu/gcj/protocol/http/Connection.java (getInputStream): Check
+       if doInput allows input.
+       (getOutputStream): Check if doOutput allows output.
+       * java/net/URLStreamHandler.java (parseURL): Fix indentation.
+
 1999-04-14  Tom Tromey  <tromey@cygnus.com>
 
        * java/net/natInetAddress.cc (lookup): On glibc2.0 systems, make
index 09c725e2cb3cbee1ca05474ea78d4e1c113c123a..9c1aca1f1285a6f761ff38fbed7c51057dc9f2ae 100644 (file)
@@ -332,6 +332,8 @@ gnu/gcj/text/LocaleData_en.java     \
 gnu/gcj/text/LocaleData_en_US.java \
 gnu/gcj/text/SentenceBreakIterator.java        \
 gnu/gcj/text/WordBreakIterator.java \
+gnu/gcj/protocol/file/Connection.java \
+gnu/gcj/protocol/file/Handler.java \
 gnu/gcj/protocol/http/Connection.java \
 gnu/gcj/protocol/http/Handler.java \
 java/io/BufferedInputStream.java \
index 71007af1e66ac52970241f1ce09f074951b467ce..857b79cc8a3f0fe42766d77469a3ab2c0e576c3f 100644 (file)
@@ -212,6 +212,8 @@ gnu/gcj/text/LocaleData_en.java     \
 gnu/gcj/text/LocaleData_en_US.java \
 gnu/gcj/text/SentenceBreakIterator.java        \
 gnu/gcj/text/WordBreakIterator.java \
+gnu/gcj/protocol/file/Connection.java \
+gnu/gcj/protocol/file/Handler.java \
 gnu/gcj/protocol/http/Connection.java \
 gnu/gcj/protocol/http/Handler.java \
 java/io/BufferedInputStream.java \
@@ -552,6 +554,8 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P .deps/boehm.P \
 .deps/gnu/gcj/convert/Output_JavaSrc.P \
 .deps/gnu/gcj/convert/Output_UTF8.P \
 .deps/gnu/gcj/convert/UnicodeToBytes.P \
+.deps/gnu/gcj/protocol/file/Connection.P \
+.deps/gnu/gcj/protocol/file/Handler.P \
 .deps/gnu/gcj/protocol/http/Connection.P \
 .deps/gnu/gcj/protocol/http/Handler.P \
 .deps/gnu/gcj/text/BaseBreakIterator.P \
diff --git a/libjava/gnu/gcj/protocol/file/Connection.java b/libjava/gnu/gcj/protocol/file/Connection.java
new file mode 100644 (file)
index 0000000..7ad7ca0
--- /dev/null
@@ -0,0 +1,169 @@
+// Connection.java - Implementation of URLConnection for file protocol.
+
+/* Copyright (C) 1999  Cygnus Solutions
+
+   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.file;
+
+import java.net.*;
+import java.io.*;
+import java.util.Vector;
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date April 13, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status:  Minimal subset of functionality.
+ */
+
+class Connection extends URLConnection
+{
+  private Hashtable hdrHash = new Hashtable();
+  private Vector hdrVec = new Vector();
+  private boolean gotHeaders = false;
+  private File fileIn;
+
+  public Connection(URL url)
+  {
+    super(url);
+  }
+
+  // Implementation of abstract method.
+  public void connect() throws IOException
+  {
+    // Call is ignored if already connected.
+    if (connected)
+      return;
+
+    // If not connected, then file needs to be openned.
+    fileIn = new File(url.getFile());
+    connected = true;
+  }
+
+  public InputStream getInputStream() throws IOException
+  {
+    if (!connected)
+      connect();
+
+    if (! doInput)
+      throw new ProtocolException("Can't open InputStream if doInput is false");
+    return new BufferedInputStream(new FileInputStream(fileIn));
+  }
+
+  // Override default method in URLConnection.
+  public OutputStream getOutputStream() throws IOException
+  {
+    if (!connected)
+      connect();
+
+    if (! doOutput)
+      throw new
+       ProtocolException("Can't open OutputStream if doOutput is false");
+    return new BufferedOutputStream(new FileOutputStream(fileIn));
+  }
+
+  // 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 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 = fileIn.length();
+    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));
+  }
+}
diff --git a/libjava/gnu/gcj/protocol/file/Handler.java b/libjava/gnu/gcj/protocol/file/Handler.java
new file mode 100644 (file)
index 0000000..de7d79b
--- /dev/null
@@ -0,0 +1,49 @@
+// Handler.java - URLStreamHandler for file protocol.
+
+/* Copyright (C) 1999  Cygnus Solutions
+
+   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.file;
+
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.io.IOException;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date April 13, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status:  Minimal functionality.
+ */
+
+public class Handler extends URLStreamHandler
+{
+  protected URLConnection openConnection(URL url) throws IOException
+  {
+    // If a hostname is set, then we need to switch protocols to ftp
+    // in order to transfer this from the remote host.
+    if (! url.getHost().equals(""))
+      {
+       // Reset the protocol (and implicitly the handler) for this URL.
+       // Then have the URL attempt the connection again, as it will
+       // get the changed handler the next time around.
+       url.set("ftp", url.getHost(), url.getPort(), url.getFile(),
+               url.getRef());
+       // Until the ftp protocol handler is written, this will cause
+       // a NullPointerException.
+       return url.openConnection();
+      }
+
+    return new Connection(url);
+  }
+}
index aee6fdd3e571446eafc3aa4dc5cb726048d9b17d..e76aa772a134dc619e8ce5ef53b82caeb9aec03e 100644 (file)
@@ -135,6 +135,8 @@ class Connection extends HttpURLConnection
     if (!connected)
       connect();
 
+    if (! doInput)
+      throw new ProtocolException("Can't open InputStream if doInput is false");
     if (bufferedIn == null)
       bufferedIn = new BufferedInputStream(sock.getInputStream());
     return bufferedIn;
@@ -146,6 +148,9 @@ class Connection extends HttpURLConnection
     if (!connected)
       connect();
 
+    if (! doOutput)
+      throw new
+       ProtocolException("Can't open OutputStream if doOutput is false");
     return sock.getOutputStream();
   }
 
index 29e0e6d4137c54e15736b230eb417a00058bbf69..ae364e4dbf9fe3f46e3cac383a83ebc369171e74 100644 (file)
@@ -26,7 +26,7 @@ public abstract class URLStreamHandler
   protected abstract URLConnection openConnection(URL u)
     throws java.io.IOException;
 
-protected void parseURL(URL u, String spec, int start, int limit)
+  protected void parseURL(URL u, String spec, int start, int limit)
   {
     String tmpStr;
     String host = "";  // Initialize to null string.