You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2004/08/23 23:01:43 UTC

svn commit: rev 36785 - in incubator/directory/ldap/trunk/common/src: java/org/apache/ldap/common/message test/org/apache/ldap/common/message

Author: akarasulu
Date: Mon Aug 23 14:01:42 2004
New Revision: 36785

Added:
   incubator/directory/ldap/trunk/common/src/test/org/apache/ldap/common/message/LockableAttributesImplTest.java
Modified:
   incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/message/LockableAttributeImpl.java
   incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/message/LockableAttributesImpl.java
Log:
Commit changes ...

 o fixed formatting: removed m_, a_ and space before ;
 o added equals() override to LockableAttributesImpl
 o completed and passed test cases for equals() override
 o removed @author tags and inserted licenses where appropriate
 


Modified: incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/message/LockableAttributeImpl.java
==============================================================================
--- incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/message/LockableAttributeImpl.java	(original)
+++ incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/message/LockableAttributeImpl.java	Mon Aug 23 14:01:42 2004
@@ -1,193 +1,5 @@
 /*
- *                                 Apache License
- *                           Version 2.0, January 2004
- *                        http://www.apache.org/licenses/
- *
- *   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- *
- *   1. Definitions.
- *
- *      "License" shall mean the terms and conditions for use, reproduction,
- *      and distribution as defined by Sections 1 through 9 of this document.
- *
- *      "Licensor" shall mean the copyright owner or entity authorized by
- *      the copyright owner that is granting the License.
- *
- *      "Legal Entity" shall mean the union of the acting entity and all
- *      other entities that control, are controlled by, or are under common
- *      control with that entity. For the purposes of this definition,
- *      "control" means (i) the power, direct or indirect, to cause the
- *      direction or management of such entity, whether by contract or
- *      otherwise, or (ii) ownership of fifty percent (50%) or more of the
- *      outstanding shares, or (iii) beneficial ownership of such entity.
- *
- *      "You" (or "Your") shall mean an individual or Legal Entity
- *      exercising permissions granted by this License.
- *
- *      "Source" form shall mean the preferred form for making modifications,
- *      including but not limited to software source code, documentation
- *      source, and configuration files.
- *
- *      "Object" form shall mean any form resulting from mechanical
- *      transformation or translation of a Source form, including but
- *      not limited to compiled object code, generated documentation,
- *      and conversions to other media types.
- *
- *      "Work" shall mean the work of authorship, whether in Source or
- *      Object form, made available under the License, as indicated by a
- *      copyright notice that is included in or attached to the work
- *      (an example is provided in the Appendix below).
- *
- *      "Derivative Works" shall mean any work, whether in Source or Object
- *      form, that is based on (or derived from) the Work and for which the
- *      editorial revisions, annotations, elaborations, or other modifications
- *      represent, as a whole, an original work of authorship. For the purposes
- *      of this License, Derivative Works shall not include works that remain
- *      separable from, or merely link (or bind by name) to the interfaces of,
- *      the Work and Derivative Works thereof.
- *
- *      "Contribution" shall mean any work of authorship, including
- *      the original version of the Work and any modifications or additions
- *      to that Work or Derivative Works thereof, that is intentionally
- *      submitted to Licensor for inclusion in the Work by the copyright owner
- *      or by an individual or Legal Entity authorized to submit on behalf of
- *      the copyright owner. For the purposes of this definition, "submitted"
- *      means any form of electronic, verbal, or written communication sent
- *      to the Licensor or its representatives, including but not limited to
- *      communication on electronic mailing lists, source code control systems,
- *      and issue tracking systems that are managed by, or on behalf of, the
- *      Licensor for the purpose of discussing and improving the Work, but
- *      excluding communication that is conspicuously marked or otherwise
- *      designated in writing by the copyright owner as "Not a Contribution."
- *
- *      "Contributor" shall mean Licensor and any individual or Legal Entity
- *      on behalf of whom a Contribution has been received by Licensor and
- *      subsequently incorporated within the Work.
- *
- *   2. Grant of Copyright License. Subject to the terms and conditions of
- *      this License, each Contributor hereby grants to You a perpetual,
- *      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- *      copyright license to reproduce, prepare Derivative Works of,
- *      publicly display, publicly perform, sublicense, and distribute the
- *      Work and such Derivative Works in Source or Object form.
- *
- *   3. Grant of Patent License. Subject to the terms and conditions of
- *      this License, each Contributor hereby grants to You a perpetual,
- *      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- *      (except as stated in this section) patent license to make, have made,
- *      use, offer to sell, sell, import, and otherwise transfer the Work,
- *      where such license applies only to those patent claims licensable
- *      by such Contributor that are necessarily infringed by their
- *      Contribution(s) alone or by combination of their Contribution(s)
- *      with the Work to which such Contribution(s) was submitted. If You
- *      institute patent litigation against any entity (including a
- *      cross-claim or counterclaim in a lawsuit) alleging that the Work
- *      or a Contribution incorporated within the Work constitutes direct
- *      or contributory patent infringement, then any patent licenses
- *      granted to You under this License for that Work shall terminate
- *      as of the date such litigation is filed.
- *
- *   4. Redistribution. You may reproduce and distribute copies of the
- *      Work or Derivative Works thereof in any medium, with or without
- *      modifications, and in Source or Object form, provided that You
- *      meet the following conditions:
- *
- *      (a) You must give any other recipients of the Work or
- *          Derivative Works a copy of this License; and
- *
- *      (b) You must cause any modified files to carry prominent notices
- *          stating that You changed the files; and
- *
- *      (c) You must retain, in the Source form of any Derivative Works
- *          that You distribute, all copyright, patent, trademark, and
- *          attribution notices from the Source form of the Work,
- *          excluding those notices that do not pertain to any part of
- *          the Derivative Works; and
- *
- *      (d) If the Work includes a "NOTICE" text file as part of its
- *          distribution, then any Derivative Works that You distribute must
- *          include a readable copy of the attribution notices contained
- *          within such NOTICE file, excluding those notices that do not
- *          pertain to any part of the Derivative Works, in at least one
- *          of the following places: within a NOTICE text file distributed
- *          as part of the Derivative Works; within the Source form or
- *          documentation, if provided along with the Derivative Works; or,
- *          within a display generated by the Derivative Works, if and
- *          wherever such third-party notices normally appear. The contents
- *          of the NOTICE file are for informational purposes only and
- *          do not modify the License. You may add Your own attribution
- *          notices within Derivative Works that You distribute, alongside
- *          or as an addendum to the NOTICE text from the Work, provided
- *          that such additional attribution notices cannot be construed
- *          as modifying the License.
- *
- *      You may add Your own copyright statement to Your modifications and
- *      may provide additional or different license terms and conditions
- *      for use, reproduction, or distribution of Your modifications, or
- *      for any such Derivative Works as a whole, provided Your use,
- *      reproduction, and distribution of the Work otherwise complies with
- *      the conditions stated in this License.
- *
- *   5. Submission of Contributions. Unless You explicitly state otherwise,
- *      any Contribution intentionally submitted for inclusion in the Work
- *      by You to the Licensor shall be under the terms and conditions of
- *      this License, without any additional terms or conditions.
- *      Notwithstanding the above, nothing herein shall supersede or modify
- *      the terms of any separate license agreement you may have executed
- *      with Licensor regarding such Contributions.
- *
- *   6. Trademarks. This License does not grant permission to use the trade
- *      names, trademarks, service marks, or product names of the Licensor,
- *      except as required for reasonable and customary use in describing the
- *      origin of the Work and reproducing the content of the NOTICE file.
- *
- *   7. Disclaimer of Warranty. Unless required by applicable law or
- *      agreed to in writing, Licensor provides the Work (and each
- *      Contributor provides its Contributions) on an "AS IS" BASIS,
- *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- *      implied, including, without limitation, any warranties or conditions
- *      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- *      PARTICULAR PURPOSE. You are solely responsible for determining the
- *      appropriateness of using or redistributing the Work and assume any
- *      risks associated with Your exercise of permissions under this License.
- *
- *   8. Limitation of Liability. In no event and under no legal theory,
- *      whether in tort (including negligence), contract, or otherwise,
- *      unless required by applicable law (such as deliberate and grossly
- *      negligent acts) or agreed to in writing, shall any Contributor be
- *      liable to You for damages, including any direct, indirect, special,
- *      incidental, or consequential damages of any character arising as a
- *      result of this License or out of the use or inability to use the
- *      Work (including but not limited to damages for loss of goodwill,
- *      work stoppage, computer failure or malfunction, or any and all
- *      other commercial damages or losses), even if such Contributor
- *      has been advised of the possibility of such damages.
- *
- *   9. Accepting Warranty or Additional Liability. While redistributing
- *      the Work or Derivative Works thereof, You may choose to offer,
- *      and charge a fee for, acceptance of support, warranty, indemnity,
- *      or other liability obligations and/or rights consistent with this
- *      License. However, in accepting such obligations, You may act only
- *      on Your own behalf and on Your sole responsibility, not on behalf
- *      of any other Contributor, and only if You agree to indemnify,
- *      defend, and hold each Contributor harmless for any liability
- *      incurred by, or claims asserted against, such Contributor by reason
- *      of your accepting any such warranty or additional liability.
- *
- *   END OF TERMS AND CONDITIONS
- *
- *   APPENDIX: How to apply the Apache License to your work.
- *
- *      To apply the Apache License to your work, attach the following
- *      boilerplate notice, with the fields enclosed by brackets "[]"
- *      replaced with your own identifying information. (Don't include
- *      the brackets!)  The text should be enclosed in the appropriate
- *      comment syntax for the file format. We also recommend that a
- *      file or class name and description of purpose be included on the
- *      same "printed page" as the copyright notice for easier
- *      identification within third-party archives.
- *
- *   Copyright [yyyy] [name of copyright owner]
+ *   Copyright 2004 The Apache Software Foundation
  *
  *   Licensed under the Apache License, Version 2.0 (the "License");
  *   you may not use this file except in compliance with the License.
@@ -202,16 +14,6 @@
  *   limitations under the License.
  *
  */
