From: Simon Steiner Date: Thu, 6 Apr 2023 11:54:38 +0000 (+0100) Subject: FOP-3090: Allow use of page position only on redo of layout X-Git-Tag: 2_9~20 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=95ddfc80503820b6cd5d07121595f6419cfbe221;p=xmlgraphics-fop.git FOP-3090: Allow use of page position only on redo of layout --- diff --git a/fop-core/src/main/java/org/apache/fop/apps/FOUserAgent.java b/fop-core/src/main/java/org/apache/fop/apps/FOUserAgent.java index 3ab871dfc..02b0128cd 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FOUserAgent.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FOUserAgent.java @@ -839,4 +839,8 @@ public class FOUserAgent { public boolean isSimpleLineBreaking() { return factory.isSimpleLineBreaking(); } + + public boolean isSkipPagePositionOnlyAllowed() { + return factory.isSkipPagePositionOnlyAllowed(); + } } diff --git a/fop-core/src/main/java/org/apache/fop/apps/FopConfParser.java b/fop-core/src/main/java/org/apache/fop/apps/FopConfParser.java index 7e41de624..3bece2002 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FopConfParser.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FopConfParser.java @@ -58,6 +58,7 @@ public class FopConfParser { private static final String PREFER_RENDERER = "prefer-renderer"; private static final String TABLE_BORDER_OVERPAINT = "table-border-overpaint"; private static final String SIMPLE_LINE_BREAKING = "simple-line-breaking"; + private static final String SKIP_PAGE_POSITION_ONLY_ALLOWED = "skip-page-position-only-allowed"; private final Log log = LogFactory.getLog(FopConfParser.class); @@ -290,6 +291,15 @@ public class FopConfParser { } } + if (cfg.getChild(SKIP_PAGE_POSITION_ONLY_ALLOWED, false) != null) { + try { + fopFactoryBuilder.setSkipPagePositionOnlyAllowed( + cfg.getChild(SKIP_PAGE_POSITION_ONLY_ALLOWED).getValueAsBoolean()); + } catch (ConfigurationException e) { + LogUtil.handleException(log, e, false); + } + } + // configure font manager new FontManagerConfigurator(cfg, baseURI, fopFactoryBuilder.getBaseURI(), resourceResolver) .configure(fopFactoryBuilder.getFontManager(), strict); diff --git a/fop-core/src/main/java/org/apache/fop/apps/FopFactory.java b/fop-core/src/main/java/org/apache/fop/apps/FopFactory.java index 8bcbf01fd..0c57d2643 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FopFactory.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FopFactory.java @@ -223,6 +223,10 @@ public final class FopFactory implements ImageContext { return config.isSimpleLineBreaking(); } + boolean isSkipPagePositionOnlyAllowed() { + return config.isSkipPagePositionOnlyAllowed(); + } + /** * Returns a new {@link Fop} instance. FOP will be configured with a default user agent * instance. Use this factory method if your output type requires an output stream. diff --git a/fop-core/src/main/java/org/apache/fop/apps/FopFactoryBuilder.java b/fop-core/src/main/java/org/apache/fop/apps/FopFactoryBuilder.java index 848454e7f..afbcb227e 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FopFactoryBuilder.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FopFactoryBuilder.java @@ -350,6 +350,11 @@ public final class FopFactoryBuilder { return this; } + public FopFactoryBuilder setSkipPagePositionOnlyAllowed(boolean b) { + fopFactoryConfigBuilder.setSkipPagePositionOnlyAllowed(b); + return this; + } + public static class FopFactoryConfigImpl implements FopFactoryConfig { private final EnvironmentProfile enviro; @@ -394,6 +399,8 @@ public final class FopFactoryBuilder { private boolean tableBorderOverpaint; private boolean simpleLineBreaking; + private boolean skipPagePositionOnlyAllowed = true; + private static final class ImageContextImpl implements ImageContext { private final FopFactoryConfig config; @@ -518,6 +525,10 @@ public final class FopFactoryBuilder { return simpleLineBreaking; } + public boolean isSkipPagePositionOnlyAllowed() { + return skipPagePositionOnlyAllowed; + } + public Map getHyphenationPatternNames() { return hyphPatNames; } @@ -567,6 +578,8 @@ public final class FopFactoryBuilder { void setTableBorderOverpaint(boolean b); void setSimpleLineBreaking(boolean b); + + void setSkipPagePositionOnlyAllowed(boolean b); } private static final class CompletedFopFactoryConfigBuilder implements FopFactoryConfigBuilder { @@ -658,6 +671,10 @@ public final class FopFactoryBuilder { public void setSimpleLineBreaking(boolean b) { throwIllegalStateException(); } + + public void setSkipPagePositionOnlyAllowed(boolean b) { + throwIllegalStateException(); + } } private static final class ActiveFopFactoryConfigBuilder implements FopFactoryConfigBuilder { @@ -750,6 +767,10 @@ public final class FopFactoryBuilder { public void setSimpleLineBreaking(boolean b) { config.simpleLineBreaking = b; } + + public void setSkipPagePositionOnlyAllowed(boolean b) { + config.skipPagePositionOnlyAllowed = b; + } } } diff --git a/fop-core/src/main/java/org/apache/fop/apps/FopFactoryConfig.java b/fop-core/src/main/java/org/apache/fop/apps/FopFactoryConfig.java index c9495afb8..55cf7143e 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FopFactoryConfig.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FopFactoryConfig.java @@ -167,6 +167,8 @@ public interface FopFactoryConfig { boolean isSimpleLineBreaking(); + boolean isSkipPagePositionOnlyAllowed(); + /** @return the hyphenation pattern names */ Map getHyphenationPatternNames(); diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java index 7926ba756..378280694 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java @@ -24,6 +24,7 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.fop.apps.FOUserAgent; import org.apache.fop.area.AreaTreeHandler; import org.apache.fop.area.BodyRegion; import org.apache.fop.area.PageViewport; @@ -78,6 +79,7 @@ public class PageProvider implements Constants { private PageSequence pageSeq; protected boolean skipPagePositionOnly; + protected FOUserAgent foUserAgent; /** * Main constructor. @@ -88,6 +90,7 @@ public class PageProvider implements Constants { this.areaTreeHandler = ath; this.pageSeq = ps; this.startPageOfPageSequence = ps.getStartingPageNumber(); + foUserAgent = ath.getUserAgent(); } public void initialize() { @@ -358,11 +361,12 @@ public class PageProvider implements Constants { private Page cacheNextPage(int index, boolean isBlank, boolean isLastPage, boolean spanAll) { String pageNumberString = pageSeq.makeFormattedPageNumber(index); boolean isFirstPage = (startPageOfPageSequence == index); + boolean skipPagePositionOnlyCheck = skipPagePositionOnly && foUserAgent.isSkipPagePositionOnlyAllowed(); SimplePageMaster spm = pageSeq.getNextSimplePageMaster( - index, isFirstPage, isLastPage, isBlank, skipPagePositionOnly); + index, isFirstPage, isLastPage, isBlank, skipPagePositionOnlyCheck); boolean isPagePositionOnly = pageSeq.hasPagePositionOnly() && !skipPagePositionOnly; if (isPagePositionOnly) { - spm = pageSeq.getNextSimplePageMaster(index, isFirstPage, true, isBlank, skipPagePositionOnly); + spm = pageSeq.getNextSimplePageMaster(index, isFirstPage, true, isBlank, false); } Page page = new Page(spm, index, pageNumberString, isBlank, spanAll, isPagePositionOnly); //Set unique key obtained from the AreaTreeHandler diff --git a/fop-core/src/test/java/org/apache/fop/apps/MutableConfig.java b/fop-core/src/test/java/org/apache/fop/apps/MutableConfig.java index 6f1a18752..27ff94f7c 100644 --- a/fop-core/src/test/java/org/apache/fop/apps/MutableConfig.java +++ b/fop-core/src/test/java/org/apache/fop/apps/MutableConfig.java @@ -141,6 +141,10 @@ public final class MutableConfig implements FopFactoryConfig { return delegate.isSimpleLineBreaking(); } + public boolean isSkipPagePositionOnlyAllowed() { + return delegate.isSkipPagePositionOnlyAllowed(); + } + public Map getHyphenationPatternNames() { return delegate.getHyphenationPatternNames(); } diff --git a/fop-core/src/test/java/org/apache/fop/intermediate/TestAssistant.java b/fop-core/src/test/java/org/apache/fop/intermediate/TestAssistant.java index 7048a9fd9..daf4b50dc 100644 --- a/fop-core/src/test/java/org/apache/fop/intermediate/TestAssistant.java +++ b/fop-core/src/test/java/org/apache/fop/intermediate/TestAssistant.java @@ -125,6 +125,7 @@ public class TestAssistant { builder.getFontManager().setBase14KerningEnabled(isBase14KerningEnabled(testDoc)); builder.setTableBorderOverpaint(isTableBorderOverpaint(testDoc)); builder.setSimpleLineBreaking(isSimpleLineBreaking(testDoc)); + builder.setSkipPagePositionOnlyAllowed(isSkipPagePositionOnlyAllowed(testDoc)); return builder.build(); } @@ -169,6 +170,15 @@ public class TestAssistant { } } + private boolean isSkipPagePositionOnlyAllowed(Document testDoc) { + try { + String s = eval(testDoc, "/testcase/cfg/skip-page-position-only-allowed"); + return !"false".equalsIgnoreCase(s); + } catch (XPathExpressionException e) { + throw new RuntimeException("Error while evaluating XPath expression", e); + } + } + /** * Loads a test case into a DOM document. * @param testFile the test file diff --git a/fop/test/layoutengine/standard-testcases/page-position_only_4.xml b/fop/test/layoutengine/standard-testcases/page-position_only_4.xml new file mode 100644 index 000000000..9dd3aeee0 --- /dev/null +++ b/fop/test/layoutengine/standard-testcases/page-position_only_4.xml @@ -0,0 +1,105 @@ + + + + + +

