Initial revision

From-SVN: r102074
This commit is contained in:
Tom Tromey 2005-07-16 00:30:23 +00:00
parent 6f4434b39b
commit f911ba985a
4557 changed files with 1000262 additions and 0 deletions

View file

@ -0,0 +1,56 @@
/* ASN1ParsingException.java -- ASN.1 parsing exception.
Copyright (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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.io;
/**
* Signals a malformed ASN.1 sequence.
*/
public class ASN1ParsingException extends java.io.IOException
{
public ASN1ParsingException()
{
super();
}
public ASN1ParsingException(String msg)
{
super(msg);
}
}

View file

@ -0,0 +1,216 @@
/* Base64InputStream.java -- base-64 input stream.
Copyright (C) 2003, 2004 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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.io;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* A filter input stream that decodes data encoded in the Base-64
* encoding scheme.
*
* @author Casey Marshall (rsdio@metastatic.org)
*/
public class Base64InputStream extends FilterInputStream
{
// Constants and fields.
// ------------------------------------------------------------------------
/** Base-64 digits. */
private static final String BASE_64 =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/** Base-64 padding character. */
private static final char BASE_64_PAD = '=';
/** Decoding state. */
private int state;
/** Intermediate decoded value. */
private int temp;
/** EOF flag. */
private boolean eof;
private final byte[] one = new byte[1];
// Constructors.
// ------------------------------------------------------------------------
/**
* Create a new Base-64 input stream. The input bytes must be the
* ASCII characters A-Z, a-z, 0-9, + and /, with optional whitespace,
* and will be decoded into a byte stream.
*
* @param in The source of Base-64 input.
*/
public Base64InputStream(InputStream in)
{
super(in);
state = 0;
temp = 0;
eof = false;
}
// Class method.
// ------------------------------------------------------------------------
/**
* Decode a single Base-64 string to a byte array.
*
* @param base64 The Base-64 encoded data.
* @return The decoded bytes.
* @throws IOException If the given data do not compose a valid Base-64
* sequence.
*/
public static byte[] decode(String base64) throws IOException
{
Base64InputStream in =
new Base64InputStream(new ByteArrayInputStream(base64.getBytes()));
ByteArrayOutputStream out =
new ByteArrayOutputStream((int) (base64.length() / 0.666));
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1)
out.write(buf, 0, len);
return out.toByteArray();
}
// Instance methods.
// ------------------------------------------------------------------------
public int available()
{
return 0;
}
public int read() throws IOException
{
if (read(one) == 1)
return one[0];
return -1;
}
public int read(byte[] buf, int off, int len) throws IOException
{
if (eof)
return -1;
int count = 0;
while (count < len)
{
int i;
while (Character.isWhitespace((char) (i = in.read())));
int pos = BASE_64.indexOf((char) i);
if (pos >= 0)
{
switch (state)
{
case 0:
temp = pos << 2;
state = 1;
break;
case 1:
buf[count++] = (byte) (temp | (pos >>> 4));
temp = (pos & 0x0F) << 4;
state = 2;
break;
case 2:
buf[count++] = (byte) (temp | (pos >>> 2));
temp = (pos & 0x03) << 6;
state = 3;
break;
case 3:
buf[count++] = (byte) (temp | pos);
state = 0;
break;
}
}
else if (i == BASE_64_PAD)
{
switch (state)
{
case 0:
case 1:
throw new IOException("malformed Base-64 input");
case 2:
while (Character.isWhitespace((char) (i = in.read())));
if (i != BASE_64_PAD)
throw new IOException("malformed Base-64 input");
case 3:
while (Character.isWhitespace((char) (i = in.read())));
}
eof = true;
break;
}
else // First non-Base-64 character, consider it end-of-stream.
{
if (state != 0)
throw new IOException("malformed Base-64 input");
eof = true;
break;
}
}
return count;
}
public boolean markSupported()
{
return false;
}
public void mark(int markLimit) { }
public void reset() throws IOException
{
throw new IOException("reset not supported");
}
public long skip(long n) throws IOException
{
long skipped;
for (skipped = 0; skipped < n; skipped++)
if (read() == -1)
break;
return skipped;
}
}

