On Sun, 2005-07-31 at 00:31 +0100, Ross Gardler wrote:
> [NOTE: this is my summary of my interpretation of *part* of the 
> discussion at the views workshop at Apachecon. In other words I have 
> tried to represent the views of those present, but may have got some 
> bits wrong - this is a document for discussion not a final document.
> 
> You can get the audio from that workshop at 
> http://svn.apache.org/viewcvs.cgi/forrest/events/apachecon-eu-2005/workshop.ogg?rev=225666&view=log
>  
> ]
> 
> What *is* a forrest:view?
> -------------------------
> 
> Some of the confusion over Views seems to have come about because they
> do much more than just replace skins. They add a whole new feature
> set.
> We therefore decided to define some terminology to help clarify the
> situation.
> 

[NOTE: I have cut and modified parts of original mails from Ross,
Ferdinand and David to fit them in my explanations. Thanks for this
excellent work! The summary of this mails describes forrest:views in
very detail, I actually just collected the pieces and added some more
explanations about the pattern they follow]

[NOTE: I changed forrest:view(s) when referring to the DSL and used
forrest:structurer instead]

[NOTE: You should read [1]-[5] before reading this mail that will help
to understand what problems forrest:views is trying to solve and the
proposed implementation for a solution]

What *is* forrest:views (f:v)?
************************
forrest:views is the codename for a forrest based implementation of the
Core J2EE Pattern - Dispatcher View [1]. The following explanation is
from [1] with their equivalent implementation in forrest:views.

Problems which we have with old fashion skins (html)
****************************************************
The problem is a combination of the problems solved by the Front
Controller and View Helper patterns in the presentation tier. There is
no centralized component for managing access control, content retrieval
or view management, and there is duplicate control code scattered
throughout various views. Additionally, business logic and presentation
formatting logic are intermingled within these views, making the system
less flexible, less reusable, and generally less resilient to change.

In our case an old fashion skin are build by 4 different view helper
(book2menu.xsl, document2html.xsl, site2xhtml.xsl and tab2menu.xsl). In
this different files we have typically non modularized presentation
formatting logic. Which makes it hard to reuse certain components in a
flexible way. Some recent usecases wanted e.g. to generate a certain
menu independent from our site.xml. Till now the menu is produced by
book2menu.xsl, if you want to override it you need to create a new skin.
The following limitations described by Ferdinand apply to this
stylesheet.

On Mon, 2005-09-05 at 09:47 +0200, Ferdinand Soethe wrote:
> - structure of site:
> 
>   The structure of the complete site and the position of a document
>   within it. This is currently defined by the grammar and limitations
> of
>   site.xml and implemented by the author or editor assembling a site
>   from different data sources.


Solution
*********
Combine a controller and dispatcher with views and helpers to handle
client requests and prepare a dynamic presentation as the response.
Controllers do not delegate content retrieval to helpers, because these
activities are deferred to the time of view processing. A dispatcher is
responsible for view management and navigation and can be encapsulated
either within a controller, a view, or a separate component.

Our basic prototype (codename: forrest:views) is implementing the
following components to achieve above written. 


dispatcher - match="prepare.view.**"
**********************************
The dispatcher is ATM within the internal.xmap of the internal.view
plugin (i.v-p). The match="prepare.view.**" is responsible to dispatch
the right view to process for the current request. 

view - default.fv 
*****************
A view represents and displays information to the client. The
information that is used in a display is retrieved from a model. Helpers
(forrest:contracts, forrest:hooks and forrest:properties) support views
by encapsulating and adapting a model for use in a display.

helper - forrest:contracts, forrest:hooks and forrest:properties
*****************************************************************
A helper is responsible for helping a view or controller complete its
processing. Thus, helpers have numerous responsibilities, including
gathering data required by the view (done by forrest:properties) and
storing this intermediate model, in which case the helper is sometimes
referred to as a value bean. Additionally, helpers may adapt this data
model for use by the view (done by forrest:contracts). Helpers can
service requests for data from the view by simply providing access to
the raw data or by formatting the data as Web content.

businessService - input plugins 
********************************
The business service is a role that is fulfilled by the service the
client is seeking to access. Typically, the business service is accessed
via a business delegate. The business delegate's role is to provide
control and protection for the business service (see "Business Delegate"
on page 248).


