From 23ef1de68377de80f99e9930ec80e9ad7ff64cdd Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Mon, 15 Oct 2007 07:23:37 +0000 Subject: [PATCH] Bugfix for NPE with empty table-row (regression from 0.93). git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@584699 13f79535-47bb-0310-9956-ffa450edef68 --- .../fop/layoutmgr/table/ActiveCell.java | 19 +++-- .../table/TableContentLayoutManager.java | 14 ++-- .../fop/layoutmgr/table/TableStepper.java | 2 +- status.xml | 3 + .../table_table-row_empty.xml | 69 +++++++++++++++++++ 5 files changed, 90 insertions(+), 17 deletions(-) create mode 100644 test/layoutengine/standard-testcases/table_table-row_empty.xml diff --git a/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java b/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java index 727566a1a..a06856d04 100644 --- a/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java +++ b/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java @@ -61,7 +61,8 @@ class ActiveCell { /** Length of the penalty ending the last step, if any. */ private int lastPenaltyLength; - ActiveCell(PrimaryGridUnit pgu, EffRow row, int rowIndex, int previousRowsLength, TableLayoutManager tableLM) { + ActiveCell(PrimaryGridUnit pgu, EffRow row, int rowIndex, int previousRowsLength, + TableLayoutManager tableLM) { this.pgu = pgu; boolean makeBoxForWholeRow = false; if (row.getExplicitHeight().min > 0) { @@ -170,18 +171,20 @@ class ActiveCell { /** * Returns the total length up to the next legal break, not yet included in the steps. * - * @return the total length up to the next legal break + * @return the total length up to the next legal break (-1 signals no further step) */ int getNextStep() { if (!includedInLastStep()) { - return nextStepLength + lastPenaltyLength + borderBefore + borderAfter + paddingBefore + paddingAfter; + return nextStepLength + lastPenaltyLength + + borderBefore + borderAfter + paddingBefore + paddingAfter; } else { start = end + 1; if (knuthIter.hasNext()) { goToNextLegalBreak(); - return nextStepLength + lastPenaltyLength + borderBefore + borderAfter + paddingBefore + paddingAfter; + return nextStepLength + lastPenaltyLength + + borderBefore + borderAfter + paddingBefore + paddingAfter; } else { - return 0; + return -1; } } } @@ -198,12 +201,14 @@ class ActiveCell { * @return */ boolean signalMinStep(int minStep) { - if (nextStepLength + lastPenaltyLength + borderBefore + borderAfter + paddingBefore + paddingAfter <= minStep) { + if (nextStepLength + lastPenaltyLength + + borderBefore + borderAfter + paddingBefore + paddingAfter <= minStep) { includedLength = nextStepLength; computeRemainingLength(); return false; } else { - return previousRowsLength + borderBefore + borderAfter + paddingBefore + paddingAfter > minStep; + return previousRowsLength + borderBefore + + borderAfter + paddingBefore + paddingAfter > minStep; } } diff --git a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java index 5b0064899..a5ca6cbe2 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java @@ -30,28 +30,21 @@ import org.apache.fop.area.Block; import org.apache.fop.area.Trait; import org.apache.fop.datatypes.PercentBaseContext; import org.apache.fop.fo.Constants; -import org.apache.fop.fo.FONode; import org.apache.fop.fo.FObj; import org.apache.fop.fo.flow.Table; import org.apache.fop.fo.flow.TableBody; import org.apache.fop.fo.flow.TableRow; -import org.apache.fop.fo.properties.CommonBorderPaddingBackground; -import org.apache.fop.fo.properties.LengthRangeProperty; import org.apache.fop.layoutmgr.BreakElement; -import org.apache.fop.layoutmgr.ElementListObserver; import org.apache.fop.layoutmgr.ElementListUtils; import org.apache.fop.layoutmgr.KnuthBox; -import org.apache.fop.layoutmgr.KnuthElement; import org.apache.fop.layoutmgr.KnuthPenalty; import org.apache.fop.layoutmgr.KnuthPossPosIter; import org.apache.fop.layoutmgr.LayoutContext; import org.apache.fop.layoutmgr.ListElement; -import org.apache.fop.layoutmgr.MinOptMaxUtil; import org.apache.fop.layoutmgr.Position; import org.apache.fop.layoutmgr.PositionIterator; import org.apache.fop.layoutmgr.TraitSetter; import org.apache.fop.layoutmgr.SpaceResolver.SpaceHandlingBreakPosition; -import org.apache.fop.traits.MinOptMax; /** * Layout manager for table contents, particularly managing the creation of combined element lists. @@ -135,7 +128,9 @@ public class TableContentLayoutManager implements PercentBaseContext { /** @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int) */ public LinkedList getNextKnuthElements(LayoutContext context, int alignment) { - log.debug("==> Columns: " + getTableLM().getColumns()); + if (log.isDebugEnabled()) { + log.debug("==> Columns: " + getTableLM().getColumns()); + } KnuthBox headerAsFirst = null; KnuthBox headerAsSecondToLast = null; KnuthBox footerAsLast = null; @@ -248,7 +243,8 @@ public class TableContentLayoutManager implements PercentBaseContext { } } if (returnList.size() > 0) { - //Remove the last penalty produced by the combining algorithm (see TableStepper), for the last step + //Remove the last penalty produced by the combining algorithm (see TableStepper), + //for the last step ListElement last = (ListElement)returnList.getLast(); if (last.isPenalty() || last instanceof BreakElement) { if (!last.isForcedBreak()) { diff --git a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java index 945f9aa4b..639144b4c 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java @@ -286,7 +286,7 @@ public class TableStepper { for (Iterator iter = activeCells.iterator(); iter.hasNext();) { ActiveCell activeCell = (ActiveCell) iter.next(); int nextStep = activeCell.getNextStep(); - if (nextStep > 0) { + if (nextStep >= 0) { stepFound = true; minStep = Math.min(minStep, nextStep); } diff --git a/status.xml b/status.xml index 18eb6c61c..70efeccb9 100644 --- a/status.xml +++ b/status.xml @@ -28,6 +28,9 @@ + + Bugfix for NPE with empty table-row (regression from 0.93). + Added a configuration setting to the PCL renderer to disable PJL commands. diff --git a/test/layoutengine/standard-testcases/table_table-row_empty.xml b/test/layoutengine/standard-testcases/table_table-row_empty.xml new file mode 100644 index 000000000..76d8bf226 --- /dev/null +++ b/test/layoutengine/standard-testcases/table_table-row_empty.xml @@ -0,0 +1,69 @@ + + + + + +

+ This test checks an empty/minimal table body (caused an NPE in 0.94). +

+
+ + + + + + + + + + + + + + + + + Header + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + +
-- 2.39.5