Skip to content

Commit 6689450

Browse files
committed
Fix NPE in case keep together is set as default property
DEVSIX-1245
1 parent 0bf56e9 commit 6689450

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

layout/src/main/java/com/itextpdf/layout/renderer/RootRenderer.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,13 @@ public void addChild(IRenderer renderer) {
183183
} else if (null != result.getCauseOfNothing() && Boolean.TRUE.equals(result.getCauseOfNothing().<Boolean>getProperty(Property.KEEP_TOGETHER))) {
184184
// set KEEP_TOGETHER false on the deepest parent (maybe the element itself) to have KEEP_TOGETHER == true
185185
IRenderer theDeepestKeptTogether = result.getCauseOfNothing();
186+
IRenderer parent;
186187
while (null == theDeepestKeptTogether.getModelElement() || null == theDeepestKeptTogether.getModelElement().<Boolean>getOwnProperty(Property.KEEP_TOGETHER)) {
187-
theDeepestKeptTogether = ((AbstractRenderer) theDeepestKeptTogether).parent;
188+
parent = ((AbstractRenderer) theDeepestKeptTogether).parent;
189+
if (parent == null) {
190+
break;
191+
}
192+
theDeepestKeptTogether = parent;
188193
}
189194
theDeepestKeptTogether.getModelElement().setProperty(Property.KEEP_TOGETHER, false);
190195
Logger logger = LoggerFactory.getLogger(RootRenderer.class);

layout/src/test/java/com/itextpdf/layout/KeepTogetherTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@ This file is part of the iText (R) project.
5454
import com.itextpdf.layout.element.List;
5555
import com.itextpdf.layout.element.Paragraph;
5656
import com.itextpdf.layout.property.ListNumberingType;
57+
import com.itextpdf.layout.property.Property;
5758
import com.itextpdf.test.ExtendedITextTest;
5859
import com.itextpdf.test.annotations.LogMessage;
5960
import com.itextpdf.test.annotations.LogMessages;
6061
import com.itextpdf.test.annotations.type.IntegrationTest;
6162
import org.junit.Assert;
6263
import org.junit.BeforeClass;
64+
import org.junit.Ignore;
6365
import org.junit.Test;
6466
import org.junit.experimental.categories.Category;
6567

@@ -229,5 +231,37 @@ public void keepTogetherDivTest02() throws IOException, InterruptedException {
229231
Assert.assertNull(new CompareTool().compareByContent(outFile, cmpFileName, destinationFolder, "diff"));
230232
}
231233

234+
@Test
235+
@LogMessages(messages = {
236+
@LogMessage(messageTemplate = LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA)
237+
})
238+
public void keepTogetherDefaultTest01() throws IOException, InterruptedException {
239+
String cmpFileName = sourceFolder + "cmp_keepTogetherDefaultTest01.pdf";
240+
String outFile = destinationFolder + "keepTogetherDefaultTest01.pdf";
241+
242+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFile));
243+
Document doc = new Document(pdfDoc);
244+
245+
Div div = new KeepTogetherDiv();
246+
doc.add(new Paragraph("first string"));
247+
for (int i = 0; i < 130; i++) {
248+
div.add(new Paragraph("String number " + i));
249+
}
250+
251+
doc.add(div);
252+
doc.close();
253+
Assert.assertNull(new CompareTool().compareByContent(outFile, cmpFileName, destinationFolder, "diff"));
254+
}
255+
256+
private static class KeepTogetherDiv extends Div {
257+
@Override
258+
public <T1> T1 getDefaultProperty(int property) {
259+
if (property == Property.KEEP_TOGETHER) {
260+
return (T1) (Object) true;
261+
}
262+
return super.<T1>getDefaultProperty(property);
263+
}
264+
}
265+
232266

233267
}

0 commit comments

Comments
 (0)