Processing pipeline
*******************
> Currently our processing pipeline looks something like this:
> 
> src -> input plugins -> core -> skinning -> output plugins. -> out
> 
> Both skinning and output plugins are optional, so we could do any of
> the
> following processes when working on, for example and OOo document:
> 
> OOo -> OOo plugin -> core -> skinning (html) -> HTML
> 
> or
> 
> OOo -> OOo plugin -> core -> skinning (FO) -> output plugins -> PDF
> 
> or
> 
> OOo -> OOo plugin -> core -> output plugins -> TEXT
> 

> Views currently only produce HTML and the process looks like this (at
> least I think it does ;-)):
> 
> OOo -> OOo plugin -> core (views) -> HTML


> We can see that forrest:views remove the skinning system. But what
> about 
> the look and feel of the page. A view does not provide that. When 
> forrest:views output XHTML we use CSS for the look and feel:
> 
> 
> CSS
> |
> \|/
> OOo -> OOo plugin -> core (views) -> HTML
> 
> =======================================================
> Themes are the look and feel of a forrest output format
> =======================================================
> 
...

forrest:structurer
******************
On Mon, 2005-09-05 at 09:47 +0200, Ferdinand Soethe wrote:
>   The structuring of the assembled page where all content is in place
>   and structured with 

forrest:hooks to provide hooks for theming.

On Sun, 2005-07-31 at 00:31 +0100, Ross Gardler wrote:
> In order to enable themes to consist of nothing more than Look and
> Feel 
> configurations there needs to be some structure to the document that 
> allows the theme designer to correctly apply the theme to the output 
> generated by Forrest. 

It is the job of a forrest:structurer to define this structure. The
structurer uses for this a couple of helper classes forrest:contracts,
forrest:hooks and forrest:properties. But there is more to a
forrest:structurer than just structure. 

The structurer is not limited to a documents but can aggregate,
structure and contact from multiple input sources. Far more actually
because it provides logical conditions for presentation formatting logic
(to be implemented by basing the structurer on jxTemplates).

> Sometimes the structurer defines content that should be aggregated
> with the source 
> file. For example it may define the copyright information, a search
> box 
> or even some dynamic content, such as an RSS feed. 

On Fri, 2005-08-19 at 04:27 +1000, David Crossley wrote:
> The name "structurer" still works, this time as a doing word
> The structurer needs to marshall the content to help it
> to build the structure.

The combination of forrest:contracts and forrest:properties allows this
aggregation of different input sources.

> So now we have:
> 

> 
>                                       theme
>                                         |
>                                        \|/
> OOo -> OOo plugin -> core (views) ->  HTML
>                       |        /|\
>                      \|/        |
>                   forrest:contracts
                    forrest:properties

> Here the forrest:contracts define the templated content that should
> be 
> inserted into the final document. 

A contract can use forrest:properties to:

> These may create a new request in 
> order to generate the content, such as an RSS feed, or they may
> insert 
> statically defined content, such as a copyright notice.
>
> Now, we need to be able to re-introduce different output formats, so
> the 
> final processing for views looks like this:

Actually the following graphic is not the original one because the
contracts as viewHelper should come *from* the output plugin.
forrest:contracts are basically xsl:templates which adapt and transforms
the presentation model to the final output.

                                           theme
                                             |
                                            \|/
src -> input plugin -> core (views) -> output plugin -> output
                       /|\      |         /|\
                        |      \|/         |
                        +------------------+
                        |forrest:contracts |
                        |forrest:properties|
                        +------------------+


forrest:structurer
> ....
> 
> forrest:structurer add a structure to the generated page that
> clearly identifies all the content in the final output. This is
> achieved through the use of 

forrest:hooks. forrest:hooks is a concept of defining format independent
hooks to structure the output. In xhtml this hooks a transformed into
<span/>s and <div/>s. For example:

<forrest:hook name="testIdDiv"/>
*or*
<forrest:hook name="testIdDiv" type="div"/>
will be transformed into 
<div name="testIdDiv" />

The same is true for @class attribute for forrest:hooks.
<forrest:hook class="testClassDiv"/>
*or*
<forrest:hook class="testClassDiv" type="div"/>
will be transformed into 
<div class="testClassDiv" />

Another feature is that you can as well output span elements for
forrest:hooks instead of div elements.
<forrest:hook name="testId" type="span"/>
will be transformed into 
<span id="testId" />

> =================================================================
> Hooks are only used to define the structure in our output that is 
> required to enable a theme to apply its look and feel.
> =================================================================
> 
> The final job of views is to define where content should be placed 
> within the structure of the page. This is done by using a 
> forrest:contract. For example:
> 
> <forrest:contract name="content-title"/>
> 
> =================================================================
> Contracts define templates that are used to place content in
> a Forrest document.
> =================================================================
> 

