You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ni...@apache.org on 2011/01/11 01:28:02 UTC

svn commit: r1057427 - in /commons/proper/lang/branches/LANG_2_X: ./ src/main/java/org/apache/commons/lang/text/ src/site/changes/ src/test/java/org/apache/commons/lang/text/

Author: niallp
Date: Tue Jan 11 00:28:01 2011
New Revision: 1057427

URL: http://svn.apache.org/viewvc?rev=1057427&view=rev
Log:
Port LANG-636 to LANG 2.x Branch - ExtendedMessageFormat doesn't override equals(Object)

Modified:
    commons/proper/lang/branches/LANG_2_X/RELEASE-NOTES.txt
    commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/text/ExtendedMessageFormat.java
    commons/proper/lang/branches/LANG_2_X/src/site/changes/changes.xml
    commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/text/ExtendedMessageFormatTest.java

Modified: commons/proper/lang/branches/LANG_2_X/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/RELEASE-NOTES.txt?rev=1057427&r1=1057426&r2=1057427&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/RELEASE-NOTES.txt (original)
+++ commons/proper/lang/branches/LANG_2_X/RELEASE-NOTES.txt Tue Jan 11 00:28:01 2011
@@ -40,6 +40,7 @@ BUG FIXES IN 2.6
 
     * [LANG-629] - CharSet: make the underlying set synchronized
     * [LANG-635] - CompareToBuilder: fix passing along compareTransients to the reflectionCompare method
+    * [LANG-636] - ExtendedMessageFormat doesn't override equals(Object)
     * [LANG-645] - FastDateFormat: fix to properly include the locale when formatting a Date
     * [LANG-638] - NumberUtils: createNumber() throws a StringIndexOutOfBoundsException when argument containing "e" and "E" is passed in
     * [LANG-607] - StringUtils methods do not handle Unicode 2.0+ supplementary characters correctly

Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/text/ExtendedMessageFormat.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/text/ExtendedMessageFormat.java?rev=1057427&r1=1057426&r2=1057427&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/text/ExtendedMessageFormat.java (original)
+++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/text/ExtendedMessageFormat.java Tue Jan 11 00:28:01 2011
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.Locale;
 import java.util.Map;
 
