You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-dev@xmlgraphics.apache.org by "Dan Caprioara (Jira)" <ji...@apache.org> on 2019/12/11 08:03:00 UTC
[jira] [Created] (FOP-2892) Font substitutions not working: the
DefaultConfiguration.getChild() does not find elements as expected
Dan Caprioara created FOP-2892:
----------------------------------
Summary: Font substitutions not working: the DefaultConfiguration.getChild() does not find elements as expected
Key: FOP-2892
URL: https://issues.apache.org/jira/browse/FOP-2892
Project: FOP
Issue Type: Bug
Components: unqualified
Affects Versions: 2.4
Reporter: Dan Caprioara
Starting with FOP 2.4 the avalon framework is not used anymore.
Instead, a {{Configuration}} implementation has been added to the FOP: {{org.apache.fop.configuration.DefaultConfiguration}}
The problem is that the {{getChild(String)}} method uses {{getElementsByTagName}} that returns all matching elements in document order, at any level. The old avalon implementation iterated only through the direct children. This creates some bugs.
Consider the following configuration:
{code:xml}
<fop version="1.0">
<!--
....
--->
<renderers>
<renderer mime="application/pdf">
<fonts>
<auto-detect/>
</fonts>
</renderer>
</renderers>
<!-- A substitution can map a font family to another. -->
<fonts>
<substitutions>
<substitution>
<from font-family='courierNew' font-style='normal' font-weight='400'/> <to font-family='Courier New'/>
</substitution>
</substitutions>
</fonts>
</fop>
{code}
The code from the {{FontManagerConfigurator}}
{code}
DefaultConfiguration fontsCfg = (DefaultConfiguration)cfg.getChild("fonts", false);
{code}
now gets the first {{fonts}} element, the one containing the autodetect, instead of getting the direct {{fonts}} element, the one containing the substitutions.
The patch that solves this is:
{code}
Index: DefaultConfiguration.java
===================================================================
--- DefaultConfiguration.java (revision 195722)
+++ DefaultConfiguration.java (working copy)
@@ -108,7 +108,7 @@
@Override
public Configuration getChild(String key) {
- NodeList nl = element.getElementsByTagName(key);
+ NodeList nl = element.getChildNodes();
for (int i = 0; i < nl.getLength(); ++i) {
Node n = nl.item(i);
if (n.getNodeName().equals(key)) {
@@ -133,13 +133,17 @@
@Override
public Configuration[] getChildren(String key) {
- NodeList nl = element.getElementsByTagName(key);
- Configuration[] result = new Configuration[nl.getLength()];
+ ArrayList<Configuration> result = new ArrayList<>(1);
+
+ NodeList nl = element.getChildNodes();
for (int i = 0; i < nl.getLength(); ++i) {
Node n = nl.item(i);
- result[i] = new DefaultConfiguration((Element) n);
+ if (n.getNodeName().equals(key)) {
+ result.add(new DefaultConfiguration((Element) n));
+ }
}
- return result;
+
+ return result.toArray(new Configuration[0]);
}
@Override
{code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)