Andreas L Delmelle wrote: > On Dec 14, 2007, at 13:07, Vincent Hennebert wrote: > >> Andreas L Delmelle wrote: >>> On Dec 14, 2007, at 11:55, Vincent Hennebert wrote: >>> >>>> Hi Andreas, >>>> >>>>> + while (!(ancestor instanceof Flow) >>>>> + && ancestor instanceof Wrapper) { >> >> Sorry, I meant: >> while (ancestor instanceof Wrapper) >> The original loop will stop when: >> ancestor instanceof Flow || !(ancestor instanceof Wrapper) >> which is equivalent to simply >> !(ancestor instanceof Wrapper) >> So I think the loop may be simplified. > > Still not convinced... > The loop should end either if the ancestor is not a Wrapper (a Block, > Inline, whatever) or if the ancestor is a Flow (this is implicitly > covered by the previous, but this makes sure we stop at the Flow and do > not climb further to the PageSequence and the Root)
But as you said this is already covered by the previous test! In other words: the loop should end either if the ancestor is not a Wrapper (a Block, Inline, whatever), or if the ancestor is not a Wrapper (a Flow...). > Doing this with a simple check is impossible, IIC. You would at least > need something like: > > while (!(ancestor instanceof Wrapper)) { > ancestor = ancestor.getParent(); > if (ancestor instanceof Flow) { > break; > } > } But the test inside the loop is not necessary, since it will automatically be performed at the end of the loop (more precisely: before starting the next iteration). If ancestor is a Flow, then ancestor is not a Wrapper, then the while loop will stop there. So the following should be enough: while (ancestor instanceof Wrapper) { ancestor = ancestor.getParent(); } // Once we get here we have !(ancestor instanceof Wrapper) That’s simply the way the while loop works. Had you used a repeat loop (do...while in Java), this would have been another question. ... Unless I’ve completely missed something. <snip/> > Just bumped into one obstacle: > validateChildNode() is a protected member of FONode, and as such, each > subclass in the fo.flow package has access only its own version... > > Options: > * increase the general visibility to public (not sure why this would be > desirable; unless there's any other compelling reasons to do so, I'd > rather not...) Yeah, we’re hitting a limitation of Java here. Basically we’re missing a keyword allowing classes of a sub-package to access the method. Making it public with a proper comment is still the less ugly way to do in my opinion. > * implement the exception rule for Wrapper in a default implementation > in FObj, which would allow delegating to the parent for any neutral > items. FObj does have access to its parent's validateChildNode() Well we rather not clutter up FObj with a method that only applies to Wrapper. Were it useful to many subclasses, why not, but that’s not the case here. I don’t think FOP will ever implement the other neutral FOs (related to dynamic content) that might have a use of it. Vincent -- Vincent Hennebert Anyware Technologies http://people.apache.org/~vhennebert http://www.anyware-tech.com Apache FOP Committer FOP Development/Consulting