Hi Alexis

Thanks for the patch! I'll look at it shortly. Would you mind attaching
it to the Bugzilla issue? 
https://issues.apache.org/bugzilla/show_bug.cgi?id=46360
That way it's clearer that you donate the changes to the ASF and
everything concerning this problem is in one place. Thanks!

On 02.09.2010 12:52:37 Alexios Giotis wrote:
> Jeremias, thanks for the clarification about the FopFactory.
> 
> I had a look at your old commit at
> http://svn.apache.org/viewvc?view=revision&revision=724163
> 
> The current situation in trunk is that in 
> PDFImageHandlerSVG.handleImage() the SVG document is not cloned but in 
> other places it is. Examples of cloning are in ImageConverterSVG2G2D, 
> AbstractGenericSVGHandler, AFPImageHandlerSVG, AFPSVGHandler, 
> Java2DSVGHandler, PSSVGHandler.
> 
> This should be the cause of all the stack traces I get. They all go 
> through PDFImageHandlerSVG and after adding the document cloning (see 
> attached patch), I can no longer reproduce the error.
> 
> It should be safe to add the SVG document cloning in there but I would 
> better reduce a little of code duplication. In all those places it is 
> required to build a GraphicsNode and the way of doing this is similar. 
> But maybe this is out of scope.
> 
> Any suggestion on how to proceed with this ?
> 
> 
> 
> 
> On 2-9-10 11:28 AM, Jeremias Maerki wrote:
> > Peter could be right. And there I thought I had this under control. But
> > with so many open Bugzilla issues, things get lost quickly. I've seen
> > multi-threading issues inside Batik myself in a production system and
> > haven't been able to put my finger on it since I though I had this fixed,
> > but it could be that I haven't really fixed it for all cases. I'll have
> > to look into it.
> >
> > At any rate, FopFactory is supposed to be thread-safe. I always have one
> > FopFactory instance per configuration and that is usually one for the
> > whole JVM.
> >
> > On 02.09.2010 10:08:19 Alexios Giotis wrote:
> >> Hi Peter,
> >>
> >> Thanks for pointing this out. It differs in that the instance of
> >> FOUserAgent was shared, but other than this, it's exactly the same case.
> >> Finally, this leads to
> >> https://issues.apache.org/bugzilla/show_bug.cgi?id=46360
> >>
> >> which is still open.
> >>
> >> As I read from the thread, this is a complex case and in batik they have
> >> good reasons not to be thread-safe.
> >>
> >> Finally, sorry for my other posting with the same title. I though that
> >> only the subscribed email address can post.
> >>
> >> Alexis
> >>
> >>
> >>
> >> On 1-9-10 11:30 PM, Peter Coppens wrote:
> >>> Alexis,
> >>>
> >>> This reminds me of something similar I ran into a while ago. I can't 
> >>> remember the details nor how I eventually got around this and/or whether 
> >>> you run into the same but the (weird) behavior you describe does look 
> >>> very similar.
> >>>
> >>> See 
> >>> http://old.nabble.com/Batik-exception-when-using-fop-with-svg-images-in-threaded-environment-td20809049.html
> >>>
> >>> Perhaps it helps
> >>>
> >>> Peter
> >>>
> >>> On 01 Sep 2010, at 17:53, Alexios Giotis wrote:
> >>>
> >>>> Hello,
> >>>>
> >>>> The javadoc and the class name suggest that FopFactory should be 
> >>>> thread-safe although this is not explicitly written. If this is not 
> >>>> thread-safe then please ignore what follows.
> >>>>
> >>>> I am using FOP 1.0 to produce PDF documents concurrently from FOP 
> >>>> intermediate format. The PDF documents share a lot of common images, so 
> >>>> I decided to use a single instance of FopFactory to reduce memory 
> >>>> requirements. >From the single FopFactory, I produce different instances 
> >>>> for different threads like this:
> >>>>
> >>>> FOUserAgent userAgent = fopFactory.newFOUserAgent();
> >>>> IFDocumentHandler targetHandler = 
> >>>> fopFactory.getRendererFactory().createDocumentHandler(userAgent,outputFormat);
> >>>> IFUtil.setupFonts(targetHandler);
> >>>> targetHandler.setResult(new StreamResult(outStream));
> >>>> IFConcatenator concatenator = new IFConcatenator(targetHandler, null);
> >>>> for (int i = 0; i<   numberOfDocumentsToConcatenate; i++) {
> >>>>    Source src = new SAXSource(myOwnApplicationXmlFilters, new 
> >>>> InputSource(myOwnInputStream));
> >>>> concatenator.appendDocument(src);
> >>>> }
> >>>>
> >>>> The problem is that even on my 2-core laptop, I frequently get 
> >>>> exceptions silently written in standard error. Different stacktraces are 
> >>>> attached and as you can see happen when batik parses the SVG files. For 
> >>>> the same input the strings read are corrupted. For example the 
> >>>> overflow="visible" is read as "vssible" and then later as "vissibll". 
> >>>> Also the fill="#EC2227" is try to parse "E7E8" as color.
> >>>>
> >>>> The workaround for my application is to have a new instance of 
> >>>> FopFactory per thread but I would like to fix it and create a patch. 
> >>>> Since I am quite new to FOP, I would like some advise on what should be 
> >>>> the proper level. The higher one would be the FopFactory (but it's too 
> >>>> high and I could do it externally in my code), then there is the 
> >>>> org.apache.xmlgraphics.image.loader.ImageManager and at the end we get 
> >>>> to the very low level org.apache.batik.css.engine.CSSEngine or 
> >>>> org.apache.batik.css.parser.Parser.
> >>>>
> >>>> Secondly, I think it's not a good practice that the exceptions are 
> >>>> written in STDERR instead of propagating to the application. What do you 
> >>>> think ?
> >>>>
> >>>>
> >>>>
> >>>> This is my first post to fop-dev and hopefully this is the proper one.
> >>>>
> >>>> Thanks,
> >>>> Alexis
> >>>>
> >>>> <stacktraces.txt>
> >>>
> >
> >
> >
> >
> > Jeremias Maerki
> >
> 




Jeremias Maerki

Reply via email to