Stefano Mazzocchi wrote: >Sylvain Wallez wrote: > >>Attaching a label to a component (e.g. a generator) makes this label >>implicit for _all_ uses of that component. This is useful when the kind >>of information represented by the label is always produced by that >>component, since this avoids adding this label everywhere in the >>pipeline where this component is used. >> >>In Cocoon's documentation sitemap, the "content" label is associated to >>the document DTD, and this is _most often_ produced from files, hence >>the label "content" on the "file" generator. Now this is only _most >>often_ and not _always_ : todo.xml, faq.xml, changes.xml aren't in the >>document DTD and need an initial transformation, and only after this >>transformation can they can have the "content" label, as in the >>following extract from the doc sitemap : >> >> <map:match pattern="body-todo.xml"> >> <map:generate type="file-nolabel" src="xdocs/todo.xml"/> >> <map:transform src="stylesheets/todo2document.xsl" label="content"/> >> <map:transform src="stylesheets/document2html.xsl"/> >> <map:serialize/> >> </map:match> >> >>Since "file" generator has a "content" label, it cannot be used here, >>otherwise "todo2document.xsl" isn't applied when the view is requested. >>So a solution was to define a new "file-nolabel" generator, which has >>the *exact same definition* as the "file" generator but doesn't have the >>label. >> >>The problem with this approach is that only 3 files in the whole docs >>have this special requirement of an initial transformation, and this >>requires to create a new component and all the associated overhead : >>duplicate configuration, duplicate handler in the component selector and >>duplicate object pool. As Vadim pointed out, do that in a shared Cocoon >>installation where every user can have its sitemap and you can buy some >>more RAM ! >> >>So my proposal was to allow to locally "substract" a label defined at >>the component level. The above snippet would then become : >> >> <map:match pattern="body-todo.xml"> >> <map:generate type="file" src="xdocs/todo.xml" label="-content"/> >> <map:transform src="stylesheets/todo2document.xsl" label="content"/> >> <map:transform src="stylesheets/document2html.xsl"/> >> <map:serialize/> >> </map:match> >> >>This avoids the overhead of declaring a new generator and clearly shows >>that we have a local modification of the label globally attached to the >>"file" generator. >> >>Is it more clear ? And if yes, what do you think ? >> > >Ok, perfectly clear. > >Now, please, tell me: why is the other solution we proposed to this >problem (that is: exit on the 'last' conten view, not the first one) >wasn't accepted. I still think it's the most elegant solution. > >Sure it is harder to implement, but we never did designed forced by >implementation difficulties and I don't see why we should start now. > Let me put back the explanations I gave to Volker Schmitt, with some more details. The below sitemap will be used for these details (high-level structural elements skipped for simplicity) :
<map:view name="content" from-label="content"> <map:transform src="content2html.xsl"/> </map:view> <map:resource name="foo"> <map:transform src="foo.xsl" label="content"/> <map:serialize/> </map:resource> <map:resource name="bar"> <map:act type="updatedatabase"/> <map:transform src="bar.xsl"/> <map:serialize/> </map:resource> <map:pipeline> <map:match pattern="foobar"> <map:generate src="foobar.xml" label="content"/> <map:act type="findtype"> <map:call resource="{type}"/> </map:act> </map:match> </map:pipeline> ---oOo--- From a user point of view, knowing when branching will occur can become a nightmare since you have to crawl all branches that can participate in a request handling (matchers, selectors, actions, resource calls, etc) in search for this last label. In the above sitemap, there's a "content" label on the generator, but the "foo" resource also has this label. If the last label is used, you cannot know by reading the "foobar" pipeline if the view will start at the <map:generate> or not. You have to examine all possible branches (and in the above case, they're dynamic) to find other places where the same label is used. Using the first label makes the behaviour more predictible : if a labelled statement in the sitemap is reached, then we *know* that the view starts at this statement. ---oOo--- Implementation will be difficult, as it requires the whole regular pipeline (the view-less one) to be built before deciding at which point should occur branching. I agree that specs shouldn't be constrained by implementations details. However, we must be aware that this requires some big changes in the existing pipeline architecture to "break" the regular pipeline at a point. But the important point here is that we need to fully build the regular pipeline to know the branching point (see below). ---oOo--- Corollary to the previous point, building the regular pipeline may have some side effects (e.g. actions) _after_ the branching label, but we cannot know beforehand that these actions shouldn't have been executed because they're not in the view. This is illustrated in the above sitemap : the "bar" resource has an action that modifies the system state, but since there is no "content" label in the "bar" resource, the view starts from the generator, that is *before* the action in the sitemap flow. Should this action be executed when the view is requested ? This leads to an interesting question. In "retuning sitemap design" (see http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=101057440717758&w=2), you classify sitemap statements in two main categories : direct components (generators, transfomers, etc) and indirect components (matchers, selectors, actions, etc). How does view handling relate to this classification ? In the current definition of views, there is no difference between direct and indirect components, and the sitemap is executed up to a matching label that causes a jump to the view. Components after the view label, both direct and indirect, aren't executed. If we change the behaviour and branch from the last label, this means that *all* indirect components of the regular pipeline are to be executed because they perform the routing in the sitemap and there execution is therefore required to find the last label. Is this really what we want ? My opinion is no : this would make understanding views and predict there behaviour really difficult. Views are a powerful concept and many users already have difficulties to master them. Turning them to black magic won't promote their use. ---oOo--- Conclusion (thanks for those who have read all of the above ;) I consider the label-on-component feature a writing facility to avoid tedious repetition in the pipelines. The documentation sitemap (with "file" / "file-nolabel") clearly shows that views are attached to a particular DTD that exists at some places in the pipelines, and that attaching their labels to general-purpose components like the resource generator may not be a good thing : 80% of the uses of that generator produce the correct DTD, but we need to be able to handle the remaining 20% without sacrificing the writing facility. That's why I suggested these "substractive labels" to avoid the declaration of a new component and the associated overhead. Also, I didn't find in the archive the reasons for this "move to last label" todo. And I wouldn't be happy if this was proposed as a workaround for the label-on-component problem. We should not constrain the definition of views by the bad side-effects of a writing facility. ---oOo--- >>And please don't forget my other post about views in aggregation :) >> > >Sorry, I thought that was sorted out: what's the problem again (I think >I missed it previously). > One-click reminder ;) http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=101683844805545&w=2 Sylvain -- Sylvain Wallez Anyware Technologies Apache Cocoon http://www.anyware-tech.com mailto:[EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]