This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Re: New classes from Classpath
- To: java-patches at gcc dot gnu dot org
- Subject: Re: New classes from Classpath
- From: Mark Wielaard <mark at klomp dot org>
- Date: Mon, 1 Oct 2001 23:08:52 +0200
- References: <20011001230654.A24501@klomp.org>
And here is the actual patch.
> 2001-10-01 Mark Wielaard <mark@klomp.org>
>
> * Makefile.am: Add new classes
> (core_java_source_files): CharSequence, InheritableThreadLocal
> (ordinary_java_source_files): Authenticator, PasswordAuthentication
> * Makefile.in: regenerate
> * gcj/javaprims.h: ditto
> * java/lang/CharSequence: new class from Classpath
> * java/lang/InheritableThreadLocal.java: ditto
> * java/lang/String.java: implements CharSequence
> (subSequence (int,int)): new method
> * java/lang/SubString.java: implements CharSequence
> (subSequence (int,int)): new method
> remerge comments with Classpath
> * java/lang/Thread.java Thread (Thread, ThreadGroup, Runnable, String):
> call InheritableThreadLocal.newChildThread()
> * java/net/Authenticator.java: new class from Classpath
> * java/net/PasswordAuthentication.java: ditto
>
> OK to commit?
--
Stuff to read:
<http://www.toad.com/gnu/whatswrong.html>
What's Wrong with Copy Protection, by John Gilmore
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.171
diff -u -r1.171 Makefile.am
--- Makefile.am 2001/09/29 19:16:26 1.171
+++ Makefile.am 2001/10/01 20:50:42
@@ -914,6 +914,7 @@
java/lang/Boolean.java \
java/lang/Byte.java \
java/lang/Character.java \
+java/lang/CharSequence.java \
java/lang/ClassCastException.java \
java/lang/ClassCircularityError.java \
java/lang/ClassFormatError.java \
@@ -936,6 +937,7 @@
java/lang/IllegalThreadStateException.java \
java/lang/IncompatibleClassChangeError.java \
java/lang/IndexOutOfBoundsException.java \
+java/lang/InheritableThreadLocal.java \
java/lang/InstantiationError.java \
java/lang/InstantiationException.java \
java/lang/Integer.java \
@@ -1179,6 +1181,7 @@
java/lang/reflect/ReflectPermission.java \
java/math/BigDecimal.java \
java/math/BigInteger.java \
+java/net/Authenticator.java \
java/net/BindException.java \
java/net/ConnectException.java \
java/net/ContentHandler.java \
@@ -1194,6 +1197,7 @@
java/net/MulticastSocket.java \
java/net/NetPermission.java \
java/net/NoRouteToHostException.java \
+java/net/PasswordAuthentication.java \
java/net/PlainDatagramSocketImpl.java \
java/net/PlainSocketImpl.java \
java/net/ProtocolException.java \
Index: Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.in,v
retrieving revision 1.182
diff -u -r1.182 Makefile.in
--- Makefile.in 2001/09/29 19:16:26 1.182
+++ Makefile.in 2001/10/01 20:50:43
@@ -63,16 +63,13 @@
host_triplet = @host@
target_alias = @target_alias@
target_triplet = @target@
-AMTAR = @AMTAR@
AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
AR = @AR@
AS = @AS@
-AWK = @AWK@
CC = @CC@
COMPPATH = @COMPPATH@
CXX = @CXX@
CXXCPP = @CXXCPP@
-DEPDIR = @DEPDIR@
DIRLTDL = @DIRLTDL@
DIVIDESPEC = @DIVIDESPEC@
DLLTOOL = @DLLTOOL@
@@ -89,7 +86,6 @@
GCTESTSPEC = @GCTESTSPEC@
HASH_SYNC_SPEC = @HASH_SYNC_SPEC@
INCLTDL = @INCLTDL@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
JC1GCSPEC = @JC1GCSPEC@
LIBFFI = @LIBFFI@
LIBGCJDEBUG = @LIBGCJDEBUG@
@@ -122,10 +118,7 @@
ZLIBS = @ZLIBS@
ZLIBSPEC = @ZLIBSPEC@
ZLIBTESTSPEC = @ZLIBTESTSPEC@
-am__include = @am__include@
-am__quote = @am__quote@
here = @here@
-install_sh = @install_sh@
libgcj_basedir = @libgcj_basedir@
mkinstalldirs = @mkinstalldirs@
@@ -652,6 +645,7 @@
java/lang/Boolean.java \
java/lang/Byte.java \
java/lang/Character.java \
+java/lang/CharSequence.java \
java/lang/ClassCastException.java \
java/lang/ClassCircularityError.java \
java/lang/ClassFormatError.java \
@@ -674,6 +668,7 @@
java/lang/IllegalThreadStateException.java \
java/lang/IncompatibleClassChangeError.java \
java/lang/IndexOutOfBoundsException.java \
+java/lang/InheritableThreadLocal.java \
java/lang/InstantiationError.java \
java/lang/InstantiationException.java \
java/lang/Integer.java \
@@ -912,6 +907,7 @@
java/lang/reflect/ReflectPermission.java \
java/math/BigDecimal.java \
java/math/BigInteger.java \
+java/net/Authenticator.java \
java/net/BindException.java \
java/net/ConnectException.java \
java/net/ContentHandler.java \
@@ -927,6 +923,7 @@
java/net/MulticastSocket.java \
java/net/NetPermission.java \
java/net/NoRouteToHostException.java \
+java/net/PasswordAuthentication.java \
java/net/PlainDatagramSocketImpl.java \
java/net/PlainSocketImpl.java \
java/net/ProtocolException.java \
@@ -1445,7 +1442,7 @@
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = gtar
+TAR = tar
GZIP_ENV = --best
DIST_SUBDIRS = @DIRLTDL@ testsuite gcj include @DIRLTDL@ gcj include
DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
@@ -1776,8 +1773,9 @@
.deps/java/lang/ArithmeticException.P \
.deps/java/lang/ArrayIndexOutOfBoundsException.P \
.deps/java/lang/ArrayStoreException.P .deps/java/lang/Boolean.P \
-.deps/java/lang/Byte.P .deps/java/lang/Character.P \
-.deps/java/lang/Class.P .deps/java/lang/ClassCastException.P \
+.deps/java/lang/Byte.P .deps/java/lang/CharSequence.P \
+.deps/java/lang/Character.P .deps/java/lang/Class.P \
+.deps/java/lang/ClassCastException.P \
.deps/java/lang/ClassCircularityError.P \
.deps/java/lang/ClassFormatError.P .deps/java/lang/ClassLoader.P \
.deps/java/lang/ClassNotFoundException.P \
@@ -1795,6 +1793,7 @@
.deps/java/lang/IllegalThreadStateException.P \
.deps/java/lang/IncompatibleClassChangeError.P \
.deps/java/lang/IndexOutOfBoundsException.P \
+.deps/java/lang/InheritableThreadLocal.P \
.deps/java/lang/InstantiationError.P \
.deps/java/lang/InstantiationException.P .deps/java/lang/Integer.P \
.deps/java/lang/InternalError.P .deps/java/lang/InterruptedException.P \
@@ -1863,14 +1862,15 @@
.deps/java/lang/w_log.P .deps/java/lang/w_pow.P \
.deps/java/lang/w_remainder.P .deps/java/lang/w_sqrt.P \
.deps/java/math/BigDecimal.P .deps/java/math/BigInteger.P \
-.deps/java/net/BindException.P .deps/java/net/ConnectException.P \
-.deps/java/net/ContentHandler.P .deps/java/net/ContentHandlerFactory.P \
-.deps/java/net/DatagramPacket.P .deps/java/net/DatagramSocket.P \
-.deps/java/net/DatagramSocketImpl.P .deps/java/net/FileNameMap.P \
-.deps/java/net/HttpURLConnection.P .deps/java/net/InetAddress.P \
-.deps/java/net/JarURLConnection.P \
+.deps/java/net/Authenticator.P .deps/java/net/BindException.P \
+.deps/java/net/ConnectException.P .deps/java/net/ContentHandler.P \
+.deps/java/net/ContentHandlerFactory.P .deps/java/net/DatagramPacket.P \
+.deps/java/net/DatagramSocket.P .deps/java/net/DatagramSocketImpl.P \
+.deps/java/net/FileNameMap.P .deps/java/net/HttpURLConnection.P \
+.deps/java/net/InetAddress.P .deps/java/net/JarURLConnection.P \
.deps/java/net/MalformedURLException.P .deps/java/net/MulticastSocket.P \
.deps/java/net/NetPermission.P .deps/java/net/NoRouteToHostException.P \
+.deps/java/net/PasswordAuthentication.P \
.deps/java/net/PlainDatagramSocketImpl.P \
.deps/java/net/PlainSocketImpl.P .deps/java/net/ProtocolException.P \
.deps/java/net/ServerSocket.P .deps/java/net/Socket.P \
Index: gcj/javaprims.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gcj/javaprims.h,v
retrieving revision 1.27
diff -u -r1.27 javaprims.h
--- javaprims.h 2001/09/02 06:26:09 1.27
+++ javaprims.h 2001/10/01 20:50:43
@@ -134,6 +134,7 @@
class Boolean;
class Byte;
class CPlusPlusDemangler;
+ class CharSequence;
class Character;
class Character$Subset;
class Character$UnicodeBlock;
@@ -161,6 +162,7 @@
class IllegalThreadStateException;
class IncompatibleClassChangeError;
class IndexOutOfBoundsException;
+ class InheritableThreadLocal;
class InstantiationError;
class InstantiationException;
class Integer;
@@ -192,6 +194,7 @@
class Short;
class StackOverflowError;
class String;
+ class String$CaseInsensitiveComparator;
class StringBuffer;
class StringIndexOutOfBoundsException;
class System;
Index: java/lang/CharSequence.java
===================================================================
RCS file: CharSequence.java
diff -N CharSequence.java
--- /dev/null Tue May 5 13:32:27 1998
+++ CharSequence.java Mon Oct 1 13:50:43 2001
@@ -0,0 +1,80 @@
+/* java.lang.CharSequence -- Anything that has an indexed sequence of chars
+ Copyright (C) 2001 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
+
+
+package java.lang;
+
+/**
+ * General functions on a sequence of chars. This interface is implemented
+ * by <code>String</code>, <code>StringBuffer</code> and
+ * <code>CharBuffer</code> to give a uniform way to get chars at a certain
+ * index, the number of characters in the sequence and a subrange of the
+ * chars. Indexes start at 0 and the last index is <code>length()-1</code>.
+ * <p>
+ * Even when classes implement this interface they are not always
+ * exchangeble because they might implement their compare, equals or hash
+ * function differently. This means that in general one should not use a
+ * <code>CharSequence</code> as keys in collections since two sequences
+ * with the same chars at the same indexes with the same length might not
+ * have the same hash code, be equal or be comparable since the are
+ * represented by different classes.
+ *
+ * @author Mark Wielaard (mark@klomp.org)
+ *
+ * @since 1.4
+ */
+
+public interface CharSequence {
+
+ /**
+ * Returns the character at the given index.
+ *
+ * @exception IndexOutOfBoundsException when <code>i < 0</code> or
+ * <code>i > length()-1</code>.
+ */
+ char charAt(int i);
+
+ /**
+ * Returns the length of the sequence.
+ */
+ int length();
+
+ /**
+ * Returns a new <code>CharSequence</char> of the indicated range.
+ *
+ * @exception IndexOutOfBoundsException when <code>begin < 0</code>,
+ * <code>end < 0</code>, <code>end > length()</code> or
+ * <code>begin > end</code>
+ */
+ CharSequence subSequence(int begin, int end);
+
+ /**
+ * Returns the complete <code>CharSequence</code> as a <code>String</code>.
+ * Classes that implement this interface should return a <code>String</code>
+ * which contains only the characters in the sequence in the correct order.
+ */
+ String toString();
+}
Index: java/lang/InheritableThreadLocal.java
===================================================================
RCS file: InheritableThreadLocal.java
diff -N InheritableThreadLocal.java
--- /dev/null Tue May 5 13:32:27 1998
+++ InheritableThreadLocal.java Mon Oct 1 13:50:43 2001
@@ -0,0 +1,165 @@
+/* java.lang.InheritableThreadLocal
+ Copyright (C) 2000 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
+
+package java.lang;
+
+import java.util.Iterator;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+/**
+ * ThreadLocal whose value is inherited by child Threads.
+ * The value of the InheritableThreadLocal associated with the (parent) Thread
+ * on the moment that it creates a new (child) Thread is set as the value that
+ * is associated with the new (child) Thread.
+ * <p>
+ * It is possible to make the value associated with the child Thread a function
+ * of the value that is associated with the parent Thread by overriding the
+ * <code>childValue()</code> method.
+ *
+ * @since 1.2
+ * @author Mark Wielaard (mark@klomp.org)
+ */
+public class InheritableThreadLocal extends ThreadLocal {
+
+ /**
+ * Maps Threads to a Set of InheritableThreadLocals
+ * (the heritage of that Thread).
+ * Uses a WeakHashMap so if the Thread is garbage collected the reference
+ * to that Set disappears.
+ * Both <code>AddToHeritage</code> access and modify it so they have to
+ * synchronize on the threadMap when they do.
+ */
+ private static Map threadMap = new WeakHashMap();
+
+ /**
+ * Creates a new InheritableThreadLocal that has no values associated
+ * with it yet.
+ */
+ public InheritableThreadLocal() {
+ super();
+ }
+
+ /**
+ * Determines the value associated with a newly created child Thread
+ * as a function of the value associated with the currently executing
+ * (parent) Thread.
+ * <p>
+ * The default implementation just returns the parentValue.
+ */
+ protected Object childValue(Object parentValue) {
+ return parentValue;
+ }
+
+ /**
+ * Adds this <code>InheritableThreadLocal</code> to the heritage of the
+ * current Thread and returns the value of the <code>ThreadLocal</code>
+ * for the Thread. The value will be either the last value that the
+ * current Thread has set, or the childValue of the last value that the
+ * parent Thread set before the current Thread was created, or the
+ * initialValue of the <code>ThreadLocal</code>.
+ *
+ * @see ThreadLocal#get()
+ */
+ public Object get() {
+ addToHeritage();
+ return super.get();
+ }
+
+ /**
+ * Adds this <code>InheritableThreadLocal</code> to the heritage of the
+ * current Thread and sets the value of the <code>ThreadLocal</code>
+ * for the Thread.
+ *
+ * @see ThreadLocal#set(Object)
+ */
+ public void set(Object value) {
+ addToHeritage();
+ super.set(value);
+ }
+
+ /**
+ * Adds this <code>InheritableThreadLocal</code> to the heritage
+ * of the current Thread.
+ */
+ private void addToHeritage() {
+ Thread currentThread = Thread.currentThread();
+ Set heritage;
+ synchronized(threadMap) {
+ heritage = (Set)threadMap.get(currentThread);
+ }
+ // Note that we don't have to synchronize on the heritage Set
+ // since only this Thread (or the parent Thread when creating
+ // the heritage) ever modifies it.
+ if (heritage == null) {
+ heritage = new HashSet();
+ synchronized(threadMap) {
+ threadMap.put(currentThread, heritage);
+ }
+ }
+ heritage.add(this);
+ }
+
+ /**
+ * Generates the childValues of all <code>InheritableThreadLocal</code>s
+ * that are in the heritage of the current Thread for the newly created
+ * childThread.
+ * Should be called from the contructor of java.lang.Thread.
+ */
+ static void newChildThread(Thread childThread) {
+ // The currentThread is the parent of the new thread
+ Thread parentThread = Thread.currentThread();
+
+ // Inherit all the InheritableThreadLocals of the parent thread
+ Set heritage;
+ synchronized(threadMap) {
+ heritage = (Set)threadMap.get(parentThread);
+ }
+ // Note that we don't have to synchronize on the heritage Set
+ // since only this Thread (or the parent Thread when creating
+ // the heritage) ever modifies it.
+ if (heritage != null) {
+ synchronized(threadMap) {
+ threadMap.put(childThread, new HashSet(heritage));
+ }
+ // And constructs all the new child values
+ // (has to be done now that we are executing in the parentThread)
+ Iterator it = heritage.iterator();
+ while (it.hasNext()) {
+ InheritableThreadLocal local =
+ (InheritableThreadLocal) it.next();
+ // Note that the parentValue cannot be null
+ // If it was it would not be in the heritage
+ Object parentValue = local.get(parentThread).getValue();
+ Object childValue = local.childValue(parentValue);
+ ThreadLocal.Value v = new ThreadLocal.Value(childValue);
+ local.set(childThread, v);
+ }
+ }
+ }
+}
Index: java/lang/String.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/String.java,v
retrieving revision 1.15
diff -u -r1.15 String.java
--- String.java 2001/09/05 19:32:57 1.15
+++ String.java 2001/10/01 20:50:43
@@ -22,7 +22,7 @@
* Status: Complete to 1.3.
*/
-public final class String implements Serializable, Comparable
+public final class String implements Serializable, Comparable, CharSequence
{
private Object data;
private int boffset; // Note this is a byte offset - don't use in Java code!
@@ -295,6 +295,28 @@
if (startsWith(str, fromIndex))
return fromIndex;
}
+ }
+
+ /**
+ * Creates a substring of this String, starting at a specified index
+ * and ending at one character before a specified index.
+ * <p>
+ * To implement <code>CharSequence</code>.
+ * Calls <code>substring(beginIndex, endIndex)</code>.
+ *
+ * @param beginIndex index to start substring (base 0)
+ * @param endIndex index after the last character to be
+ * copied into the substring
+ *
+ * @return new String which is a substring of this String
+ *
+ * @exception StringIndexOutOfBoundsException
+ * if (beginIndex < 0 || endIndex > this.length() || beginIndex > endIndex)
+ */
+ public CharSequence subSequence(int beginIndex, int endIndex)
+ throws IndexOutOfBoundsException
+ {
+ return substring(beginIndex, endIndex);
}
public String substring (int beginIndex)
Index: java/lang/StringBuffer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/StringBuffer.java,v
retrieving revision 1.11
diff -u -r1.11 StringBuffer.java
--- StringBuffer.java 2001/05/22 04:38:35 1.11
+++ StringBuffer.java 2001/10/01 20:50:43
@@ -1,21 +1,32 @@
-// StringBuffer.java - Growable strings.
+/* StringBuffer.java -- Growable strings
+ Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
-/* Copyright (C) 1998, 1999, 2000 Free Software Foundation
+This file is part of GNU Classpath.
- This file is part of libgcj.
+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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
-
package java.lang;
import java.io.Serializable;
-/**
- * @author Tom Tromey <tromey@cygnus.com>
- * @date October 23, 1998.
- */
-
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* Updated using online JDK 1.2 docs.
* Believed complete and correct to JDK 1.2.
@@ -57,7 +68,7 @@
* @author Tom Tromey
* @see java.lang.String
*/
-public final class StringBuffer implements Serializable
+public final class StringBuffer implements Serializable, CharSequence
{
/** Append the <code>String</code> value of the argument to this <code>StringBuffer</code>.
* Uses <code>String.valueOf()</code> to convert to
@@ -198,7 +209,7 @@
* @param index the index of the character to get, starting at 0.
* @return the character at the specified index.
* @exception IndexOutOfBoundsException if the desired character index
- * is not between 0 and length() - 1 (inclusive).
+ * is negative or greater then length() - 1.
*/
public synchronized char charAt (int index)
{
@@ -652,6 +663,28 @@
// enable sharing here.
return new String (value, beginIndex, endIndex - beginIndex);
}
+
+ /**
+ * Creates a substring of this StringBuffer, starting at a specified index
+ * and ending at one character before a specified index.
+ * <p>
+ * To implement <code>CharSequence</code>.
+ * Calls <code>substring(beginIndex, endIndex)</code>.
+ *
+ * @param beginIndex index to start substring (base 0)
+ * @param endIndex index after the last character to be
+ * copied into the substring
+ *
+ * @return new String which is a substring of this StringBuffer
+ *
+ * @exception StringIndexOutOfBoundsException
+ * if (beginIndex < 0 || endIndex > this.length() || beginIndex > endIndex)
+ */
+ public CharSequence subSequence (int beginIndex, int endIndex)
+ {
+ return substring(beginIndex, endIndex);
+ }
+
/** Convert this <code>StringBuffer</code> to a <code>String</code>.
* @return the characters in this StringBuffer
Index: java/lang/Thread.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Thread.java,v
retrieving revision 1.19
diff -u -r1.19 Thread.java
--- Thread.java 2001/08/26 11:30:09 1.19
+++ Thread.java 2001/10/01 20:50:45
@@ -258,6 +258,8 @@
group.addThread(this);
runnable = r;
+ InheritableThreadLocal.newChildThread(this);
+
initialize_native ();
}
Index: java/net/Authenticator.java
===================================================================
RCS file: Authenticator.java
diff -N Authenticator.java
--- /dev/null Tue May 5 13:32:27 1998
+++ Authenticator.java Mon Oct 1 13:50:45 2001
@@ -0,0 +1,269 @@
+/* Authenticator.java -- Abstract class for obtaining authentication info
+ Copyright (C) 1998,2000 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
+
+package java.net;
+
+/**
+ * Sometimes a network operation (such as hitting a password protected
+ * web site) will require authentication information in the form of a
+ * username and password. This abstract class provides a model for
+ * obtaining that information.
+ * <p>
+ * To make use of this feature, a programmer must create a subclass of
+ * Authenticator that knows how to obtain the necessary info. An example
+ * would be a class that popped up a dialog box to prompt the user.
+ * After creating an instance of that subclass, the static setDefault
+ * method of this class is called to set up that instance as the object
+ * to use on subsequent calls to obtain authorization.
+ *
+ * @since 1.2
+ *
+ * @author Aaron M. Renn (arenn@urbanophile.com)
+ */
+public abstract class Authenticator
+{
+
+/*************************************************************************/
+
+/*
+ * Class Variables
+ */
+
+/**
+ * This is the default Authenticator object to use for password requests
+ */
+private static Authenticator default_authenticator;
+
+/*************************************************************************/
+
+/*
+ * Instance Variables
+ */
+
+/**
+ * InternetAddress of the site requesting authentication
+ */
+private InetAddress addr;
+
+/**
+ * The port number of the site requesting authentication
+ */
+private int port;
+
+/**
+ * The protocol name of the site requesting authentication
+ */
+private String protocol;
+
+/**
+ * The prompt to display to the user when requesting authentication info
+ */
+private String prompt;
+
+/**
+ * The authentication scheme in use
+ */
+private String scheme;
+
+/*************************************************************************/
+
+/*
+ * Class Methods
+ */
+
+/**
+ * This method sets the default <code>Authenticator</code> object (an
+ * instance of a
+ * subclass of <code>Authenticator</code>) to use when prompting the user for
+ * information. Note that this method checks to see if the caller is
+ * allowed to set this value (the "setDefaultAuthenticator" permission)
+ * and throws a <code>SecurityException</code> if it is not.
+ *
+ * @param def_auth The new default <code>Authenticator</code> object to use
+ *
+ * @exception SecurityException If the caller does not have permission
+ * to perform this operation
+ */
+public static void
+setDefault(Authenticator def_auth)
+{
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkPermission(new NetPermission("setDefaultAuthenticator"));
+
+ default_authenticator = def_auth;
+}
+
+/*************************************************************************/
+
+/**
+ * This method is called whenever a username and password for a given
+ * network operation is required. First, a security check is made to see
+ * if the caller has the "requestPasswordAuthentication"
+ * permission. If not, the method thows an exception. If there is no
+ * default <code>Authenticator</code> object, the method then returns
+ * <code>null</code>. Otherwise, the default authenticators's instance
+ * variables are initialized and it's <code>getPasswordAuthentication</code>
+ * method is called to get the actual authentication information to return.
+ *
+ * @param addr The address requesting authentication
+ * @param port The port requesting authentication
+ * @param protocol The protocol requesting authentication
+ * @param prompt The prompt to display to the user when requesting
+ authentication info
+ * @param scheme The authentication scheme in use
+ *
+ * @return A <code>PasswordAuthentication</code> object with the user's
+ * authentication info.
+ *
+ * @exception SecurityException If the caller does not have permission to
+ * perform this operation
+ */
+public static PasswordAuthentication
+requestPasswordAuthentication(InetAddress addr, int port, String protocol,
+ String prompt, String scheme)
+{
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkPermission(new NetPermission("requestPasswordAuthentication"));
+
+ if (default_authenticator == null)
+ return(null);
+
+ default_authenticator.addr = addr;
+ default_authenticator.port = port;
+ default_authenticator.protocol = protocol;
+ default_authenticator.prompt = prompt;
+ default_authenticator.scheme = scheme;
+
+ return(default_authenticator.getPasswordAuthentication());
+}
+
+/*************************************************************************/
+
+/*
+ * Constructors
+ */
+
+/**
+ * Default, no-argument constructor for subclasses to call.
+ */
+public
+Authenticator()
+{
+}
+
+/*************************************************************************/
+
+/*
+ * Instance Methods
+ */
+
+/**
+ * This method returns the address of the site that is requesting
+ * authentication.
+ *
+ * @return The requesting site
+ */
+protected final InetAddress
+getRequestingSite()
+{
+ return(addr);
+}
+
+/*************************************************************************/
+
+/**
+ * This method returns the port of the site that is requesting
+ * authentication.
+ *
+ * @return The requesting port
+ */
+protected final int
+getRequestingPort()
+{
+ return(port);
+}
+
+/*************************************************************************/
+
+/**
+ * This method returns the requesting protocol of the operation that is
+ * requesting authentication
+ *
+ * @return The requesting protocol
+ */
+protected final String
+getRequestingProtocol()
+{
+ return(protocol);
+}
+
+/*************************************************************************/
+
+/**
+ * Returns the prompt that should be used when requesting authentication
+ * information from the user
+ *
+ * @return The user prompt
+ */
+protected final String
+getRequestingPrompt()
+{
+ return(prompt);
+}
+
+/*************************************************************************/
+
+/**
+ * This method returns the authentication scheme in use
+ *
+ * @return The authentication scheme
+ */
+protected final String
+getRequestingScheme()
+{
+ return(scheme);
+}
+
+/*************************************************************************/
+
+/**
+ * This method is called whenever a request for authentication is made. It
+ * can call the other getXXX methods to determine the information relevant
+ * to this request. Subclasses should override this method, which returns
+ * <code>null</code> by default.
+ *
+ * @return The PasswordAuthentication information
+ */
+protected PasswordAuthentication
+getPasswordAuthentication()
+{
+ return(null);
+}
+
+} // class Authenticator
+
Index: java/net/PasswordAuthentication.java
===================================================================
RCS file: PasswordAuthentication.java
diff -N PasswordAuthentication.java
--- /dev/null Tue May 5 13:32:27 1998
+++ PasswordAuthentication.java Mon Oct 1 13:50:45 2001
@@ -0,0 +1,104 @@
+/* PasswordAuthentication.java -- Container class for username/password pairs
+ Copyright (C) 1998,2000 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
+
+package java.net;
+
+/**
+ * This class serves a container for username/password pairs.
+ *
+ * @author Aaron M. Renn (arenn@urbanophile.com)
+ */
+public final class PasswordAuthentication
+{
+
+/*************************************************************************/
+
+/*
+ * Instance Variables
+ */
+
+/**
+ * The username
+ */
+private String username;
+
+/**
+ * The password
+ */
+private char[] password;
+
+/*************************************************************************/
+
+/*
+ * Constructors
+ */
+
+/**
+ * Creates a new PasswordAuthentication object from the specified username
+ * and password.
+ *
+ * @param username The username for this object
+ * @param password The password for this object
+ */
+public
+PasswordAuthentication(String username, char[] password)
+{
+ this.username = username;
+ this.password = password;
+}
+
+/*************************************************************************/
+
+/*
+ * Instance Methods
+ */
+
+/**
+ * Returns the username associated with this object
+ *
+ * @return The username
+ */
+public String
+getUserName()
+{
+ return(username);
+}
+
+/*************************************************************************/
+
+/**
+ * Returns the password associated with this object
+ *
+ * @return The password
+ */
+public char[]
+getPassword()
+{
+ return(password);
+}
+
+} // class PasswordAuthentication
+