You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@forrest.apache.org by Thorsten Scherler <th...@apache.org> on 2006/01/10 09:53:44 UTC

Dispatcher - structuring the content model (was: Mapping URLs to documents)

Hi all,

thx Andreas for mentioning 
http://wiki.apache.org/lenya/ProposalContentModel
again and starting the URL discussion. Really nice presented
information.

The latest discussion about URL mapping [1] and the above mentioned wiki
page sounding like the reason I started my work on the dispatcher (in
forrest - first implementation in the next release). It was called
forrest:views in the beginning to express its main purpose but views is
an often used term and in the end caused confusions. 

A view is for me an aggregation of different data sources transformed
for a specific format. The URL
http://lenya.apache.org/community/index.html is defined by the html view
of the document http://lenya.apache.org/community/index. Andreas called
it canonical URL which is the path *without* file extension and seems to
share this definition of "view".

I have sometimes problems with the usage of "document". In a html view a
document is the main content. *Not* the navigation, menu, ... that is
extra content. It can contain *links* to other assets but normally not
keep them. 

...but IMO a URL does not have to be connected to *just* one "document"
or to a document at all. 

El vie, 06-01-2006 a las 14:24 +0100, Andreas Hartmann escribió:
> Supporting the other case, multiple URL suffixes for a document, is
> certainly
> necessary. But I'd separate this information from the document itself.
> IMO the URL suffix should be used to request a certain view of a
> document:
> 
> /foo              -> HTML view
> /foo.html         -> HTML view
> /foo.pdf          -> PDF view
> /foo.print.html   -> print HTML view (if CSS is not appropriate or
> whatever)
> 
> The canonical URL of a document whould be assembled from the canonical
> base URL (/foo) and the extension denoting the view.

In the default publication the html view is done in the page2xhtml.xsl.
Here we are arranging the different contracts (like breadcrumb, tabs,
menu, ...) which are coming from an earlier aggregation as input. 

The main problem with this approach is that it is expecting a given data
model (aggregation) which is not easily extensible. Further more some
views are not using all the data model given by the aggregation (e.g.
*.print.html will probably only render the main document and not any
menus). 

IMO each URL space should be able for deciding which business services
(such as documents, assets, navigation, ...) to use and how to render
the resulting business data. 

This leads to a different URL handling focus - away from document
centric. A document can be (but do not have to be) behind a certain URL.
In the forrest dispatcher that is controlled by the structurer.

http://forrest.apache.org/docs_0_80/howto/howto-structurer-dsl.html

"We developed the structurer to let the user decide where to place
elements in e.g. html pages. We started this work with the skinconf.xml
where you could configure certain elements and their positions. These
elements were known under certain names. It was up to the skin designer
to support this configuration and the elements

...

The structurer allows us to define the order in which forrest:contracts
appear, and also to group them using forrest:hooks. 

forrest:hooks are containers that are only used for layout reasons. They
do not add any content nor functionality to the output. They add only
layout information to the output. Actually e.g. a <forrest:hook
name="layoutId"/> will be transformed to <div id="layoutId"/> 

forrest:contracts are functionality or extra content that a theme can
use to display the request. Sometimes a contract delivers
format-specific markup, other times it delivers a format-independent
string. We decide different kind of contracts, static one (like
described in the contract howto), semi static (which offer configuration
parameter in the structurer) and dynamic contracts (which offer
semi-static configuration and/or requesting the content)."

http://svn.apache.org/viewcvs.cgi/*checkout*/forrest/trunk/main/template-sites/v3/src/documentation/resources/themes/common/html/content-minitoc.ft

This is the contract to generate a table of content of an xdoc in
forrest. It should demonstrate the idea of contracts in general. They
are standalone, self explaining, configurable pieces of xsl templates
created out of pure maintaining reasons. 

http://forrest.apache.org/docs_0_80/howto/howto-structurer-contracts.html#enhanceMaintenance

This contracts provide
1) description -  what does the contract do? What do the properties
mean? What else does the user have to know?
2) usage - how can I use the contract in the structurer?
3) implementation - till now the dispatcher only supports xsl as
inputFormat but that should be extensible in the future.

If you look at the link again, you will find in the usage tag
dataURI="cocoon://#{$getRequest}.toc.xml". This attribute, defined in a
structurer, makes the dispatcher contact
cocoon://#{$getRequest}.toc.xml" for the input data for this contract.
If you need to contact more then one business service in for a contract
one can jx:import as many as one want since the structurer is a jx
template. 

Now let us say $getRequest="index", then we are requesting the uri
cocoon://index.toc.xml. This could be the result from the toc.xml view
on the document (id="index"). The site structure finally defines which
"document" (main content) with id="index" is linked.  With the
dispatcher you can even create a view on a URL where no "document" (main
content) exits e.g. just static output.

The URL mapping is defined by the theme fallback mechanism of the
dispatcher. You can define for each URL a specific view (structurer) or
you can define a directory based one or you can use the theme default
structurer or the forrest core structurer. 

...and all this for different formats.

salu2

[1] http://marc.theaimsgroup.com/?t=113655405500001&r=1&w=2
-- 
thorsten

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