Author: cutting
Date: Sat Feb 19 00:40:03 2011
New Revision: 1072217

URL: http://svn.apache.org/viewvc?rev=1072217&view=rev
Log:
AVRO-730. Java: Add set() and remove() methods to GenericData.Array. 
Contributed by Chase Bradford.

Modified:
    avro/trunk/CHANGES.txt
    
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
    
avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java

Modified: avro/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1072217&r1=1072216&r2=1072217&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Sat Feb 19 00:40:03 2011
@@ -91,6 +91,9 @@ Avro 1.5.0 (unreleased)
     AVRO-750. C: Install a pkg-config file
     (dcreager)
 
+    AVRO-730. Java: Add set() and remove() methods to GenericData.Array.
+    (Chase Bradford via cutting)
+
   IMPROVEMENTS
 
     AVRO-765. Java: Improvement to BinaryDecoder readLong performance

Modified: 
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
URL: 
http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java?rev=1072217&r1=1072216&r2=1072217&view=diff
==============================================================================
--- 
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
 (original)
+++ 
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
 Sat Feb 19 00:40:03 2011
@@ -123,6 +123,22 @@ public class GenericData {
       elements[size++] = o;
       return true;
     }
+    @Override public T set(int i, T o) {
+      if (i >= size)
+        throw new IndexOutOfBoundsException("Index " + i + " out of bounds.");
+      T response = (T)elements[i];
+      elements[i] = o;
+      return response;
+    }
+    @Override public T remove(int i) {
+      if (i >= size)
+        throw new IndexOutOfBoundsException("Index " + i + " out of bounds.");
+      T result = (T)elements[i];
+      --size;
+      System.arraycopy(elements, i+1, elements, i, (size-i));
+      elements[size] = null;
+      return result;
+    }
     public T peek() {
       return (size < elements.length) ? (T)elements[size] : null;
     }

Modified: 
avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
URL: 
http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java?rev=1072217&r1=1072216&r2=1072217&view=diff
==============================================================================
--- 
avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
 (original)
+++ 
avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
 Sat Feb 19 00:40:03 2011
@@ -149,6 +149,64 @@ public class TestGenericData {
       array.get(0);
       fail("Expected IndexOutOfBoundsException getting index 0 after clear()");
     } catch (IndexOutOfBoundsException e) {}
+
+  }
+  @Test
+  public void testArrayRemove()
+  {
+    Schema schema = Schema.createArray(Schema.create(Schema.Type.INT));
+    GenericArray<Integer> array = new GenericData.Array<Integer>(10, schema);
+    array.clear();
+    for(int i=0; i<10; ++i)
+      array.add(i);
+    assertEquals(10, array.size());
+    assertEquals(new Integer(0), array.get(0));
+    assertEquals(new Integer(9), array.get(9));
+
+    array.remove(0);
+    assertEquals(9, array.size());
+    assertEquals(new Integer(1), array.get(0));
+    assertEquals(new Integer(2), array.get(1));
+    assertEquals(new Integer(9), array.get(8));
+
+    // Test boundary errors.
+    try {
+      array.get(9);
+      fail("Expected IndexOutOfBoundsException after removing an element");
+    } catch (IndexOutOfBoundsException e){}
+    try {
+      array.set(9, 99);
+      fail("Expected IndexOutOfBoundsException after removing an element");
+    } catch (IndexOutOfBoundsException e){}
+    try {
+      array.remove(9);
+      fail("Expected IndexOutOfBoundsException after removing an element");
+    } catch (IndexOutOfBoundsException e){}
+
+    // Test that we can still remove for properly sized arrays, and the rval
+    assertEquals(new Integer(9), array.remove(8));
+    assertEquals(8, array.size());
+
+
+    // Test insertion after remove
+    array.add(88);
+    assertEquals(new Integer(88), array.get(8));
+  }
+  @Test
+  public void testArraySet()
+  {
+    Schema schema = Schema.createArray(Schema.create(Schema.Type.INT));
+    GenericArray<Integer> array = new GenericData.Array<Integer>(10, schema);
+    array.clear();
+    for(int i=0; i<10; ++i)
+      array.add(i);
+    assertEquals(10, array.size());
+    assertEquals(new Integer(0), array.get(0));
+    assertEquals(new Integer(5), array.get(5));
+
+    assertEquals(new Integer(5), array.set(5, 55));
+    assertEquals(10, array.size());
+    assertEquals(new Integer(55), array.get(5));
   }
   
   @Test


Reply via email to