You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mime4j-dev@james.apache.org by ol...@apache.org on 2011/01/12 17:51:58 UTC

svn commit: r1058228 - in /james/mime4j/branches/dom-api-refactoring: core/src/main/java/org/apache/james/mime4j/util/ dom/src/main/java/org/apache/james/mime4j/dom/address/ dom/src/test/java/org/apache/james/mime4j/field/address/

Author: olegk
Date: Wed Jan 12 16:51:57 2011
New Revision: 1058228

URL: http://svn.apache.org/viewvc?rev=1058228&view=rev
Log:
Slightly more efficient #equals and #hashCode implementations for Mailbox

Added:
    james/mime4j/branches/dom-api-refactoring/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java   (with props)
Modified:
    james/mime4j/branches/dom-api-refactoring/dom/src/main/java/org/apache/james/mime4j/dom/address/Mailbox.java
    james/mime4j/branches/dom-api-refactoring/dom/src/test/java/org/apache/james/mime4j/field/address/AddressTest.java

Added: james/mime4j/branches/dom-api-refactoring/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/dom-api-refactoring/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java?rev=1058228&view=auto
==============================================================================
--- james/mime4j/branches/dom-api-refactoring/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java (added)
+++ james/mime4j/branches/dom-api-refactoring/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java Wed Jan 12 16:51:57 2011
@@ -0,0 +1,69 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.util;
+
+/**
+ * A set of utility methods to help produce consistent
+ * {@link Object#equals equals} and {@link Object#hashCode hashCode} methods.
+ */
+public final class LangUtils {
+
+    public static final int HASH_SEED = 17;
+    public static final int HASH_OFFSET = 37;
+
+    /** Disabled default constructor. */
+    private LangUtils() {
+    }
+
+    public static int hashCode(final int seed, final int hashcode) {
+        return seed * HASH_OFFSET + hashcode;
+    }
+
+    public static int hashCode(final int seed, final boolean b) {
+        return hashCode(seed, b ? 1 : 0);
+    }
+
+    public static int hashCode(final int seed, final Object obj) {
+        return hashCode(seed, obj != null ? obj.hashCode() : 0);
+    }
+
+    /**
+     * Check if two objects are equal.
+     * 
+     * @param obj1 first object to compare, may be {@code null}
+     * @param obj2 second object to compare, may be {@code null}
+     * @return {@code true} if the objects are equal or both null
+     */
+    public static boolean equals(final Object obj1, final Object obj2) {
+        return obj1 == null ? obj2 == null : obj1.equals(obj2);
+    }
+
+    /**
+     * Check if two strings are equal, ignoring case considerations.
+     * 
+     * @param s1 first string to compare, may be {@code null}
+     * @param s2 second string to compare, may be {@code null}
+     * @return {@code true} if the objects are equal or both null
+     */
+    public static boolean equalsIgnoreCase(final String s1, final String s2) {
+        return s1 == null ? s2 == null : s1.equalsIgnoreCase(s2);
+    }
+
+}

Propchange: james/mime4j/branches/dom-api-refactoring/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/branches/dom-api-refactoring/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/branches/dom-api-refactoring/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: james/mime4j/branches/dom-api-refactoring/dom/src/main/java/org/apache/james/mime4j/dom/address/Mailbox.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/dom-api-refactoring/dom/src/main/java/org/apache/james/mime4j/dom/address/Mailbox.java?rev=1058228&r1=1058227&r2=1058228&view=diff
==============================================================================
--- james/mime4j/branches/dom-api-refactoring/dom/src/main/java/org/apache/james/mime4j/dom/address/Mailbox.java (original)
+++ james/mime4j/branches/dom-api-refactoring/dom/src/main/java/org/apache/james/mime4j/dom/address/Mailbox.java Wed Jan 12 16:51:57 2011
@@ -23,6 +23,8 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.james.mime4j.util.LangUtils;
+
 /**
  * Represents a single e-mail address.
  */
@@ -156,8 +158,17 @@ public class Mailbox extends Address {
     }
 
     @Override
+    protected final void doAddMailboxesTo(List<Mailbox> results) {
+        results.add(this);
+    }
+
+    @Override
     public int hashCode() {
-        return getCanonicalizedAddress().hashCode();
+        int hash = LangUtils.HASH_SEED;
+        hash = LangUtils.hashCode(hash, this.localPart);
+        hash = LangUtils.hashCode(hash, this.domain != null ? 
+                this.domain.toLowerCase(Locale.US) : null);
+        return hash;
     }
 
     /**
@@ -180,28 +191,14 @@ public class Mailbox extends Address {
             return true;
         if (!(obj instanceof Mailbox))
             return false;
-
-        Mailbox other = (Mailbox) obj;
-        return getCanonicalizedAddress()
-                .equals(other.getCanonicalizedAddress());
-    }
-
-    @Override
-    protected final void doAddMailboxesTo(List<Mailbox> results) {
-        results.add(this);
-    }
-
-    private String getCanonicalizedAddress() {
-        if (domain == null) {
-            return localPart;
-        } else {
-            return localPart + '@' + domain.toLowerCase(Locale.US);
-        }
+        Mailbox that = (Mailbox) obj;
+        return LangUtils.equals(this.localPart, that.localPart) && 
+            LangUtils.equalsIgnoreCase(this.domain, that.domain);
     }
 
     @Override
     public String toString() {
-        return getCanonicalizedAddress();
+        return getAddress();
     }
 
 }

Modified: james/mime4j/branches/dom-api-refactoring/dom/src/test/java/org/apache/james/mime4j/field/address/AddressTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/dom-api-refactoring/dom/src/test/java/org/apache/james/mime4j/field/address/AddressTest.java?rev=1058228&r1=1058227&r2=1058228&view=diff
==============================================================================
--- james/mime4j/branches/dom-api-refactoring/dom/src/test/java/org/apache/james/mime4j/field/address/AddressTest.java (original)
+++ james/mime4j/branches/dom-api-refactoring/dom/src/test/java/org/apache/james/mime4j/field/address/AddressTest.java Wed Jan 12 16:51:57 2011
@@ -415,5 +415,28 @@ public class AddressTest extends TestCas
         } catch (ParseException expected) {
         }
     }
+
+    public void testMailboxEquals() throws Exception {
+        Mailbox m1 = new Mailbox("john.doe", "acme.org");
+        Mailbox m2 = new Mailbox("john doe", "acme.org");
+        Mailbox m3 = new Mailbox("john.doe", "Acme.Org");
+        Mailbox m4 = new Mailbox("john.doe", null);
+        assertTrue(m1.equals(m1));
+        assertFalse(m1.equals(m2));
+        assertTrue(m1.equals(m3));
+        assertFalse(m1.equals(m4));
+        assertFalse(m1.equals(null));
+    }
     
+    public void testMailboxHashCode() throws Exception {
+        Mailbox m1 = new Mailbox("john.doe", "acme.org");
+        Mailbox m2 = new Mailbox("john doe", "acme.org");
+        Mailbox m3 = new Mailbox("john.doe", "Acme.Org");
+        Mailbox m4 = new Mailbox("john.doe", null);
+        assertTrue(m1.hashCode() == m1.hashCode());
+        assertFalse(m1.hashCode() == m2.hashCode());
+        assertTrue(m1.hashCode() == m3.hashCode());
+        assertFalse(m1.hashCode() == m4.hashCode());
+    }
+
 }