As part of the project I'm working on I need to have batik retrieve referenced files from a local database. To do this I figured I should extend either ParsedURLDefaultProtocolHandler or AbstractParsedURLProtocolHandler so I could return my own extended version of ParsedURLData which would establish the database connection and return an InputStream for processing. While trying to implement this I encountered a possible bug. Setup: Library: batik1.7beta1 JDK: 1.5 (Apple) OS: MacOS 10.5
The protocol link I wanted would be something like: "library: fileName.ext#ref" and would be used to call for images, css files and other svg files. I have found two problems with this setup: 1 - Batik doesn't use protocol handlers for css files referenced in <?xml-stylesheet ?> 2 - Batik still tries to create a URL object even tho the ParsedURL has already returned data. CSS Loading org.w3c.dom.DOMException: Null Document reference: Invalid CSS document. at org.apache.batik.css.engine.CSSEngine.parseStyleSheet(CSSEngine.java :1167) at org.apache.batik.css.engine.CSSEngine.parseStyleSheet(CSSEngine.java :1127) at org.apache.batik.dom.svg.SVGStyleSheetProcessingInstruction.getCSSStyleSheet (SVGStyleSheetProcessingInstruction.java:104) at org.apache.batik.css.engine.CSSEngine.getStyleSheetNodes(CSSEngine.java :934) at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java :796) at org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java :878) at org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java :82) at org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java :579) at org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode( SVGSVGElementBridge.java:132) at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:72) at org.apache.batik.swing.svg.GVTTreeBuilder.run(GVTTreeBuilder.java:96) It's important to note that my protocol handler is *never* called when batik tries to open the css file. SVG Loading org.apache.batik.bridge.BridgeException: Malformed URL: library:SOPOS_1_1.regions at org.apache.batik.bridge.BridgeContext.getReferencedNode( BridgeContext.java:781) at org.apache.batik.bridge.BridgeContext.getReferencedElement( BridgeContext.java:797) at org.apache.batik.bridge.SVGUseElementBridge.buildCompositeGraphicsNode( SVGUseElementBridge.java:123) at org.apache.batik.bridge.SVGUseElementBridge.createGraphicsNode( SVGUseElementBridge.java:97) at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:206) at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:164) at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:78) at org.apache.batik.swing.svg.GVTTreeBuilder.run(GVTTreeBuilder.java:96) When it's trying to load the SVG document the problem is in SAXSVGDocumentFactory.java in createDocument(String uri) on line 204. Currently I have solved my problems by registering an extended URLStreamHandlerFactory with URL.setURLStreamHandlerFactory(). I also have to create extended forms of both URLStreamHandler and URLConnection but it loads all the files properly (including css) and I don't need either ParsedURLDefaultProtocolHandler or AbstractParsedURLProtocolHandler. -- - Robert
