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