]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Bugfix for NPE with empty table-row (regression from 0.93).
authorJeremias Maerki <jeremias@apache.org>
Mon, 15 Oct 2007 07:23:37 +0000 (07:23 +0000)
committerJeremias Maerki <jeremias@apache.org>
Mon, 15 Oct 2007 07:23:37 +0000 (07:23 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@584699 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/layoutmgr/table/ActiveCell.java
src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
src/java/org/apache/fop/layoutmgr/table/TableStepper.java
status.xml
test/layoutengine/standard-testcases/table_table-row_empty.xml [new file with mode: 0644]

index 727566a1a1778b937cf6445665e6885f0e4534ad..a06856d04ad3a16ed83613ed0587635b0fd47b9d 100644 (file)
@@ -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;
         }
     }
 
index 5b0064899dc5ffdb59e35fb164ccb922c6861ab6..a5ca6cbe283c8da50632b08b25b5b5970df98226 100644 (file)
@@ -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()) {
index 945f9aa4b45fb1128141e498e0483d6883d1cfd4..639144b4c3cfe89376ac4228a2e71932a747b8bb 100644 (file)
@@ -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);
             }
index 18eb6c61c6cf06b70730270bee561b553c023639..70efeccb9275e054f7dad32574310e962bd0004e 100644 (file)
@@ -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 (file)
index 0000000..76d8bf2
--- /dev/null
@@ -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>