Skip to content

Commit ef2697e

Browse files
committed
feat: update Saxon library to v11.4
This commit updates the Saxon-HE dependency to version 11.4. It refactors the Saxon-related code as follows: - update the function+registration code to the latest API changes - extract the Saxon schema reader factory (used by Jing) in its own class - the Saxon schema reader factory is made available to Jing via the SPI mechanism (declared in `META-INF/services/com.thaiopensource.validate.SchemaReaderFactory`). This notably allows Jing to find and use our factory for both Schematron and NVDL. - the Saxon schema reader factory no longer extends Jing's `NewSaxonSchemaReaderFactory`, which set the feature "XSLT_VERSION" to "2.0" and caused a Warning to be issued by Saxon 11. Fix #1341
1 parent 3d25330 commit ef2697e

File tree

8 files changed

+91
-104
lines changed

8 files changed

+91
-104
lines changed

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@
178178
<dependency>
179179
<groupId>net.sf.saxon</groupId>
180180
<artifactId>Saxon-HE</artifactId>
181-
<version>9.8.0-8</version>
181+
<version>11.4</version>
182182
</dependency>
183183
<dependency>
184184
<groupId>nu.validator</groupId>
@@ -368,7 +368,7 @@
368368
<configuration>
369369
<instructions>
370370
<Import-Package>
371-
net.sf.saxon.*;version="[9.8.0,9.8.1)",
371+
net.sf.saxon.*;version="[11.4.0,11.4.1)",
372372
*
373373
</Import-Package>
374374
<Automatic-Module-Name>org.w3c.epubcheck</Automatic-Module-Name>
@@ -444,7 +444,7 @@
444444
<dependency>
445445
<groupId>net.sf.saxon</groupId>
446446
<artifactId>Saxon-HE</artifactId>
447-
<version>9.4</version>
447+
<version>11.4</version>
448448
</dependency>
449449
</dependencies>
450450
</plugin>

src/main/java/com/adobe/epubcheck/xml/XMLValidator.java

Lines changed: 26 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@
2828
import java.net.URISyntaxException;
2929
import java.net.URL;
3030

31-
import javax.xml.transform.TransformerFactory;
32-
33-
import org.idpf.epubcheck.util.saxon.ColumnNumberFunction;
34-
import org.idpf.epubcheck.util.saxon.LineNumberFunction;
35-
import org.idpf.epubcheck.util.saxon.SystemIdFunction;
3631
import org.xml.sax.ErrorHandler;
3732
import org.xml.sax.InputSource;
3833
import org.xml.sax.SAXException;
@@ -48,16 +43,7 @@
4843
import com.thaiopensource.validate.SchemaReader;
4944
import com.thaiopensource.validate.ValidateProperty;
5045
import com.thaiopensource.validate.auto.AutoSchemaReader;
51-
import com.thaiopensource.validate.auto.SchemaReaderFactorySchemaReceiverFactory;
5246
import com.thaiopensource.validate.rng.CompactSchemaReader;
53-
import com.thaiopensource.validate.schematron.NewSaxonSchemaReaderFactory;
54-
55-
import net.sf.saxon.Configuration;
56-
import net.sf.saxon.TransformerFactoryImpl;
57-
import net.sf.saxon.sxpath.IndependentContext;
58-
import net.sf.saxon.sxpath.XPathStaticContext;
59-
import net.sf.saxon.trans.SymbolicName;
60-
6147

6248
public class XMLValidator
6349
{
@@ -84,19 +70,19 @@ public static BasicResolver getInstance()
8470
return theInstance;
8571
}
8672

87-
public void resolve(Identifier id, Input input) throws
88-
IOException,
89-
ResolverException
73+
public void resolve(Identifier id, Input input)
74+
throws IOException,
75+
ResolverException
9076
{
9177
if (!input.isResolved())
9278
{
9379
input.setUri(resolveUri(id));
9480
}
9581
}
9682

