diff options
author | Jeremias Maerki <jeremias@apache.org> | 2007-10-15 07:23:37 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2007-10-15 07:23:37 +0000 |
commit | 23ef1de68377de80f99e9930ec80e9ad7ff64cdd (patch) | |
tree | 7196e55144763b545ece40693d4ecc961557f81f | |
parent | 9c90d82a757b3ed323455c5604bc2a7d24866b0c (diff) | |
download | xmlgraphics-fop-23ef1de68377de80f99e9930ec80e9ad7ff64cdd.tar.gz xmlgraphics-fop-23ef1de68377de80f99e9930ec80e9ad7ff64cdd.zip |
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
5 files changed, 90 insertions, 17 deletions
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 @@ <changes> <release version="FOP Trunk"> + <action context="Code" dev="JM" type="fix"> + Bugfix for NPE with empty table-row (regression from 0.93). + </action> <action context="Code" dev="JM" type="add"> Added a configuration setting to the PCL renderer to disable PJL commands. </action> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks an empty/minimal table body (caused an NPE in 0.94). + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="5in"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:table table-layout="fixed"> + <fo:table-column column-width="proportional-column-width(1)"/> + <fo:table-column column-width="proportional-column-width(1)"/> + <fo:table-header> + <fo:table-row> + <fo:table-cell> + <fo:block> + <fo:inline>Header</fo:inline> + </fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-header> + <fo:table-body> + <fo:table-row> + <fo:table-cell id="cell1"> + <fo:block/> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <eval expected="1" xpath="count(//pageViewport)"/> + <element-list category="table-cell" id="cell1"> + <box w="0" aux="true"/> + </element-list> + <element-list category="breaker"> + <box w="0"/> <!--table body --> + <box w="14400"/> <!-- table header --> + <skip>3</skip> + </element-list> + </checks> +</testcase> |