In my last post I suspected the Woodstox lib to be the reason that Tapestry 5.1 does not work on Google App Engine (GAE).
So, I tried to eliminate the Woodstox lib and just use Stax – and it turned out to be really easy. The only problem was that the standard Stax parser does not handle DTDs in a nice way – you have to parse them yourself.
Changes to Tapestry:
- use XMLInputFactory instead of XMLInputFactory2 in TemplateParserImpl
- remove inputFactory.configureForSpeed(); in TemplateParserImpl
- use XMLStreamReader instead of XMLStreamReader2 in StaxTemplateParser
- change the dtd() method StaxTemplateParser to (this could be nicer):
private void dtd() throws XMLStreamException { String dtd = reader.getText(); String[] dtdElements = dtd.split(" "); if(dtdElements.length > 3) { String rootName = dtdElements[1]; String publicId = null; String systemId = null; if("PUBLIC".equals(dtdElements[2])) { publicId = dtdElements[3]; if(dtdElements.length > 4) systemId = dtdElements[4]; } else if("SYSTEM".equals(dtdElements[2])) { systemId = dtdElements[3]; } tokenAccumulator.add(new DTDToken(rootName, publicId, systemId, getLocation())); } }
I have eliminated Woodstox – Tapestry runs now on plain Stax (included in JRE). But it still does not work on GAE – seems that the whole Stax package is locked and cannot be used. Maybe I give it another try. Hmmm.
I expect google can fix the bug.ad woodstox to white list.
jun tsai