97-
public void open(Input input) throws
98-
IOException,
99-
ResolverException
83+
public void open(Input input)
84+
throws IOException,
85+
ResolverException
10086
{
10187
if (!input.isUriDefinitive())
10288
{
@@ -106,8 +92,7 @@ public void open(Input input) throws
10692
try
10793
{
10894
uri = new URI(input.getUri());
109-
}
110-
catch (URISyntaxException e)
95+
} catch (URISyntaxException e)
11196
{
11297
throw new ResolverException(e);
11398
}
@@ -122,8 +107,8 @@ public void open(Input input) throws
122107
input.setByteStream(url.openStream());
123108
}
124109

125-
public static String resolveUri(Identifier id) throws
126-
ResolverException
110+
public static String resolveUri(Identifier id)
111+
throws ResolverException
127112
{
128113
try
129114
{
@@ -153,74 +138,40 @@ public static String resolveUri(Identifier id) throws
153138
}
154139

155140
return uriRef;
156-
}
157-
catch (URISyntaxException e)
141+
} catch (URISyntaxException e)
158142
{
159143
throw new ResolverException(e);
160-
}
161-
catch (MalformedURLException e)
144+
} catch (MalformedURLException e)
162145
{
163146
throw new ResolverException(e);
164147
}
165148
}
166149
}
167150

