Author: msahyoun
Date: Sat Oct 12 22:47:49 2019
New Revision: 1868376

URL: http://svn.apache.org/viewvc?rev=1868376&view=rev
Log:
PDFBOX-4669: fix removing when filtered by index; add test

Modified:
    
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/COSArrayList.java
    
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/COSArrayListTest.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/COSArrayList.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/COSArrayList.java?rev=1868376&r1=1868375&r2=1868376&view=diff
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/COSArrayList.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/COSArrayList.java
 Sat Oct 12 22:47:49 2019
@@ -204,10 +204,10 @@ public class COSArrayList<E> implements
         int index = actual.indexOf( o );
         if( index >= 0 )
         {
-            Object removed = actual.remove( index );
+            retval = actual.remove( o );
 
-            if (removed instanceof COSObjectable) {
-                COSBase cosBase = ((COSObjectable) removed).getCOSObject();
+            if (o instanceof COSObjectable) {
+                COSBase cosBase = ((COSObjectable) o).getCOSObject();
                 retval = array.remove(cosBase);
             }
         }
@@ -607,8 +607,9 @@ public class COSArrayList<E> implements
     @Override
     public E remove(int index)
     {
-        array.remove( index );
-        return actual.remove( index );
+        E toBeRemoved = actual.get(index);
+        boolean result = remove(toBeRemoved);
+        return result ? toBeRemoved : null;
     }
 
     /**

Modified: 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/COSArrayListTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/COSArrayListTest.java?rev=1868376&r1=1868375&r2=1868376&view=diff
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/COSArrayListTest.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/COSArrayListTest.java
 Sat Oct 12 22:47:49 2019
@@ -194,6 +194,43 @@ public class COSArrayListTest {
     }
 
     @Test
+    public void removeFromFilteredListByIndex() throws Exception
+    {
+        // retrieve all annotations from page but the link annotation
+        // which is 2nd in list - see above setup
+        AnnotationFilter annotsFilter = new AnnotationFilter()
+        {
+            @Override
+            public boolean accept(PDAnnotation annotation)
+            {
+                return !(annotation instanceof PDAnnotationLink);
+            }
+        };
+
+        COSArrayList<PDAnnotation> cosArrayList = (COSArrayList<PDAnnotation>) 
pdPage.getAnnotations(annotsFilter);
+        COSArray underlyingCOSArray = 
pdPage.getCOSObject().getCOSArray(COSName.ANNOTS);
+
+        assertTrue("Filtered COSArrayList size shall be 2", 
cosArrayList.size() == 2);
+        assertTrue("Underlying COSArray shall have 3 entries", 
underlyingCOSArray.size() == 3);
+        assertTrue("Backed COSArray shall have 3 entries", 
cosArrayList.toList().size() == 3);
+
+        // remove aCircle annotation
+        int positionToRemove = 1;
+        PDAnnotation toBeRemoved = cosArrayList.get(positionToRemove);
+        assertTrue("We should remove the circle annotation", 
toBeRemoved.getSubtype().equals(PDAnnotationSquareCircle.SUB_TYPE_CIRCLE));
+        cosArrayList.remove(positionToRemove);
+
+        assertTrue("List size shall be 2", cosArrayList.size() == 1);
+        assertTrue("COSArray size shall be 2", underlyingCOSArray.size() == 2);
+        assertTrue("Backed COSArray size shall be 2", 
cosArrayList.toList().size() == 2);
+
+        assertTrue("Removed annotation shall no longer appear in 
COSArrayList", cosArrayList.indexOf(toBeRemoved) == -1);
+        assertTrue("Removed annotation shall no longer appear in underlying 
COSArray", underlyingCOSArray.indexOf(toBeRemoved.getCOSObject()) == -1);
+        assertTrue("Removed annotation shall no longer appear in backed 
COSArray", cosArrayList.toList().indexOf(toBeRemoved.getCOSObject()) == -1);
+    }
+    
+
+    @Test
     public void removeFromFilteredListByObject() throws Exception
     {
         // retrieve all annotations from page but the link annotation


Reply via email to