Commit 32cf6a3b by Chris Burdess Committed by Michael Koch

Connection.java: Return correct content length for directory listing.

2005-04-27  Chris Burdess  <dog@gnu.org>

	* gnu/java/net/protocol/file/Connection.java: Return correct content
	length for directory listing.
	* java/net/URLClassLoader.java: Correction for URLClassLoader, bug
	#11285: return valid URLs for directories.i

From-SVN: r98884
parent 529eec21
2005-04-27 Chris Burdess <dog@gnu.org>
* gnu/java/net/protocol/file/Connection.java: Return correct content
length for directory listing.
* java/net/URLClassLoader.java: Correction for URLClassLoader, bug
#11285: return valid URLs for directories.i
2005-04-27 Thomas Fitzsimmons <fitzsim@redhat.com> 2005-04-27 Thomas Fitzsimmons <fitzsim@redhat.com>
* Makefile.am (ordinary_java_source_files): Add * Makefile.am (ordinary_java_source_files): Add
......
...@@ -42,6 +42,7 @@ import gnu.java.security.action.GetPropertyAction; ...@@ -42,6 +42,7 @@ import gnu.java.security.action.GetPropertyAction;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
...@@ -49,6 +50,8 @@ import java.io.FilePermission; ...@@ -49,6 +50,8 @@ import java.io.FilePermission;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ProtocolException; import java.net.ProtocolException;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
...@@ -82,12 +85,26 @@ public class Connection extends URLConnection ...@@ -82,12 +85,26 @@ public class Connection extends URLConnection
private static String lineSeparator; private static String lineSeparator;
static
{
if (lineSeparator == null)
{
GetPropertyAction getProperty = new GetPropertyAction("line.separator");
lineSeparator = (String) AccessController.doPrivileged(getProperty);
}
}
/** /**
* This is a File object for this connection * This is a File object for this connection
*/ */
private File file; private File file;
/** /**
* If a directory, contains a list of files in the directory.
*/
private byte[] directoryListing;
/**
* InputStream if we are reading from the file * InputStream if we are reading from the file
*/ */
private InputStream inputStream; private InputStream inputStream;
...@@ -136,19 +153,7 @@ public class Connection extends URLConnection ...@@ -136,19 +153,7 @@ public class Connection extends URLConnection
{ {
if (doInput) if (doInput)
{ {
if (lineSeparator == null) inputStream = new ByteArrayInputStream(getDirectoryListing());
{
GetPropertyAction getProperty = new GetPropertyAction("line.separator");
lineSeparator = (String) AccessController.doPrivileged(getProperty);
}
StringBuffer sb = new StringBuffer();
String[] files = file.list();
for (int index = 0; index < files.length; ++index)
sb.append(files[index]).append(lineSeparator);
inputStream = new ByteArrayInputStream(sb.toString().getBytes());
} }
if (doOutput) if (doOutput)
...@@ -158,6 +163,32 @@ public class Connection extends URLConnection ...@@ -158,6 +163,32 @@ public class Connection extends URLConnection
connected = true; connected = true;
} }
/**
* Populates the <code>directoryListing</code> field with a byte array
* containing a representation of the directory listing.
*/
byte[] getDirectoryListing()
throws IOException
{
if (directoryListing == null)
{
ByteArrayOutputStream sink = new ByteArrayOutputStream();
// NB uses default character encoding for this system
Writer writer = new OutputStreamWriter(sink);
String[] files = file.list();
for (int i = 0; i < files.length; i++)
{
writer.write(files[i]);
writer.write(lineSeparator);
}
directoryListing = sink.toByteArray();
}
return directoryListing;
}
/** /**
* Opens the file for reading and returns a stream for it. * Opens the file for reading and returns a stream for it.
...@@ -231,7 +262,13 @@ public class Connection extends URLConnection ...@@ -231,7 +262,13 @@ public class Connection extends URLConnection
if (field.equals("content-type")) if (field.equals("content-type"))
return guessContentTypeFromName(file.getName()); return guessContentTypeFromName(file.getName());
else if (field.equals("content-length")) else if (field.equals("content-length"))
return Long.toString(file.length()); {
if (file.isDirectory())
{
return Integer.toString(getContentLength());
}
return Long.toString(file.length());
}
else if (field.equals("last-modified")) else if (field.equals("last-modified"))
{ {
synchronized (dateFormat) synchronized (dateFormat)
...@@ -259,6 +296,10 @@ public class Connection extends URLConnection ...@@ -259,6 +296,10 @@ public class Connection extends URLConnection
if (!connected) if (!connected)
connect(); connect();
if (file.isDirectory())
{
return getDirectoryListing().length;
}
return (int) file.length(); return (int) file.length();
} }
catch (IOException e) catch (IOException e)
......
...@@ -610,7 +610,7 @@ public class URLClassLoader extends SecureClassLoader ...@@ -610,7 +610,7 @@ public class URLClassLoader extends SecureClassLoader
Resource getResource(String name) Resource getResource(String name)
{ {
File file = new File(dir, name); File file = new File(dir, name);
if (file.exists() && ! file.isDirectory()) if (file.exists())
return new FileResource(this, name, file); return new FileResource(this, name, file);
return null; return null;
} }
...@@ -628,11 +628,36 @@ public class URLClassLoader extends SecureClassLoader ...@@ -628,11 +628,36 @@ public class URLClassLoader extends SecureClassLoader
InputStream getInputStream() throws IOException InputStream getInputStream() throws IOException
{ {
// Delegate to the URL content handler mechanism to retrieve an
// HTML representation of the directory listing if a directory
if (file.isDirectory())
{
URL url = getURL();
return url.openStream();
}
// Otherwise simply return a FileInputStream
return new FileInputStream(file); return new FileInputStream(file);
} }
public int getLength() public int getLength()
{ {
// Delegate to the URL content handler mechanism to retrieve the
// length of the HTML representation of the directory listing if
// a directory, or -1 if an exception occurs opening the directory.
if (file.isDirectory())
{
URL url = getURL();
try
{
URLConnection connection = url.openConnection();
return connection.getContentLength();
}
catch (IOException e)
{
return -1;
}
}
// Otherwise simply return the file length
return (int) file.length(); return (int) file.length();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment