jeremias    2005/01/26 07:00:45

  Modified:    src/java/org/apache/fop/layoutmgr FlowLayoutManager.java
  Log:
  Added a check for endless loops.
  
  Revision  Changes    Path
  1.10      +24 -8     
xml-fop/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
  
  Index: FlowLayoutManager.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- FlowLayoutManager.java    20 Oct 2004 21:07:02 -0000      1.9
  +++ FlowLayoutManager.java    26 Jan 2005 15:00:45 -0000      1.10
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 1999-2004 The Apache Software Foundation.
  + * Copyright 1999-2005 The Apache Software Foundation.
    * 
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
  @@ -23,7 +23,6 @@
   import org.apache.fop.area.Area;
   import org.apache.fop.area.BlockParent;
   
  -import java.util.ArrayList;
   import java.util.List;
   import org.apache.fop.traits.MinOptMax;
   
  @@ -34,10 +33,11 @@
    * and filling them with block-level areas generated by its children.
    */
   public class FlowLayoutManager extends BlockStackingLayoutManager {
  +    
       private Flow fobj;
       
       /** List of break possibilities */
  -    protected List blockBreaks = new ArrayList();
  +    protected List blockBreaks = new java.util.ArrayList();
   
       /** Array of areas currently being filled stored by area class */
       private BlockParent[] currentAreas = new BlockParent[Area.CLASS_MAX];
  @@ -45,8 +45,15 @@
       private int iStartPos = 0;
   
       /**
  +     * Used to count the number of subsequent times to layout child areas on
  +     * multiple pages.
  +     */
  +    private int numSubsequentOverflows = 0;
  +    
  +    /**
        * This is the top level layout manager.
        * It is created by the PageSequence FO.
  +     * @param node Flow object
        */
       public FlowLayoutManager(Flow node) {
           super(node);
  @@ -87,6 +94,10 @@
                       childLC.setStackLimit(MinOptMax.subtract(bpd, 
stackSize));
   
                       if (bp.isForcedBreak() || bp.nextBreakOverflows()) {
  +                        if (log.isDebugEnabled()) {
  +                            log.debug("BreakPoss signals " + 
(bp.isForcedBreak() 
  +                                    ? "forced break" : "next break 
overflows"));
  +                        }
                           breakPage = true;
                       }
                   }
  @@ -99,9 +110,16 @@
                   breakPage = true;
               }
               if (breakPage) {
  +                numSubsequentOverflows++;
  +                if (numSubsequentOverflows > 50) {
  +                    log.error("Content overflows available area. Giving up 
after 50 attempts.");
  +                    setFinished(true);
  +                    return null;
  +                }
                   return new BreakPoss(
                         new LeafPosition(this, blockBreaks.size() - 1));
               }
  +            numSubsequentOverflows = 0; //Reset emergency counter
           }
           setFinished(true);
           if (blockBreaks.size() > 0) {
  @@ -121,9 +139,8 @@
           while (parentIter.hasNext()) {
               LeafPosition lfp = (LeafPosition) parentIter.next();
               // Add the block areas to Area
  -            PositionIterator breakPosIter =
  -              new BreakPossPosIter(blockBreaks, iStartPos,
  -                                   lfp.getLeafPos() + 1);
  +            PositionIterator breakPosIter =  new BreakPossPosIter(
  +                    blockBreaks, iStartPos, lfp.getLeafPos() + 1);
               iStartPos = lfp.getLeafPos() + 1;
               while ((childLM = breakPosIter.getNextChildLM()) != null) {
                   childLM.addAreas(breakPosIter, lc);
  @@ -149,8 +166,7 @@
        */
       public Area getParentArea(Area childArea) {
           // Get an area from the Page
  -        BlockParent parentArea =
  -          (BlockParent) parentLM.getParentArea(childArea);
  +        BlockParent parentArea = 
(BlockParent)parentLM.getParentArea(childArea);
           this.currentAreas[parentArea.getAreaClass()] = parentArea;
           setCurrentArea(parentArea);
           return parentArea;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to