Bug #4684
closedNullPointerException compiling a stylesheet using eXist-DB transform() function
100%
Description
In private email, Johann Schinnerl reports
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:161) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:79) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.exist.http.urlrewrite.Forward.doRewrite(Forward.java:51) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.http.urlrewrite.XQueryURLRewrite.doRewrite(XQueryURLRewrite.java:525) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:344) ~[exist-core-5.2.0.jar:5.2.0]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[javax.servlet-api-3.1.0.jar:3.1.0]
at org.eclipse.jetty.servlet.ServletHolder$NotAsyncServlet.service(ServletHolder.java:1386) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1617) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:226) ~[websocket-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:566) ~[jetty-security-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1607) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1577) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:221) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:767) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.Server.handle(Server.java:500) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_222-4-redhat]
Caused by: java.lang.NullPointerException
at net.sf.saxon.functions.SystemProperty.getProperty(SystemProperty.java:129) ~[saxon9pe.jar:?]
at net.sf.saxon.functions.SystemProperty.call(SystemProperty.java:86) ~[saxon9pe.jar:?]
at net.sf.saxon.functions.SystemProperty.call(SystemProperty.java:31) ~[saxon9pe.jar:?]
at net.sf.saxon.expr.FunctionCall.iterate(FunctionCall.java:532) ~[saxon9pe.jar:?]
at net.sf.saxon.expr.Expression.evaluateItem(Expression.java:846) ~[saxon9pe.jar:?]
at net.sf.saxon.expr.parser.Evaluator$6.evaluate(Evaluator.java:213) ~[saxon9pe.jar:?]
at net.sf.saxon.expr.SystemFunctionCall.evaluateArguments(SystemFunctionCall.java:446) ~[saxon9pe.jar:?]
at net.sf.saxon.expr.FunctionCall.iterate(FunctionCall.java:530) ~[saxon9pe.jar:?]
at net.sf.saxon.style.UseWhenFilter.evaluateStatic(UseWhenFilter.java:666) ~[saxon9pe.jar:?]
at net.sf.saxon.style.UseWhenFilter.processStaticVariable(UseWhenFilter.java:376) ~[saxon9pe.jar:?]
at net.sf.saxon.style.UseWhenFilter.startElement(UseWhenFilter.java:209) ~[saxon9pe.jar:?]
at net.sf.saxon.event.StartTagBuffer.startContent(StartTagBuffer.java:246) ~[saxon9pe.jar:?]
at net.sf.saxon.event.ProxyReceiver.startContent(ProxyReceiver.java:177) ~[saxon9pe.jar:?]
at net.sf.saxon.event.ProxyReceiver.startContent(ProxyReceiver.java:177) ~[saxon9pe.jar:?]
at net.sf.saxon.event.ReceivingContentHandler.startElement(ReceivingContentHandler.java:446) ~[saxon9pe.jar:?]
at org.exist.util.serializer.ReceiverToSAX.startElement(ReceiverToSAX.java:105) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.storage.serializers.XIncludeFilter.startElement(XIncludeFilter.java:233) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.storage.serializers.NativeSerializer.serializeToReceiver(NativeSerializer.java:271) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.storage.serializers.NativeSerializer.serializeToReceiver(NativeSerializer.java:273) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.storage.serializers.NativeSerializer.serializeToReceiver(NativeSerializer.java:130) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.storage.serializers.Serializer.toSAX(Serializer.java:856) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.xslt.StylesheetResolverAndCompiler.compileTemplates(StylesheetResolverAndCompiler.java:149) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.xslt.StylesheetResolverAndCompiler.templates(StylesheetResolverAndCompiler.java:99) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.xslt.StylesheetResolverAndCompiler.newTransformerHandler(StylesheetResolverAndCompiler.java:127) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.xquery.functions.transform.Transform.createHandler(Transform.java:384) ~[exist-core-5.2.0.jar:5.2.0]
... 74 more
Johann Schinnerl
to which I responded
Well, it certainly takes us a big step forward, but it doesn't actually solve it.
At the time of the crash, we're evaluating a call on the system-property() function that appears probably in the select expression of a static variable. The code in question is
Configuration config = rsc.getConfiguration();
String edition = rsc.getPackageData().getTargetEdition();
where rsc is the RetainedStaticContext of the expression (the function call), and it's telling us that the RetainedStaticContext exists but has no PackageData. Now we have to work out why, which ain't easy.
The line numbers in UseWhenFilter are slightly out from my version; the commit log points to bugs 4326 and 4546, but neither seems directly relevant.
The stack trace shows
at net.sf.saxon.event.ProxyReceiver.startContent(ProxyReceiver.java:177) ~[saxon9pe.jar:?]
at net.sf.saxon.event.ReceivingContentHandler.startElement(ReceivingContentHandler.java:446) ~[saxon9pe.jar:?]
at org.exist.util.serializer.ReceiverToSAX.startElement(ReceiverToSAX.java:105) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.storage.serializers.XIncludeFilter.startElement(XIncludeFilter.java:233) ~[exist-core-5.2.0.jar:5.2.0]
at org.exist.storage.serializers.NativeSerializer.serializeToReceiver(NativeSerializer.java:271) ~[exist-core-5.2.0.jar:5.2.0]
which implies that the stylesheet content is being piped directly into Saxon via SAX events, and this suggests that the initialization is incomplete in some way. I guess the most likely way they do this is via the JAXP TemplatesHandler
interface. The TemplatesHandlerImpl
initialization does
UseWhenFilter useWhenFilter = new UseWhenFilter(compilation, builder, NestedIntegerValue.TWO);
The third argument is the import precedence and I've no idea why this is set to 2! But this doesn't feel relevant.
More to the point, the "compilation" object that's being passed in here doesn't have its PackageData initialized and this could well account for the subsequent NPE. So I guess I need to do some tests of the JAXP TemplatesHandler using 3.0 constructs that access package data.
I'll raise an issue.
Michael Kay Saxonica
reported against 9.9.1.5
Please register to edit this issue