This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Re: java.util Classpath/libgcj merging
Hi,
On Mon, Feb 19, 2001 at 11:31:08AM +1300, Bryce McKinlay wrote:
> Mark Wielaard wrote:
>
> > The following patch merges some of the simpler classes from java.util with
> > the Classpath versions. It removes some RCS keywords to make it simpler to
> > see that the files in Classpath CVS and gcc CVS are actually the same
> > version.
>
> Cool, thanks. It would be cool to have something that automatically runs
> diff on the classpath and libjava trees and dumps the results out to a web
> page or something.
That would be nice. But even with the Exception merge (see below), your
java.security work and ignoring java.awt we still need to merge more then
100 classes. (java.io, java.lang, java.net, java.text, java.util.zip and
the rest of java.util).
> > It reindents some files so they have the same indenting as the Classpath
> > versions. And it merges some simple classes, interfaces and exceptions.
>
> > * java/util/ConcurrentModificationException.java: merge with Classpath
> > * java/util/EmptyStackException.java: idem
>
> In the past I've held off merging in Classpath's exception classes because
> I'm not sure I like the way that the SerialVersionUIDs are present in all
> of them.
> Should it be neccessary to have a SerialVersionUID in a class that doesnt
> have an explicit serialized form (ie readObject and writeObject methods)?
> Or are we just potentially masking serialization incompatibilies?
>
> > OK to commit to the head/branch?
>
> Yes, if you think the serialization issue is ok.
I haven't commited the Exception classes. I am working on merging all the
Exceptions at once. I already merged all Exception code from libgcj into
Classpath. Now I need to look at when the serialVersionUID fields are really
needed and then reindent all of them before putting them back in libgcj.
So what I actually commited is:
2001-03-19 Mark Wielaard <mark@klomp.org>
* java/util/ArrayList.java: Remove RCS keywords from comments
* java/util/BasicMapEntry.java: idem
* java/util/Dictionary.java: idem
* java/util/HashSet.java: idem
* java/util/EventObject.java: reindent
* java/util/Properties.java: idem
* java/util/SortedMap.java: idem
* java/util/Enumeration.java: Merge with Classpath
* java/util/EventListener.java: idem
* java/util/Observable.java: idem
* java/util/Observer.java: idem
* java/util/Stack.java: idem
Cheers,
Mark
--
Stuff to read:
<http://www.toad.com/gnu/whatswrong.html>
What's Wrong with Copy Protection, by John Gilmore
Index: java/util/ArrayList.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/ArrayList.java,v
retrieving revision 1.6
diff -u -r1.6 ArrayList.java
--- ArrayList.java 2000/12/17 11:51:14 1.6
+++ ArrayList.java 2001/03/19 22:56:24
@@ -40,7 +40,6 @@
* to or removing from the end of a list, checking the size, &c.
*
* @author Jon A. Zeppieri
- * @version $Id: ArrayList.java,v 1.6 2000/12/17 11:51:14 bryce Exp $
* @see java.util.AbstractList
* @see java.util.List
*/
Index: java/util/BasicMapEntry.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/BasicMapEntry.java,v
retrieving revision 1.3
diff -u -r1.3 BasicMapEntry.java
--- BasicMapEntry.java 2000/12/21 02:00:15 1.3
+++ BasicMapEntry.java 2001/03/19 22:56:24
@@ -33,8 +33,6 @@
* Hashtable.
*
* @author Jon Zeppieri
- * @version $Revision: 1.3 $
- * @modified $Id: BasicMapEntry.java,v 1.3 2000/12/21 02:00:15 bryce Exp $
*/
class BasicMapEntry implements Map.Entry
{
Index: java/util/Dictionary.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/Dictionary.java,v
retrieving revision 1.4
diff -u -r1.4 Dictionary.java
--- Dictionary.java 2001/02/15 06:43:00 1.4
+++ Dictionary.java 2001/03/19 22:56:24
@@ -40,8 +40,6 @@
* in the Collections framework.
*
* @author Jon Zeppieri
- * @version $Revision: 1.4 $
- * @modified $Id: Dictionary.java,v 1.4 2001/02/15 06:43:00 bryce Exp $
*/
public abstract class Dictionary extends Object
{
Index: java/util/HashSet.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/HashSet.java,v
retrieving revision 1.4
diff -u -r1.4 HashSet.java
--- HashSet.java 2001/02/16 04:50:38 1.4
+++ HashSet.java 2001/03/19 22:56:24
@@ -45,8 +45,6 @@
* HashSet is a part of the JDK1.2 Collections API.
*
* @author Jon Zeppieri
- * @version $Revision: 1.4 $
- * @modified $Id: HashSet.java,v 1.4 2001/02/16 04:50:38 bryce Exp $
*/
public class HashSet extends AbstractSet
implements Set, Cloneable, Serializable
Index: java/util/EventObject.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/EventObject.java,v
retrieving revision 1.4
diff -u -r1.4 EventObject.java
--- EventObject.java 2000/10/24 10:53:56 1.4
+++ EventObject.java 2001/03/19 22:56:24
@@ -1,28 +1,28 @@
/* EventObject.java - Represent events fired by objects.
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
- This file is part of GNU Classpath.
+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 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.
+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.
+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. */
+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.util;
Index: java/util/Properties.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/Properties.java,v
retrieving revision 1.7
diff -u -r1.7 Properties.java
--- Properties.java 2000/10/07 18:13:11 1.7
+++ Properties.java 2001/03/19 22:56:25
@@ -7,7 +7,7 @@
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
@@ -62,427 +62,477 @@
*
* @see PropertyResourceBundle
* @author Jochen Hoenicke */
-public class Properties extends Hashtable {
- /**
- * The property list that contains default values for any keys not
- * in this property list.
- */
- protected Properties defaults;
-
- private static final long serialVersionUID = 4112578634029874840L;
-
- /**
- * Creates a new empty property list.
- */
- public Properties() {
- this.defaults = null;
- }
-
- /**
- * Create a new empty property list with the specified default values.
- * @param defaults a Properties object containing the default values.
- */
- public Properties(Properties defaults) {
- this.defaults = defaults;
- }
-
- /**
- * Reads a property list from an input stream. The stream should
- * have the following format: <br>
- *
- * An empty line or a line starting with <code>#</code> or
- * <code>!</code> is ignored. An backslash (<code>\</code>) at the
- * end of the line makes the line continueing on the next line
- * (but make sure there is no whitespace after the backslash).
- * Otherwise, each line describes a key/value pair. <br>
- *
- * The chars up to the first whitespace, = or : are the key. You
- * can include this caracters in the key, if you precede them with
- * a backslash (<code>\</code>). The key is followed by optional
- * whitespaces, optionally one <code>=</code> or <code>:</code>,
- * and optionally some more whitespaces. The rest of the line is
- * the resource belonging to the key. <br>
- *
- * Escape sequences <code>\t, \n, \r, \\, \", \', \!, \#, \ </code>(a
- * space), and unicode characters with the
- * <code>\</code><code>u</code>xxxx notation are detected, and
- * converted to the corresponding single character. <br>
- *
- * <pre>
- * # This is a comment
- * key = value
- * k\:5 \ a string starting with space and ending with newline\n
- * # This is a multiline specification; note that the value contains
- * # no white space.
- * weekdays: Sunday,Monday,Tuesday,Wednesday,\
- * Thursday,Friday,Saturday
- * # The safest way to include a space at the end of a value:
- * label = Name:\<code></code>u0020
- * </pre>
- *
- * @param in the input stream
- * @exception IOException if an error occured when reading
- * from the input. */
- public void load(InputStream inStream) throws IOException {
- BufferedReader reader =
- new BufferedReader(new InputStreamReader(inStream));
- String line;
- while ((line = reader.readLine()) != null) {
- char c = 0;
- int pos = 0;
- while (pos < line.length()
- && Character.isWhitespace(c = line.charAt(pos)))
- pos++;
-
- // If line is empty or begins with a comment character,
- // skip this line.
- if (pos == line.length() || c == '#' || c == '!')
- continue;
-
- // The characaters up to the next Whitespace, ':', or '='
- // describe the key. But look for escape sequences.
- StringBuffer key = new StringBuffer();
- while (pos < line.length()
- && !Character.isWhitespace(c = line.charAt(pos++))
- && c != '=' && c != ':') {
- if (c == '\\') {
- if (pos == line.length()) {
- // The line continues on the next line.
- line = reader.readLine();
- pos = 0;
- while (pos < line.length()
- && Character.isWhitespace(c = line.charAt(pos)))
- pos++;
- } else {
- c = line.charAt(pos++);
- switch (c) {
- case 'n':
- key.append('\n');
- break;
- case 't':
- key.append('\t');
- break;
- case 'r':
- key.append('\r');
- break;
- case 'u':
- if (pos+4 <= line.length()) {
- char uni = (char) Integer.parseInt
- (line.substring(pos, pos+4), 16);
- key.append(uni);
- } // else throw exception?
- break;
- default:
- key.append(c);
- break;
- }
- }
- } else
- key.append(c);
- }
-
- boolean isDelim = (c == ':' || c == '=');
- while (pos < line.length()
- && Character.isWhitespace(c = line.charAt(pos)))
- pos++;
-
- if (!isDelim && (c == ':' || c == '=')) {
- pos++;
- while (pos < line.length()
- && Character.isWhitespace(c = line.charAt(pos)))
- pos++;
- }
-
- StringBuffer element = new StringBuffer(line.length()-pos);
- while (pos < line.length()) {
- c = line.charAt(pos++);
- if (c == '\\') {
- if (pos == line.length()) {
- // The line continues on the next line.
- line = reader.readLine();
- pos = 0;
- while (pos < line.length()
- && Character.isWhitespace(c = line.charAt(pos)))
- pos++;
- element.ensureCapacity(line.length()-pos+element.length());
- } else {
- c = line.charAt(pos++);
- switch (c) {
- case 'n':
- element.append('\n');
- break;
- case 't':
- element.append('\t');
- break;
- case 'r':
- element.append('\r');
- break;
- case 'u':
- if (pos+4 <= line.length()) {
- char uni = (char) Integer.parseInt
- (line.substring(pos, pos+4), 16);
- element.append(uni);
- } // else throw exception?
- break;
- default:
- element.append(c);
- break;
- }
- }
- } else
- element.append(c);
- }
- put(key.toString(), element.toString());
- }
- }
-
- /**
- * Calls <code>store(OutputStream out, String header)</code> and
- * ignores the IOException that may be thrown.
- * @deprecated use store instead.
- * @exception ClassCastException if this property contains any key or
- * value that isn't a string.
- */
- public void save(OutputStream out, String header) {
- try {
- store(out,header);
- } catch (IOException ex) {
- }
- }
-
- /**
- * Writes the key/value pairs to the given output stream. <br>
- *
- * If header is not null, this method writes a comment containing
- * the header as first line to the stream. The next line (or first
- * line if header is null) contains a comment with the current date.
- * Afterwards the key/value pairs are written to the stream in the
- * following format. <br>
- *
- * Each line has the form <code>key = value</code>. Newlines,
- * Returns and tabs are written as <code>\n,\t,\r</code> resp.
- * The characters <code>\, !, #, =</code> and <code>:</code> are
- * preceeded by a backslash. Spaces are preceded with a backslash,
- * if and only if they are at the beginning of the key. Characters
- * that are not in the ascii range 33 to 127 are written in the
- * <code>\</code><code>u</code>xxxx Form.
- *
- * @param out the output stream
- * @param header the header written in the first line, may be null.
- * @exception ClassCastException if this property contains any key or
- * value that isn't a string.
- */
- public void store(OutputStream out, String header) throws IOException {
- PrintWriter writer = new PrintWriter(out);
- if (header != null)
- writer.println("#"+header);
- writer.println("#"+new Date().toString());
- list(writer);
- writer.flush();
- }
+public class Properties extends Hashtable
+{
+ /**
+ * The property list that contains default values for any keys not
+ * in this property list.
+ */
+ protected Properties defaults;
+
+ private static final long serialVersionUID = 4112578634029874840L;
+
+ /**
+ * Creates a new empty property list.
+ */
+ public Properties()
+ {
+ this.defaults = null;
+ }
+
+ /**
+ * Create a new empty property list with the specified default values.
+ * @param defaults a Properties object containing the default values.
+ */
+ public Properties(Properties defaults)
+ {
+ this.defaults = defaults;
+ }
+
+ /**
+ * Reads a property list from an input stream. The stream should
+ * have the following format: <br>
+ *
+ * An empty line or a line starting with <code>#</code> or
+ * <code>!</code> is ignored. An backslash (<code>\</code>) at the
+ * end of the line makes the line continueing on the next line
+ * (but make sure there is no whitespace after the backslash).
+ * Otherwise, each line describes a key/value pair. <br>
+ *
+ * The chars up to the first whitespace, = or : are the key. You
+ * can include this caracters in the key, if you precede them with
+ * a backslash (<code>\</code>). The key is followed by optional
+ * whitespaces, optionally one <code>=</code> or <code>:</code>,
+ * and optionally some more whitespaces. The rest of the line is
+ * the resource belonging to the key. <br>
+ *
+ * Escape sequences <code>\t, \n, \r, \\, \", \', \!, \#, \ </code>(a
+ * space), and unicode characters with the
+ * <code>\</code><code>u</code>xxxx notation are detected, and
+ * converted to the corresponding single character. <br>
+ *
+ * <pre>
+ * # This is a comment
+ * key = value
+ * k\:5 \ a string starting with space and ending with newline\n
+ * # This is a multiline specification; note that the value contains
+ * # no white space.
+ * weekdays: Sunday,Monday,Tuesday,Wednesday,\
+ * Thursday,Friday,Saturday
+ * # The safest way to include a space at the end of a value:
+ * label = Name:\<code></code>u0020
+ * </pre>
+ *
+ * @param in the input stream
+ * @exception IOException if an error occured when reading
+ * from the input. */
+ public void load(InputStream inStream) throws IOException
+ {
+ BufferedReader reader =
+ new BufferedReader(new InputStreamReader(inStream));
+ String line;
- /**
- * Adds the given key/value pair to this properties. This calls
- * the hashtable method put.
- * @param key the key for this property
- * @param value the value for this property
- * @return The old value for the given key.
- * @since JDK1.2 */
- public Object setProperty(String key, String value) {
- return put(key,value);
- }
-
- /**
- * Gets the property with the specified key in this property list.
- * If the key is not found, the default property list is searched.
- * If the property is not found in default or the default of
- * default, null is returned.
- * @param key The key for this property.
- * @param defaulValue A default value
- * @return The value for the given key, or null if not found.
- * @exception ClassCastException if this property contains any key or
- * value that isn't a string.
- */
- public String getProperty(String key) {
- return getProperty(key, null);
- }
-
- /**
- * Gets the property with the specified key in this property list. If
- * the key is not found, the default property list is searched. If the
- * property is not found in default or the default of default, the
- * specified defaultValue is returned.
- * @param key The key for this property.
- * @param defaulValue A default value
- * @return The value for the given key.
- * @exception ClassCastException if this property contains any key or
- * value that isn't a string.
- */
- public String getProperty(String key, String defaultValue) {
- Properties prop = this;
- // Eliminate tail recursion.
- do {
- String value = (String) prop.get(key);
- if (value != null)
- return value;
- prop = prop.defaults;
- } while (prop != null);
- return defaultValue;
- }
-
- private final void addHashEntries (Hashtable base) {
- if (defaults != null)
- defaults.addHashEntries(base);
- Enumeration keys = keys ();
- while (keys.hasMoreElements())
- base.put(keys.nextElement(), base);
- }
-
- /**
- * Returns an enumeration of all keys in this property list, including
- * the keys in the default property list.
- */
- public Enumeration propertyNames () {
- // We make a new Hashtable that holds all the keys. Then we
- // return an enumeration for this hash. We do this because we
- // don't want modifications to be reflected in the enumeration
- // (per JCL), and because there doesn't seem to be a
- // particularly better way to ensure that duplicates are
- // ignored.
- Hashtable t = new Hashtable ();
- addHashEntries (t);
- return t.keys();
- }
-
- /**
- * Formats a key/value pair for output in a properties file.
- * See store for a description of the format.
- * @param key the key.
- * @param value the value.
- * @see #store
- */
- private String formatForOutput(String key, String value) {
- // This is a simple approximation of the expected line size.
- StringBuffer result = new StringBuffer(key.length()+value.length()+16);
- boolean head = true;
- for (int i=0; i< key.length(); i++) {
- char c = key.charAt(i);
- switch (c) {
- case '\n':
- result.append("\\n");
- break;
- case '\r':
- result.append("\\r");
- break;
- case '\t':
- result.append("\\t");
- break;
- case '\\':
- result.append("\\\\");
- break;
- case '!':
- result.append("\\!");
- break;
- case '#':
- result.append("\\#");
- break;
- case '=':
- result.append("\\=");
- break;
- case ':':
- result.append("\\:");
- break;
- case ' ':
- result.append("\\ ");
- break;
- default:
- if (c < 32 || c > '~') {
- String hex = Integer.toHexString(c);
- result.append("\\u0000".substring(0, 6-hex.length()));
- result.append(hex);
- } else
- result.append(c);
- }
- if (c != 32)
- head = false;
- }
- result.append('=');
- head=true;
- for (int i=0; i< value.length(); i++) {
- char c = value.charAt(i);
- switch (c) {
- case '\n':
- result.append("\\n");
- break;
- case '\r':
- result.append("\\r");
- break;
- case '\t':
- result.append("\\t");
- break;
- case '\\':
- result.append("\\\\");
- break;
- case '!':
- result.append("\\!");
- break;
- case '#':
- result.append("\\#");
- break;
- case ' ':
- result.append(head ? "\\ ": " ");
- break;
- default:
- if (c < 32 || c > '~') {
- String hex = Integer.toHexString(c);
- result.append("\\u0000".substring(0, 6-hex.length()));
- result.append(hex);
- } else
- result.append(c);
- }
- if (c != 32)
- head = false;
- }
- return result.toString();
- }
-
- /**
- * Writes the key/value pairs to the given print stream. They are
- * written in the way, described in the method store.
- * @param out the stream, where the key/value pairs are written to.
- * @exception ClassCastException if this property contains any key or
- * value that isn't a string.
- * @see #store
- */
- public void list(PrintStream out) {
- Enumeration keys = keys();
- Enumeration elts = elements();
- while (keys.hasMoreElements()) {
- String key = (String) keys.nextElement();
- String elt = (String) elts.nextElement();
- String output = formatForOutput(key,elt);
- out.println(output);
- }
- }
-
- /**
- * Writes the key/value pairs to the given print writer. They are
- * written in the way, described in the method store.
- * @param out the writer, where the key/value pairs are written to.
- * @exception ClassCastException if this property contains any key or
- * value that isn't a string.
- * @see #store
- * @see #list(java.io.PrintStream)
- * @since JDK1.1
- */
- public void list(PrintWriter out) {
- Enumeration keys = keys();
- Enumeration elts = elements();
- while (keys.hasMoreElements()) {
- String key = (String) keys.nextElement();
- String elt = (String) elts.nextElement();
- String output = formatForOutput(key,elt);
- out.println(output);
- }
- }
+ while ((line = reader.readLine()) != null)
+ {
+ char c = 0;
+ int pos = 0;
+ while (pos < line.length()
+ && Character.isWhitespace(c = line.charAt(pos)))
+ pos++;
+
+ // If line is empty or begins with a comment character,
+ // skip this line.
+ if (pos == line.length() || c == '#' || c == '!')
+ continue;
+
+ // The characaters up to the next Whitespace, ':', or '='
+ // describe the key. But look for escape sequences.
+ StringBuffer key = new StringBuffer();
+ while (pos < line.length()
+ && !Character.isWhitespace(c = line.charAt(pos++))
+ && c != '=' && c != ':')
+ {
+ if (c == '\\')
+ {
+ if (pos == line.length())
+ {
+ // The line continues on the next line.
+ line = reader.readLine();
+ pos = 0;
+ while (pos < line.length()
+ && Character.isWhitespace(c = line.charAt(pos)))
+ pos++;
+ }
+ else
+ {
+ c = line.charAt(pos++);
+ switch (c)
+ {
+ case 'n':
+ key.append('\n');
+ break;
+ case 't':
+ key.append('\t');
+ break;
+ case 'r':
+ key.append('\r');
+ break;
+ case 'u':
+ if (pos + 4 <= line.length())
+ {
+ char uni = (char) Integer.parseInt
+ (line.substring(pos, pos + 4), 16);
+ key.append(uni);
+ } // else throw exception?
+ break;
+ default:
+ key.append(c);
+ break;
+ }
+ }
+ }
+ else
+ key.append(c);
+ }
+
+ boolean isDelim = (c == ':' || c == '=');
+ while (pos < line.length()
+ && Character.isWhitespace(c = line.charAt(pos)))
+ pos++;
+
+ if (!isDelim && (c == ':' || c == '='))
+ {
+ pos++;
+ while (pos < line.length()
+ && Character.isWhitespace(c = line.charAt(pos)))
+ pos++;
+ }
+
+ StringBuffer element = new StringBuffer(line.length() - pos);
+ while (pos < line.length())
+ {
+ c = line.charAt(pos++);
+ if (c == '\\')
+ {
+ if (pos == line.length())
+ {
+ // The line continues on the next line.
+ line = reader.readLine();
+ pos = 0;
+ while (pos < line.length()
+ && Character.isWhitespace(c = line.charAt(pos)))
+ pos++;
+ element.ensureCapacity(line.length() - pos +
+ element.length());
+ }
+ else
+ {
+ c = line.charAt(pos++);
+ switch (c)
+ {
+ case 'n':
+ element.append('\n');
+ break;
+ case 't':
+ element.append('\t');
+ break;
+ case 'r':
+ element.append('\r');
+ break;
+ case 'u':
+ if (pos + 4 <= line.length())
+ {
+ char uni = (char) Integer.parseInt
+ (line.substring(pos, pos + 4), 16);
+ element.append(uni);
+ } // else throw exception?
+ break;
+ default:
+ element.append(c);
+ break;
+ }
+ }
+ }
+ else
+ element.append(c);
+ }
+ put(key.toString(), element.toString());
+ }
+ }
+
+ /**
+ * Calls <code>store(OutputStream out, String header)</code> and
+ * ignores the IOException that may be thrown.
+ * @deprecated use store instead.
+ * @exception ClassCastException if this property contains any key or
+ * value that isn't a string.
+ */
+ public void save(OutputStream out, String header)
+ {
+ try
+ {
+ store(out, header);
+ }
+ catch (IOException ex)
+ {
+ }
+ }
+
+ /**
+ * Writes the key/value pairs to the given output stream. <br>
+ *
+ * If header is not null, this method writes a comment containing
+ * the header as first line to the stream. The next line (or first
+ * line if header is null) contains a comment with the current date.
+ * Afterwards the key/value pairs are written to the stream in the
+ * following format. <br>
+ *
+ * Each line has the form <code>key = value</code>. Newlines,
+ * Returns and tabs are written as <code>\n,\t,\r</code> resp.
+ * The characters <code>\, !, #, =</code> and <code>:</code> are
+ * preceeded by a backslash. Spaces are preceded with a backslash,
+ * if and only if they are at the beginning of the key. Characters
+ * that are not in the ascii range 33 to 127 are written in the
+ * <code>\</code><code>u</code>xxxx Form.
+ *
+ * @param out the output stream
+ * @param header the header written in the first line, may be null.
+ * @exception ClassCastException if this property contains any key or
+ * value that isn't a string.
+ */
+ public void store(OutputStream out, String header) throws IOException
+ {
+ PrintWriter writer = new PrintWriter(out);
+ if (header != null)
+ writer.println("#" + header);
+ writer.println("#" + new Date().toString());
+ list(writer);
+ writer.flush();
+ }
+
+ /**
+ * Adds the given key/value pair to this properties. This calls
+ * the hashtable method put.
+ * @param key the key for this property
+ * @param value the value for this property
+ * @return The old value for the given key.
+ * @since JDK1.2 */
+ public Object setProperty(String key, String value)
+ {
+ return put(key, value);
+ }
+
+ /**
+ * Gets the property with the specified key in this property list.
+ * If the key is not found, the default property list is searched.
+ * If the property is not found in default or the default of
+ * default, null is returned.
+ * @param key The key for this property.
+ * @param defaulValue A default value
+ * @return The value for the given key, or null if not found.
+ * @exception ClassCastException if this property contains any key or
+ * value that isn't a string.
+ */
+ public String getProperty(String key)
+ {
+ return getProperty(key, null);
+ }
+
+ /**
+ * Gets the property with the specified key in this property list. If
+ * the key is not found, the default property list is searched. If the
+ * property is not found in default or the default of default, the
+ * specified defaultValue is returned.
+ * @param key The key for this property.
+ * @param defaulValue A default value
+ * @return The value for the given key.
+ * @exception ClassCastException if this property contains any key or
+ * value that isn't a string.
+ */
+ public String getProperty(String key, String defaultValue)
+ {
+ Properties prop = this;
+ // Eliminate tail recursion.
+ do
+ {
+ String value = (String) prop.get(key);
+ if (value != null)
+ return value;
+ prop = prop.defaults;
+ }
+ while (prop != null);
+ return defaultValue;
+ }
+
+ private final void addHashEntries(Hashtable base)
+ {
+ if (defaults != null)
+ defaults.addHashEntries(base);
+ Enumeration keys = keys();
+ while (keys.hasMoreElements())
+ base.put(keys.nextElement(), base);
+ }
+
+ /**
+ * Returns an enumeration of all keys in this property list, including
+ * the keys in the default property list.
+ */
+ public Enumeration propertyNames()
+ {
+ // We make a new Hashtable that holds all the keys. Then we
+ // return an enumeration for this hash. We do this because we
+ // don't want modifications to be reflected in the enumeration
+ // (per JCL), and because there doesn't seem to be a
+ // particularly better way to ensure that duplicates are
+ // ignored.
+ Hashtable t = new Hashtable();
+ addHashEntries(t);
+ return t.keys();
+ }
+
+ /**
+ * Formats a key/value pair for output in a properties file.
+ * See store for a description of the format.
+ * @param key the key.
+ * @param value the value.
+ * @see #store
+ */
+ private String formatForOutput(String key, String value)
+ {
+ // This is a simple approximation of the expected line size.
+ StringBuffer result =
+ new StringBuffer(key.length() + value.length() + 16);
+ boolean head = true;
+ for (int i = 0; i < key.length(); i++)
+ {
+ char c = key.charAt(i);
+ switch (c)
+ {
+ case '\n':
+ result.append("\\n");
+ break;
+ case '\r':
+ result.append("\\r");
+ break;
+ case '\t':
+ result.append("\\t");
+ break;
+ case '\\':
+ result.append("\\\\");
+ break;
+ case '!':
+ result.append("\\!");
+ break;
+ case '#':
+ result.append("\\#");
+ break;
+ case '=':
+ result.append("\\=");
+ break;
+ case ':':
+ result.append("\\:");
+ break;
+ case ' ':
+ result.append("\\ ");
+ break;
+ default:
+ if (c < 32 || c > '~')
+ {
+ String hex = Integer.toHexString(c);
+ result.append("\\u0000".substring(0, 6 - hex.length()));
+ result.append(hex);
+ }
+ else
+ result.append(c);
+ }
+ if (c != 32)
+ head = false;
+ }
+ result.append('=');
+ head = true;
+ for (int i = 0; i < value.length(); i++)
+ {
+ char c = value.charAt(i);
+ switch (c)
+ {
+ case '\n':
+ result.append("\\n");
+ break;
+ case '\r':
+ result.append("\\r");
+ break;
+ case '\t':
+ result.append("\\t");
+ break;
+ case '\\':
+ result.append("\\\\");
+ break;
+ case '!':
+ result.append("\\!");
+ break;
+ case '#':
+ result.append("\\#");
+ break;
+ case ' ':
+ result.append(head ? "\\ " : " ");
+ break;
+ default:
+ if (c < 32 || c > '~')
+ {
+ String hex = Integer.toHexString(c);
+ result.append("\\u0000".substring(0, 6 - hex.length()));
+ result.append(hex);
+ }
+ else
+ result.append(c);
+ }
+ if (c != 32)
+ head = false;
+ }
+ return result.toString();
+ }
+
+ /**
+ * Writes the key/value pairs to the given print stream. They are
+ * written in the way, described in the method store.
+ * @param out the stream, where the key/value pairs are written to.
+ * @exception ClassCastException if this property contains any key or
+ * value that isn't a string.
+ * @see #store
+ */
+ public void list(PrintStream out)
+ {
+ Enumeration keys = keys();
+ Enumeration elts = elements();
+ while (keys.hasMoreElements())
+ {
+ String key = (String) keys.nextElement();
+ String elt = (String) elts.nextElement();
+ String output = formatForOutput(key, elt);
+ out.println(output);
+ }
+ }
+
+ /**
+ * Writes the key/value pairs to the given print writer. They are
+ * written in the way, described in the method store.
+ * @param out the writer, where the key/value pairs are written to.
+ * @exception ClassCastException if this property contains any key or
+ * value that isn't a string.
+ * @see #store
+ * @see #list(java.io.PrintStream)
+ * @since JDK1.1
+ */
+ public void list(PrintWriter out)
+ {
+ Enumeration keys = keys();
+ Enumeration elts = elements();
+ while (keys.hasMoreElements())
+ {
+ String key = (String) keys.nextElement();
+ String elt = (String) elts.nextElement();
+ String output = formatForOutput(key, elt);
+ out.println(output);
+ }
+ }
}
Index: java/util/SortedMap.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/SortedMap.java,v
retrieving revision 1.1
diff -u -r1.1 SortedMap.java
--- SortedMap.java 2000/08/27 22:06:44 1.1
+++ SortedMap.java 2001/03/19 22:56:25
@@ -7,7 +7,7 @@
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
@@ -30,7 +30,8 @@
package java.util;
-public interface SortedMap extends Map {
+public interface SortedMap extends Map
+{
Comparator comparator();
Object firstKey();
SortedMap headMap(Object toKey);
Index: java/util/Enumeration.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/Enumeration.java,v
retrieving revision 1.3
diff -u -r1.3 Enumeration.java
--- Enumeration.java 2000/03/07 19:55:27 1.3
+++ Enumeration.java 2001/03/19 22:56:25
@@ -1,24 +1,65 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation
+/* Enumeration.java -- Interface for enumerating lists of objects
+ Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
- This file is part of libgcj.
+This file is part of GNU Classpath.
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
+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.util;
-
-/**
- * @author Warren Levy <warrenl@cygnus.com>
- * @date August 25, 1998.
- */
+
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1.
* Status: Believed complete and correct
*/
-
+
+/**
+ * Interface for lists of objects that can be returned in sequence. Successive
+ * objects are obtained by the nextElement method.
+ * <p>
+ * As of Java 1.2, the Iterator interface provides the same functionality, but
+ * with shorter method names and a new optional method to remove items from the
+ * list. If writing for 1.2, consider using Iterator instead. Enumerations over
+ * the new collections classes, for use with legacy APIs that require them, can
+ * be obtained by the enumeration method in class Collections.
+ *
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date August 25, 1998.
+ */
public interface Enumeration
{
- public boolean hasMoreElements();
- public Object nextElement() throws NoSuchElementException;
+ /**
+ * Tests whether there are elements remaining in the enumeration.
+ *
+ * @return true if there is at least one more element in the enumeration,
+ * that is, if the next call to nextElement will not throw a
+ * NoSuchElementException.
+ */
+ boolean hasMoreElements();
+
+ /**
+ * Obtain the next element in the enumeration.
+ *
+ * @return the next element in the enumeration
+ * @exception NoSuchElementException if there are no more elements
+ */
+ Object nextElement() throws NoSuchElementException;
}
Index: java/util/EventListener.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/EventListener.java,v
retrieving revision 1.3
diff -u -r1.3 EventListener.java
--- EventListener.java 2000/03/07 19:55:27 1.3
+++ EventListener.java 2001/03/19 22:56:25
@@ -1,24 +1,47 @@
-// EventListener.java - Listen for events from event source.
+/* An interface that all event listener interfaces must extend
+ Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
-/* Copyright (C) 1998, 1999 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.
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
-
+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.util;
-/**
- * @author Tom Tromey <tromey@cygnus.com>
- * @date December 12, 1998
- */
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* Status: Believed complete and correct.
*/
+/**
+ * Empty interface that is implemented by classes that need to receive
+ * events. Subinterfaces define methods that can be called to fire an
+ * event notification. Normally the name of these subinterfaces end in
+ * <code>Listener</code> and all method described by the subinterface
+ * take as argument an subclass of <code>EventObject</code>.
+ *
+ * @author Tom Tromey <tromey@cygnus.com>
+ * @date December 12, 1998
+ */
public interface EventListener
{
}
Index: java/util/Observable.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/Observable.java,v
retrieving revision 1.3
diff -u -r1.3 Observable.java
--- Observable.java 2000/03/07 19:55:27 1.3
+++ Observable.java 2001/03/19 22:56:25
@@ -1,30 +1,49 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation
+/* java.util.Observable
+ Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
- This file is part of libgcj.
+This file is part of GNU Classpath.
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
+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.util;
-
-/**
- * @author Warren Levy <warrenl@cygnus.com>
- * @date September 2, 1998.
- */
+
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Believed complete and correct.
*/
-
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date September 2, 1998.
+ */
public class Observable
{
- /* tracks whether this object has changed */
+ /** tracks whether this object has changed */
private boolean changed;
/* list of the Observers registered as interested in this Observable */
- private Vector observerVec;
+ private Vector observers;
/* TBD: This might be better implemented as an Observer[]
* but that would mean writing more code rather than making use of
@@ -34,63 +53,101 @@
* we may decide to make the tradeoff and reimplement with an Observer[].
*/
+ /**
+ * Constructs an Observable with zero Observers.
+ */
public Observable()
{
changed = false;
- observerVec = new Vector();
+ observers = new Vector();
}
- public synchronized void addObserver(Observer obs)
+ /**
+ * Adds an Observer. If the observer was already added this method does
+ * nothing.
+ *
+ * @param observer Observer to add.
+ */
+ public synchronized void addObserver(Observer observer)
{
- // JDK 1.2 spec says not to add this if it is already there
- if (!observerVec.contains(obs))
- observerVec.addElement(obs);
+ if (!observers.contains(observer))
+ observers.addElement(observer);
}
+ /**
+ * Reset this Observable's state to unchanged.
+ */
protected synchronized void clearChanged()
{
changed = false;
}
+ /**
+ * @return Number of Observers for this Observable.
+ */
public synchronized int countObservers()
{
- return observerVec.size();
+ return observers.size();
}
- public synchronized void deleteObserver(Observer obs)
+ /**
+ * Deletes an Observer of this Observable.
+ *
+ * @param victim Observer to delete.
+ */
+ public synchronized void deleteObserver(Observer victim)
{
- observerVec.removeElement(obs);
+ observers.removeElement(victim);
}
+ /**
+ * Deletes all Observers of this Observable.
+ */
public synchronized void deleteObservers()
{
- observerVec.removeAllElements();
+ observers.removeAllElements();
}
+ /**
+ * @return Whether or not this Observable has changed.
+ */
public synchronized boolean hasChanged()
{
return changed;
}
+ /**
+ * If the Observable has actually changed then tell all Observers about it,
+ * then resets state to unchanged.
+ */
public void notifyObservers()
{
notifyObservers(null);
}
- public void notifyObservers(Object arg)
+ /**
+ * If the Observable has actually changed then tell all Observers about it,
+ * then resets state to unchanged.
+ * Note that though the order of notification is unspecified in subclasses,
+ * in Observable it is in the order of registration.
+ *
+ * @param obj Arguement to Observer's update method.
+ */
+ public void notifyObservers(Object obj)
{
- if (changed)
- {
- /* The JDK 1.2 spec states that though the order of notification
- * is unspecified in subclasses, in Observable it is in the order
- * of registration.
- */
- for (int i = 0, numObs = observerVec.size(); i < numObs; i++)
- ((Observer) (observerVec.elementAt(i))).update(this, arg);
- changed = false;
- }
+ if (!hasChanged())
+ return;
+ Vector ob1 = (Vector) observers.clone();
+
+ for (int i = 0; i < ob1.size(); i++)
+ ((Observer) ob1.elementAt(i)).update(this, obj);
+
+ clearChanged();
}
+ /**
+ * Marks this Observable as having changed.
+ */
protected synchronized void setChanged()
{
changed = true;
Index: java/util/Observer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/Observer.java,v
retrieving revision 1.3
diff -u -r1.3 Observer.java
--- Observer.java 2000/03/07 19:55:27 1.3
+++ Observer.java 2001/03/19 22:56:25
@@ -1,24 +1,48 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation
+/* Implemented when a class wants to be informed of changes in Observable
+ objects.
+ Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
- This file is part of libgcj.
+This file is part of GNU Classpath.
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
+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.util;
-
-/**
- * @author Warren Levy <warrenl@cygnus.com>
- * @date August 25, 1998.
- */
+
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Believed complete and correct
+ */
+
+/**
+ * Interface that is implemented when a class wants to be informed of changes
+ * in Observable objects.
+ *
+ * @see java.util.Observable
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date August 25, 1998.
*/
-
public interface Observer
{
- public void update(Observable observed, Object arg);
+ public void update(Observable observable, Object arg);
}
Index: java/util/Stack.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/Stack.java,v
retrieving revision 1.4
diff -u -r1.4 Stack.java
--- Stack.java 2000/09/08 19:37:09 1.4
+++ Stack.java 2001/03/19 22:56:25
@@ -1,42 +1,89 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation
+/* Stack.java - Class that provides a Last In First Out (LIFO)
+ datatype, known more commonly as a Stack
+ Copyright (C) 1998, 1999, 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. */
- 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 java.util;
-/**
- * @author Warren Levy <warrenl@cygnus.com>
- * @date August 20, 1998.
- */
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Believed complete and correct
*/
+/**
+ * Stack provides a Last In First Out (LIFO) data type, commonly known
+ * as a Stack.
+ *
+ * Stack itself extends Vector and provides the additional methods
+ * for stack manipulation (push, pop, peek).
+ *
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date August 20, 1998.
+ */
public class Stack extends Vector
{
// Could use Vector methods internally for the following methods
// but have used Vector fields directly for efficiency (i.e. this
// often reduces out duplicate bounds checking).
- public boolean empty()
+ private static final long serialVersionUID = 1224463164541339165L;
+
+ /**
+ * This constructor creates a new Stack, initially empty
+ */
+ public Stack()
{
- return elementCount == 0;
+ super();
}
- public synchronized Object peek()
+ /**
+ * Pushes an Object onto the top of the stack. This method is effectively
+ * the same as addElement(item)
+ *
+ * @param item the Object to push onto the stack
+ * @returns the Object pushed onto the stack
+ * @see java.util.Vector#addElement(java.util.Object)
+ */
+ public Object push(Object item)
{
- if (elementCount == 0)
- throw new EmptyStackException();
+ // When growing the Stack, use the Vector routines in case more
+ // memory is needed.
+ // Note: spec indicates that this method *always* returns obj passed in!
- return elementData[elementCount - 1];
+ addElement(item);
+ return item;
}
+ /**
+ * Pops an item from the stack and returns it. The item popped is
+ * removed from the Stack
+ *
+ * @returns the Object popped from the stack
+ */
public synchronized Object pop()
{
if (elementCount == 0)
@@ -49,28 +96,44 @@
return obj;
}
- public Object push(Object obj)
+ /**
+ * Returns the top Object on the stack without removing it
+ *
+ * @returns the top Object on the stack
+ */
+ public synchronized Object peek()
{
- // When growing the Stack, use the Vector routines in case more
- // memory is needed.
- // Note: spec indicates that this method *always* returns obj passed in!
+ if (elementCount == 0)
+ throw new EmptyStackException();
- addElement(obj);
- return obj;
+ return elementData[elementCount - 1];
}
- public synchronized int search(Object obj)
+ /**
+ * Tests if the stack is empty
+ *
+ * @returns true if the stack contains no items, false otherwise
+ */
+ public boolean empty()
{
- // Return the position of obj on the stack as measured from the top;
- // i.e. the top element is 1, the next element down is 2, etc.
- // If obj is not on the stack, return -1
+ return elementCount == 0;
+ }
+ /**
+ * Returns the position of an Object on the stack, with the top
+ * most Object being at position 1, and each Object deeper in the
+ * stack at depth + 1
+ *
+ * @param o The object to search for
+ * @returns The 1 based depth of the Object, or -1 if the Object
+ * is not on the stack.
+ */
+ public synchronized int search(Object o)
+ {
for (int i = elementCount-1; i >=0; --i)
- if (elementData[i].equals(obj))
- return elementCount - i;
+ if (elementData[i].equals(o))
+ return elementCount - i;
return -1;
}
-
- private static final long serialVersionUID = 1224463164541339165L;
}