wolfgangmm / tei-simple-pm

An implementation of the TEI Simple ODD extensions for processing models in XQuery.
http://showcases.exist-db.org/exist/apps/tei-simple/index.html
20 stars 9 forks source link

[bugfix] Make sure to correctly resolve fonts for fop 2.1 #23

Open adamretter opened 8 years ago

joewiz commented 8 years ago

I've tested this PR against the latest eXist develop (and thus am using a version that incorporates https://github.com/eXist-db/exist/pull/977), but I am getting the following error when generating a PDF via FO (reproducible with any file in the stock test collection), using a build of tei-simple-pm from the latest master branch:

HTTP ERROR 500

Problem accessing /exist/apps/tei-simple/modules/fo.xql. Reason:

    Server Error
Caused by:

javax.servlet.ServletException: An error occurred: URI scheme is not "file"
    at org.exist.http.servlets.EXistServlet.doGet(EXistServlet.java:263)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:229)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
    at org.exist.http.urlrewrite.Forward.doRewrite(Forward.java:50)
    at org.exist.http.urlrewrite.XQueryURLRewrite.doRewrite(XQueryURLRewrite.java:548)
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:352)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
    at de.betterform.agent.web.filter.XFormsFilter.doFilter(XFormsFilter.java:171)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: URI scheme is not "file"
    at java.io.File.<init>(File.java:421)
    at org.apache.fop.fonts.FontCache.addFont(FontCache.java:335)
    at org.apache.fop.fonts.DefaultFontConfigurator.getFontInfo(DefaultFontConfigurator.java:173)
    at org.apache.fop.fonts.DefaultFontConfigurator.addFonts(DefaultFontConfigurator.java:136)
    at org.apache.fop.fonts.DefaultFontConfigurator.configure(DefaultFontConfigurator.java:89)
    at org.apache.fop.render.PrintRendererConfigurator.getCustomFontCollection(PrintRendererConfigurator.java:147)
    at org.apache.fop.render.PrintRendererConfigurator.setupFontInfo(PrintRendererConfigurator.java:127)
    at org.apache.fop.render.intermediate.IFUtil.setupFonts(IFUtil.java:170)
    at org.apache.fop.render.intermediate.IFRenderer.setupFontInfo(IFRenderer.java:187)
    at org.apache.fop.area.RenderPagesModel.<init>(RenderPagesModel.java:75)
    at org.apache.fop.area.AreaTreeHandler.setupModel(AreaTreeHandler.java:135)
    at org.apache.fop.area.AreaTreeHandler.<init>(AreaTreeHandler.java:105)
    at org.apache.fop.render.RendererFactory.createFOEventHandler(RendererFactory.java:350)
    at org.apache.fop.fo.FOTreeBuilder.<init>(FOTreeBuilder.java:107)
    at org.apache.fop.apps.Fop.createDefaultHandler(Fop.java:104)
    at org.apache.fop.apps.Fop.<init>(Fop.java:78)
    at org.apache.fop.apps.FOUserAgent.newFop(FOUserAgent.java:182)
    at org.apache.fop.apps.FopFactory.newFop(FopFactory.java:240)
    at org.exist.xquery.modules.xslfo.ApacheFopProcessorAdapter.getContentHandler(ApacheFopProcessorAdapter.java:67)
    at org.exist.xquery.modules.xslfo.RenderFunction.eval(RenderFunction.java:139)
    at org.exist.xquery.BasicFunction.eval(BasicFunction.java:70)
    at org.exist.xquery.InternalFunctionCall.eval(InternalFunctionCall.java:41)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:99)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:102)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267)
    at org.exist.xquery.SequenceConstructor.eval(SequenceConstructor.java:84)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.XQuery.execute(XQuery.java:253)
    at org.exist.xquery.XQuery.execute(XQuery.java:185)
    at org.exist.http.RESTServer.executeXQuery(RESTServer.java:1506)
    at org.exist.http.RESTServer.doGet(RESTServer.java:507)
    at org.exist.http.servlets.EXistServlet.doGet(EXistServlet.java:230)
    ... 45 more
Caused by:

