[ 
https://issues.apache.org/jira/browse/FOP-2461?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14525446#comment-14525446
 ] 

Andreas L. Delmelle commented on FOP-2461:
------------------------------------------

The auxiliary layout elements generated for padding-after have their Position 
set to null, so the second call in the chain 
"endEl.getPosition().getPosition()" causes the NPE. 
The statement at that line was indeed included in the merged branch, and was 
always bound to fail at some point. Best guess is that there are no tests yet 
that use padding-after on the last block in list item content, and the 
assumption was made that endEl ''always'' returned a wrapped Position

Lazy workaround:
As there is already a null-check for endEl itself, but none for the returned 
Position, the check can be extended 

   {{(endEl != null _&& endEl.getPosition() != null_) ? 
endEl.getPosition().getPosition() ...}}

Works and does not seem to break anything, but is not exactly robust. The same 
would have to be done a few lines up, or it would be just a matter of time 
before the same issue arises again, when someone decides to try padding-after 
in the label...

More robust alternative(s)?
Create a single final Position (ListElement.NULL_POSITION?), and use that as 
the default in the ListElement constructor and in ListElement.setPosition(), in 
case a literal null is passed. May want to make setPosition() final as well, 
since it is effectively overridden nowhere, and should be kept that way.
At least the semantics would then be clearer, and can be documented as such in 
the javadoc:
* ListElement.getPosition() --> safe, always returns a Position instance
* Position.getPosition()  --> unsafe, potentially returns null, depending on 
the implementation



> NullPointerException in ListItemLayoutManager since Temp_BasicSideFloat Merge
> -----------------------------------------------------------------------------
>
>                 Key: FOP-2461
>                 URL: https://issues.apache.org/jira/browse/FOP-2461
>             Project: Fop
>          Issue Type: Bug
>          Components: layout/unqualified
>    Affects Versions: trunk
>            Reporter: Matthias Reischenbacher
>         Attachments: fop-2461-test-case.xml
>
>
> The attached fo test cases causes a NullPointerException inside 
> ListItemLayoutManager. This is the stack trace:
> java.lang.NullPointerException
>       at 
> org.apache.fop.layoutmgr.list.ListItemLayoutManager.getCombinedKnuthElementsForListItem(ListItemLayoutManager.java:405)
>       at 
> org.apache.fop.layoutmgr.list.ListItemLayoutManager.getNextKnuthElements(ListItemLayoutManager.java:326)
>       at 
> org.apache.fop.layoutmgr.BlockStackingLayoutManager.getNextKnuthElements(BlockStackingLayoutManager.java:239)
>       at 
> org.apache.fop.layoutmgr.BlockStackingLayoutManager.getNextChildElements(BlockStackingLayoutManager.java:498)
>       at 
> org.apache.fop.layoutmgr.BlockStackingLayoutManager.getNextKnuthElements(BlockStackingLayoutManager.java:289)
>       at 
> org.apache.fop.layoutmgr.list.ListBlockLayoutManager.getNextKnuthElements(ListBlockLayoutManager.java:103)
>       at 
> org.apache.fop.layoutmgr.BlockStackingLayoutManager.getNextKnuthElements(BlockStackingLayoutManager.java:239)
>       at 
> org.apache.fop.layoutmgr.BlockLayoutManager.getNextChildElements(BlockLayoutManager.java:141)
>       at 
> org.apache.fop.layoutmgr.BlockStackingLayoutManager.getNextKnuthElements(BlockStackingLayoutManager.java:289)
>       at 
> org.apache.fop.layoutmgr.BlockLayoutManager.getNextKnuthElements(BlockLayoutManager.java:113)
>       at 
> org.apache.fop.layoutmgr.BlockLayoutManager.getNextKnuthElements(BlockLayoutManager.java:105)
>       at 
> org.apache.fop.layoutmgr.table.TableCellLayoutManager.getNextKnuthElements(TableCellLayoutManager.java:191)
>       at 
> org.apache.fop.layoutmgr.table.RowGroupLayoutManager.createElementsForRowGroup(RowGroupLayoutManager.java:120)
>       at 
> org.apache.fop.layoutmgr.table.RowGroupLayoutManager.getNextKnuthElements(RowGroupLayoutManager.java:63)
>       at 
> org.apache.fop.layoutmgr.table.TableContentLayoutManager.getKnuthElementsForRowIterator(TableContentLayoutManager.java:270)
>       at 
> org.apache.fop.layoutmgr.table.TableContentLayoutManager.getNextKnuthElements(TableContentLayoutManager.java:212)
>       at 
> org.apache.fop.layoutmgr.table.TableLayoutManager.getNextKnuthElements(TableLayoutManager.java:273)
>       at 
> org.apache.fop.layoutmgr.FlowLayoutManager.getNextChildElements(FlowLayoutManager.java:223)
>       at 
> org.apache.fop.layoutmgr.FlowLayoutManager.addChildElements(FlowLayoutManager.java:148)
>       at 
> org.apache.fop.layoutmgr.FlowLayoutManager.getNextKnuthElements(FlowLayoutManager.java:116)
>       at 
> org.apache.fop.layoutmgr.FlowLayoutManager.getNextKnuthElements(FlowLayoutManager.java:69)
>       at 
> org.apache.fop.layoutmgr.PageBreaker.getNextKnuthElements(PageBreaker.java:252)
>       at 
> org.apache.fop.layoutmgr.AbstractBreaker.getNextBlockList(AbstractBreaker.java:643)
>       at 
> org.apache.fop.layoutmgr.PageBreaker.getNextBlockList(PageBreaker.java:178)
>       at 
> org.apache.fop.layoutmgr.PageBreaker.getNextBlockList(PageBreaker.java:158)
>       at 
> org.apache.fop.layoutmgr.AbstractBreaker.doLayout(AbstractBreaker.java:384)
>       at org.apache.fop.layoutmgr.PageBreaker.doLayout(PageBreaker.java:112)
>       at 
> org.apache.fop.layoutmgr.PageSequenceLayoutManager.activateLayout(PageSequenceLayoutManager.java:135)
>       at 
> org.apache.fop.area.AreaTreeHandler.endPageSequence(AreaTreeHandler.java:267)
>       at 
> org.apache.fop.fo.pagination.PageSequence.endOfNode(PageSequence.java:130)
>       at 
> org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilder.java:360)
>       at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:190)
>       at 
> org.apache.xalan.transformer.TransformerIdentityImpl.endElement(TransformerIdentityImpl.java:1101)
>       at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown 
> Source)
>       at org.apache.xerces.xinclude.XIncludeHandler.endElement(Unknown Source)
>       at 
> org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
>       at 
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown
>  Source)
>       at 
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown 
> Source)
>       at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
>       at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
>       at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
>       at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
>       at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown 
> Source)
>       at 
> org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
>       at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:285)
>       at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:115)
>       at org.apache.fop.cli.Main.startFOP(Main.java:186)
>       at org.apache.fop.cli.Main.main(Main.java:217)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to