-
-/*
- * $Id: LockableAttributeImpl.java,v 1.5 2003/10/17 03:54:27 akarasulu Exp $
- *
- * -- (c) LDAPd Group                                                    --
- * -- Please refer to the LICENSE.txt file in the root directory of      --
- * -- any LDAPd project for copyright and distribution information.      --
- *
- */
-
 package org.apache.ldap.common.message ;
 
 
@@ -229,11 +31,9 @@
 
 /**
  * Permanently Lockable ordered JNDI Attribute implementation.
- * 
- * @author <a href="mailto:aok123@bellsouth.net">Alex Karasulu</a>
- * @author <a href="mailto:jmachols@attbi.com">Jeff Machols</a>
- * @author $Author: akarasulu $
- * @version $Revision: 1.5 $
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org"> Apache Directory
+ *         Project</a> $Rev$
  */
 public class LockableAttributeImpl
     extends AbstractLockable implements LockableAttribute

Modified: incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/message/LockableAttributesImpl.java
==============================================================================
--- incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/message/LockableAttributesImpl.java	(original)
+++ incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/message/LockableAttributesImpl.java	Mon Aug 23 14:01:42 2004
@@ -1,51 +1,50 @@
-/*
- *   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed 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.ldap.common.message ;
-
-
-import java.util.Map ;
-import java.util.HashMap ;
-import java.util.Iterator ;
-
-import javax.naming.NamingException ;
-import javax.naming.NamingEnumeration ;
-import javax.naming.directory.Attribute ;
-
-import org.apache.commons.lang.exception.ExceptionUtils ;
-
-import org.apache.ldap.common.Lockable ;
-import org.apache.ldap.common.AbstractLockable ;
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed 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.ldap.common.message;
+
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.naming.NamingException;
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+
+import org.apache.ldap.common.Lockable;
+import org.apache.ldap.common.AbstractLockable;
 
 
 /**
  * A case-insensitive Lockable JNDI Attributes implementation.
  * 
- * @author <a href="mailto:aok123@bellsouth.net">Alex Karasulu</a>
- * @author <a href="mailto:jmachols@attbi.com">Jeff Machols</a>
- * @author $Author: akarasulu $
- * @version $Revision: 1.9 $
+ * @author <a href="mailto:directory-dev@incubator.apache.org"> Apache Directory
+ *         Project</a> $Rev$
  */
 public class LockableAttributesImpl
     extends AbstractLockable implements LockableAttributes
 {
     /** Map of user provided String ids to Attributes */
-    private final Map m_map = new HashMap() ;
+    private final Map map = new HashMap();
     /** Cache of lowercase id Strings to mixed cased user provided String ids */
-    private final transient Map m_keyMap ;
+    private final transient Map keyMap;
 
 
     // ------------------------------------------------------------------------
@@ -58,38 +57,38 @@
      */
     public LockableAttributesImpl()
     {
-        super( false ) ;
-        m_keyMap = new HashMap() ;
+        super( false );
+        keyMap = new HashMap();
     }
 
 
     /**
      * Creates a LockableAttributes with a parent Lockable.
      *
-     * @param a_parent the parent lockable to use for overriding lock state.
+     * @param parent the parent lockable to use for overriding lock state.
      */
-    public LockableAttributesImpl( Lockable a_parent )
+    public LockableAttributesImpl( Lockable parent )
     {
-        super( a_parent, false ) ;
-        m_keyMap = new HashMap() ;
+        super( parent, false );
+        keyMap = new HashMap();
     }
 
 
     /**
      * Used by clone to create a LockableAttributes.
      *
-     * @param a_parent the parent Lockable
-     * @param a_map the primary user provided id to Attribute Map
-     * @param a_keyMap the canonical key to user provided id Map
-     */
-    private LockableAttributesImpl( Lockable a_parent,
-        Map a_map, Map a_keyMap )
-    {
-        super( a_parent, false ) ;
-
-        m_map.putAll( a_map ) ;
-        m_keyMap = a_keyMap ;
-        m_keyMap.putAll( a_keyMap ) ;
+     * @param parent the parent Lockable
+     * @param map the primary user provided id to Attribute Map
+     * @param keyMap the canonical key to user provided id Map
+     */
+    private LockableAttributesImpl( Lockable parent,
+        Map map, Map keyMap )
+    {
+        super( parent, false );
+
+        map.putAll( map );
+        this.keyMap = keyMap;
+        keyMap.putAll( keyMap );
     }
 
 
@@ -106,7 +105,7 @@
      */
     public boolean isCaseIgnored()
     {
-        return true ;
+        return true;
     }
 
 
@@ -117,7 +116,7 @@
      */
     public int size()
     {
-        return m_map.size() ;
+        return map.size();
     }
 
 
@@ -125,7 +124,7 @@
      * Retrieves the attribute with the given attribute id from the
      * attribute set.
      *
-     * @param a_attrId The non-null id of the attribute to retrieve.
+     * @param attrId The non-null id of the attribute to retrieve.
      *        If this attribute set ignores the character
      *        case of its attribute ids, the case of attrID
      *        is ignored.
@@ -133,16 +132,16 @@
      * @see #put
      * @see #remove
      */
-    public Attribute get( String a_attrId )
+    public Attribute get( String attrId )
     {
-        String l_key = getUserProvidedId( a_attrId ) ;
+        String l_key = getUserProvidedId( attrId );
 
         if ( l_key == null )
         {
-            return null ;
+            return null;
         }
 
-        return ( Attribute ) m_map.get( l_key ) ;
+        return ( Attribute ) map.get( l_key );
     }
 
 
@@ -158,7 +157,7 @@
      */
     public NamingEnumeration getAll()
     {
-        return new IteratorNamingEnumeration( m_map.values().iterator() ) ;
+        return new IteratorNamingEnumeration( map.values().iterator() );
     }
 
 
@@ -175,64 +174,64 @@
      */
     public NamingEnumeration getIDs()
     {
-        return new IteratorNamingEnumeration( m_map.keySet().iterator() ) ;
+        return new IteratorNamingEnumeration( map.keySet().iterator() );
     }
 
 
     /**
      * Adds a new attribute to the attribute set.
      *
-     * @param a_attrId non-null The id of the attribute to add.
+     * @param attrId non-null The id of the attribute to add.
      *        If the attribute set ignores the character
      *        case of its attribute ids, the case of attrID
      *        is ignored.
-     * @param a_val The possibly null value of the attribute to add.
+     * @param val The possibly null value of the attribute to add.
      *        If null, the attribute does not have any values.
      * @return The Attribute with attrID that was previous in this attribute set
      *         null if no such attribute existed.
      * @see #remove
      */
-    public Attribute put( String a_attrId, Object a_val )
+    public Attribute put( String attrId, Object val )
     {
-        super.lockCheck( "Attempt to add value to locked Attributes" ) ;
-        Attribute l_attr = get( a_attrId ) ;
+        super.lockCheck( "Attempt to add value to locked Attributes" );
+        Attribute l_attr = get( attrId );
 
         if ( l_attr == null )
         {
-            l_attr = new LockableAttributeImpl( this, a_attrId ) ;
-            setUserProvidedId( a_attrId ) ;
+            l_attr = new LockableAttributeImpl( this, attrId );
+            setUserProvidedId( attrId );
         }
 
-        l_attr.add( a_val ) ;
-        m_map.put( a_attrId, l_attr ) ;
-        return l_attr ;
+        l_attr.add( val );
+        map.put( attrId, l_attr );
+        return l_attr;
     }
 
 
     /**
      * Adds a new attribute to the attribute set.
      *
-     * @param a_attr The non-null attribute to add.  If the attribute set 
+     * @param attr The non-null attribute to add.  If the attribute set
      *        ignores the character case of its attribute ids, the case of
      *        attr's identifier is ignored.
      * @return The Attribute with the same ID as attr that was previous in this 
      *         attribute set; null if no such attribute existed.
      * @see #remove
      */
-    public Attribute put( Attribute a_attr )
+    public Attribute put( Attribute attr )
     {
-        super.lockCheck( "Attempt to Attribute to locked Attributes" ) ;
-        Attribute l_old = get( a_attr.getID() ) ;
+        super.lockCheck( "Attempt to Attribute to locked Attributes" );
+        Attribute l_old = get( attr.getID() );
 
         if ( l_old != null )
         {
-            m_map.remove( l_old.getID() ) ;
-            m_keyMap.remove( l_old.getID().toLowerCase() ) ;
+            map.remove( l_old.getID() );
+            keyMap.remove( l_old.getID().toLowerCase() );
         }
 
-        m_map.put( a_attr.getID(), a_attr ) ;
-        setUserProvidedId( a_attr.getID() ) ;
-        return l_old ;
+        map.put( attr.getID(), attr );
+        setUserProvidedId( attr.getID() );
+        return l_old;
     }
 
 
@@ -240,25 +239,25 @@
       * Removes the attribute with the attribute id 'attrID' from
       * the attribute set. If the attribute does not exist, ignore.
       *
-      * @param a_attrId The non-null id of the attribute to remove. If the 
+      * @param attrId The non-null id of the attribute to remove. If the
       * attribute set ignores the character case of its attribute ids, the case 
       * of attrID is ignored.
       * @return The Attribute with the same ID as attrID that was previous in 
       * the attribute set; null if no such attribute existed.
       */
-    public Attribute remove( String a_attrId )
+    public Attribute remove( String attrId )
     {
         super.lockCheck(
-            "Attempt to remove Attribute from locked Attributes" ) ;
-        Attribute l_old = get( a_attrId ) ;
+            "Attempt to remove Attribute from locked Attributes" );
+        Attribute l_old = get( attrId );
 
         if ( l_old != null )
         {
-            m_map.remove( l_old.getID() ) ;
-            m_keyMap.remove( l_old.getID().toLowerCase() ) ;
+            map.remove( l_old.getID() );
+            keyMap.remove( l_old.getID().toLowerCase() );
         }
 
-        return l_old ;
+        return l_old;
     }
 
 
@@ -270,7 +269,7 @@
       */
     public Object clone()
     {
-        return new LockableAttributesImpl( getParent(), m_map, m_keyMap ) ;
+        return new LockableAttributesImpl( getParent(), map, keyMap );
     }
     
     
@@ -281,32 +280,86 @@
      */
     public String toString()
     {
-        StringBuffer l_buf = new StringBuffer() ;
+        StringBuffer l_buf = new StringBuffer();
         
-        Iterator l_attrs = m_map.values().iterator() ;
+        Iterator l_attrs = map.values().iterator();
         while ( l_attrs.hasNext() )
         {
-            Attribute l_attr = ( Attribute ) l_attrs.next() ;
+            Attribute l_attr = ( Attribute ) l_attrs.next();
             
             try 
             {
-                NamingEnumeration l_values = l_attr.getAll() ;
+                NamingEnumeration l_values = l_attr.getAll();
                 while ( l_values.hasMore() )
                 {
-                    String l_value = ( String ) l_values.next() ;
-                    l_buf.append( l_attr.getID() ) ;
-                    l_buf.append( ": " ) ;
-                    l_buf.append( l_value ) ;
-                    l_buf.append( '\n' ) ;
+                    String l_value = ( String ) l_values.next();
+                    l_buf.append( l_attr.getID() );
+                    l_buf.append( ": " );
+                    l_buf.append( l_value );
+                    l_buf.append( '\n' );
                 }
             } 
             catch ( NamingException e )
             {
-                l_buf.append( ExceptionUtils.getFullStackTrace( e ) ) ;
+                l_buf.append( ExceptionUtils.getFullStackTrace( e ) );
             }
         }
         
-        return l_buf.toString() ;
+        return l_buf.toString();
+    }
+
+
+    /**
+     * Checks to see if this Attributes implemenation is equivalent to another.
+     * The comparision does not take into account the implementation or any
+     * Lockable interface properties.  Case independent lookups by Attribute ID
+     * is considered to be significant.
+     *
+     * @param obj the Attributes object to test for equality to this
+     * @return true if the Attributes are equal false otherwise
+     */
+    public boolean equals( Object obj )
+    {
+        if ( obj == this )
+        {
+            return true;
+        }
+
+        if ( ! ( obj instanceof Attributes ) )
+        {
+            return false;
+        }
+
+        Attributes attrs = ( Attributes ) obj;
+
+        if ( attrs.size() != size() )
+        {
+            return false;
+        }
+
+        if ( attrs.isCaseIgnored() != isCaseIgnored() )
+        {
+            return false;
+        }
+
+        NamingEnumeration list = attrs.getAll();
+        while ( list.hasMoreElements() )
+        {
+            Attribute attr = ( Attribute ) list.nextElement();
+            Attribute myAttr = ( Attribute ) get( attr.getID() );
+
+            if ( myAttr == null )
+            {
+                return false;
+            }
+
+            if ( ! myAttr.equals( attr ) )
+            {
+                return false;
+            }
+        }
+
+        return true;
     }
 
 
@@ -319,14 +372,14 @@
      * Sets the user provided key by normalizing it and adding a record into the
      * keymap for future lookups.
      *
-     * @param a_userProvidedId the id of the Attribute gotten from the attribute
+     * @param userProvidedId the id of the Attribute gotten from the attribute
      * instance via getID().
      */
-    private void setUserProvidedId( String a_userProvidedId )
+    private void setUserProvidedId( String userProvidedId )
     {
-        if ( m_keyMap.get( a_userProvidedId ) == null )
+        if ( keyMap.get( userProvidedId ) == null )
         {
-            m_keyMap.put( a_userProvidedId.toLowerCase(), a_userProvidedId ) ;
+            keyMap.put( userProvidedId.toLowerCase(), userProvidedId );
         }
     }
 
@@ -335,18 +388,18 @@
      * Gets the user provided key by looking it up using the normalized key in
      * the key map.
      *
-     * @param a_attrId the id of the Attribute in any case.
+     * @param attrId the id of the Attribute in any case.
      * @return the attribute id as it would be returned on a call to the
      * Attribute's getID() method.
      */
-    private String getUserProvidedId( String a_attrId )
+    private String getUserProvidedId( String attrId )
     {
         // First check if it is correct form to save string creation below.
-        if ( m_map.containsKey( a_attrId ) )
+        if ( map.containsKey( attrId ) )
         {
-            return a_attrId ;
+            return attrId;
         }
 
-        return ( String ) m_keyMap.get( a_attrId.toLowerCase() ) ;
+        return ( String ) keyMap.get( attrId.toLowerCase() );
     }
 }

