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");
+ }
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.