Helpers (forrest:contracts) mainly adapt and transform the presentation
model (pm) for the view, but also help with any limited business
processing that is initiated from the view (forrest:properties) (cp. [3]
& [4])

> NOTE: contracts may be static or dynamic.

A static contract expects a certain presentation model and will simply
transform the pm.
<forrest:contract name="content-title"/>

A dynamic contract simply adapt to the pm and can use data from the view
for it. 
<forrest:contract name="branding-tagline">
  <forrest:properties contract="branding-tagline">
    <forrest:property name="branding-tagline-name">new
seed</forrest:property>
    <forrest:property name="branding-tagline-tagline">powered by 
      forrest:views</forrest:property>
  </forrest:properties>
</forrest:contract>

But a dynamic contract can as well service requests for data from the
view by simply providing access to the raw data or by formatting the
data. 
<forrest:contract name="content-feeder">
    <forrest:properties contract="content-feeder">
      <forrest:property name="content-feeder"
nugget="get.nugget.feeder">
        <url>/feeds/somefeed.xml</url>
      </forrest:property>
    </forrest:properties>
</forrest:contract>

Grouping of forrest:structure elements
**************************************
You can group elements to a template and call it from any
forrest:structure. e.g.
<forrest:hook name="export-link">
 <forrest:contract name="content-xml-link"/>
 <forrest:contract name="content-pdf-link"/>
</forrest:hook>

can be called as <forrest:call-template name="export-link"/>
when saved as {project:resources}/templates/export-link.vt.xml 

[NOTE: This featured will be obsolete when we use jxtemplates]

> 
> View FAQs
> =========
> 
> Does a view define how the page is displayed?
> 
> No. A view defines *what* is displayed

and how this *what* is structured.

>  How it is displayed is defined
> by the Theme.
> 
> ----
> 
> What does a view define?
> 
> A view defines the structure of a 

request and the contracts (helper classes) that are to
> be placed within that structure. 
Further it can as well initiated limited business processing with the
contracts.

> 
> ----
> 
> Why does a view define a document structure?
> 
> The view structure is used to allow a theme to be created
> independently
> of the view.

This means as well format independent.
 
> 
> ----
> 
> What is a Theme?
> 
> A theme is a description of how a page is to be displayed. It
> describes
> the look and feel of the page, but does not define any content.
> 
> ----
> 
> What does a contract define?
> 
> A contract defines what content will be placed at a specific point in
> the document structure described by a View.
> 
> ----
> 
> What is a nugget?
> 
> A nugget is a small piece of dynamic content described by a contract.
> 

<snip org="David Crossley" rep="Ross">
> Style
> Presentation
> Theme

I think all these terms became encapsulated in theme as I defined it in 
the start of this thread.

Style is usually used in the context of an HTML output. Presentation is 
more generic, referring to the look and feel of an output format.

Theme is the Forrest:Views term for both of these together.

> Nugget

Is a bit of dynamic content inclued in a forest:view by a 
forrest:contract. By dynamic we mean that it may change between 
invocations of Forrest (or between requests if Forrest is running 
dynamicaly).

> Aggregate

Forrrest:views aggregate various nuggets (which include the src 
document) in a single output document.
</snip>

In addition to nugget, Nicola told me I used that in another way then he
refers to them. I see nuggets as helpers, that can service requests for
data from the view by simply providing access to the raw data or by
formatting the data.

I hope this summarizes the thread till now appropriately and adds some
more explanation to the terminology mess. I would like to encourage all
to add further thoughts to this, especially naming harmonizations under
the given background.

salu2

[1]
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DispatcherView.html
[2]
http://svn.apache.org/viewcvs.cgi/*checkout*/forrest/trunk/site-author/content/xdocs/TR/2004/WD-forrest10.html
[3]
http://corej2eepatterns.com/Patterns2ndEd/ViewHelper.htm
[4]
http://java.sun.com/blueprints/corej2eepatterns/Patterns/ViewHelper.html
[5]
http://corej2eepatterns.com/Patterns2ndEd/DispatcherView.htm

On Sun, 2005-07-31 at 00:31 +0100, Ross Gardler wrote:
> --------------------------------------------------------------
> 
> I do hope someone will take the time to put this into the
> forrest:views 
> documentation once the content has been discussed and agreed.
> 
> 
> 

-- 
thorsten

"Together we stand, divided we fall!" 
Hey you (Pink Floyd)

Reply via email to