You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-dev@xmlgraphics.apache.org by "Vincent Hennebert (JIRA)" <ji...@apache.org> on 2013/08/29 19:40:51 UTC

[jira] [Commented] (FOP-2293) Whitespace management extension

    [ https://issues.apache.org/jira/browse/FOP-2293?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13753851#comment-13753851 ] 

Vincent Hennebert commented on FOP-2293:
----------------------------------------

Hi Seifeddine,

thanks for your patch. I noticed you refer to the [WhitespaceManagement|http://wiki.apache.org/xmlgraphics-fop/WhitespaceManagement] page on the developer wiki. It would be good if you could put your doc into a new section of that page, explaining what exactly you are planning to implement and any divergence from what is already there.

Some high-level comments about your patch:
* Please set up Checkstyle using the checkstyle-5.5.xml file at the root of the project and fix all the warnings. I already fixed some of them but not all. Among other things, it’s important to always put statements in {{if}} or {{else}} blocks into braces, even if there is only one statement, to prevent mistakes in case statements are added later on.
* FOP aims to be Java 1.5 compliant. Please compile the code with a 1.5 JDK, to make sure you are not using methods from the standard library that were added in Java 1.6 or later.
* Use the @Override annotation whenever you override a method. You should be able to set up your IDE to do that automatically for you.
* Try and use enhanced for loops rather than iterators whenever you can, as this usually makes the code much more concise. I did it in the filter method of FIRST_FIT as illustration
* The naming of extension elements will probably have to be revised to make them more concise and explicit. But we can handle that later on.
* Similarly, we will have to clarify whether the extension elements generate areas or simply return the areas from their child elements, whether that would be reference areas, etc.
* The fitting-strategy property should not be in the fox namespace since it’s not meant to be used on elements from other namespaces. Simply leave it without any namespace.
* The code doesn’t seem to work if the extension element is the last element of the flow.
* Eventually, support for changing IPD will have to be added. I don’t think that would work as it is?

And here are some finer-grain comments in specific parts of the code:

h6. BreakingAlgorithm
* handleBestFitPenalty
** Move this method to after considerLegalBreak, to follow the reading order (from the higher-level method to the lower-level method).
** totalWidth should not be updated if an alternative is found, since you’re dealing with a penalty element.
** Why should the test for difference be > 0 only? A negative difference is ok as long as the adjustment ratio is >= -1.
** Creating a new KnuthPenalty for every alternative is not ideal. It should be created once and stored in the alternative.
** alternativeManager will work only if there is only one extension in the document. If there are more, they will be mixed up in the same instance (see multiple-feasible-nodes.fo). Its logic should probably be moved to BestFitPenalty, which should also allow to avoid passing it around through LayoutContext.
* considerLegalBreak: the test ‘if element instanceof BestFitPenalty’ should not be put there as this method is also used for inline content, where such elements will never be present. It should be moved to a method that will be overridden in PageBreakingAlgorithm.
* if there’s no room on the page, the content will be unconditionally put on the next page. Is that what you want? I suppose this aspect is still work in progress.

h6. AlternativeManager
getBestAlternative: don’t catch the NPE. Change the code so that it tolerates a null value, or if you really can’t then add an ‘if != null’ test

h6. BestFitPenalty
instead of having a getAlternativeCount and a getAlternative(int) method, simply define one getAlternatives method that returns the list (or the collection if ordering is not important) of alternatives.

h6. ElementListUtils
* The calcFullContentLength shouldn’t be necessary: you can probably call SpaceResolver.resolveElementList first and then use the standard calcContentLength method.
* Eventually the creation of BestFitLayoutManagerMaker and AlternativeBlocklayoutManagerMaker will have to be moved to somewhere else than LayoutManagerMapping since they are extension elements. But we can address that later on.

h6. KnuthAlgorithmTestCase
This is an excellent start. The BestFitPenaltyTestCase inner class probably is unnecessary, the method can just be moved to the outer class. Eventually this test case can be completed to handle more cases (different and more complex situations), moved into their own class if necessary.

h6. AlternativeBlock
* I renamed FO_NAME into OBJECT_NAME as this is not a formatting object
* validateChildNode: I don’t think you want to check elements in the fox namespace. If you start like this you might as well check for elements in the SVG namespace, and the MathML namespace, etc. Some generic, all-purpose solution would have to be devised to check foreign elements, but this is getting off-topic.

h6. BestFit
* bind
** The determination of the strategy can be made a bit more robust by moving the code into the enum. Add a name field to each value of the enum and then use the values() method to iterate through them and return the appropriate one. See here for some hints:
[http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html]
I already modified the enum to replace the FittingStrategy class, which allows to simplify the code quite a bit.
** The validation of the property value should leverage FOP’s property sub-system. This can be done by defining the property using an EnumProperty.Maker instead of a StringProperty.Maker. Unfortunately, because that system was designed before the switch to Java 1.5, it would have to be modified to use Java enums. Maybe now is the time to do it. We can get back to that later.
* processNode: not sure why you redefine it?

h6. AlternativeBlockLayoutManager
* getNextKnuthElements: please, don’t do the same mistake as in other getNextKnuthElements methods and find a better name for the returnedList and returnList variables :-)
* addChildArea: not sure if the test curBlockArea != null is necessary, since it is initialized in getParentArea. Also, IIUC you are going to deal with block areas only, as per the definition of fox:alternative-block
* there is code duplicated from other LMs. This is fine for now, but eventually it would be good to remove that duplication from all the LMs. We can get back to that later.

I’ve applied your patch to a temporary branch: [https://svn.eu.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_WhitespaceManagement] Please switch your local copy to that branch and submit your next patch against it.

Feel free to ask if you have any questions.

Thanks,
Vincent

                
> Whitespace management extension
> -------------------------------
>
>                 Key: FOP-2293
>                 URL: https://issues.apache.org/jira/browse/FOP-2293
>             Project: Fop
>          Issue Type: New Feature
>          Components: general
>    Affects Versions: trunk
>            Reporter: Seifeddine Dridi
>            Priority: Minor
>              Labels: XSL-FO
>             Fix For: trunk
>
>         Attachments: bestfit.fo, doc.pdf, patch.patch
>
>
> I have been working on an extension for whitespace management, similar to what's described here: http://wiki.apache.org/xmlgraphics-fop/WhitespaceManagement
> The logic of the extension is very simple: the user defines a set of alternatives that he wishes to insert at the end of a page, then if there is enough space left, FOP will pick the alternative that best matches the user's selection criteria (first fit, smallest fit, biggest fit).
> This is my first work on FOP and it took me almost 2 months to reach this stage in development. But it's not the end of course, so I'm relying on your feedback to improve it.
> Thank you

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira