Create an SVG file with an unused reference. This can happen by editing an SVG created in Adobe Illustrator with Inkscape and removing objects. See e.svg.txt. Essentially:
The unused reference is ignored and rasterizing continues. This is the behaviour that Inkscape takes, which permits it to load the image:
Actual
Exception is thrown and the image is not rasterized.
io.sf.carte.echosvg.bridge.BridgeException: file:community.svg:-1
Cannot find the referenced element:
"#SVGID_00000072257059765744298700000011011170644502566322_"
specified on the element <use> - may be a problem of 'id'
The root cause is BridgeContext.java, line 752, where it is assumed incorrectly that all such Element instances have a valid Node reference:
Node ref = ur.getNode(uri, e);
if (ref == null) {
throw new BridgeException(this, e, ERR_URI_BAD_TARGET, new Object[] { uri });
This exception is caught by SVGAbstractTransformer at line 261 and wrapped into a new exception:
throw new TranscoderException(ex);
By the time it is wrapped and re-thrown as a TranscoderException, it's too late to intervene. Perhaps instead of creating a BridgeException, there needs to be an UndefinedReferenceException subclass of BridgeException? That way the exception can still be caught by SVGAbstractTransformer yet passed along to the ErrorHandler instead of being wrapped and re-thrown?
Another idea would be to create an "Empty" node/element to represent a missing reference, but that would needlessly clutter the DOM or have any number of unintended side-effects, I imagine, because getReferencedNode is used in many places.
Replicate
Create an SVG file with an unused reference. This can happen by editing an SVG created in Adobe Illustrator with Inkscape and removing objects. See e.svg.txt. Essentially:
Rasterize the file using EchoSVG.
Expected
The unused reference is ignored and rasterizing continues. This is the behaviour that Inkscape takes, which permits it to load the image:
Actual
Exception is thrown and the image is not rasterized.
The root cause is
BridgeContext.java
, line 752, where it is assumed incorrectly that all suchElement
instances have a validNode
reference:This exception is caught by
SVGAbstractTransformer
at line 261 and wrapped into a new exception:By the time it is wrapped and re-thrown as a
TranscoderException
, it's too late to intervene. Perhaps instead of creating aBridgeException
, there needs to be anUndefinedReferenceException
subclass ofBridgeException
? That way the exception can still be caught bySVGAbstractTransformer
yet passed along to theErrorHandler
instead of being wrapped and re-thrown?Another idea would be to create an "Empty" node/element to represent a missing reference, but that would needlessly clutter the DOM or have any number of unintended side-effects, I imagine, because
getReferencedNode
is used in many places.