java.lang.IllegalArgumentException: URI scheme is not "file"
    at java.io.File.<init>(File.java:421)
    at org.apache.fop.fonts.FontCache.addFont(FontCache.java:335)
    at org.apache.fop.fonts.DefaultFontConfigurator.getFontInfo(DefaultFontConfigurator.java:173)
    at org.apache.fop.fonts.DefaultFontConfigurator.addFonts(DefaultFontConfigurator.java:136)
    at org.apache.fop.fonts.DefaultFontConfigurator.configure(DefaultFontConfigurator.java:89)
    at org.apache.fop.render.PrintRendererConfigurator.getCustomFontCollection(PrintRendererConfigurator.java:147)
    at org.apache.fop.render.PrintRendererConfigurator.setupFontInfo(PrintRendererConfigurator.java:127)
    at org.apache.fop.render.intermediate.IFUtil.setupFonts(IFUtil.java:170)
    at org.apache.fop.render.intermediate.IFRenderer.setupFontInfo(IFRenderer.java:187)
    at org.apache.fop.area.RenderPagesModel.<init>(RenderPagesModel.java:75)
    at org.apache.fop.area.AreaTreeHandler.setupModel(AreaTreeHandler.java:135)
    at org.apache.fop.area.AreaTreeHandler.<init>(AreaTreeHandler.java:105)
    at org.apache.fop.render.RendererFactory.createFOEventHandler(RendererFactory.java:350)
    at org.apache.fop.fo.FOTreeBuilder.<init>(FOTreeBuilder.java:107)
    at org.apache.fop.apps.Fop.createDefaultHandler(Fop.java:104)
    at org.apache.fop.apps.Fop.<init>(Fop.java:78)
    at org.apache.fop.apps.FOUserAgent.newFop(FOUserAgent.java:182)
    at org.apache.fop.apps.FopFactory.newFop(FopFactory.java:240)
    at org.exist.xquery.modules.xslfo.ApacheFopProcessorAdapter.getContentHandler(ApacheFopProcessorAdapter.java:67)
    at org.exist.xquery.modules.xslfo.RenderFunction.eval(RenderFunction.java:139)
    at org.exist.xquery.BasicFunction.eval(BasicFunction.java:70)
    at org.exist.xquery.InternalFunctionCall.eval(InternalFunctionCall.java:41)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:99)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:102)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267)
    at org.exist.xquery.SequenceConstructor.eval(SequenceConstructor.java:84)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:111)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.XQuery.execute(XQuery.java:253)
    at org.exist.xquery.XQuery.execute(XQuery.java:185)
    at org.exist.http.RESTServer.executeXQuery(RESTServer.java:1506)
    at org.exist.http.RESTServer.doGet(RESTServer.java:507)
    at org.exist.http.servlets.EXistServlet.doGet(EXistServlet.java:230)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:229)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
    at org.exist.http.urlrewrite.Forward.doRewrite(Forward.java:50)
    at org.exist.http.urlrewrite.XQueryURLRewrite.doRewrite(XQueryURLRewrite.java:548)
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:352)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
    at de.betterform.agent.web.filter.XFormsFilter.doFilter(XFormsFilter.java:171)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
Powered by Jetty://
adamretter commented 8 years ago

@joewiz Are you sure you are using the correct PR? The PR disables the font-cache (https://github.com/wolfgangmm/tei-simple-pm/pull/23/commits/cfba8c3ac1b1d47a45fb46009a7adab7e0324bec#diff-27b7c450a06c704fad731b8ac920f159R40) However, your stacktrace shows the font-cache is still being used!

joewiz commented 8 years ago

How odd! Yes, I actually copied and pasted directly from the raw view of https://github.com/wolfgangmm/tei-simple-pm/pull/23/commits/cfba8c3ac1b1d47a45fb46009a7adab7e0324bec#diff-27b7c450a06c704fad731b8ac920f159R40, and pasted this over the contents of /db/apps/tei-simple/modules/fo.xql. I just confirmed that I'm using the latest eXist develop branch and tei-simple-pm master branch, with this version of fo.xql as the only modification:

screen shot 2016-05-09 at 1 49 15 pm

adamretter commented 8 years ago

@joewiz Okay, can you tell me steps to reproduce then please? If I go into the home page of tei-simple-pm and click an article and click PDF, then I get a PDF, can you tell me a specific article or something?

joewiz commented 8 years ago

@adamretter Sure, and thanks:

  1. From EXIST_HOME, get the latest from from the develop branch via git pull
  2. Rebuild eXist with ./build.sh rebuild
  3. Ensure a vanilla database with ./build.sh clean-default-data-dir
  4. From the TEI Simple PM app directory, get the latest via git pull
  5. Rebuild the app with ant clean and ant
  6. Start eXist, open Dashboard, upload build/tei-simple-1.0.1.xar
  7. In eXide, paste https://raw.githubusercontent.com/adamretter/tei-simple-pm/fop-2.1-font-resolution/modules/fo.xql over the contents of /db/apps/tei-simple/modules/fo.xql. Save the changes to fo.xql.
  8. Open http://localhost:8080/exist/apps/tei-simple/index.html and select PDF > PDF via FO from the dropdown menu beside "THE TRAGEDIE OF ROMEO and IVLIET":

    screen shot 2016-05-09 at 2 15 25 pm

    The resulting request URL is http://localhost:8080/exist/apps/tei-simple/modules/fo.xql?token=7b0c7c57-36c4-4d52-9d22-73d4918a53bf&odd=teisimple.odd&doc=test/romeo_and_juliet.xml, and the response is the URI scheme is not "file" error reported above.