You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2007/01/22 19:23:26 UTC

svn commit: r498739 - in /directory/shared/trunk/ldap/src: main/java/org/apache/directory/shared/ldap/message/ test/java/org/apache/directory/shared/ldap/message/

Author: elecharny
Date: Mon Jan 22 10:23:24 2007
New Revision: 498739

URL: http://svn.apache.org/viewvc?view=rev&rev=498739
Log:
Added two constructors in Attribute(s)Impl : they take an Attribute argument
nd copy it into the new Attribute(s)Impl created.
Added a test for cthis copy
Removed a useless import 

Modified:
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributeImpl.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributesImpl.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/BindResponseImpl.java
    directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/message/AttributeImplTest.java

Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributeImpl.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributeImpl.java?view=diff&rev=498739&r1=498738&r2=498739
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributeImpl.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributeImpl.java Mon Jan 22 10:23:24 2007
@@ -116,6 +116,45 @@
         size = 1;
     }
 
+    /**
+     * Create a copy of an Attribute, be it an AttributeImpl
+     * instance of a BasicAttribute instance
+     * 
+     * @param attribute the Attribute instace to copy
+     * @throws
+     */
+    public AttributeImpl( Attribute attribute ) throws NamingException
+    {
+        if ( attribute == null )
+        {
+            throw new NamingException( "Null attribute is not allowed" );
+        }
+        else if ( attribute instanceof AttributeImpl )
+        {
+            AttributeImpl clone = (AttributeImpl)attribute.clone();
+            
+            upId  = clone.upId;
+            list = clone.list;
+            size = clone.size;
+            value = clone.value;
+        }
+        else if ( attribute instanceof AttributeImpl )
+        {
+            upId = attribute.getID();
+            
+            NamingEnumeration values = attribute.getAll();
+            
+            while ( values.hasMoreElements() )
+            {
+                add( values.nextElement() );
+            }
+        }
+        else
+        {
+            throw new NamingException( "Attribute must be an instance of BasicAttribute or AttributeImpl" );
+        }
+    }
+
     // ------------------------------------------------------------------------
     // javax.naming.directory.Attribute Interface Method Implementations
     // ------------------------------------------------------------------------

Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributesImpl.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributesImpl.java?view=diff&rev=498739&r1=498738&r2=498739
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributesImpl.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/AttributesImpl.java Mon Jan 22 10:23:24 2007
@@ -30,6 +30,7 @@
 import javax.naming.directory.Attribute;
 import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttribute;
+import javax.naming.directory.BasicAttributes;
 
 import org.apache.directory.shared.ldap.util.AttributeUtils;
 import org.apache.directory.shared.ldap.util.StringTools;
@@ -227,6 +228,60 @@
         put( id, value );
         this.ignoreCase = ignoreCase;
     }
+
+    /**
+     * Copies an Attributes
+     */
+    public AttributesImpl( Attributes attributes ) throws NamingException
+    {
+        if ( attributes == null )
+        {
+            throw new NamingException( "Cannot  create a copy of a null element" );
+        }
+        else if ( attributes instanceof BasicAttributes )
+        {
+            ignoreCase = attributes.isCaseIgnored();
+            
+            NamingEnumeration attrs = attributes.getAll();
+            
+            while ( attrs.hasMoreElements() )
+            {
+                Attribute attribute = new AttributeImpl( (Attribute)attrs.nextElement() );
+                
+                put( attribute );
+            }
+        }
+        else if ( attributes instanceof AttributesImpl )
+        {
+            try
+            {
+                AttributesImpl clone = (AttributesImpl)attributes.clone();
+                
+                keyMap = new HashMap<String, Holder>( clone.keyMap.size() );
+                
+                Iterator keys = clone.keyMap.keySet().iterator();
+        
+                while ( keys.hasNext() )
+                {
+                    String key = (String)keys.next();
+                    Holder holder = clone.keyMap.get( key );
+                    keyMap.put( key, (Holder)holder.clone() );
+                }
+                
+                ignoreCase = clone.ignoreCase;
+            }
+            catch ( CloneNotSupportedException cnse )
+            {
+                throw new NamingException( "Cannot copy a value inro the new atributes element" );
+            }
+        }
+        else
+        {
+            throw new NamingException( "Cannot create a copy of a object which is not an" + 
+                " instance of AttributesImpl or of BasicAttributes" );
+        }
+    }
+
 
     // ------------------------------------------------------------------------
     // Serialization methods

Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/BindResponseImpl.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/BindResponseImpl.java?view=diff&rev=498739&r1=498738&r2=498739
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/BindResponseImpl.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/BindResponseImpl.java Mon Jan 22 10:23:24 2007
@@ -22,7 +22,6 @@
 
 import java.util.Arrays;
 