View file

@ -0,0 +1,73 @@
/* gnu.java.io.ClassLoaderObjectInputStream
Copyright (C) 1998 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.StreamCorruptedException;
/**
* ClassLoaderObjectInputStream is ObjectInputStream, with
* the ability to use a specific ClassLoader.
*
* @author Geoff Berry
* @version 1.1.0, 29 Jul 1998
*/
public class ClassLoaderObjectInputStream extends ObjectInputStream {
ClassLoader myClassLoader;
/** Create the new ClassLoaderObjectInputStream.
* @param in the InputStream to read the Objects from.
* @param myClassLoader the ClassLoader to load classes
* with.
*/
public ClassLoaderObjectInputStream(InputStream in, ClassLoader myClassLoader) throws IOException,StreamCorruptedException {
super(in);
this.myClassLoader = myClassLoader;
}
/** Overriden method to use the loadClass() method from
* the ClassLoader.
*/
public Class resolveClass(String name) throws IOException, ClassNotFoundException {
return myClassLoader.loadClass(name);
}
}

View file

@ -0,0 +1,56 @@
/* NullOutputStream.java -- OutputStream that does absolutely nothing
Copyright (C) 1998 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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.io;
import java.io.OutputStream;
/**
This is a placeholder OutputStream that does absolutley nothing
when written to. It is intended to be used in the same manner as
/dev/null. None of this class's methods do anything at all.
*/
public class NullOutputStream extends OutputStream
{
public NullOutputStream() {}
public void write( int b ) {}
public void write( byte b[] ) {}
public void write( byte b[], int off, int len ) {}
public void flush() {}
public void close() {}
}

View file

@ -0,0 +1,100 @@
/* ObjectIdentityWrapper.java -- Wrapper class used to override equals()
and hashCode() to be as discriminating as possible
Copyright (C) 1998 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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.io;
/**
This class is a thin wrapper around <code>Object</code> that makes
the methods <code>hashCode()</code> and <code>equals(Object)</code>
as discriminating as possible.
*/
public class ObjectIdentityWrapper
{
/**
Constructs a <code>ObjectIdentityWrapper</code> that is wrapped
around o.
*/
public ObjectIdentityWrapper( Object o )
{
object = o;
}
/**
Uses <code>System.identityHashCode(Object)</code> to compute a
hash code for the object wrapped by this
<code>ObjectIdentityWrapper</code>.
@see java.lang.System#identityHashCode(java.lang.Object)
@see java.util.Hashtable
@see java.lang.Object#hashCode()
*/
public int hashCode()
{
return System.identityHashCode( object );
}
/**
Uses the <code>==</code> operator to test for equality between
the object wrapped by this <code>ObjectIdentityWrapper</code> and
the object wrapped by the <code>ObjectIdentityWrapper</code> o.
Returns false if o is not a <code>ObjectIdentityWrapper</code>.
@see java.util.Hashtable
@see java.lang.Object#equals()
*/
public boolean equals( Object o )
{
if( o instanceof ObjectIdentityWrapper )
return object == ((ObjectIdentityWrapper)o).object;
else
return false;
}
public String toString()
{
return "ObjectIdentityWrapper< " + object + ", " + hashCode() + " >";
}
/**
The <code>Object</code> wrapped by this
<code>ObjectIdentityWrapper</code>.
*/
public Object object;
}

View file