Added: incubator/directory/ldap/trunk/common/src/test/org/apache/ldap/common/message/LockableAttributesImplTest.java
==============================================================================
--- (empty file)
+++ incubator/directory/ldap/trunk/common/src/test/org/apache/ldap/common/message/LockableAttributesImplTest.java	Mon Aug 23 14:01:42 2004
@@ -0,0 +1,134 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed 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.ldap.common.message;
+
+
+import junit.framework.TestCase;
+
+import javax.naming.directory.BasicAttributes;
+
+
+/**
+ * Test cases for the methods of the LockableAttributeImpl class.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org"> Apache Directory
+ *         Project</a> $Rev$
+ */
+public class LockableAttributesImplTest extends TestCase
+{
+    /**
+     * Creates and populates a LockableAttributeImpl with a specific id.
+     *
+     * @param id the id for the attribute
+     * @return the LockableAttributeImpl assembled for testing
+     */
+    private LockableAttributeImpl getAttribute( String id )
+    {
+        LockableAttributeImpl attr = new LockableAttributeImpl( id );
+        attr.add( "value0" );
+        attr.add( "value1" );
+        attr.add( "value2" );
+        return attr;
+    }
+
+
+    /**
+     * Creates and populates a LockableAttributes object
+     *
+     * @return
+     */
+    private LockableAttributesImpl getAttributes()
+    {
+        LockableAttributesImpl attrs = new LockableAttributesImpl();
+        attrs.put( getAttribute( "attr0" ) );
+        attrs.put( getAttribute( "attr1" ) );
+        attrs.put( getAttribute( "attr2" ) );
+        return attrs;
+    }
+
+
+    /**
+     * Tests equality for the same object reference.
+     */
+    public void testEqualsSameObj()
+    {
+        LockableAttributesImpl attrs = getAttributes();
+        assertTrue( "same object should return true", attrs.equals( attrs ) );
+    }
+
+
+    /**
+     * Tests two exact replicas for equality.
+     */
+    public void testEqualsExactCopy()
+    {
+        LockableAttributesImpl attrs0 = getAttributes();
+        LockableAttributesImpl attrs1 = getAttributes();
+        assertTrue( "exact copies should be equal", attrs0.equals( attrs1 ) );
+        assertTrue( "exact copies should be equal", attrs1.equals( attrs0 ) );
+    }
+
+
+    /**
+     * Tests two exact copies with multiple copies of the same attribute added
+     * for equality.
+     */
+    public void testEqualsExactCopyWithReplicas()
+    {
+        LockableAttributesImpl attrs0 = getAttributes();
+        LockableAttributesImpl attrs1 = getAttributes();
+        attrs1.put( getAttribute( "attr0" ) );
+        attrs1.put( getAttribute( "attr0" ) );
+        assertTrue( "exact copies with repeated adds should be equal",
+                attrs0.equals( attrs1 ) );
+        assertTrue( "exact copies with repeated adds should be equal",
+                attrs1.equals( attrs0 ) );
+    }
+
+
+    /**
+     * Test inequality with different attributes.
+     */
+    public void testNotEqualDiffAttr()
+    {
+        LockableAttributesImpl attrs0 = getAttributes();
+        LockableAttributesImpl attrs1 = getAttributes();
+        attrs1.put( getAttribute( "blah" ) );
+        assertFalse( "different attributes should not be equal",
+                attrs0.equals( attrs1 ) );
+        assertFalse( "different attributes should not be equal",
+                attrs1.equals( attrs0 ) );
+    }
+
+
+    /**
+     * Tests equality of same attributes with different implementations.
+     */
+    public void testEqualsDiffImpl()
+    {
+        LockableAttributesImpl attrs0 = getAttributes();
+        BasicAttributes attrs1 = new BasicAttributes( true );
+        attrs1.put( getAttribute( "attr0" ) );
+        attrs1.put( getAttribute( "attr1" ) );
+        attrs1.put( getAttribute( "attr2" ) );
+
+        assertTrue( "different implementations of the same " +
+                "attributes should be equal", attrs0.equals( attrs1 ) );
+        assertTrue( "different implementations of the same " +
+                "attributes should be equal", attrs1.equals( attrs0 ) );
+    }
+}