168-
/**
169-
* Extends Jing's Saxon 9 schema reader factory by registering
170-
* extension functions.
171-
*/
172-
static public class ExtendedSaxonSchemaReaderFactory extends NewSaxonSchemaReaderFactory
173-
{
174-
public void initTransformerFactory(TransformerFactory factory)
175-
{
176-
super.initTransformerFactory(factory);
177-
SymbolicName.F lineNumberFn = new SymbolicName.F(LineNumberFunction.QNAME, 0);
178-
SymbolicName.F columnNumberFn = new SymbolicName.F(ColumnNumberFunction.QNAME, 0);
179-
SymbolicName.F systemIdFn = new SymbolicName.F(SystemIdFunction.QNAME, 0);
180-
if (factory instanceof TransformerFactoryImpl)
181-
{
182-
Configuration configuration = ((TransformerFactoryImpl) factory).getConfiguration();
183-
XPathStaticContext xpathContext = new IndependentContext(configuration);
184-
if (!xpathContext.getFunctionLibrary().isAvailable(lineNumberFn))
185-
{
186-
configuration.registerExtensionFunction(new LineNumberFunction());
187-
}
188-
if (!xpathContext.getFunctionLibrary().isAvailable(columnNumberFn))
189-
{
190-
configuration.registerExtensionFunction(new ColumnNumberFunction());
191-
}
192-
if (!xpathContext.getFunctionLibrary().isAvailable(systemIdFn))
193-
{
194-
configuration.registerExtensionFunction(new SystemIdFunction());
195-
}
196-
}
197-
}
198-
}
199-
200151
// handles errors in schemas
201152
private class ErrorHandlerImpl implements ErrorHandler
202153
{
203154

204-
public void error(SAXParseException exception) throws
205-
SAXException
155+
public void error(SAXParseException exception)
156+
throws SAXException
206157
{
207158
exception.printStackTrace();
208159
}
209160

210-
public void fatalError(SAXParseException exception) throws
211-
SAXException
161+
public void fatalError(SAXParseException exception)
162+
throws SAXException
212163
{
213164
exception.printStackTrace();
214165
}
215166

216-
public void warning(SAXParseException exception) throws
217-
SAXException
167+
public void warning(SAXParseException exception)
168+
throws SAXException
218169
{
219170
exception.printStackTrace();
220171
}
221172

222173
}
223-
174+
224175
public XMLValidator(String schemaName, boolean isNormative)
225176
{
226177
this.isNormative = isNormative;
@@ -245,36 +196,31 @@ public XMLValidator(String schemaName, boolean isNormative)
245196
if (schemaName.endsWith(".rnc"))
246197
{
247198
schemaReader = CompactSchemaReader.getInstance();
248-
} else if (schemaName.endsWith(".sch")) {
249-
schemaReader = new AutoSchemaReader(
250-
new SchemaReaderFactorySchemaReceiverFactory(
251-
new ExtendedSaxonSchemaReaderFactory()));
252199
}
253200
else
254201
{
255-
256202
schemaReader = new AutoSchemaReader();
257203
}
258204

259205
schema = schemaReader.createSchema(schemaSource,
260206
mapBuilder.toPropertyMap());
261-
}
262-
catch (RuntimeException e)
207+
} catch (RuntimeException e)
263208
{
264209
throw e;
265-
}
266-
catch (Exception e)
210+
} catch (Exception e)
267211
{
268212
e.printStackTrace();
269213
throw new Error("Internal error: " + e + " " + schemaName);
270214
}
271215
}
272-
273-
public Schema getSchema() {
216+
217+
public Schema getSchema()
218+
{
274219
return schema;
275220
}
276-
277-
public boolean isNormative() {
221+
222+
public boolean isNormative()
223+
{
278224
return isNormative;
279225
}
280226
}

src/main/java/org/idpf/epubcheck/util/saxon/ColumnNumberFunction.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
public class ColumnNumberFunction extends ExtensionFunctionDefinition
1414
{
1515

16-
private static final long serialVersionUID = -4202710868367933385L;
17-
1816
public static StructuredQName QNAME = new StructuredQName("saxon", "http://saxon.sf.net/", "column-number");
1917

2018
@Override
@@ -64,9 +62,7 @@ public ExtensionFunctionCall makeCallExpression()
6462
{
6563
return new ExtensionFunctionCall()
6664
{
67-
private static final long serialVersionUID = -4202710868367933385L;
68-
69-
public Sequence call(XPathContext context, @SuppressWarnings("rawtypes") Sequence[] arguments) throws XPathException
65+
public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException
7066
{
7167
if (context.getContextItem() instanceof NodeInfo)
7268
{

src/main/java/org/idpf/epubcheck/util/saxon/Int64ValueSequence.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import net.sf.saxon.om.Item;
44
import net.sf.saxon.om.Sequence;
55
import net.sf.saxon.om.SequenceIterator;
6-
import net.sf.saxon.trans.XPathException;
76
import net.sf.saxon.value.Int64Value;
87

98
class Int64ValueSequence implements Sequence
@@ -21,8 +20,7 @@ public Item head()
2120
}
2221

2322
@Override
24-
public SequenceIterator iterate() throws
25-
XPathException
23+
public SequenceIterator iterate()
2624
{
2725
return item.iterate();
2826
}

src/main/java/org/idpf/epubcheck/util/saxon/LineNumberFunction.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
public class LineNumberFunction extends ExtensionFunctionDefinition
1414
{
1515

16-
private static final long serialVersionUID = -4202710868367933385L;
17-
1816
public static StructuredQName QNAME = new StructuredQName("saxon", "http://saxon.sf.net/", "line-number");
1917

2018
@Override
@@ -65,9 +63,7 @@ public ExtensionFunctionCall makeCallExpression()
6563
return new ExtensionFunctionCall()
6664
{
6765

68-
private static final long serialVersionUID = -4202710868367933385L;
69-
70-
public Sequence call(XPathContext context, @SuppressWarnings("rawtypes") Sequence[] arguments) throws XPathException
66+
public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException
7167
{
7268
if (context.getContextItem() instanceof NodeInfo)
7369
{
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.idpf.epubcheck.util.saxon;
2+
3+
import javax.xml.transform.TransformerFactory;
4+
5+
import com.thaiopensource.validate.schematron.SchematronSchemaReaderFactory;
6+
7+
import net.sf.saxon.Configuration;
8+
import net.sf.saxon.TransformerFactoryImpl;
9+
import net.sf.saxon.lib.ErrorReporter;
10+
import net.sf.saxon.lib.FeatureKeys;
11+
import net.sf.saxon.s9api.XmlProcessingError;
12+
import net.sf.saxon.sxpath.IndependentContext;
13+
import net.sf.saxon.sxpath.XPathStaticContext;
14+
import net.sf.saxon.trans.SymbolicName;
15+
16+
public class SaxonSchemaReaderFactory extends SchematronSchemaReaderFactory
17+
{
18+
public void initTransformerFactory(TransformerFactory factory)
19+
{
20+
super.initTransformerFactory(factory);
21+
factory.setAttribute(FeatureKeys.LINE_NUMBERING, Boolean.TRUE);
22+
SymbolicName.F lineNumberFn = new SymbolicName.F(LineNumberFunction.QNAME, 0);
23+
SymbolicName.F columnNumberFn = new SymbolicName.F(ColumnNumberFunction.QNAME, 0);
24+
SymbolicName.F systemIdFn = new SymbolicName.F(SystemIdFunction.QNAME, 0);
25+
if (factory instanceof TransformerFactoryImpl)
26+
{
27+
Configuration configuration = ((TransformerFactoryImpl) factory).getConfiguration();
28+
configuration.setErrorReporterFactory(config -> {
29+
return new ErrorReporter()
30+
{
31+
32+
@Override
33+
public void report(XmlProcessingError error)
34+
{
35+
System.out.println(error.getMessage());
36+
37+
}
38+
};
39+
});
40+
XPathStaticContext xpathContext = new IndependentContext(configuration);
41+
if (!xpathContext.getFunctionLibrary().isAvailable(lineNumberFn, 20))
42+
{
43+
configuration.registerExtensionFunction(new LineNumberFunction());
44+
}
45+
if (!xpathContext.getFunctionLibrary().isAvailable(columnNumberFn, 20))
46+
{
47+
configuration.registerExtensionFunction(new ColumnNumberFunction());
48+
}
49+
if (!xpathContext.getFunctionLibrary().isAvailable(systemIdFn, 20))
50+
{
51+
configuration.registerExtensionFunction(new SystemIdFunction());
52+
}
53+
}
54+
}
55+
}

src/main/java/org/idpf/epubcheck/util/saxon/SystemIdFunction.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import net.sf.saxon.lib.ExtensionFunctionDefinition;
66
import net.sf.saxon.om.Item;
77
import net.sf.saxon.om.NodeInfo;
8-
import net.sf.saxon.om.SequenceIterator;
98
import net.sf.saxon.om.Sequence;
9+
import net.sf.saxon.om.SequenceIterator;
1010
import net.sf.saxon.om.StructuredQName;
1111
import net.sf.saxon.trans.XPathException;
1212
import net.sf.saxon.value.AnyURIValue;
@@ -15,8 +15,6 @@
1515
public class SystemIdFunction extends ExtensionFunctionDefinition
1616
{
1717

18-
private static final long serialVersionUID = -4202710868367933385L;
19-
2018
public static StructuredQName QNAME = new StructuredQName("saxon", "http://saxon.sf.net/", "system-id");
2119

2220
@Override
@@ -66,9 +64,7 @@ public ExtensionFunctionCall makeCallExpression()
6664
{
6765
return new ExtensionFunctionCall()
6866
{
69-
private static final long serialVersionUID = -4202710868367933385L;
70-
71-
public Sequence call(XPathContext context, @SuppressWarnings("rawtypes") Sequence[] arguments) throws XPathException
67+
public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException
7268
{
7369
if (context.getContextItem() instanceof NodeInfo)
7470
{
@@ -94,8 +90,7 @@ public Item head()
9490
}
9591

9692
@Override
97-
public SequenceIterator iterate() throws
98-
XPathException
93+
public SequenceIterator iterate()
9994
{
10095
return item.iterate();
10196
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.idpf.epubcheck.util.saxon.SaxonSchemaReaderFactory

0 commit comments

Comments
 (0)