+import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.Validate;
 
 /**
@@ -69,6 +70,7 @@ import org.apache.commons.lang.Validate;
  */
 public class ExtendedMessageFormat extends MessageFormat {
     private static final long serialVersionUID = -2362048321261811743L;
+    private static final int HASH_SEED = 31;
 
     private static final String DUMMY_PATTERN = "";
     private static final String ESCAPED_QUOTE = "''";
@@ -248,6 +250,49 @@ public class ExtendedMessageFormat exten
     }
 
     /**
+     * Check if this extended message format is equal to another object.
+     *
+     * @param obj the object to compare to
+     * @return true if this object equals the other, otherwise false
+     * @since 2.6
+     */
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (ObjectUtils.notEqual(getClass(), obj.getClass())) {
+          return false;
+        }
+        ExtendedMessageFormat rhs = (ExtendedMessageFormat)obj;
+        if (ObjectUtils.notEqual(toPattern, rhs.toPattern)) {
+            return false;
+        }
+        if (ObjectUtils.notEqual(registry, rhs.registry)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Return the hashcode.
+     *
+     * @return the hashcode
+     * @since 2.6
+     */
+    public int hashCode() {
+        int result = super.hashCode();
+        result = HASH_SEED * result + ObjectUtils.hashCode(registry);
+        result = HASH_SEED * result + ObjectUtils.hashCode(toPattern);
+        return result;
+    }
+
+    /**
      * Get a custom format from a format description.
      * 
      * @param desc String

Modified: commons/proper/lang/branches/LANG_2_X/src/site/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/site/changes/changes.xml?rev=1057427&r1=1057426&r2=1057427&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/site/changes/changes.xml (original)
+++ commons/proper/lang/branches/LANG_2_X/src/site/changes/changes.xml Tue Jan 11 00:28:01 2011
@@ -37,6 +37,7 @@
     <action type="add" issue="LANG-482">StrSubstitutor: support substitution in variable names</action>
     <action type="fix" issue="LANG-629">CharSet: make the underlying set synchronized</action>
     <action type="fix" issue="LANG-635">CompareToBuilder: fix passing along compareTransients to the reflectionCompare method</action>
+    <action type="fix" issue="LANG-636">ExtendedMessageFormat doesn't override equals(Object)</action>
     <action type="fix" issue="LANG-645">FastDateFormat: fix to properly include the locale when formatting a Date</action>
     <action type="fix" issue="LANG-638">NumberUtils: createNumber() throws a StringIndexOutOfBoundsException when argument containing "e" and "E" is passed in</action>
     <action type="fix" issue="LANG-607">StringUtils methods do not handle Unicode 2.0+ supplementary characters correctly</action>

Modified: commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/text/ExtendedMessageFormatTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/text/ExtendedMessageFormatTest.java?rev=1057427&r1=1057426&r2=1057427&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/text/ExtendedMessageFormatTest.java (original)
+++ commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/text/ExtendedMessageFormatTest.java Tue Jan 11 00:28:01 2011
@@ -263,6 +263,50 @@ public class ExtendedMessageFormatTest e
     }
 
     /**
+     * Test equals() and hashcode.
+     */
+    public void testEqualsHashcode() {
+        Map registry = new HashMap();
+        registry.put("testfmt", new LowerCaseFormatFactory());
+        Map otherRegitry = new HashMap();
+        otherRegitry.put("testfmt", new UpperCaseFormatFactory());
+
+        String pattern = "Pattern: {0,testfmt}";
+        ExtendedMessageFormat emf = new ExtendedMessageFormat(pattern, Locale.US, registry);
+
+        ExtendedMessageFormat other = null;
+
+        // Same object
+        assertTrue("same, equals()",   emf.equals(emf));
+        assertTrue("same, hashcode()", emf.hashCode() == emf.hashCode());
+
+        // Equal Object
+        other = new ExtendedMessageFormat(pattern, Locale.US, registry);
+        assertTrue("equal, equals()",   emf.equals(other));
+        assertTrue("equal, hashcode()", emf.hashCode() == other.hashCode());
+
+        // Different Class
+        other = new OtherExtendedMessageFormat(pattern, Locale.US, registry);
+        assertFalse("class, equals()",  emf.equals(other));
+        assertTrue("class, hashcode()", emf.hashCode() == other.hashCode()); // same hashcode
+        
+        // Different pattern
+        other = new ExtendedMessageFormat("X" + pattern, Locale.US, registry);
+        assertFalse("pattern, equals()",   emf.equals(other));
+        assertFalse("pattern, hashcode()", emf.hashCode() == other.hashCode());
+
+        // Different registry
+        other = new ExtendedMessageFormat(pattern, Locale.US, otherRegitry);
+        assertFalse("registry, equals()",   emf.equals(other));
+        assertFalse("registry, hashcode()", emf.hashCode() == other.hashCode());
+
+        // Different Locale
+        other = new ExtendedMessageFormat(pattern, Locale.FRANCE, registry);
+        assertFalse("locale, equals()",  emf.equals(other));
+        assertTrue("locale, hashcode()", emf.hashCode() == other.hashCode()); // same hashcode
+    }
+
+    /**
      * Test a built in format for the specified Locales, plus <code>null</code> Locale.
      * @param pattern MessageFormat pattern
      * @param args MessageFormat arguments
@@ -388,4 +432,16 @@ public class ExtendedMessageFormatTest e
                             .getDateInstance(DateFormat.DEFAULT, locale);
         }
     }
+
+    /**
+     * Alternative ExtendedMessageFormat impl.
+     */
+    private static class OtherExtendedMessageFormat extends ExtendedMessageFormat {
+        public OtherExtendedMessageFormat(String pattern, Locale locale,
+                Map registry) {
+            super(pattern, locale, registry);
+        }
+        
+    }
+
 }