@ -0,0 +1,228 @@
/* PlatformHelper.java -- Isolate OS-specific IO helper methods and variables
Copyright (C) 1998, 2002 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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.io;
import java.util.StringTokenizer;
/**
* We had many changes in File.java, URLStreamHandler.java etc. to handle
* path representations on different platforms (Windows/Unix-family).
* Finally we'd like to collect all these ad hoc codes into this utility class.
* --Gansha
*/
public class PlatformHelper
{
public static final boolean isWindows = System.getProperty("os.name").indexOf("Windows") >= 0;
public static final String separator = System.getProperty("file.separator");
public static final char separatorChar = separator.charAt(0);
public static final String pathSeparator = System.getProperty("path.separator");
public static final char pathSeparatorChar = pathSeparator.charAt(0);
/**
* On most platforms 260 is equal or greater than a max path value,
* so we can set the initial buffer size of StringBuffer to half of this value
* to improve performance.
*/
public static final int INITIAL_MAX_PATH = 260/2;
/**
* This routine checks the input param "path" whether it begins with root path
* prefix.
* if not, return 0;
* if yes, return the len of root path prefix;
* --for Unix-family platform, root path begins with "/" and len is 1
* --for Windows platform, root path begins with "drive:\\" and len is 3
*/
public static final int beginWithRootPathPrefix(String path)
{
if (path.startsWith("/") || path.startsWith("\\"))
return 1;
if (!isWindows)
return 0;
if (path.length() > 2
&& Character.isLetter(path.charAt(0))
&& path.charAt(1) == ':'
&& (path.charAt(2) == '/' || path.charAt(2) == '\\'))
return 3;
return 0;
}
/**
* This routine checks the input param "path" whether it's root directory.
* --for Unix-family platform, root directory is "/"
* --for Windows platform, root directory is "\\" or "drive:\\".
*/
public static final boolean isRootDirectory(String path)
{
int len = path.length();
return len > 0 && beginWithRootPathPrefix(path) == len;
}
/**
* This routine canonicalizes input param "path" to formal path representation
* for current platform, including interpreting ".." and "." .
*/
public static final String toCanonicalForm(String path)
{
/*??
if(path.indexOf('.') < 0 && path.indexOf("..") < 0)
return path;
*/
String tmppath = path.replace('/', separatorChar);
StringBuffer canonpath;
// We found it'll be more efficient and easy to handle to
// return a lowercased canonical path
if(isWindows)
tmppath = tmppath.toLowerCase();
int i;
if ((i = beginWithRootPathPrefix(tmppath)) == 0 )
return path;
/* The original
"canonpath = new StringBuffer(tmppath.substring(0, i))"
isn't very efficient because StringBuffer's
ensureCapacity_unsynchronized will fail definitely each time
and will enlarge buffer and copy contents. .
*/
canonpath = new StringBuffer(INITIAL_MAX_PATH);
canonpath.append(tmppath.substring(0, i));
tmppath = tmppath.substring(i);
// pathdepth==0 indicates there're only root path in the buffer
int pathdepth = 0;
StringTokenizer st = new StringTokenizer(tmppath, separator);
// Traverse each element of the path, handling "." and ".."
// Should handle "~" too?
if (st.hasMoreTokens())
do
{
String s = st.nextToken();
// Handle "." or an empty element.
if (s.equals(".") || s.equals(""))
continue;
// Handle ".." by deleting the last element from the path
if (s.equals(".."))
{
if (pathdepth == 0)
continue;
// Strip of trailing separator
canonpath.setLength(canonpath.length() - 1/*separator.length()*/);
String tmpstr = canonpath.toString();
int idx = tmpstr.lastIndexOf(separator);
if ((idx == -1) || ((idx + 1/*separator.length()*/) > tmpstr.length()))
//throw new IOException("Can't happen error");
return path; // Shouldn't happen
canonpath.setLength(idx + 1/*separator.length()*/);
pathdepth--;
continue;
}
canonpath.append(s);
pathdepth++; //now it's more than root path
if (st.hasMoreTokens())
canonpath.append(separator);
}
while (st.hasMoreTokens());
if (endWithSeparator(path))
canonpath.append(separator);
String tmpstr = canonpath.toString();
//if (pathdepth > 0 && endWithSeparator(tmpstr) )
// tmpstr = tmpstr.substring(0, tmpstr.length() - 1/*separator.length()*/);
return tmpstr;
}
/**
* This routine canonicalizes input param "path" to formal path representation
* for current platform, and normalize all separators to "sepchar".
*/
public static final String toCanonicalForm(String path, char sepchar)
{
String tmpstr = toCanonicalForm(path);
tmpstr = tmpstr.replace(separatorChar, sepchar);
return tmpstr;
}
/**
* This routine checks whether input param "path" ends with separator
*/
public static final boolean endWithSeparator(String path)
{
if (path.endsWith("\\") || path.endsWith("/"))
return true;
return false;
}
/**
* This routine removes from input param "path" the tail separator if it exists,
* and return the remain part.
*/
public static final String removeTailSeparator(String path)
{
if (endWithSeparator(path) && !isRootDirectory(path))
return path.substring(0, path.length() - 1);
return path;
}
/**
* This routine returns last index of separator in input param "path",
* and return it.
*/
public static final int lastIndexOfSeparator(String path)
{
return Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
}
}

