Author: ssteiner
Date: Tue Jun 20 07:45:25 2017
New Revision: 1799312

URL: http://svn.apache.org/viewvc?rev=1799312&view=rev
Log:
FOP-2714: Infinite loop when region name not found

Modified:
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/RegionBody.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
    
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/RegionBody.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/RegionBody.java?rev=1799312&r1=1799311&r2=1799312&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/RegionBody.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/RegionBody.java
 Tue Jun 20 07:45:25 2017
@@ -141,7 +141,7 @@ public class RegionBody extends Region {
     }
 
     /** {@inheritDoc} */
-    protected String getDefaultRegionName() {
+    public String getDefaultRegionName() {
         return "xsl-region-body";
     }
 

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java?rev=1799312&r1=1799311&r2=1799312&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
 Tue Jun 20 07:45:25 2017
@@ -34,6 +34,8 @@ import org.apache.fop.complexscripts.bid
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.pagination.PageSequence;
 import org.apache.fop.fo.pagination.PageSequenceMaster;
+import org.apache.fop.fo.pagination.Region;
+import org.apache.fop.fo.pagination.RegionBody;
 import org.apache.fop.fo.pagination.SideRegion;
 import org.apache.fop.fo.pagination.StaticContent;
 import org.apache.fop.layoutmgr.inline.ContentLayoutManager;
@@ -189,16 +191,27 @@ public class PageSequenceLayoutManager e
         // cannot layout areas from the main flow.  Blank pages can be created 
from empty pages.
 
         if (!isBlank) {
-            while (!getPageSequence().getMainFlow().getFlowName()
-                    .equals(newPage.getSimplePageMaster()
-                            .getRegion(FO_REGION_BODY).getRegionName())) {
+            int i = 0;
+            while (!flowNameEquals(newPage, i > 0)) {
                 newPage = super.makeNewPage(isBlank);
+                i++;
             }
         }
 
         return newPage;
     }
 
+    private boolean flowNameEquals(Page newPage, boolean strict) {
+        String psName = getPageSequence().getMainFlow().getFlowName();
+        Region body = newPage.getSimplePageMaster().getRegion(FO_REGION_BODY);
+        String name = body.getRegionName();
+        if (strict && !name.equals(psName) && 
!name.equals(((RegionBody)body).getDefaultRegionName())) {
+            throw new RuntimeException(
+                    "The flow-name \"" + name + "\" could not be mapped to a 
region-name in the layout-master-set");
+        }
+        return psName.equals(name);
+    }
+
     private void layoutSideRegion(int regionID) {
         SideRegion reg = 
(SideRegion)curPage.getSimplePageMaster().getRegion(regionID);
         if (reg == null) {

Modified: 
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java?rev=1799312&r1=1799311&r2=1799312&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java
 Tue Jun 20 07:45:25 2017
@@ -31,6 +31,7 @@ import org.apache.fop.area.PageViewport;
 import org.apache.fop.fo.pagination.Flow;
 import org.apache.fop.fo.pagination.PageSequence;
 import org.apache.fop.fo.pagination.Region;
+import org.apache.fop.fo.pagination.RegionBody;
 import org.apache.fop.fo.pagination.Root;
 import org.apache.fop.fo.pagination.SimplePageMaster;
 
@@ -106,7 +107,7 @@ public class PageSequenceLayoutManagerTe
         final Page page = mock(Page.class);
         final SimplePageMaster spm = mock(SimplePageMaster.class);
         final PageViewport pageViewport = mock(PageViewport.class);
-        final Region region = mock(Region.class);
+        final Region region = mock(RegionBody.class);
 
         when(page.getSimplePageMaster()).thenReturn(spm);
         when(page.getPageViewport()).thenReturn(pageViewport);
@@ -116,4 +117,35 @@ public class PageSequenceLayoutManagerTe
 
         return page;
     }
+
+    @Test
+    public void testRegionNameNotFound() {
+        final PageSequence pseq = mock(PageSequence.class);
+        final AreaTreeHandler ath = mock(AreaTreeHandler.class);
+        final Flow flow = mock(Flow.class);
+        final Root root = mock(Root.class);
+
+        when(flow.getFlowName()).thenReturn(MAIN_FLOW_NAME);
+        when(pseq.getRoot()).thenReturn(root);
+        when(pseq.getMainFlow()).thenReturn(flow);
+
+        PageSequenceLayoutManager pageSequenceLayoutManager = new 
PageSequenceLayoutManager(ath, pseq) {
+            public void activateLayout() {
+                makeNewPage(false);
+            }
+            protected Page createPage(int pageNumber, boolean isBlank) {
+                return createPageForRegionName("test");
+            }
+            protected void finishPage() {
+            }
+        };
+        RuntimeException re = null;
+        try {
+            pageSequenceLayoutManager.activateLayout();
+        } catch (RuntimeException e) {
+            re = e;
+        }
+        assertEquals(re.getMessage(),
+                "The flow-name \"test\" could not be mapped to a region-name 
in the layout-master-set");
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscr...@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-h...@xmlgraphics.apache.org

Reply via email to