]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-2714: Infinite loop when region name not found
authorSimon Steiner <ssteiner@apache.org>
Tue, 20 Jun 2017 07:45:25 +0000 (07:45 +0000)
committerSimon Steiner <ssteiner@apache.org>
Tue, 20 Jun 2017 07:45:25 +0000 (07:45 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1799312 13f79535-47bb-0310-9956-ffa450edef68

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

index 164c1cee57b196bac4965871d171cbc659d2702e..210f25e1f21ea014ecf3985488fdbcbdbd6c1d4b 100644 (file)
@@ -141,7 +141,7 @@ public class RegionBody extends Region {
     }
 
     /** {@inheritDoc} */
-    protected String getDefaultRegionName() {
+    public String getDefaultRegionName() {
         return "xsl-region-body";
     }
 
index cfcaabb33e0161430ec45eacf19bcd385d76213a..6b993424cb794052ef00f41881f1992e4e8da16d 100644 (file)
@@ -34,6 +34,8 @@ import org.apache.fop.complexscripts.bidi.BidiResolver;
 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 extends AbstractPageSequenceLayoutManager
         // 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) {
index e810f80c5a492fb7c21fd7c5c27f764b43cf2b5d..e6a0975a80fabff22ead362357b6a99051bfe373 100644 (file)
@@ -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 PageSequenceLayoutManagerTestCase {
         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 PageSequenceLayoutManagerTestCase {
 
         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");
+    }
 }