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