View file

@ -0,0 +1,75 @@
# This property file contains dependencies of classes, methods, and
# field on other methods or classes.
#
# Syntax:
#
# <used>: <needed 1> [... <needed N>]
#
# means that when <used> is included, <needed 1> (... <needed N>) must
# be included as well.
#
# <needed X> and <used> are of the form
#
# <class.methodOrField(signature)>
#
# or just
#
# <class>
#
# Within dependencies, variables can be used. A variable is defined as
# follows:
#
# {variable}: value1 value2 ... value<n>
#
# variables can be used on the right side of dependencies as follows:
#
# <used>: com.bla.blu.{variable}.Class.m()V
#
# The use of the variable will expand to <n> dependencies of the form
#
# <used>: com.bla.blu.value1.Class.m()V
# <used>: com.bla.blu.value2.Class.m()V
# ...
# <used>: com.bla.blu.value<n>.Class.m()V
#
# Variables can be redefined when building a system to select the
# required support for features like encodings, protocols, etc.
#
# Hints:
#
# - For methods and fields, the signature is mandatory. For
# specification, please see the Java Virtual Machine Specification by
# SUN. Unlike in the spec, field signatures (types) are in brackets.
#
# - Package names must be separated by '/' (and not '.'). E.g.,
# java/lang/Class (this is necessary, because the '.' is used to
# separate method or field names from classes)
#
# - In case <needed> refers to a class, only the class itself will be
# included in the resulting binary, NOT necessarily all its methods
# and fields. If you want to refer to all methods and fields, you can
# write class.* as an abbreviation.
#
# - Abbreviations for packages are also possible: my/package/* means all
# methods and fields of all classes in my/package.
#
# - A line with a trailing '\' continues in the next line.
# All encodings supported are loaded via gnu/java/io/EncodingManager.findEncoderConstructor
# or gnu/java/io/EncodingManager.findDecoderConstructor from class
# gnu/java/io/decode/Decoder<encoding>.
#
# This introduces a dependency for all encodings. To allow an easy selection
# and addition of encodings, the library variable {encodings} can be set to
# the set of supported encodings.
#
{encodings}: 8859_1 8859_2 8859_3 8859_4 8859_5 UTF8
gnu/java/io/EncodingManager.findEncoderConstructor(Ljava/lang/String;Z)Ljava/lang/reflect/Constructor;: \
gnu/java/io/decode/Decoder{encodings}.*
gnu/java/io/EncodingManager.findDecoderConstructor(Ljava/lang/String;Z)Ljava/lang/reflect/Constructor;: \
gnu/java/io/encode/Encoder{encodings}.* \
# end of file

View file

@ -0,0 +1,46 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in gnu.java.io package.
Copyright (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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. -->
<html>
<head><title>GNU Classpath - gnu.java.io</title></head>
<body>
<p></p>
</body>
</html>