Calendar.java: Implement Comparable<Calendar>.

* java/util/Calendar.java: Implement Comparable<Calendar>.  Update
	comments.
	(clear): Call complete.
	(setTimeZone): Call computeTime, computeFields.
	(compareTo): New method.
	* java/nio/charset/Charset.java: Implement Comparable<Charset>.
	(availableCharsets): Genericized.
	(aliases): Likewise.
	(compareTo): Changed argument type.
	* java/lang/ClassLoader.java (loadClass): Genericized.
	(findClass): Likewise.
	(defineClass): Likewise.
	(resolveClass): Likewise.
	(findSystemClass): Likewise.
	(setSigners): Likewise.
	(findLoadedClass): Likewise.
	(getResources): Likewise.
	(findResources): Likewise.
	(getSystemResources): Likewise.
	(checkInitialized): New method.
	* java/lang/Class.java (getCanonicalName): New method.

From-SVN: r121471
This commit is contained in:
Tom Tromey 2007-02-01 20:34:08 +00:00 committed by Tom Tromey
parent 62e5bf5d42
commit 0a32f469ac
11 changed files with 193 additions and 46 deletions

View File

@ -1,3 +1,27 @@
2007-02-01 Tom Tromey <tromey@redhat.com>
* java/util/Calendar.java: Implement Comparable<Calendar>. Update
comments.
(clear): Call complete.
(setTimeZone): Call computeTime, computeFields.
(compareTo): New method.
* java/nio/charset/Charset.java: Implement Comparable<Charset>.
(availableCharsets): Genericized.
(aliases): Likewise.
(compareTo): Changed argument type.
* java/lang/ClassLoader.java (loadClass): Genericized.
(findClass): Likewise.
(defineClass): Likewise.
(resolveClass): Likewise.
(findSystemClass): Likewise.
(setSigners): Likewise.
(findLoadedClass): Likewise.
(getResources): Likewise.
(findResources): Likewise.
(getSystemResources): Likewise.
(checkInitialized): New method.
* java/lang/Class.java (getCanonicalName): New method.
2007-01-31 Keith Seitz <keiths@redhat.com>
* include/jvmti-int.h (JVMTI): Declare member "enabled".

View File

