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