+ This test checks for the use of an 'only' conditional-page-master-reference (XSL 1.1) +

+
+ + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mr Markus Sample + 39 XXX Street + MELBOURNE VIC 3000 + + + + + 18 November 2022 + + + + + Policy Type: Life Insurance + Policy Number: 55553420 + Hi Markus, + Help keep your life on track + Mrs Vanessa Sample recently set up an XXXX Life Insurance policy and listed you as a life insured. To help us set up the policy some of your personal information was provided. + We have enclosed this information. A copy of the policy documentation has been sent to Mrs Vanessa Sample, as the Policy Owner, but to protect your privacy we have not shared any of your sensitive information. + We value your privacy + The ways in which your personal information is collected, used, secured and disclosed, are set out in the respective privacy policies of XXXX (as the product distributor) and xxx (as the product issuer). You can either view these online at xxxx.com.au/lifeprivacy and xxx.com.au/privacy or call 1300 209 088 to request a printed copy free of charge. + What you need to do + It’s important that you read the enclosed documents and ensure your details are correct otherwise it could result in us refusing a claim or cancelling the policy. + Our commitment to you + The insurer of xxxx Life Insurance is committed to the Life Insurance Code of Practice, further ensuring that you will continue to receive the highest possible quality service. Read more at xxxx.com.au/contact/code-of-practice. + We're here to help + If you have any questions or need to update your details please call us on + 1300 420 233. + + Take care, + The Life Insurance Team + + + + + + + + + + + +