@ -1,5 +1,5 @@
/* Class.java -- Representation of a Java class.
Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006
Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007
Free Software Foundation
This file is part of GNU Classpath.
@ -1290,6 +1290,59 @@ public final class Class<T>
return v.toArray(new Annotation[v.size()]);
}
/**
* <p>
* Returns the canonical name of this class, as defined by section
* 6.7 of the Java language specification. Each package, top-level class,
* top-level interface and primitive type has a canonical name. A member
* class has a canonical name, if its parent class has one. Likewise,
* an array type has a canonical name, if its component type does.
* Local or anonymous classes do not have canonical names.
* </p>
* <p>
* The canonical name for top-level classes, top-level interfaces and
* primitive types is always the same as the fully-qualified name.
* For array types, the canonical name is the canonical name of its
* component type with `[]' appended.
* </p>
* <p>
* The canonical name of a member class always refers to the place where
* the class was defined, and is composed of the canonical name of the
* defining class and the simple name of the member class, joined by `.'.
* For example, if a <code>Person</code> class has an inner class,
* <code>M</code>, then both its fully-qualified name and canonical name
* is <code>Person.M</code>. A subclass, <code>Staff</code>, of
* <code>Person</code> refers to the same inner class by the fully-qualified
* name of <code>Staff.M</code>, but its canonical name is still
* <code>Person.M</code>.
* </p>
* <p>
* Where no canonical name is present, <code>null</code> is returned.
* </p>
*
* @return the canonical name of the class, or <code>null</code> if the
* class doesn't have a canonical name.
* @since 1.5
*/
public String getCanonicalName()
{
if (isArray())
{
String componentName = getComponentType().getCanonicalName();
if (componentName != null)
return componentName + "[]";
}
if (isMemberClass())
{
String memberName = getDeclaringClass().getCanonicalName();
if (memberName != null)
return memberName + "." + getSimpleName();
}
if (isLocalClass() || isAnonymousClass())
return null;
return getName();
}
/**
* Returns all annotations directly defined by this class. If there are
* no annotations associated with this class, then a zero-length array

View File

@ -1,5 +1,5 @@
/* ClassLoader.java -- responsible for loading classes into the VM
Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -118,7 +118,6 @@ import java.lang.annotation.Annotation;
* @author Eric Blake (ebb9@email.byu.edu)
* @see Class
* @since 1.0
* @status still missing 1.4 functionality
*/
public abstract class ClassLoader
{
@ -373,7 +372,7 @@ public abstract class ClassLoader
* @return the loaded class
* @throws ClassNotFoundException if the class cannot be found
*/
public Class loadClass(String name) throws ClassNotFoundException
public Class<?> loadClass(String name) throws ClassNotFoundException
{
return loadClass(name, false);
}
@ -401,7 +400,7 @@ public abstract class ClassLoader
* @return the loaded class
* @throws ClassNotFoundException if the class cannot be found
*/
protected synchronized Class loadClass(String name, boolean resolve)
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
SecurityManager sm = SecurityManager.current;
@ -490,7 +489,7 @@ public abstract class ClassLoader
* @throws ClassNotFoundException when the class can not be found
* @since 1.2
*/
protected Class findClass(String name) throws ClassNotFoundException
protected Class<?> findClass(String name) throws ClassNotFoundException
{
throw new ClassNotFoundException(name);
}
@ -508,7 +507,7 @@ public abstract class ClassLoader
* offset + len exceeds data
* @deprecated use {@link #defineClass(String, byte[], int, int)} instead
*/
protected final Class defineClass(byte[] data, int offset, int len)
protected final Class<?> defineClass(byte[] data, int offset, int len)
throws ClassFormatError
{
return defineClass(null, data, offset, len);
@ -533,8 +532,8 @@ public abstract class ClassLoader
* @throws SecurityException if name starts with "java."
* @since 1.1
*/
protected final Class defineClass(String name, byte[] data, int offset,
int len) throws ClassFormatError
protected final Class<?> defineClass(String name, byte[] data, int offset,
int len) throws ClassFormatError
{
return defineClass(name, data, offset, len, null);
}
@ -562,15 +561,14 @@ public abstract class ClassLoader
* do not match up
* @since 1.2
*/
protected final synchronized Class defineClass(String name, byte[] data,
int offset, int len,
ProtectionDomain domain)
protected final synchronized Class<?> defineClass(String name, byte[] data,
int offset, int len,
ProtectionDomain domain)
throws ClassFormatError
{
checkInitialized();
if (domain == null)
domain = defaultProtectionDomain;
if (! initialized)
throw new SecurityException("attempt to define class from uninitialized class loader");
Class retval = VMClassLoader.defineClass(this, name, data,
offset, len, domain);
@ -615,8 +613,9 @@ public abstract class ClassLoader
* @throws NullPointerException if c is null
* @throws LinkageError if linking fails
*/
protected final void resolveClass(Class c)
protected final void resolveClass(Class<?> c)
{
checkInitialized();
VMClassLoader.resolveClass(c);
}
@ -629,9 +628,10 @@ public abstract class ClassLoader
* @return the found class
* @throws ClassNotFoundException if the class cannot be found
*/
protected final Class findSystemClass(String name)
protected final Class<?> findSystemClass(String name)
throws ClassNotFoundException
{
checkInitialized();
return Class.forName(name, false, systemClassLoader);
}
@ -666,8 +666,9 @@ public abstract class ClassLoader
* @param signers the signers to set
* @since 1.1
*/
protected final void setSigners(Class c, Object[] signers)
protected final void setSigners(Class<?> c, Object[] signers)
{
checkInitialized();
c.setSigners(signers);
}
@ -678,8 +679,9 @@ public abstract class ClassLoader
* @return the found Class, or null if it is not found
* @since 1.1
*/
protected final synchronized Class findLoadedClass(String name)
protected final synchronized Class<?> findLoadedClass(String name)
{
checkInitialized();
// NOTE: If the VM is keeping its own cache, it may make sense to have
// this method be native.
return (Class) loadedClasses.get(name);
@ -732,15 +734,16 @@ public abstract class ClassLoader
* @return an enumaration of all resources found
* @throws IOException if I/O errors occur in the process
* @since 1.2
* @specnote this was <code>final</code> prior to 1.5
*/
public final Enumeration getResources(String name) throws IOException
public final Enumeration<URL> getResources(String name) throws IOException
{
Enumeration parentResources;
Enumeration<URL> parentResources;
if (parent == null)
parentResources = VMClassLoader.getResources(name);
else
parentResources = parent.getResources(name);
return new DoubleEnumeration(parentResources, findResources(name));
return new DoubleEnumeration<URL>(parentResources, findResources(name));
}
/**
@ -760,9 +763,9 @@ public abstract class ClassLoader
* @throws IOException if I/O errors occur in the process
* @since 1.2
*/
protected Enumeration findResources(String name) throws IOException
protected Enumeration<URL> findResources(String name) throws IOException
{
return EmptyEnumeration.getInstance();
return (Enumeration<URL>) EmptyEnumeration.getInstance();
}
/**
@ -807,7 +810,8 @@ public abstract class ClassLoader
* @throws IOException if I/O errors occur in the process
* @since 1.2
*/
public static Enumeration getSystemResources(String name) throws IOException
public static Enumeration<URL> getSystemResources(String name)
throws IOException
{
return systemClassLoader.getResources(name);
}
@ -939,7 +943,7 @@ public abstract class ClassLoader
throw new IllegalArgumentException("Package " + name
+ " already defined");
Package p = new Package(name, specTitle, specVendor, specVersion,
implTitle, implVendor, implVersion, sealed);
implTitle, implVendor, implVersion, sealed, this);
synchronized (definedPackages)
{
definedPackages.put(name, p);
@ -1115,4 +1119,16 @@ public abstract class ClassLoader
}
return false;
}
/**
* Before doing anything "dangerous" please call this method to make sure
* this class loader instance was properly constructed (and not obtained
* by exploiting the finalizer attack)
* @see #initialized
*/
private void checkInitialized()
{
if (! initialized)
throw new SecurityException("attempt to use uninitialized class loader");
}
}

View File

@ -145,7 +145,7 @@ public: // actually package-private
::java::lang::Object * accessControlState;
::gnu::gcj::RawData * interp_frame;
::gnu::gcj::RawData * frame;
volatile jint state;
jint volatile state;
::gnu::gcj::RawDataManaged * data;
public:
static ::java::lang::Class class$;

View File

@ -1,5 +1,5 @@
/* Charset.java --
Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 2002, 2004, 2005, 2007 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -61,14 +61,15 @@ import java.util.TreeMap;
/**
* @author Jesse Rosenstock
* @since 1.4
* @status updated to 1.5
*/
public abstract class Charset implements Comparable
public abstract class Charset implements Comparable<Charset>
{
private CharsetEncoder cachedEncoder;
private CharsetDecoder cachedDecoder;
/**
* Charset providers.
* Extra Charset providers.
*/
private static CharsetProvider[] providers;
@ -174,7 +175,7 @@ public abstract class Charset implements Comparable
* Returns the Charset instance for the charset of the given name.
*
* @param charsetName
* @return
* @return the Charset instance for the indicated charset
* @throws UnsupportedCharsetException if this VM does not support
* the charset of the given name.
* @throws IllegalCharsetNameException if the given charset name is
@ -221,19 +222,20 @@ public abstract class Charset implements Comparable
return cs;
}
public static SortedMap availableCharsets()
public static SortedMap<String, Charset> availableCharsets()
{
TreeMap charsets = new TreeMap(String.CASE_INSENSITIVE_ORDER);
for (Iterator i = provider().charsets(); i.hasNext(); )
TreeMap<String, Charset> charsets
= new TreeMap(String.CASE_INSENSITIVE_ORDER);
for (Iterator<Charset> i = provider().charsets(); i.hasNext(); )
{
Charset cs = (Charset) i.next();
Charset cs = i.next();
charsets.put(cs.name(), cs);
}
CharsetProvider[] providers = providers2();
for (int j = 0; j < providers.length; j++)
{
for (Iterator i = providers[j].charsets(); i.hasNext(); )
for (Iterator<Charset> i = providers[j].charsets(); i.hasNext(); )
{
Charset cs = (Charset) i.next();
charsets.put(cs.name(), cs);
@ -295,14 +297,14 @@ public abstract class Charset implements Comparable
return canonicalName;
}
public final Set aliases ()
public final Set<String> aliases ()
{
if (aliases == null)
return Collections.EMPTY_SET;
return Collections.<String>emptySet();
// should we cache the aliasSet instead?
int n = aliases.length;
HashSet aliasSet = new HashSet (n);
HashSet<String> aliasSet = new HashSet<String> (n);
for (int i = 0; i < n; ++i)
aliasSet.add (aliases[i]);
return Collections.unmodifiableSet (aliasSet);
@ -387,9 +389,9 @@ public abstract class Charset implements Comparable
}
}
public final int compareTo (Object ob)
public final int compareTo (Charset other)
{
return canonicalName.compareToIgnoreCase (((Charset) ob).canonicalName);
return canonicalName.compareToIgnoreCase (other.canonicalName);
}
public final int hashCode ()

View File

@ -1,5 +1,6 @@
/* Calendar.java --
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -103,7 +104,8 @@ day_of_week + week_of_year</pre>
* @see TimeZone
* @see java.text.DateFormat
*/
public abstract class Calendar implements Serializable, Cloneable
public abstract class Calendar
implements Serializable, Cloneable, Comparable<Calendar>
{
/**
* Constant representing the era time field.
@ -460,6 +462,8 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Creates a calendar representing the actual time, using the default
* time zone and locale.
*
* @return The new calendar.
*/
public static synchronized Calendar getInstance()
{
@ -469,7 +473,12 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Creates a calendar representing the actual time, using the given
* time zone and the default locale.
* @param zone a time zone.
*
* @param zone a time zone (<code>null</code> not permitted).
*
* @return The new calendar.
*
* @throws NullPointerException if <code>zone</code> is <code>null</code>.
*/
public static synchronized Calendar getInstance(TimeZone zone)
{
@ -479,7 +488,12 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Creates a calendar representing the actual time, using the default
* time zone and the given locale.
* @param locale a locale.
*
* @param locale a locale (<code>null</code> not permitted).
*
* @return The new calendar.
*
* @throws NullPointerException if <code>locale</code> is <code>null</code>.
*/
public static synchronized Calendar getInstance(Locale locale)
{
@ -501,8 +515,14 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Creates a calendar representing the actual time, using the given
* time zone and locale.
* @param zone a time zone.
* @param locale a locale.
*
* @param zone a time zone (<code>null</code> not permitted).
* @param locale a locale (<code>null</code> not permitted).
*
* @return The new calendar.
*
* @throws NullPointerException if <code>zone</code> or <code>locale</code>
* is <code>null</code>.
*/
public static synchronized Calendar getInstance(TimeZone zone, Locale locale)
{
@ -600,6 +620,10 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Sets this Calendar's time to the given Date. All time fields
* are invalidated by this method.
*
* @param date the date (<code>null</code> not permitted).
*
* @throws NullPointerException if <code>date</code> is <code>null</code>.
*/
public final void setTime(Date date)
{
@ -860,6 +884,7 @@ public abstract class Calendar implements Serializable, Cloneable
1, 1970, JANUARY, 1, 1, 1, 1, THURSDAY, 1, AM, 0, 0, 0,
0, 0, zone.getRawOffset(), 0
};
complete();
isTimeSet = false;
areFieldsSet = false;
isSet[field] = false;
@ -1020,6 +1045,8 @@ public abstract class Calendar implements Serializable, Cloneable
public void setTimeZone(TimeZone zone)
{
this.zone = zone;
computeTime();
computeFields();
}
/**
@ -1175,6 +1202,31 @@ public abstract class Calendar implements Serializable, Cloneable
return max;
}
/**
* Compares the time of two calendar instances.
* @param calendar the calendar to which the time should be compared.
* @return 0 if the two calendars are set to the same time,
* less than 0 if the time of this calendar is before that of
* <code>cal</code>, or more than 0 if the time of this calendar is after
* that of <code>cal</code>.
*
* @param cal the calendar to compare this instance with.
* @throws NullPointerException if <code>cal</code> is null.
* @throws IllegalArgumentException if either calendar has fields set to
* invalid values.
* @since 1.5
*/
public int compareTo(Calendar cal)
{
long t1 = getTimeInMillis();
long t2 = cal.getTimeInMillis();
if(t1 == t2)
return 0;
if(t1 > t2)
return 1;
return -1;
}
/**
* Return a clone of this object.
*/