Skip to content

Commit 32f2437

Browse files
BezrukovMiText-CI
authored andcommitted
Take document into account for PdfIndirectReference equals and hashCode
DEVSIX-3972 Autoported commit. Original commit hash: [5e9e852a7]
1 parent f45c5b8 commit 32f2437

File tree

7 files changed

+341
-68
lines changed

7 files changed

+341
-68
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
using System.IO;
2+
using iText.Test;
3+
4+
namespace iText.Kernel.Pdf {
5+
public class PdfIndirectReferenceTest : ExtendedITextTest {
6+
[NUnit.Framework.Test]
7+
public virtual void BaseEqualsTest() {
8+
PdfIndirectReference reference = new PdfIndirectReference(null, 41, 0);
9+
NUnit.Framework.Assert.IsTrue(reference.Equals(reference));
10+
NUnit.Framework.Assert.IsFalse(reference.Equals(null));
11+
PdfIndirectReferenceTest.TestIndirectReference testIndirectReference = new PdfIndirectReferenceTest.TestIndirectReference
12+
(null, 41, 0);
13+
NUnit.Framework.Assert.IsFalse(reference.Equals(testIndirectReference));
14+
NUnit.Framework.Assert.IsFalse(testIndirectReference.Equals(reference));
15+
}
16+
17+
[NUnit.Framework.Test]
18+
public virtual void EqualsWithDocTest() {
19+
using (PdfDocument firstDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
20+
using (PdfDocument secondDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
21+
// add a page to avoid exception throwing on close
22+
firstDoc.AddNewPage();
23+
secondDoc.AddNewPage();
24+
PdfIndirectReference obj41Gen0 = new PdfIndirectReference(firstDoc, 41, 0);
25+
NUnit.Framework.Assert.IsTrue(obj41Gen0.Equals(new PdfIndirectReference(firstDoc, 41, 0)));
26+
NUnit.Framework.Assert.IsFalse(obj41Gen0.Equals(new PdfIndirectReference(firstDoc, 42, 0)));
27+
NUnit.Framework.Assert.IsFalse(obj41Gen0.Equals(new PdfIndirectReference(firstDoc, 41, 1)));
28+
NUnit.Framework.Assert.IsFalse(obj41Gen0.Equals(new PdfIndirectReference(null, 41, 0)));
29+
NUnit.Framework.Assert.IsFalse(obj41Gen0.Equals(new PdfIndirectReference(secondDoc, 41, 0)));
30+
}
31+
}
32+
}
33+
34+
[NUnit.Framework.Test]
35+
public virtual void EqualsWithNullDocsTest() {
36+
PdfIndirectReference obj41Gen0 = new PdfIndirectReference(null, 41, 0);
37+
NUnit.Framework.Assert.IsTrue(obj41Gen0.Equals(new PdfIndirectReference(null, 41, 0)));
38+
NUnit.Framework.Assert.IsFalse(obj41Gen0.Equals(new PdfIndirectReference(null, 42, 0)));
39+
NUnit.Framework.Assert.IsFalse(obj41Gen0.Equals(new PdfIndirectReference(null, 41, 1)));
40+
using (PdfDocument doc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
41+
// add a page to avoid exception throwing on close
42+
doc.AddNewPage();
43+
NUnit.Framework.Assert.IsFalse(obj41Gen0.Equals(new PdfIndirectReference(doc, 41, 0)));
44+
}
45+
}
46+
47+
[NUnit.Framework.Test]
48+
public virtual void HashCodeTest() {
49+
PdfIndirectReference firstReference = new PdfIndirectReference(null, 41, 7);
50+
PdfIndirectReference secondReference = new PdfIndirectReference(null, 41, 7);
51+
NUnit.Framework.Assert.AreNotSame(firstReference, secondReference);
52+
NUnit.Framework.Assert.AreEqual(firstReference.GetHashCode(), secondReference.GetHashCode());
53+
NUnit.Framework.Assert.AreNotEqual(firstReference.GetHashCode(), new PdfIndirectReference(null, 42, 7).GetHashCode
54+
());
55+
NUnit.Framework.Assert.AreNotEqual(firstReference.GetHashCode(), new PdfIndirectReference(null, 41, 5).GetHashCode
56+
());
57+
using (PdfDocument firstDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
58+
using (PdfDocument secondDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
59+
// add a page to avoid exception throwing on close
60+
firstDoc.AddNewPage();
61+
secondDoc.AddNewPage();
62+
PdfIndirectReference obj41Gen0 = new PdfIndirectReference(firstDoc, 41, 0);
63+
NUnit.Framework.Assert.AreEqual(obj41Gen0.GetHashCode(), new PdfIndirectReference(firstDoc, 41, 0).GetHashCode
64+
());
65+
NUnit.Framework.Assert.AreNotEqual(obj41Gen0.GetHashCode(), new PdfIndirectReference(secondDoc, 41, 0).GetHashCode
66+
());
67+
NUnit.Framework.Assert.AreNotEqual(obj41Gen0.GetHashCode(), new PdfIndirectReference(null, 41, 0).GetHashCode
68+
());
69+
}
70+
}
71+
}
72+
73+
[NUnit.Framework.Test]
74+
public virtual void CompareToWithDocTest() {
75+
using (PdfDocument firstDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
76+
using (PdfDocument secondDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
77+
// add a page to avoid exception throwing on close
78+
firstDoc.AddNewPage();
79+
secondDoc.AddNewPage();
80+
PdfIndirectReference obj41Gen7 = new PdfIndirectReference(firstDoc, 41, 7);
81+
NUnit.Framework.Assert.AreEqual(0, obj41Gen7.CompareTo(new PdfIndirectReference(firstDoc, 41, 7)));
82+
NUnit.Framework.Assert.AreEqual(1, obj41Gen7.CompareTo(new PdfIndirectReference(firstDoc, 11, 17)));
83+
NUnit.Framework.Assert.AreEqual(-1, obj41Gen7.CompareTo(new PdfIndirectReference(firstDoc, 51, 0)));
84+
NUnit.Framework.Assert.AreEqual(-1, obj41Gen7.CompareTo(new PdfIndirectReference(firstDoc, 41, 17)));
85+
NUnit.Framework.Assert.AreEqual(1, obj41Gen7.CompareTo(new PdfIndirectReference(firstDoc, 41, 0)));
86+
NUnit.Framework.Assert.AreEqual(1, obj41Gen7.CompareTo(new PdfIndirectReference(null, 41, 7)));
87+
// we do not expect that ids could be equal
88+
int docIdsCompareResult = firstDoc.GetDocumentId() > secondDoc.GetDocumentId() ? 1 : -1;
89+
NUnit.Framework.Assert.AreEqual(docIdsCompareResult, obj41Gen7.CompareTo(new PdfIndirectReference(secondDoc
90+
, 41, 7)));
91+
NUnit.Framework.Assert.AreEqual(-docIdsCompareResult, new PdfIndirectReference(secondDoc, 41, 7).CompareTo
92+
(obj41Gen7));
93+
}
94+
}
95+
}
96+
97+
[NUnit.Framework.Test]
98+
public virtual void CompareToWithNullDocsTest() {
99+
PdfIndirectReference obj41Gen7 = new PdfIndirectReference(null, 41, 7);
100+
NUnit.Framework.Assert.AreEqual(0, obj41Gen7.CompareTo(new PdfIndirectReference(null, 41, 7)));
101+
NUnit.Framework.Assert.AreEqual(1, obj41Gen7.CompareTo(new PdfIndirectReference(null, 11, 17)));
102+
NUnit.Framework.Assert.AreEqual(-1, obj41Gen7.CompareTo(new PdfIndirectReference(null, 51, 0)));
103+
NUnit.Framework.Assert.AreEqual(-1, obj41Gen7.CompareTo(new PdfIndirectReference(null, 41, 17)));
104+
NUnit.Framework.Assert.AreEqual(1, obj41Gen7.CompareTo(new PdfIndirectReference(null, 41, 0)));
105+
using (PdfDocument doc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
106+
// add a page to avoid exception throwing on close
107+
doc.AddNewPage();
108+
NUnit.Framework.Assert.AreEqual(-1, obj41Gen7.CompareTo(new PdfIndirectReference(doc, 41, 7)));
109+
NUnit.Framework.Assert.AreEqual(1, obj41Gen7.CompareTo(new PdfIndirectReference(doc, 11, 17)));
110+
NUnit.Framework.Assert.AreEqual(1, obj41Gen7.CompareTo(new PdfIndirectReference(doc, 41, 0)));
111+
}
112+
}
113+
114+
private class TestIndirectReference : PdfIndirectReference {
115+
public TestIndirectReference(PdfDocument doc, int objNr, int genNr)
116+
: base(doc, objNr, genNr) {
117+
}
118+
}
119+
}
120+
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
using System.IO;
2+
using iText.Kernel.Pdf;
3+
using iText.Test;
4+
5+
namespace iText.Kernel.Utils {
6+
public class CompareToolObjectPathTest : ExtendedITextTest {
7+
[NUnit.Framework.Test]
8+
public virtual void BaseEqualsTest() {
9+
CompareTool compareTool = new CompareTool();
10+
PdfIndirectReference firstReference = CreateIndirectReference(null, 41, 0);
11+
PdfIndirectReference secondReference = CreateIndirectReference(null, 42, 0);
12+
CompareTool.ObjectPath path = new CompareTool.ObjectPath(firstReference, secondReference);
13+
NUnit.Framework.Assert.IsTrue(path.Equals(path));
14+
NUnit.Framework.Assert.IsFalse(path.Equals(null));
15+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(firstReference, secondReference).Equals(new CompareTool.ObjectPath
16+
(null, secondReference)));
17+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(null, secondReference).Equals(new CompareTool.ObjectPath
18+
(firstReference, secondReference)));
19+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(firstReference, secondReference).Equals(new CompareTool.ObjectPath
20+
(firstReference, null)));
21+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(firstReference, secondReference).Equals(new CompareTool.ObjectPath
22+
(null, secondReference)));
23+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(firstReference, secondReference).Equals(new CompareTool.ObjectPath
24+
(new CompareToolObjectPathTest.TestIndirectReference(null, 41, 0), secondReference)));
25+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(firstReference, secondReference).Equals(new CompareTool.ObjectPath
26+
(firstReference, new CompareToolObjectPathTest.TestIndirectReference(null, 42, 0))));
27+
}
28+
29+
[NUnit.Framework.Test]
30+
public virtual void EqualsWithDocTest() {
31+
CompareTool compareTool = new CompareTool();
32+
using (PdfDocument firstDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
33+
using (PdfDocument secondDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
34+
// add a page to avoid exception throwing on close
35+
firstDoc.AddNewPage();
36+
secondDoc.AddNewPage();
37+
PdfIndirectReference obj41Gen0 = CreateIndirectReference(firstDoc, 41, 0);
38+
PdfIndirectReference obj42Gen0 = CreateIndirectReference(firstDoc, 42, 0);
39+
NUnit.Framework.Assert.IsTrue(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
40+
(CreateIndirectReference(firstDoc, 41, 0), obj42Gen0)));
41+
NUnit.Framework.Assert.IsTrue(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
42+
(obj41Gen0, CreateIndirectReference(firstDoc, 42, 0))));
43+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
44+
(CreateIndirectReference(firstDoc, 42, 0), obj42Gen0)));
45+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
46+
(obj41Gen0, CreateIndirectReference(firstDoc, 41, 0))));
47+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
48+
(CreateIndirectReference(firstDoc, 41, 1), obj42Gen0)));
49+
NUnit.Framework.Assert.IsFalse(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
50+
(obj41Gen0, CreateIndirectReference(firstDoc, 42, 1))));
51+
// TODO: DEVSIX-4756 start asserting false
52+
NUnit.Framework.Assert.IsTrue(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
53+
(CreateIndirectReference(null, 41, 0), obj42Gen0)));
54+
// TODO: DEVSIX-4756 start asserting false
55+
NUnit.Framework.Assert.IsTrue(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
56+
(obj41Gen0, CreateIndirectReference(null, 42, 0))));
57+
// TODO: DEVSIX-4756 start asserting false
58+
NUnit.Framework.Assert.IsTrue(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
59+
(CreateIndirectReference(secondDoc, 41, 0), obj42Gen0)));
60+
// TODO: DEVSIX-4756 start asserting false
61+
NUnit.Framework.Assert.IsTrue(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).Equals(new CompareTool.ObjectPath
62+
(obj41Gen0, CreateIndirectReference(secondDoc, 42, 0))));
63+
}
64+
}
65+
}
66+
67+
[NUnit.Framework.Test]
68+
public virtual void HashCodeTest() {
69+
CompareTool compareTool = new CompareTool();
70+
using (PdfDocument firstDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
71+
using (PdfDocument secondDoc = new PdfDocument(new PdfWriter(new MemoryStream()))) {
72+
// add a page to avoid exception throwing on close
73+
firstDoc.AddNewPage();
74+
secondDoc.AddNewPage();
75+
PdfIndirectReference obj41Gen0 = CreateIndirectReference(firstDoc, 41, 0);
76+
PdfIndirectReference obj42Gen0 = CreateIndirectReference(firstDoc, 42, 0);
77+
NUnit.Framework.Assert.AreEqual(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).GetHashCode(), new CompareTool.ObjectPath
78+
(CreateIndirectReference(firstDoc, 41, 0), CreateIndirectReference(firstDoc, 42, 0)).GetHashCode());
79+
NUnit.Framework.Assert.AreNotEqual(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).GetHashCode(), new CompareTool.ObjectPath
80+
(CreateIndirectReference(firstDoc, 42, 0), obj42Gen0).GetHashCode());
81+
NUnit.Framework.Assert.AreNotEqual(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).GetHashCode(), new CompareTool.ObjectPath
82+
(obj41Gen0, CreateIndirectReference(firstDoc, 41, 0)).GetHashCode());
83+
// TODO: DEVSIX-4756 start asserting not equals
84+
NUnit.Framework.Assert.AreEqual(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).GetHashCode(), new CompareTool.ObjectPath
85+
(CreateIndirectReference(null, 41, 0), CreateIndirectReference(firstDoc, 42, 0)).GetHashCode());
86+
// TODO: DEVSIX-4756 start asserting not equals
87+
NUnit.Framework.Assert.AreEqual(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).GetHashCode(), new CompareTool.ObjectPath
88+
(CreateIndirectReference(firstDoc, 41, 0), CreateIndirectReference(null, 42, 0)).GetHashCode());
89+
// TODO: DEVSIX-4756 start asserting not equals
90+
NUnit.Framework.Assert.AreEqual(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).GetHashCode(), new CompareTool.ObjectPath
91+
(CreateIndirectReference(secondDoc, 41, 0), CreateIndirectReference(firstDoc, 42, 0)).GetHashCode());
92+
// TODO: DEVSIX-4756 start asserting not equals
93+
NUnit.Framework.Assert.AreEqual(new CompareTool.ObjectPath(obj41Gen0, obj42Gen0).GetHashCode(), new CompareTool.ObjectPath
94+
(CreateIndirectReference(firstDoc, 41, 0), CreateIndirectReference(secondDoc, 42, 0)).GetHashCode());
95+
}
96+
}
97+
}
98+
99+
private PdfIndirectReference CreateIndirectReference(PdfDocument doc, int objNr, int genNr) {
100+
return new CompareToolObjectPathTest.PdfIndirectReferenceWithPublicConstructor(doc, objNr, genNr);
101+
}
102+
103+
private class PdfIndirectReferenceWithPublicConstructor : PdfIndirectReference {
104+
public PdfIndirectReferenceWithPublicConstructor(PdfDocument doc, int objNr, int genNr)
105+
: base(doc, objNr, genNr) {
106+
}
107+
}
108+
109+
private class TestIndirectReference : CompareToolObjectPathTest.PdfIndirectReferenceWithPublicConstructor {
110+
public TestIndirectReference(PdfDocument doc, int objNr, int genNr)
111+
: base(doc, objNr, genNr) {
112+
}
113+
}
114+
}
115+
}

itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs

Lines changed: 6 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2236,6 +2236,10 @@ protected internal virtual IPdfPageFactory GetPageFactory() {
22362236
return pdfPageFactory;
22372237
}
22382238

2239+
internal virtual long GetDocumentId() {
2240+
return documentId;
2241+
}
2242+
22392243
/// <summary>Gets iText version info.</summary>
22402244
/// <returns>iText version info.</returns>
22412245
internal VersionInfo GetVersionInfo() {
@@ -2434,53 +2438,10 @@ private void EnsureTreeRootAddedToNames(PdfObject treeRoot, PdfName treeType) {
24342438
names.SetModified();
24352439
}
24362440

2437-
private long GetDocumentId() {
2438-
return documentId;
2439-
}
2440-
24412441
private bool WriterHasEncryption() {
24422442
return writer.properties.IsStandardEncryptionUsed() || writer.properties.IsPublicKeyEncryptionUsed();
24432443
}
24442444

2445-
/// <summary>A structure storing documentId, object number and generation number.</summary>
2446-
/// <remarks>
2447-
/// A structure storing documentId, object number and generation number. This structure is using to calculate
2448-
/// an unique object key during the copy process.
2449-
/// </remarks>
2450-
internal class IndirectRefDescription {
2451-
internal readonly long docId;
2452-
2453-
internal readonly int objNr;
2454-
2455-
internal readonly int genNr;
2456-
2457-
internal IndirectRefDescription(PdfIndirectReference reference) {
2458-
this.docId = reference.GetDocument().GetDocumentId();
2459-
this.objNr = reference.GetObjNumber();
2460-
this.genNr = reference.GetGenNumber();
2461-
}
2462-
2463-
public override int GetHashCode() {
2464-
int result = (int)docId;
2465-
result *= 31;
2466-
result += objNr;
2467-
result *= 31;
2468-
result += genNr;
2469-
return result;
2470-
}
2471-
2472-
public override bool Equals(Object o) {
2473-
if (this == o) {
2474-
return true;
2475-
}
2476-
if (o == null || GetType() != o.GetType()) {
2477-
return false;
2478-
}
2479-
PdfDocument.IndirectRefDescription that = (PdfDocument.IndirectRefDescription)o;
2480-
return docId == that.docId && objNr == that.objNr && genNr == that.genNr;
2481-
}
2482-
}
2483-
24842445
private String AddModifiedPostfix(String producer) {
24852446
if (producer == null || !versionInfo.GetVersion().Contains(versionInfo.GetProduct())) {
24862447
return versionInfo.GetVersion();
@@ -2503,12 +2464,12 @@ private String AddModifiedPostfix(String producer) {
25032464
private static void OverrideFullCompressionInWriterProperties(WriterProperties properties, bool readerHasXrefStream
25042465
) {
25052466
if (true == properties.isFullCompression && !readerHasXrefStream) {
2506-
ILog logger = LogManager.GetLogger(typeof(PdfDocument));
2467+
ILog logger = LogManager.GetLogger(typeof(iText.Kernel.Pdf.PdfDocument));
25072468
logger.Warn(KernelLogMessageConstant.FULL_COMPRESSION_APPEND_MODE_XREF_TABLE_INCONSISTENCY);
25082469
}
25092470
else {
25102471
if (false == properties.isFullCompression && readerHasXrefStream) {
2511-
ILog logger = LogManager.GetLogger(typeof(PdfDocument));
2472+
ILog logger = LogManager.GetLogger(typeof(iText.Kernel.Pdf.PdfDocument));
25122473
logger.Warn(KernelLogMessageConstant.FULL_COMPRESSION_APPEND_MODE_XREF_STREAM_INCONSISTENCY);
25132474
}
25142475
}

0 commit comments

Comments
 (0)