On 12.02.2009 13:35:57 Vincent Hennebert wrote:
> And that goes on...
> 
> > Author: jeremias
> > Date: Wed Feb 11 14:54:26 2009
> > New Revision: 743351
> > 
> > URL: http://svn.apache.org/viewvc?rev=743351&view=rev
> > Log:
> > Added missing default font setup.
> >  
> > +    /** {...@inheritdoc} */
> > +    public void setDefaultFontInfo(FontInfo fontInfo) {
> > +        FontInfo fi = Java2DUtil.buildDefaultJava2DBasedFontInfo(fontInfo, 
> > getUserAgent());
> > +        setFontInfo(fi);
> > +    }
> 
> The setDefaultFontInfo method is defined 5 times in the
> AbstractBinaryWritingIFDocumentHandler hierarchy:
> 
> - one in ABWIFDocumentHandler itself, here’s the code:
>         FontManager fontManager = 
> getUserAgent().getFactory().getFontManager();
>         FontCollection[] fontCollections = new FontCollection[] {
>                 new Base14FontCollection(fontManager.isBase14KerningEnabled())
>         };
> 
>         FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
>         fi.setEventListener(new
> FontEventAdapter(getUserAgent().getEventBroadcaster()));
>         fontManager.setup(fi, fontCollections);
>         setFontInfo(fi);
> 
> - one in the AFPDocumentHandler sub-class:
>         FontManager fontManager = 
> getUserAgent().getFactory().getFontManager();
>         FontCollection[] fontCollections = new FontCollection[] {
>             new AFPFontCollection(getUserAgent().getEventBroadcaster(), null)
>         };
> 
>         FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
>         fi.setEventListener(new
> FontEventAdapter(getUserAgent().getEventBroadcaster()));
>         fontManager.setup(fi, fontCollections);
>         setFontInfo(fi);
> 
> - one in PCLDocumentHandler:
>         FontInfo fi = Java2DUtil.buildDefaultJava2DBasedFontInfo(fontInfo,
> getUserAgent());
>         setFontInfo(fi);
> 
> - one in TIFFDocumentHandler:
>         FontInfo fi = Java2DUtil.buildDefaultJava2DBasedFontInfo(fontInfo,
> getUserAgent());
>         setFontInfo(fi);
> 
> 
> One could think: it’s not too bad, the code is duplicated only twice, in
> the last two cases it’s a one-line call to another method. Yes, but
> guess what is the code of that method:
>         Graphics2D graphics2D = 
> Java2DFontMetrics.createFontMetricsGraphics2D();
> 
>         FontManager fontManager = userAgent.getFactory().getFontManager();
>         FontCollection[] fontCollections = new FontCollection[] {
>                 new 
> org.apache.fop.render.java2d.Base14FontCollection(graphics2D),
>                 new InstalledFontCollection(graphics2D)
>         };
> 
>         FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
>         fi.setEventListener(new
> FontEventAdapter(userAgent.getEventBroadcaster()));
>         fontManager.setup(fi, fontCollections);
>         return fi;

I'm so completely lost. I have absolutely no idea what you want to say
here. I don't see any optimization potential here at all. But I'm sure
you could do it better.

> Looking further into the ABWIFDocumentHandler hierarchy, we can see how
> the startDocument method is implemented:
> - in AFPDocumentHandler:
>         try {
>             if (getUserAgent() == null) {
>                 throw new IllegalStateException(
>                         "User agent must be set before starting PostScript
> generation");
>             }
>             if (this.outputStream == null) {
>                 throw new IllegalStateException("OutputStream hasn't been set
> through setResult()");
>             }
>             [...]
>         } catch (IOException e) {
>             throw new IFException("I/O error in startDocument()", e);
>         }
> 
> - in PCLDocumentHandler:
>         try {
>             if (getUserAgent() == null) {
>                 throw new IllegalStateException(
>                         "User agent must be set before starting PDF 
> generation");
>             }
>             if (this.outputStream == null) {
>                 throw new IllegalStateException("OutputStream hasn't been set
> through setResult()");
>             }
>             [...]
>         } catch (IOException e) {
>             throw new IFException("I/O error in startDocument()", e);
>         }
> 
> - in PDFDocumentHandler:
>         try {
>             if (getUserAgent() == null) {
>                 throw new IllegalStateException(
>                         "User agent must be set before starting PDF 
> generation");
>             }
>             if (this.outputStream == null) {
>                 throw new IllegalStateException("OutputStream hasn't been set
> through setResult()");
>             }
>             [...]
>         } catch (IOException e) {
>             throw new IFException("I/O error in startDocument()", e);
>         }
> 
> - in PSDocumentHandler:
>         try {
>             if (getUserAgent() == null) {
>                 throw new IllegalStateException(
>                         "User agent must be set before starting PostScript
> generation");
>             }
>             if (this.outputStream == null) {
>                 throw new IllegalStateException("OutputStream hasn't been set
> through setResult()");
>             }
>             [...]
>         } catch (IOException e) {
>             throw new IFException("I/O error in startDocument()", e);
>         }
> 
> - in TIFFDocumentHandler:
>         try {
>             if (getUserAgent() == null) {
>                 throw new IllegalStateException(
>                         "User agent must be set before starting PDF 
> generation");
>             }
>             if (this.outputStream == null) {
>                 throw new IllegalStateException("OutputStream hasn't been set
> through setResult()");
>             }
>             [...]
>         } catch (IOException e) {
>             throw new IFException("I/O error in startDocument()", e);
>         }
> 
> Note the copy/paste errors, which means that only 2 out of the 5 error
> messages are correct.
> There’s no TODO statement anywhere, so I assume that this code is
> considered to be finalized. IIC this is new code: no legacy here, no
> inherited burden.

Fixed. Thanks for pointing out the oversight.

> Now I have just one question: why? What benefit does this development
> method bring that I’ve missed, and that overcomes all of the well-known
> drawbacks?

Two questions actually. But I don't know how/what to repond to that.


Jeremias Maerki

Reply via email to