You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Gary Gregory <gg...@seagullsw.com> on 2004/02/19 02:26:52 UTC
RE: cvs commit: jakarta-commons/lang/src/java/org/apache/commons/
lang ClassUtils.java
Done.
Gary
> -----Original Message-----
> From: Stephen Colebourne [mailto:scolebourne@btopenworld.com]
> Sent: Wednesday, February 18, 2004 17:15
> To: Jakarta Commons Developers List
> Subject: Re: cvs commit: jakarta-
> commons/lang/src/java/org/apache/commons/lang ClassUtils.java
>
> This implementation of comparators as anonymous classes will not work on
> JDK1.2. Suggest using named static nested classes.
> Stephen
>
> ----- Original Message -----
> From: <gg...@apache.org>
> To: <ja...@apache.org>
> Sent: Sunday, February 15, 2004 12:51 AM
> Subject: cvs commit: jakarta-commons/lang/src/java/org/apache/commons/lang
> ClassUtils.java
>
>
> > ggregory 2004/02/14 16:51:38
> >
> > Modified: lang/src/test/org/apache/commons/lang ClassUtilsTest.java
> > lang/src/test/org/apache/commons/lang/enum EnumTest.java
> > lang/src/java/org/apache/commons/lang ClassUtils.java
> > Log:
> >
> > PR: Bugzilla Bug 26943 [patch] Class and Package Comparators for
> ClassUtils
> > Submitted by: alban.peignier
> > Reviewed by: Gary Gregory
> >
> > Revision Changes Path
> > 1.8 +101 -1
> jakarta-commons/lang/src/test/org/apache/commons/lang/ClassUtilsTest.java
> >
> > Index: ClassUtilsTest.java
> > ===================================================================
> > RCS file:
> /home/cvs/jakarta-
> commons/lang/src/test/org/apache/commons/lang/ClassUtilsTe
> st.java,v
> > retrieving revision 1.7
> > retrieving revision 1.8
> > diff -u -r1.7 -r1.8
> > --- ClassUtilsTest.java 23 Oct 2003 21:03:44 -0000 1.7
> > +++ ClassUtilsTest.java 15 Feb 2004 00:51:37 -0000 1.8
> > @@ -54,8 +54,12 @@
> > package org.apache.commons.lang;
> >
> > import java.lang.reflect.Constructor;
> > +import java.lang.reflect.InvocationTargetException;
> > +import java.lang.reflect.Method;
> > import java.lang.reflect.Modifier;
> > +import java.net.URLClassLoader;
> > import java.util.ArrayList;
> > +import java.util.Comparator;
> > import java.util.List;
> > import java.util.Map;
> >
> > @@ -63,11 +67,13 @@
> > import junit.framework.TestCase;
> > import junit.framework.TestSuite;
> > import junit.textui.TestRunner;
> > +import org.apache.commons.lang.enum.ColorEnum;
> >
> > /**
> > * Unit tests {@link org.apache.commons.lang.ClassUtils}.
> > *
> > * @author Stephen Colebourne
> > + * @author Gary D. Gregory
> > * @version $Id$
> > */
> > public class ClassUtilsTest extends TestCase {
> > @@ -409,6 +415,100 @@
> > // test null
> > assertNull("null -> null",
> > ClassUtils.primitiveToWrapper(null));
> > + }
> > +
> > + public void testClassComparator() {
> > + Comparator comparator = ClassUtils.CLASS_NAME_COMPARATOR;
> > + Class smallClass = java.lang.Boolean.class;
> > + Class bigClass = java.util.Set.class;
> > +
> > + assertTrue(comparator.compare(smallClass, smallClass) == 0);
> > + assertTrue(comparator.compare(bigClass, smallClass) > 0);
> > + assertTrue(comparator.compare(smallClass, bigClass) < 0);
> > +
> > + assertTrue(comparator.compare(smallClass, null) > 0);
> > + assertTrue(comparator.compare(null, smallClass) < 0);
> > +
> > + assertComparatorContract(comparator, smallClass, smallClass);
> > + assertComparatorContract(comparator, bigClass, bigClass);
> > + assertComparatorContract(comparator, smallClass, bigClass);
> > + }
> > +
> > + public void testPackageComparator() {
> > + Comparator comparator = ClassUtils.PACKAGE_NAME_COMPARATOR;
> > + Package smallPackage = java.lang.Boolean.class.getPackage();
> > + Package bigPackage = java.util.Set.class.getPackage();
> > +
> > + assertTrue(comparator.compare(smallPackage, smallPackage) ==
> 0);
> > + assertTrue(comparator.compare(bigPackage, smallPackage) > 0);
> > + assertTrue(comparator.compare(smallPackage, bigPackage) < 0);
> > +
> > + assertTrue(comparator.compare(smallPackage, null) > 0);
> > + assertTrue(comparator.compare(null, smallPackage) < 0);
> > +
> > + assertComparatorContract(comparator, smallPackage,
> smallPackage);
> > + assertComparatorContract(comparator, bigPackage, bigPackage);
> > + assertComparatorContract(comparator, smallPackage,
> bigPackage);
> > + }
> > +
> > + public void testPackageNameComparatorWithDifferentClassLoaders()
> throws SecurityException, IllegalArgumentException, ClassNotFoundException
> {
> > + Comparator comparator = ClassUtils.PACKAGE_NAME_COMPARATOR;
> > + Package p1 = java.lang.Boolean.class.getPackage();
> > + Package p2 = java.util.Set.class.getPackage();
> > + ClassLoader classLoader = newSystemClassLoader();
> > + Object p1Other = this.getPackage(classLoader,
> "java.lang.Boolean");
> > + Object p2Other = this.getPackage(classLoader,
> "java.util.Set");
> > + // all here
> > + assertComparatorContract(comparator, p1, p1);
> > + assertComparatorContract(comparator, p2, p2);
> > + assertComparatorContract(comparator, p1, p2);
> > + // all other
> > + assertComparatorContract(comparator, p1Other, p1Other);
> > + assertComparatorContract(comparator, p2Other, p2Other);
> > + assertComparatorContract(comparator, p1Other, p2Other);
> > + // p1 and p1Other
> > + assertComparatorContract(comparator, p1, p1Other);
> > + assertComparatorContract(comparator, p2, p2);
> > + assertComparatorContract(comparator, p1Other, p2);
> > + // p2 and p2Other
> > + assertComparatorContract(comparator, p1, p1);
> > + assertComparatorContract(comparator, p2, p2Other);
> > + assertComparatorContract(comparator, p1, p2Other);
> > + }
> > +
> > + Object getPackage(ClassLoader classLoader, String className)
> throws
> ClassNotFoundException, SecurityException,
> > + IllegalArgumentException {
> > + // Sanity check:
> > + assertNotNull(Package.getPackage("java.lang"));
> > +
> Package.getPackage("java.lang").equals(Package.getPackage("java.lang"));
> > + // set up:
> > + assertNotNull(classLoader);
> > + Class otherClass = classLoader.loadClass(className);
> > + assertNotNull(otherClass);
> > + Object otherPackage = otherClass.getPackage();
> > + assertNotNull(otherPackage);
> > + return otherPackage;
> > + }
> > +
> > + /**
> > + * The ordering imposed by a Comparator c on a set of elements S
> is
> said to
> > + * be consistent with equals if and only if (compare((Object)e1,
> > + * (Object)e2)==0) has the same boolean value as
> e1.equals((Object)e2) for
> > + * every e1 and e2 in S.
> > + *
> > + *
> http://java.sun.com/j2se/1.3/docs/api/java/util/Comparator.html
> > + */
> > + public void assertComparatorContract(Comparator comparator,
> Object
> e1, Object e2) {
> > + assertEquals(comparator.compare(e1, e2) == 0, e1.equals(e2));
> > + }
> > +
> > + public static ClassLoader newSystemClassLoader() throws
> SecurityException, IllegalArgumentException {
> > + ClassLoader scl = ClassLoader.getSystemClassLoader();
> > + if (!(scl instanceof URLClassLoader)) {
> > + fail("Need a better test set up.");
> > + }
> > + URLClassLoader urlScl = (URLClassLoader)scl;
> > + return URLClassLoader.newInstance(urlScl.getURLs(), null);
> > }
> >
> > // public static List getAssignableFrom(List classes, Class
> superclass) {
> >
> >
> >
> > 1.16 +65 -26
> jakarta-commons/lang/src/test/org/apache/commons/lang/enum/EnumTest.java
> >
> > Index: EnumTest.java
> > ===================================================================
> > RCS file:
> /home/cvs/jakarta-
> commons/lang/src/test/org/apache/commons/lang/enum/EnumTes
> t.java,v
> > retrieving revision 1.15
> > retrieving revision 1.16
> > diff -u -r1.15 -r1.16
> > --- EnumTest.java 13 Feb 2004 23:17:45 -0000 1.15
> > +++ EnumTest.java 15 Feb 2004 00:51:38 -0000 1.16
> > @@ -55,7 +55,6 @@
> >
> > import java.lang.reflect.InvocationTargetException;
> > import java.lang.reflect.Method;
> > -import java.net.URLClassLoader;
> > import java.util.ArrayList;
> > import java.util.HashMap;
> > import java.util.Iterator;
> > @@ -66,13 +65,14 @@
> > import junit.framework.Test;
> > import junit.framework.TestCase;
> > import junit.framework.TestSuite;
> > -
> > +import org.apache.commons.lang.ClassUtilsTest;
> > import org.apache.commons.lang.SerializationUtils;
> >
> > /**
> > * Test cases for the {@link Enum} class.
> > *
> > * @author Stephen Colebourne
> > + * @author Gary D. Gregory
> > * @version $Id$
> > */
> >
> > @@ -473,18 +473,50 @@
> > // the SAME class as the getEnumList(). The references in the
> outer class
> > // are just extra references.
> > }
> > +
> > + public void testColorEnumEqualsWithDifferentClassLoaders() throws
> SecurityException, IllegalArgumentException,
> > + ClassNotFoundException, NoSuchMethodException,
> IllegalAccessException, InvocationTargetException {
> > + this.testEqualsTrueWithDifferentClassLoaders(ColorEnum.BLUE);
> > +
> this.testEqualsTrueWithDifferentClassLoaders(ColorEnum.GREEN);
> > + this.testEqualsTrueWithDifferentClassLoaders(ColorEnum.RED);
> > + }
> > +
> > + void testEqualsTrueWithDifferentClassLoaders(ColorEnum colorEnum)
> throws ClassNotFoundException, SecurityException,
> > + NoSuchMethodException, IllegalArgumentException,
> IllegalAccessException, InvocationTargetException {
> > + // Sanity checks:
> > + assertTrue(colorEnum.equals(colorEnum));
> > + assertNotNull(ColorEnum.class.getClassLoader());
> > + // set up:
> > + ClassLoader classLoader =
> ClassUtilsTest.newSystemClassLoader();
> > + Object enumObjectFromOtherClassLoader =
> this.getColorEnum(classLoader, colorEnum.getName());
> > + // the real test, part 1.
> > + try {
> > + ColorEnum testCase = (ColorEnum)
> enumObjectFromOtherClassLoader;
> > + fail("Should have thrown a ClassCastException for " +
> testCase);
> > + } catch (ClassCastException e) {
> > + // normal.
> > + }
> > + // the real test, part 2.
> > + assertEquals("The two objects should match even though they
> are
> from different class loaders", colorEnum,
> > + enumObjectFromOtherClassLoader);
> > + // the real test, part 3.
> > + int falseCount = 0;
> > + for (Iterator iter = ColorEnum.iterator(); iter.hasNext();) {
> > + ColorEnum element = (ColorEnum) iter.next();
> > + if (!colorEnum.equals(element)) {
> > + falseCount++;
> > +
> assertFalse(enumObjectFromOtherClassLoader.equals(element));
> > + }
> > + }
> > + assertEquals(ColorEnum.getEnumList().size() - 1, falseCount);
> > + }
> >
> > - public void testEqualsWithDifferentClassLoaders() throws
> ClassNotFoundException, SecurityException, NoSuchMethodException,
> IllegalArgumentException, IllegalAccessException,
> InvocationTargetException
> {
> > + Object getColorEnum(ClassLoader classLoader, String color) throws
> ClassNotFoundException, SecurityException,
> > + NoSuchMethodException, IllegalArgumentException,
> IllegalAccessException, InvocationTargetException {
> > // Sanity check:
> > ColorEnum.RED.equals(ColorEnum.RED);
> > assertNotNull(ColorEnum.class.getClassLoader());
> > // set up:
> > - ClassLoader scl = ClassLoader.getSystemClassLoader();
> > - if (!(scl instanceof URLClassLoader)) {
> > - fail("Need a better test set up.");
> > - }
> > - URLClassLoader urlScl = (URLClassLoader)scl;
> > - ClassLoader classLoader =
> URLClassLoader.newInstance(urlScl.getURLs(), null);
> > assertNotNull(classLoader);
> >
> assertFalse(classLoader.equals(ColorEnum.class.getClassLoader()));
> > Class otherColorEnumClass =
> classLoader.loadClass("org.apache.commons.lang.enum.ColorEnum");
> > @@ -492,24 +524,31 @@
> > assertNotNull(otherColorEnumClass.getClassLoader());
> >
> assertTrue(classLoader.equals(otherColorEnumClass.getClassLoader()));
> >
> assertFalse(otherColorEnumClass.getClassLoader().equals(ColorEnum.class.ge
> tC
> lassLoader()));
> > - Method method = otherColorEnumClass.getMethod("getEnum", new
> Class[]{String.class});
> > - Object enumObject = method.invoke(otherColorEnumClass, new
> Object[]{"Red"});
> > + Method method = otherColorEnumClass.getMethod("getEnum", new
> Class[]{String.class});
> > + Object enumObject = method.invoke(otherColorEnumClass, new
> Object[]{color});
> > assertNotNull(enumObject);
> > - // the real test, part 1.
> > - try {
> > - ColorEnum testCase = (ColorEnum)enumObject;
> > - fail("Should have thrown a ClassCastException");
> > - } catch (ClassCastException e) {
> > - // normal.
> > - }
> > - // the real test, part 2.
> > - assertEquals("The two objects should match even though they
> are
> from different class loaders", ColorEnum.RED, enumObject);
> > + assertFalse(ColorEnum.class.equals(enumObject.getClass()));
> > + assertFalse(ColorEnum.class == enumObject.getClass());
> > + return enumObject;
> > }
> > -
> > +
> > public void testEqualsToWrongInstance() {
> > - assertEquals(false, ColorEnum.RED.equals("test"));
> > - assertEquals(false, ColorEnum.RED.equals(new Integer(1)));
> > - assertEquals(false, ColorEnum.RED.equals(new Boolean(true)));
> > - assertEquals(false, ColorEnum.RED.equals(new
> StringBuffer("test")));
> > + for (Iterator iter = ColorEnum.iterator(); iter.hasNext();) {
> > + ColorEnum element = (ColorEnum) iter.next();
> > + this.testEqualsToWrongInstance(element);
> > + }
> > + }
> > +
> > + void testEqualsToWrongInstance(ColorEnum colorEnum) {
> > + assertEquals(false, colorEnum.equals("test"));
> > + assertEquals(false, colorEnum.equals(new Integer(1)));
> > + assertEquals(false, colorEnum.equals(new Boolean(true)));
> > + assertEquals(false, colorEnum.equals(new
> StringBuffer("test")));
> > + assertEquals(false, colorEnum.equals(new Object()));
> > + assertEquals(false, colorEnum.equals(null));
> > + assertEquals(false, colorEnum.equals(""));
> > + assertEquals(false,
> colorEnum.equals(ColorEnum.getEnum(null)));
> > + assertEquals(false, colorEnum.equals(ColorEnum.getEnum("")));
> > + assertEquals(false, colorEnum.equals(ColorEnum.getEnum("This
> ColorEnum does not exist.")));
> > }
> > }
> >
> >
> >
> > 1.24 +54 -5
> jakarta-commons/lang/src/java/org/apache/commons/lang/ClassUtils.java
> >
> > Index: ClassUtils.java
> > ===================================================================
> > RCS file:
> /home/cvs/jakarta-
> commons/lang/src/java/org/apache/commons/lang/ClassUtils.j
> ava,v
> > retrieving revision 1.23
> > retrieving revision 1.24
> > diff -u -r1.23 -r1.24
> > --- ClassUtils.java 23 Oct 2003 21:03:43 -0000 1.23
> > +++ ClassUtils.java 15 Feb 2004 00:51:38 -0000 1.24
> > @@ -54,6 +54,7 @@
> > package org.apache.commons.lang;
> >
> > import java.util.ArrayList;
> > +import java.util.Comparator;
> > import java.util.HashMap;
> > import java.util.Iterator;
> > import java.util.List;
> > @@ -73,22 +74,22 @@
> > public class ClassUtils {
> >
> > /**
> > - * <p>The package separator character: <code>.</code>.</p>
> > + * <p>The package separator character: <code>'.' ==
> {@value}</code>.</p>
> > */
> > public static final char PACKAGE_SEPARATOR_CHAR = '.';
> >
> > /**
> > - * <p>The package separator String: <code>.</code>.</p>
> > + * <p>The package separator String: <code>"."</code>.</p>
> > */
> > public static final String PACKAGE_SEPARATOR =
> String.valueOf(PACKAGE_SEPARATOR_CHAR);
> >
> > /**
> > - * <p>The inner class separator character: <code>$</code>.</p>
> > + * <p>The inner class separator character: <code>'$' ==
> {@value}</code>.</p>
> > */
> > public static final char INNER_CLASS_SEPARATOR_CHAR = '$';
> >
> > /**
> > - * <p>The inner class separator String: <code>$</code>.</p>
> > + * <p>The inner class separator String: <code>"$"</code>.</p>
> > */
> > public static final String INNER_CLASS_SEPARATOR =
> String.valueOf(INNER_CLASS_SEPARATOR_CHAR);
> >
> > @@ -563,5 +564,53 @@
> > }
> > return (cls.getName().indexOf(INNER_CLASS_SEPARATOR_CHAR) >=
> 0);
> > }
> > +
> > + /**
> > + * Compares two <code>Class</code>s by name.
> > + */
> > + public static final Comparator CLASS_NAME_COMPARATOR = new
> Comparator() {
> > + /**
> > + * Compares two <code>Class</code>s by name.
> > + *
> > + * @throws ClassCastException
> > + * If <code>o1</code> or <code>o2</code> are
> not <code>Class</code>
> > + * instances.
> > + */
> > + public int compare(Object o1, Object o2) {
> > + Class class1 = (Class) o1;
> > + Class class2 = (Class) o2;
> > + if (class1 == null) {
> > + return class2 == null ? 0 : -1;
> > + }
> > + if (class2 == null) {
> > + return 1;
> > + }
> > + return class1.getName().compareTo(class2.getName());
> > + }
> > + };
> > +
> > + /**
> > + * Compares two <code>Package</code>s by name.
> > + */
> > + public static final Comparator PACKAGE_NAME_COMPARATOR = new
> Comparator() {
> > + /**
> > + * Compares two <code>Package</code>s by name.
> > + *
> > + * @throws ClassCastException
> > + * If <code>o1</code> or <code>o2</code> are
> not <code>Package</code>
> > + * instances.
> > + */
> > + public int compare(Object o1, Object o2) {
> > + Package package1 = (Package) o1;
> > + Package package2 = (Package) o2;
> > + if (package1 == null) {
> > + return package2 == null ? 0 : -1;
> > + }
> > + if (package2 == null) {
> > + return 1;
> > + }
> > + return package1.getName().compareTo(package2.getName());
> > + }
> > + };
> >
> > }
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: commons-dev-help@jakarta.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: commons-dev-help@jakarta.apache.org