Exceptions when using loadSVGDocument() and dispose() on JSVGCanvas

Andrew Swenson <[email protected]>
Newsgroups gmane.text.xml.batik.user
Message-ID <0BCE8DA023546E48BF21F078FB68158C1B4FA3@exmb-00-ah.ad.mathworks.com>
Hi all,

I have noticed some timing issues related to how I am using JSVGCanvas.  I am using Java 1.6 and Batik 1.7 on windows.

My program works by:
- Creating a JSVGCanvas 
- Loading a document in the constructor using loadSVGDocument()
- Use a GVTTreeRendererListener to wait until the document is done
- Execute JavaScript code to manipulate portions of the SVG DOM on the UpdateManager's RunnableQueue's thread

I see a reasonable amount of sporadic exceptions when I am running my code in a test environment (all listed below at the end of the email).  This doesn't happen when manually using the software, which makes me think it's a timing issue.  A typical test case looks like:

	- Setup
	-- Creates a JSVGCanvas
	-- calls loadSVGDocument()

	- <do whatever the test was going to do>

	- Cleanup
	-- calling dispose() on the JSVGCanvas


Some other things which may be relevant:

- I am invoking dispose() by calling it from the UpdateManager's RunnableQueue's thread.  Which thread should I be calling dispose() from?  Is there anything I need to check before calling dispose(), like ensuring that the UpdateManager is not busy?

- Does it matter which thread I call loadSVGDocument() from?  

- Some test points will call loadSVGDocument() to change the SVG file multiple times.  So you can potentially have a single JSVGCanvas that has multiple files loaded across its lifetime. 

- Should EVERY method on JSVGCanvas be treated with the idea that it is a Swing component, so therefore ALL method calls should be done on EDT?


The exceptions all look to have a similar failure mode where something is in the process of being rendered, but an NPE is hit.  It makes me think I am committing some updates or disposes on the wrong thread and this is crashing a rendering in progress.  Also, for the last two exceptions, I looked at the final catch block of the run() method in GVTTreeRenderer, and it is doing a printStackTrace().

	http://apachecode.appspot.com/vs?c=org.apache.batik.swing.gvt.GVTTreeRenderer

This seemed strange because for all the other types of exceptions, it is either swallowing them or rethrowing them.  By having the code do a printStackTrace(), it prevents any program from ever catching the error.  I am curious if anyone knows why this is done.


Any help why I am seeing these exceptions would be appreciated!

Thanks!
 - Andrew



Exception in thread "RunnableQueue-11" java.lang.NullPointerException
	at java.awt.geom.RectangularShape.intersects(Unknown Source)
	at org.apache.batik.gvt.AbstractGraphicsNode.getBounds(AbstractGraphicsNode.java:776)
	at org.apache.batik.gvt.UpdateTracker.getDirtyAreas(UpdateTracker.java:93)
	at org.apache.batik.bridge.UpdateManager.repaint(UpdateManager.java:569)
	at org.apache.batik.bridge.UpdateManager$UpdateManagerRunHander.runnableInvoked(UpdateManager.java:870)
	at org.apache.batik.util.RunnableQueue.runnableInvoked(RunnableQueue.java:543)
	at org.apache.batik.util.RunnableQueue.run(RunnableQueue.java:251)
	at java.lang.Thread.run(Unknown Source)



java.util.ConcurrentModificationException
	at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
	at java.util.LinkedList$ListItr.next(Unknown Source)
	at org.apache.batik.swing.gvt.AbstractJGVTComponent.renderGVTTree(AbstractJGVTComponent.java:727)
	at org.apache.batik.swing.svg.AbstractJSVGComponent.renderGVTTree(AbstractJSVGComponent.java:1072)
	at org.apache.batik.swing.gvt.AbstractJGVTComponent.scheduleGVTRendering(AbstractJGVTComponent.java:791)
	at org.apache.batik.swing.svg.AbstractJSVGComponent.access$701(AbstractJSVGComponent.java:203)
	at org.apache.batik.swing.svg.AbstractJSVGComponent$SVGListener.svgLoadEventDispatchCompleted(AbstractJSVGComponent.java:1655)
	at org.apache.batik.swing.svg.SVGLoadEventDispatcher$2.dispatch(SVGLoadEventDispatcher.java:173)
	at org.apache.batik.util.EventDispatcher.dispatchEvent(EventDispatcher.java:103)
	at org.apache.batik.util.EventDispatcher.fireEvent(EventDispatcher.java:87)
	at org.apache.batik.util.EventDispatcher$1.run(EventDispatcher.java:46)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)



java.lang.IllegalStateException: RunnableQueue not started or has exited
	at org.apache.batik.util.RunnableQueue.preemptLater(RunnableQueue.java:323)
	at org.apache.batik.bridge.UpdateManager.manageUpdates(UpdateManager.java:275)
	at org.apache.batik.swing.svg.AbstractJSVGComponent$SVGListener.gvtRenderingCompleted(AbstractJSVGComponent.java:1762)
	at org.apache.batik.swing.gvt.GVTTreeRenderer$4.dispatch(GVTTreeRenderer.java:193)
	at org.apache.batik.util.EventDispatcher.dispatchEvent(EventDispatcher.java:103)
	at org.apache.batik.util.EventDispatcher.fireEvent(EventDispatcher.java:87)
	at org.apache.batik.util.EventDispatcher$1.run(EventDispatcher.java:46)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)



java.lang.NullPointerException 
	at java.awt.geom.Rectangle2D.intersect(Unknown Source) 
	at org.apache.batik.gvt.AbstractGraphicsNode.getBounds(AbstractGraphicsNode.java:777) 
	at org.apache.batik.gvt.AbstractGraphicsNode.paint(AbstractGraphicsNode.java:443) 
	at org.apache.batik.gvt.CompositeGraphicsNode.primitivePaint(CompositeGraphicsNode.java:165) 
	at org.apache.batik.gvt.filter.GraphicsNodeRed8Bit.genRect(GraphicsNodeRed8Bit.java:140) 
	at org.apache.batik.gvt.filter.GraphicsNodeRed8Bit.copyData(GraphicsNodeRed8Bit.java:116) 
	at org.apache.batik.ext.awt.image.rendered.TranslateRed.copyData(TranslateRed.java:105) 
	at org.apache.batik.ext.awt.image.rendered.PadRed.copyData(PadRed.java:88) 
	at org.apache.batik.gvt.renderer.DynamicRenderer.repaint(DynamicRenderer.java:244) 
	at org.apache.batik.gvt.renderer.StaticRenderer.repaint(StaticRenderer.java:344) 
	at org.apache.batik.swing.gvt.GVTTreeRenderer.run(GVTTreeRenderer.java:123)



java.lang.NullPointerException
	at org.apache.batik.gvt.renderer.DynamicRenderer.updateWorkingBuffers(DynamicRenderer.java:85)
	at org.apache.batik.gvt.renderer.StaticRenderer.clearOffScreen(StaticRenderer.java:307)
	at org.apache.batik.swing.gvt.GVTTreeRenderer.run(GVTTreeRenderer.java:108)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.