Skip to content

Commit 70b45cc

Browse files
committed
Improve PdfArray#contains(), PdfArray#remove() and PdfArray#indexOf()
All this methods now work with direct content of an object. DEVSIX-828
1 parent 7e93450 commit 70b45cc

File tree

4 files changed

+167
-24
lines changed

4 files changed

+167
-24
lines changed

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfArray.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,10 @@ public boolean isEmpty() {
188188
public boolean contains(PdfObject o) {
189189
if (list.contains(o))
190190
return true;
191-
if (o != null) {
192-
if (o.getIndirectReference() != null
193-
&& list.contains(o.getIndirectReference())) {
194-
return true;
195-
} else if (o.isIndirectReference()
196-
&& list.contains(((PdfIndirectReference) o).getRefersTo())) {
191+
if (o == null)
192+
return false;
193+
for (PdfObject pdfObject : this) {
194+
if (PdfObject.equalContent(o, pdfObject)) {
197195
return true;
198196
}
199197
}
@@ -230,11 +228,14 @@ public void add(PdfObject pdfObject) {
230228
public void remove(PdfObject o) {
231229
if (list.remove(o))
232230
return;
233-
if (o != null) {
234-
if (o.getIndirectReference() != null && list.remove(o.getIndirectReference()))
231+
if (o == null)
232+
return;
233+
Iterator<PdfObject> it = iterator();
234+
while (it.hasNext()) {
235+
if (PdfObject.equalContent(o, it.next())) {
236+
it.remove();
235237
return;
236-
if (o.isIndirectReference())
237-
list.remove(((PdfIndirectReference) o).getRefersTo());
238+
}
238239
}
239240
}
240241

@@ -314,7 +315,16 @@ public void remove(int index) {
314315
* @see java.util.List#indexOf(Object)
315316
*/
316317
public int indexOf(PdfObject o) {
317-
return list.indexOf(o);
318+
if (o == null)
319+
return list.indexOf(null);
320+
int index = 0;
321+
for (PdfObject pdfObject : this) {
322+
if (PdfObject.equalContent(o, pdfObject)) {
323+
return index;
324+
}
325+
index++;
326+
}
327+
return -1;
318328
}
319329

320330
/**

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfDictionaryValues.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public boolean contains(Object o) {
6666
if (o == null)
6767
return false;
6868
for (PdfObject pdfObject : this) {
69-
if (equalObjects((PdfObject) o, pdfObject)) {
69+
if (PdfObject.equalContent((PdfObject) o, pdfObject)) {
7070
return true;
7171
}
7272
}
@@ -81,7 +81,7 @@ public boolean remove(Object o) {
8181
return false;
8282
Iterator<PdfObject> it = iterator();
8383
while (it.hasNext()) {
84-
if (equalObjects((PdfObject) o, it.next())) {
84+
if (PdfObject.equalContent((PdfObject) o, it.next())) {
8585
it.remove();
8686
return true;
8787
}
@@ -126,14 +126,4 @@ public void remove() {
126126
parentIterator.remove();
127127
}
128128
}
129-
130-
private static boolean equalObjects(PdfObject obj1, PdfObject obj2) {
131-
PdfObject direct1 = obj1 != null && obj1.isIndirectReference()
132-
? ((PdfIndirectReference)obj1).getRefersTo(true)
133-
: obj1;
134-
PdfObject direct2 = obj2 != null && obj2.isIndirectReference()
135-
? ((PdfIndirectReference)obj2).getRefersTo(true)
136-
: obj2;
137-
return direct1 != null && direct1.equals(direct2);
138-
}
139-
}
129+
}

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfObject.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,4 +515,14 @@ PdfObject processCopying(PdfDocument documentTo, boolean allowDuplicating) {
515515
return obj.clone();
516516
}
517517
}
518+
519+
static boolean equalContent(PdfObject obj1, PdfObject obj2) {
520+
PdfObject direct1 = obj1 != null && obj1.isIndirectReference()
521+
? ((PdfIndirectReference)obj1).getRefersTo(true)
522+
: obj1;
523+
PdfObject direct2 = obj2 != null && obj2.isIndirectReference()
524+
? ((PdfIndirectReference)obj2).getRefersTo(true)
525+
: obj2;
526+
return direct1 != null && direct1.equals(direct2);
527+
}
518528
}

kernel/src/test/java/com/itextpdf/kernel/pdf/PdfArrayTest.java

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,137 @@ public void testValuesIndirectRemove() {
5353

5454
Assert.assertEquals(0, array.size());
5555
}
56+
57+
@Test
58+
public void testContains() {
59+
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
60+
61+
PdfArray array = new PdfArray();
62+
array.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
63+
array.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
64+
array.add(new PdfNumber(3).makeIndirect(doc));
65+
array.add(new PdfNumber(4).makeIndirect(doc));
66+
array.add(new PdfNumber(5));
67+
array.add(new PdfNumber(6));
68+
69+
PdfArray array2 = new PdfArray();
70+
array2.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
71+
array2.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
72+
array2.add(new PdfNumber(3).makeIndirect(doc));
73+
array2.add(new PdfNumber(4).makeIndirect(doc));
74+
array2.add(new PdfNumber(5));
75+
array2.add(new PdfNumber(6));
76+
77+
for (PdfObject obj : array2) {
78+
Assert.assertTrue(array.contains(obj));
79+
}
80+
81+
for (int i = 0; i < array2.size(); i++) {
82+
Assert.assertTrue(array.contains(array2.get(i)));
83+
}
84+
}
85+
86+
@Test
87+
public void testRemove() {
88+
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
89+
90+
PdfArray array = new PdfArray();
91+
array.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
92+
array.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
93+
array.add(new PdfNumber(3).makeIndirect(doc));
94+
array.add(new PdfNumber(4).makeIndirect(doc));
95+
array.add(new PdfNumber(5));
96+
array.add(new PdfNumber(6));
97+
98+
PdfArray array2 = new PdfArray();
99+
array2.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
100+
array2.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
101+
array2.add(new PdfNumber(3).makeIndirect(doc));
102+
array2.add(new PdfNumber(4).makeIndirect(doc));
103+
array2.add(new PdfNumber(5));
104+
array2.add(new PdfNumber(6));
105+
106+
for (PdfObject obj : array2) {
107+
array.remove(obj);
108+
}
109+
110+
Assert.assertEquals(0, array.size());
111+
}
112+
113+
@Test
114+
public void testRemove2() {
115+
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
116+
117+
PdfArray array = new PdfArray();
118+
array.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
119+
array.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
120+
array.add(new PdfNumber(3).makeIndirect(doc));
121+
array.add(new PdfNumber(4).makeIndirect(doc));
122+
array.add(new PdfNumber(5));
123+
array.add(new PdfNumber(6));
124+
125+
PdfArray array2 = new PdfArray();
126+
array2.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
127+
array2.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
128+
array2.add(new PdfNumber(3).makeIndirect(doc));
129+
array2.add(new PdfNumber(4).makeIndirect(doc));
130+
array2.add(new PdfNumber(5));
131+
array2.add(new PdfNumber(6));
132+
133+
for (int i = 0; i < array2.size(); i++) {
134+
array.remove(array2.get(i));
135+
}
136+
137+
Assert.assertEquals(0, array.size());
138+
}
139+
@Test
140+
public void testIndexOf() {
141+
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
142+
143+
PdfArray array = new PdfArray();
144+
array.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
145+
array.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
146+
array.add(new PdfNumber(3).makeIndirect(doc));
147+
array.add(new PdfNumber(4).makeIndirect(doc));
148+
array.add(new PdfNumber(5));
149+
array.add(new PdfNumber(6));
150+
151+
PdfArray array2 = new PdfArray();
152+
array2.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
153+
array2.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
154+
array2.add(new PdfNumber(3).makeIndirect(doc));
155+
array2.add(new PdfNumber(4).makeIndirect(doc));
156+
array2.add(new PdfNumber(5));
157+
array2.add(new PdfNumber(6));
158+
159+
int i = 0;
160+
for (PdfObject obj : array2) {
161+
Assert.assertEquals(i++, array.indexOf(obj));
162+
}
163+
}
164+
165+
@Test
166+
public void testIndexOf2() {
167+
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
168+
169+
PdfArray array = new PdfArray();
170+
array.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
171+
array.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
172+
array.add(new PdfNumber(3).makeIndirect(doc));
173+
array.add(new PdfNumber(4).makeIndirect(doc));
174+
array.add(new PdfNumber(5));
175+
array.add(new PdfNumber(6));
176+
177+
PdfArray array2 = new PdfArray();
178+
array2.add(new PdfNumber(1).makeIndirect(doc).getIndirectReference());
179+
array2.add(new PdfNumber(2).makeIndirect(doc).getIndirectReference());
180+
array2.add(new PdfNumber(3).makeIndirect(doc));
181+
array2.add(new PdfNumber(4).makeIndirect(doc));
182+
array2.add(new PdfNumber(5));
183+
array2.add(new PdfNumber(6));
184+
185+
for (int i = 0; i < array2.size(); i++) {
186+
Assert.assertEquals(i, array.indexOf(array2.get(i)));
187+
}
188+
}
56189
}

0 commit comments

Comments
 (0)