Browse Source

FOP-2714: Infinite loop when region name not found

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1799312 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-2_3
Simon Steiner 6 years ago
parent
commit
ac0ddecca6

+ 1
- 1
fop-core/src/main/java/org/apache/fop/fo/pagination/RegionBody.java View File

@@ -141,7 +141,7 @@ public class RegionBody extends Region {
}

/** {@inheritDoc} */
protected String getDefaultRegionName() {
public String getDefaultRegionName() {
return "xsl-region-body";
}


+ 16
- 3
fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java View 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) {

+ 33
- 1
fop-core/src/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java View 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");
}
}

Loading…
Cancel
Save