Skip to content

Commit 18252d6

Browse files
BezrukovMiText-CI
authored andcommitted
PdfNumber equals and hashcode fixes
DEVSIX-4931 Autoported commit. Original commit hash: [f370fe48b]
1 parent 45e3488 commit 18252d6

File tree

4 files changed

+37
-23
lines changed

4 files changed

+37
-23
lines changed

itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfPrimitivesTest.cs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -253,16 +253,33 @@ public virtual void EqualStrings() {
253253
}
254254

255255
[NUnit.Framework.Test]
256-
[LogMessage(iText.IO.LogMessageConstant.CALCULATE_HASHCODE_FOR_MODIFIED_PDFNUMBER)]
257256
public virtual void EqualNumbers() {
258-
PdfNumber num1 = (PdfNumber)new PdfNumber(1).MakeIndirect(new PdfDocument(new PdfWriter(new ByteArrayOutputStream
259-
())));
260-
PdfNumber num2 = new PdfNumber(2);
261-
NUnit.Framework.Assert.IsFalse(num1.Equals(num2));
262-
int hashCode = num1.GetHashCode();
263-
num1.Increment();
264-
NUnit.Framework.Assert.IsTrue(num1.Equals(num2));
265-
NUnit.Framework.Assert.AreNotEqual(hashCode, num1.GetHashCode());
257+
using (PdfDocument document = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()))) {
258+
// add a page to avoid exception throwing on close
259+
document.AddNewPage();
260+
PdfNumber num1 = (PdfNumber)new PdfNumber(1).MakeIndirect(document);
261+
PdfNumber num2 = new PdfNumber(2);
262+
NUnit.Framework.Assert.IsFalse(num1.Equals(num2));
263+
int hashCode = num1.GetHashCode();
264+
num1.Increment();
265+
NUnit.Framework.Assert.IsTrue(num1.Equals(num2));
266+
NUnit.Framework.Assert.AreNotEqual(hashCode, num1.GetHashCode());
267+
}
268+
PdfNumber a = new PdfNumber(1);
269+
PdfNumber aContent = new PdfNumber(a.GetInternalContent());
270+
PdfNumber b = new PdfNumber(2);
271+
PdfNumber bContent = new PdfNumber(b.GetInternalContent());
272+
NUnit.Framework.Assert.IsTrue(a.Equals(aContent));
273+
NUnit.Framework.Assert.AreEqual(a.GetHashCode(), aContent.GetHashCode());
274+
NUnit.Framework.Assert.IsTrue(b.Equals(bContent));
275+
NUnit.Framework.Assert.AreEqual(b.GetHashCode(), bContent.GetHashCode());
276+
NUnit.Framework.Assert.IsFalse(aContent.Equals(bContent));
277+
NUnit.Framework.Assert.AreNotEqual(aContent.GetHashCode(), bContent.GetHashCode());
278+
aContent.Increment();
279+
NUnit.Framework.Assert.IsFalse(a.Equals(aContent));
280+
NUnit.Framework.Assert.AreNotEqual(a.GetHashCode(), aContent.GetHashCode());
281+
NUnit.Framework.Assert.IsTrue(aContent.Equals(bContent));
282+
NUnit.Framework.Assert.AreEqual(aContent.GetHashCode(), bContent.GetHashCode());
266283
}
267284

268285
[NUnit.Framework.Test]

itext/itext.io/itext/io/LogMessageConstant.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public sealed class LogMessageConstant {
6060

6161
public const String ATTEMPT_TO_MOVE_TO_FLUSHED_PARENT = "An attempt is made to move the tag tree pointer to the tag parent which has been already flushed. Tag tree pointer is moved to the root tag instead.";
6262

63+
/// <summary>The log message for hashcode method call for modified instance of PdfNumber object.</summary>
64+
[System.ObsoleteAttribute(@"Logging this case has been deprecated The constant will be removed in 7.2.")]
6365
public const String CALCULATE_HASHCODE_FOR_MODIFIED_PDFNUMBER = "Calculate hashcode for modified PdfNumber.";
6466

6567
public const String CANNOT_ADD_FINISHED_HINT_AS_A_NEW_KID_HINT = "Layout tagging hints addition failed: cannot add a hint that is already marked as finished. Consider using com.itextpdf.layout.tagging.LayoutTaggingHelper#moveKidHint method for moving already finished kid hint from not yet finished parent hint.";

itext/itext.kernel/itext/kernel/pdf/PdfNumber.cs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ source product.
4242
4343
*/
4444
using System;
45-
using Common.Logging;
4645
using iText.IO.Source;
4746
using iText.IO.Util;
4847

@@ -52,8 +51,6 @@ public class PdfNumber : PdfPrimitiveObject {
5251

5352
private bool isDouble;
5453

55-
private bool changed = false;
56-
5754
public PdfNumber(double value)
5855
: base() {
5956
SetValue(value);
@@ -105,7 +102,6 @@ public virtual void SetValue(int value) {
105102
this.value = value;
106103
this.isDouble = false;
107104
this.content = null;
108-
this.changed = true;
109105
}
110106

111107
public virtual void SetValue(double value) {
@@ -139,8 +135,13 @@ public override String ToString() {
139135
}
140136

141137
public override bool Equals(Object o) {
142-
return this == o || o != null && GetType() == o.GetType() && JavaUtil.DoubleCompare(((iText.Kernel.Pdf.PdfNumber
143-
)o).value, value) == 0;
138+
if (this == o) {
139+
return true;
140+
}
141+
if (o == null || GetType() != o.GetType()) {
142+
return false;
143+
}
144+
return JavaUtil.DoubleCompare(((iText.Kernel.Pdf.PdfNumber)o).GetValue(), GetValue()) == 0;
144145
}
145146

146147
/// <summary>Checks if string representation of the value contains decimal point.</summary>
@@ -150,13 +151,7 @@ public virtual bool HasDecimalPoint() {
150151
}
151152

152153
public override int GetHashCode() {
153-
if (changed) {
154-
//if the instance was modified, hashCode also will be changed, it may cause inconsistency.
155-
ILog logger = LogManager.GetLogger(typeof(PdfReader));
156-
logger.Warn(iText.IO.LogMessageConstant.CALCULATE_HASHCODE_FOR_MODIFIED_PDFNUMBER);
157-
changed = false;
158-
}
159-
long hash = JavaUtil.DoubleToLongBits(value);
154+
long hash = JavaUtil.DoubleToLongBits(GetValue());
160155
return (int)(hash ^ ((long)(((ulong)hash) >> 32)));
161156
}
162157

port-hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
f1732a245a993f40926832877c8639bbd0ff93b2
1+
f370fe48b878c1deb322a836e3060530e1ee380c

0 commit comments

Comments
 (0)