-import org.apache.directory.shared.ldap.util.ArrayUtils;
 import org.apache.directory.shared.ldap.util.StringTools;
 
 

Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/message/AttributeImplTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/message/AttributeImplTest.java?view=diff&rev=498739&r1=498738&r2=498739
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/message/AttributeImplTest.java (original)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/message/AttributeImplTest.java Mon Jan 22 10:23:24 2007
@@ -185,7 +185,77 @@
     }
     
     // Test the clone operation
-    public void testCloneAttribute() throws NamingException
+    public void testCloneAttribute1Value() throws NamingException
+    {
+        Attribute attr = new AttributeImpl( "test" );
+
+        byte[] zero = StringTools.getBytesUtf8( "zero" );
+        attr.add( zero );
+
+        Object[] allValues = new Object[] { zero };
+
+        Attribute clone = (Attribute)attr.clone();
+        
+        // Test the atomic elements
+        assertTrue( clone instanceof AttributeImpl );
+        assertEquals( 1, clone.size() );
+        assertEquals( "test", clone.getID() );
+        
+        // Now test the values
+        NamingEnumeration values = clone.getAll();
+        
+        int i = 0;
+        
+        while ( values.hasMoreElements() )
+        {
+            Object value = values.next();
+            
+            if ( value instanceof String )
+            {
+                assertEquals( allValues[i++], value );
+            }
+            else
+            {
+                byte[] v = (byte[])value;
+                
+                // The content should be equal
+                assertTrue( ArrayUtils.isEquals( allValues[i], v ) );
+                
+                // but not the container
+                assertNotSame( allValues[i++], value );
+            }
+        }
+        
+        // Check that if we change the content, the cloned attribute
+        // is still the same.
+        zero[1] = 'o';
+        attr.set( 0, zero );
+        
+        // The initial attribute should be modified
+        Object attrZero = attr.get( 0 );
+        assertNotSame( zero, attrZero );
+        assertTrue( ArrayUtils.isEquals( zero, attrZero ) );
+        
+        // but the cloned attribute should remain the same
+        Object clonedZero = clone.get( 0 );
+        assertNotSame( zero, clonedZero );
+        assertFalse( ArrayUtils.isEquals( zero, clonedZero ) );
+        
+        // Remove a value from the original attribute
+        zero = (byte[])attr.remove( 0 );
+        
+        // Check that it does not have modified the cloned attribute
+        assertEquals( 1, clone.size() );
+        
+        // The content should be equal
+        assertTrue( ArrayUtils.isEquals( StringTools.getBytesUtf8( "zero" ), clone.get( 0 ) ) );
+        
+        // but not the container
+        assertNotSame( zero, clone.get( 0 ) );
+    }
+    
+    // Test the clone operation
+    public void testCloneAttributeNValues() throws NamingException
     {
         Attribute attr = new AttributeImpl( "test" );
 
@@ -263,6 +333,155 @@
         assertNotSame( three, clone.get( 3 ) );
     }
     
