Skip to content

Commit 58eaa3c

Browse files
committed
Update PdfDictionaryEntrySet and PdfDictionaryValues.
DEVSIX-851
1 parent 698bf89 commit 58eaa3c

File tree

4 files changed

+101
-23
lines changed

4 files changed

+101
-23
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ class PdfDictionaryEntrySet extends AbstractSet<Map.Entry<PdfName, PdfObject>> {
5656
this.set = set;
5757
}
5858

59+
@Override
60+
public boolean contains(Object o) {
61+
return set.contains(o) || super.contains(o);
62+
}
63+
64+
@Override
65+
public boolean remove(Object o) {
66+
return set.remove(o) || super.remove(o);
67+
}
68+
5969
@Override
6070
public Iterator<Map.Entry<PdfName, PdfObject>> iterator() {
6171
return new DirectIterator();

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

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,29 +63,26 @@ public boolean add(PdfObject object) {
6363
public boolean contains(Object o) {
6464
if (collection.contains(o))
6565
return true;
66-
if (o != null) {
67-
if (((PdfObject) o).getIndirectReference() != null
68-
&& collection.contains(((PdfObject) o).getIndirectReference())) {
69-
return true;
70-
} else if (((PdfObject) o).isIndirectReference()
71-
&& collection.contains(((PdfIndirectReference) o).getRefersTo())) {
66+
if (o == null)
67+
return false;
68+
for (PdfObject pdfObject : this) {
69+
if (equalObjects((PdfObject) o, pdfObject)) {
7270
return true;
7371
}
7472
}
7573
return false;
76-
7774
}
7875

7976
@Override
8077
public boolean remove(Object o) {
8178
if (collection.remove(o))
8279
return true;
83-
if (o != null) {
84-
if (((PdfObject) o).getIndirectReference() != null
85-
&& collection.remove(((PdfObject) o).getIndirectReference())) {
86-
return true;
87-
} else if (((PdfObject) o).isIndirectReference()
88-
&& collection.remove(((PdfIndirectReference) o).getRefersTo())) {
80+
if (o == null)
81+
return false;
82+
Iterator<PdfObject> it = iterator();
83+
while (it.hasNext()) {
84+
if (equalObjects((PdfObject) o, it.next())) {
85+
it.remove();
8986
return true;
9087
}
9188
}
@@ -129,4 +126,14 @@ public void remove() {
129126
parentIterator.remove();
130127
}
131128
}
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+
}
132139
}

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.itextpdf.io.source.ByteArrayOutputStream;
44
import org.junit.Assert;
5-
import org.junit.Ignore;
65
import org.junit.Test;
76

87
import java.util.ArrayList;
@@ -74,7 +73,7 @@ public void testEntrySetRemove() {
7473
Assert.assertEquals(0, dict.size());
7574
}
7675

77-
@Test @Ignore("DEVSIX-851")
76+
@Test
7877
public void testEntrySetRemove2() {
7978
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
8079

@@ -94,10 +93,10 @@ public void testEntrySetRemove2() {
9493
dict2.put(new PdfName("5"), new PdfNumber(5));
9594
dict2.put(new PdfName("6"), new PdfNumber(6));
9695

97-
for (Map.Entry<PdfName, PdfObject> e: dict.entrySet()) {
98-
if (e.getValue().getIndirectReference() != null) continue;
99-
Assert.assertTrue(dict2.entrySet().remove(e));
96+
for (Map.Entry<PdfName, PdfObject> e: dict2.entrySet()) {
97+
dict.entrySet().remove(e);
10098
}
99+
101100
Assert.assertEquals(0, dict.entrySet().size());
102101
Assert.assertEquals(0, dict.values().size());
103102
Assert.assertEquals(0, dict.size());
@@ -126,7 +125,7 @@ public void testEntrySetRemoveAll() {
126125
Assert.assertEquals(0, dict.size());
127126
}
128127

129-
@Test @Ignore("DEVSIX-851")
128+
@Test
130129
public void testEntrySetRemoveAll2() {
131130
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
132131

@@ -297,7 +296,7 @@ public void testValuesIndirectRemove() {
297296
Assert.assertEquals(2, dict.size());
298297
}
299298

300-
@Test @Ignore("DEVSIX-851")
299+
@Test
301300
public void testValuesRemove2() {
302301
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
303302

@@ -318,7 +317,7 @@ public void testValuesRemove2() {
318317
dict2.put(new PdfName("6"), new PdfNumber(6));
319318

320319
for (PdfObject v: dict2.values()) {
321-
Assert.assertTrue(dict.values().remove(v));
320+
dict.values().remove(v);
322321
}
323322
Assert.assertEquals(0, dict.entrySet().size());
324323
Assert.assertEquals(0, dict.values().size());
@@ -350,7 +349,7 @@ public void testValuesRemoveAll() {
350349

351350
}
352351

353-
@Test @Ignore("DEVSIX-851")
352+
@Test
354353
public void testValuesRemoveAll2() {
355354
PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
356355

@@ -371,6 +370,7 @@ public void testValuesRemoveAll2() {
371370
dict2.put(new PdfName("6"), new PdfNumber(6));
372371

373372
dict.values().removeAll(dict2.values());
373+
374374
Assert.assertEquals(0, dict.entrySet().size());
375375
Assert.assertEquals(0, dict.values().size());
376376
Assert.assertEquals(0, dict.size());

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

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
package com.itextpdf.kernel.pdf;
22

3+
import com.itextpdf.io.LogMessageConstant;
4+
import com.itextpdf.io.source.ByteArrayOutputStream;
35
import com.itextpdf.test.ExtendedITextTest;
6+
import com.itextpdf.test.annotations.LogMessage;
7+
import com.itextpdf.test.annotations.LogMessages;
48
import com.itextpdf.test.annotations.type.IntegrationTest;
9+
import org.junit.Assert;
510
import org.junit.Before;
611
import org.junit.Test;
712
import org.junit.experimental.categories.Category;
813

914
import java.io.IOException;
15+
import java.nio.charset.Charset;
16+
import java.nio.charset.StandardCharsets;
1017
import java.util.Random;
1118

1219
@Category(IntegrationTest.class)
@@ -182,7 +189,6 @@ public void primitivesBooleanIndirectTest() throws IOException {
182189
pdfDoc.close();
183190
}
184191

185-
186192
@Test
187193
public void pdfNamesTest() {
188194
RandomString rnd = new RandomString(16);
@@ -191,6 +197,61 @@ public void pdfNamesTest() {
191197
}
192198
}
193199

200+
@Test
201+
public void equalStrings() {
202+
PdfString a = new PdfString("abcd").makeIndirect(new PdfDocument(new PdfWriter(new ByteArrayOutputStream())));
203+
PdfString b = new PdfString("abcd".getBytes(StandardCharsets.US_ASCII));
204+
Assert.assertTrue(a.equals(b));
205+
206+
PdfString c = new PdfString("abcd", "UTF-8");
207+
Assert.assertFalse(c.equals(a));
208+
}
209+
210+
@Test
211+
@LogMessages(messages = {
212+
@LogMessage(messageTemplate = LogMessageConstant.CALCULATE_HASHCODE_FOR_MODIFIED_PDFNUMBER)
213+
})
214+
public void equalNumbers() {
215+
PdfNumber num1 = new PdfNumber(1).makeIndirect(new PdfDocument(new PdfWriter(new ByteArrayOutputStream())));
216+
PdfNumber num2 = new PdfNumber(2);
217+
218+
Assert.assertFalse(num1.equals(num2));
219+
220+
int hashCode = num1.hashCode();
221+
num1.increment();
222+
223+
Assert.assertTrue(num1.equals(num2));
224+
Assert.assertNotEquals(hashCode, num1.hashCode());
225+
}
226+
227+
@Test
228+
public void equalNames() {
229+
PdfName a = new PdfName("abcd").makeIndirect(new PdfDocument(new PdfWriter(new ByteArrayOutputStream())));
230+
PdfName b = new PdfName("abcd");
231+
Assert.assertTrue(a.equals(b));
232+
}
233+
234+
@Test
235+
public void equalBoolean() {
236+
PdfBoolean f = new PdfBoolean(false).makeIndirect(new PdfDocument(new PdfWriter(new ByteArrayOutputStream())));
237+
PdfBoolean t = new PdfBoolean(true);
238+
Assert.assertFalse(f.equals(t));
239+
Assert.assertTrue(f.equals(PdfBoolean.FALSE));
240+
Assert.assertTrue(t.equals(PdfBoolean.TRUE));
241+
}
242+
243+
@Test
244+
public void equalNulls() {
245+
PdfNull a = new PdfNull().makeIndirect(new PdfDocument(new PdfWriter(new ByteArrayOutputStream())));;
246+
Assert.assertTrue(a.equals(PdfNull.PDF_NULL));
247+
}
248+
249+
@Test
250+
public void equalLiterals() {
251+
PdfLiteral a = new PdfLiteral("abcd");
252+
PdfLiteral b = new PdfLiteral("abcd".getBytes(StandardCharsets.US_ASCII));
253+
Assert.assertTrue(a.equals(b));
254+
}
194255

195256
private PdfArray generatePdfArrayWithFloatNumbers(PdfDocument doc, boolean indirects) {
196257
PdfArray array = new PdfArray().makeIndirect(doc);

0 commit comments

Comments
 (0)