aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremias Maerki <jeremias@apache.org>2007-10-15 07:23:37 +0000
committerJeremias Maerki <jeremias@apache.org>2007-10-15 07:23:37 +0000
commit23ef1de68377de80f99e9930ec80e9ad7ff64cdd (patch)
tree7196e55144763b545ece40693d4ecc961557f81f
parent9c90d82a757b3ed323455c5604bc2a7d24866b0c (diff)
downloadxmlgraphics-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
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/ActiveCell.java19
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java14
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/TableStepper.java2
-rw-r--r--status.xml3
-rw-r--r--test/layoutengine/standard-testcases/table_table-row_empty.xml69
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>