+    // Test the copy operation
+    public void testCopyAttributeImpl1Value() throws NamingException
+    {
+        Attribute attr = new AttributeImpl( "test" );
+
+        byte[] zero = StringTools.getBytesUtf8( "zero" );
+        attr.add( zero );
+
+        Object[] allValues = new Object[] { zero };
+
+        Attribute copy = new AttributeImpl( attr );
+        
+        // Test the atomic elements
+        assertTrue( copy instanceof AttributeImpl );
+        assertEquals( 1, copy.size() );
+        assertEquals( "test", copy.getID() );
+        
+        // Now test the values
+        NamingEnumeration values = copy.getAll();
+        
+        int i = 0;
+        
+        while ( values.hasMoreElements() )
+        {
+            Object value = values.next();
+            
+            if ( value instanceof String )
+            {
+                assertEquals( allValues[i++], value );
+            }
+            else
+            {
+                byte[] v = (byte[])value;
+                
+                // The content should be equal
+                assertTrue( ArrayUtils.isEquals( allValues[i], v ) );
+                
+                // but not the container
+                assertNotSame( allValues[i++], value );
+            }
+        }
+        
+        // Check that if we change the content, the copied attribute
+        // is still the same.
+        zero[1] = 'o';
+        attr.set( 0, zero );
+        
+        // The initial attribute should be modified
+        Object attrZero = attr.get( 0 );
+        assertNotSame( zero, attrZero );
+        assertTrue( ArrayUtils.isEquals( zero, attrZero ) );
+        
+        // but the copied attribute should remain the same
+        Object copied = copy.get( 0 );
+        assertNotSame( zero, copied );
+        assertFalse( ArrayUtils.isEquals( zero, copied ) );
+        
+        // Remove a value from the original attribute
+        zero = (byte[])attr.remove( 0 );
+        
+        // Check that it does not have modified the copied attribute
+        assertEquals( 1, copy.size() );
+        
+        // The content should be equal
+        assertTrue( ArrayUtils.isEquals( StringTools.getBytesUtf8( "zero" ), copy.get( 0 ) ) );
+        
+        // but not the container
+        assertNotSame( zero, copy.get( 0 ) );
+    }
+    
+    // Test the copy operation with more than one value
+    public void testCopyAttributeImplNValues() throws NamingException
+    {
+        Attribute attr = new AttributeImpl( "test" );
+
+        String zero = "zero";
+        attr.add( zero );
+
+        String one = "one";
+        attr.add( one );
+        
+        byte[] two = StringTools.getBytesUtf8( "two" );
+        attr.add( two );
+
+        byte[] three = StringTools.getBytesUtf8( "three" );
+        attr.add( three );
+        
+        Object[] allValues = new Object[] { zero, one, two, three };
+
+        Attribute copy = new AttributeImpl( attr );
+        
+        // Test the atomic elements
+        assertTrue( copy instanceof AttributeImpl );
+        assertEquals( 4, copy.size() );
+        assertEquals( "test", copy.getID() );
+        
+        // Now test the values
+        NamingEnumeration values = copy.getAll();
+        
+        int i = 0;
+        
+        while ( values.hasMoreElements() )
+        {
+            Object value = values.next();
+            
+            if ( value instanceof String )
+            {
+                assertEquals( allValues[i++], value );
+            }
+            else
+            {
+                byte[] v = (byte[])value;
+                
+                // The content should be equal
+                assertTrue( ArrayUtils.isEquals( allValues[i], v ) );
+                
+                // but not the container
+                assertNotSame( allValues[i++], value );
+            }
+        }
+        
+        // Check that if we change the content, the copied attribute
+        // is still the same.
+        two[1] = 'o';
+        attr.set( 2, two );
+        
+        // The initial attribute should be modified
+        Object attrTwo = attr.get( 2 );
+        assertNotSame( two, attrTwo );
+        assertTrue( ArrayUtils.isEquals( two, attrTwo ) );
+        
+        // but the copied attribute should remain the same
+        Object copied = copy.get( 2 );
+        assertNotSame( two, copied );
+        assertFalse( ArrayUtils.isEquals( two, copied ) );
+        
+        // Remove a value from the original attribute
+        three = (byte[])attr.remove( 3 );
+        
+        // Check that it does not have modified the copied attribute
+        assertEquals( 4, copy.size() );
+        
+        // The content should be equal
+        assertTrue( ArrayUtils.isEquals( three, copy.get( 3 ) ) );
+        
+        // but not the container
+        assertNotSame( three, copy.get( 3 ) );
+    }
+
     public void testEquals()
     {
         Attribute attr = new AttributeImpl( "test" );