cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel Fagerstrom <>
Subject Re: Problems with lazy loading components
Date Wed, 19 Oct 2005 12:34:27 GMT
Sylvain Wallez wrote:

> Carsten Ziegeler wrote:
>> Daniel Fagerstrom wrote:  
>>> The current behaviour is flawed as we already know from e.g. the 
>>> case with the I18N transformer where dynamic resolution is used when 
>>> static is what would have been expected. With lazy loading things 
>>> get even worse as resolution during the setup phase also can become 
>>> dynamic.
>>> It is time that we solve this problem once and for all.     
>> Yeah, sure, I totally agree. But providing two different source
>> resolvers creates imho more confusion than it really helps. 
> And actually 3 resolvers, as we also have the one in setup() of 
> sitemap components :-)

See my long answer to Carsten.

> Here's another suggestion that doesn't need a new component.
> First of all, when a component is setup (i.e. Avalon lifecycle 
> interfaces), the relative path must *always* be the one where the 
> component is declared, whatever the current environment is. This 
> solves the issues with lazy loading and poolable components that are 
> created on demand.


> Outside of the component setup, we have the current behaviour where 
> the relative path depends on the current sitemap.

First, I don't think state dependent resolution is especially easy to 
understand. Second, how can the source resolver know anything about the 
state of the component that use it?

> Now if a component needs to access some resources relative to the 
> place where it was declared, then it *must* resolve that URI during 
> its setup phase.
> Example:
> class FooTransfomer extends... {
>    ServiceManager manager;
>    String baseURI;
>    SourceResolver resolver;
>    public void service(ServiceManager sm) {
>        this.manager = sm;
>        this.resolver = (SourceResolver)sm.lookup(SourceResolver.ROLE);
>        this.baseURI = resolver.resolve("").getURI();
>        // yeah, we must also release the source...
>    }
>    public void doSomething(String sitemapURI, String configURI) {
>        // Access data relative to the current sitamep
>        Source sitemapSrc = resolver.resolveURI(sitemapURI);
>        // Access data relative to the place where the component was 
> defined
>        Source configSrc = resolver.resolveURI(configURI, baseURI, null);
>        ....
>    }
> }

To me it doesn't seem like a simplification compared to what I proposed. 
Furthermore as mentioned above, it is not obvious how the source 
resolver could know anything about the state of the component that use it.



View raw message