Overview
A FOP process has three stages:
building the FO tree,
building the Area tree,
The getNextBreakPoss call tree
The addAreas call tree
Finishing the page
rendering the pages.
These stages are preceded by two other stages:
0. preparation: the objects for
the FOP process are constructed; this phase may be done by FOP (apps
package), or by the calling application;
X. parsing: this phase is done
by a SAX parser; FOP's own preparation stage uses a JAXP
SAXParserFactory to call an available SAX parser.
Stage 0. The preparation stage occurs
before the other stages. When it is completed it starts the parsing
stage by calling the parser's parse method.
The parsing stage and stages 1, 2, 3 run concurrently. Each stage
calls into the following stage at appropriate points in its
process. It is feasible that stages 2 and 3 will run in separate
threads.
Stage X. The parser now takes control.
It parses the FO document or walks over the DOM tree. When it
encounters XML events such as the start or end of the document, the
start or end of an XML element, or character data, it makes a call
back into the FO tree builder.
Stage 1. The FO tree builder now takes
control to create or finish the FO node for which the XML event was
fired. When it is done, it returns control to the parser.
The end events of a few XML elements invoke further actions
of the FO tree builder. When a page-sequence FO node is finished, the
FO tree builder notifies its tree listeners (of which there usually is
only one, the Area tree builder) of this event. Each listener in turn
takes control to process the page sequence.
Stage 2. The Area tree builder (which
is the tree listener) now takes control to lay out the page sequence
and construct the Area tree for it. This stage is divided in three
substages.
Stage 2a. The (pseudo)tree of possible
break points is created. Each node in the FO tree creates a Layout
Manager of the appropriate type. The resulting tree of Layout Managers
is recursed. Each Layout Manager asks each of its child Layout
Managers in turn to return a possible break point, until all child
Layout Managers are finished. This process is started by the Page
Layout Manager, which is tied to the page-sequence FO node that was
just completed in stage 1. Each time when its current child Layout
Manager returns a possible break point, a complete (pseudo)tree of
possible break points for a page has been collected. The next
substage takes control.
Stage 2b. Now the area tree is
created. The (pseudo)tree of possible break points and their Layout
Managers is recursed. Each possible break point may create an area. It
then calls the possible break points of the child LM that fall in this
area, to create and return their area, and adds those areas to its own
area. This process is started by the Page Layout Manager after the
previous substage has finished. When its possible break point returns
its area, the area tree for the flow of the page is complete.
Stage 2c. The Page Layout Manager adds
the static areas and hands the page to the Area tree builder, which
adds it to the root area. The Area tree builder now inspects the set
of complete pages, and fills in forward references to the page just
finished. Pages which are now complete including the forward
references contained in them, are handed over to the renderer, which
now takes control. When the renderer returns control, the Page Layout
Manager starts again in stage 2a to lay out the next page in the page
sequence.
When all pages of this page sequence are done, this stage
finishes, and the Area tree builder returns control to the FO tree
builder.
Stage 3. The renderer now takes control
to render the finished pages. When it is done with those pages, it
returns control to the Area tree builder.
This process model is FOP's default process model. It is
completely configurable, through the objects constructed in the
preparation stage. Stage 1 is configured by the content handler that
is registered with the parser. Stage 2 is configured by the listeners
that are registered with the FO tree builder. The layout process in
stage 2 is also configured by the layout strategy that is registered
with the Area tree builder. [It might be more appropriate to say that
stage 2 is controlled by the tree control object. The actual Area tree
builder is assigned by the layout strategy.] Stage 3 is configured by
the selected renderer or output format.