Ok, I'm starting to get it. So you're saying that Merlin always has a root block addressable via "/", but this root block has no real name, hence my problems trying stuff like "/root" as I expected the root block to be called "root". I actually have no real preference between having this root block unamed or having it always started and referenced as "root". I guess it would probably make it clearer if you always have a root block named "root".
What makes me think is that #<interface-name> part you can add to a URL to have access to services exported by a block. Why do you treat blocks differently from the components it contains, as a block is also a component ? Maybe could Merlin understand the following url [base-url]/root/myblock as an access to the block myblock and all the services it exports, meaning the requester has to cast the returned object to the interface he / she expects, provided of course that the returned object implements all the interfaces (services) declared in the descriptors. I guess you're using dynamic proxies to represent the services exported by a block. This dynamic proxy could implement ALL the interfaces that a block export, leaving the cast operation to the user. I think this is exactly what is done when you request a "normal" component (ie not a block). A component exports services, and when you get that component from the container, it implements ALL the interfaces that are declared in the component descriptor. Otherwise (to remain coherent), you can proxify EVERY component that are returned by the container and make them implement either ONE interface (the interface beinig specified by the #<interface-name> part of the URL) or ALL interfaces (when nothing is specified in the URL). This would allow the following URL : [base-url]/root : returns the root block as a component (proxy) implementing all the interfaces it exports. [base-url]/root#my.package.MyService : returns the root block as a component (proxy) implementing the MyService interface (provided this root block really exports the MyService interface) [base-url]/root/mycomponent : returns mycomponent contained in the root block. This component implements all the interfaces it declares in its deployment descriptor [base-url]/root/mycomponent#my.package.MyOtherService : returns mycomponent contained in the root block. This component implements the MyOtherService interface (provided this component really provides the MyOtherService interface). Merlin could do some checking to see if a requested component implements the Service interface it is asked for. Proxying component allows returned objects to be narrowed to what the user really expects, hiding the technical / undesirable details Merlin needs in its internals (useful for block component). Proxying components could also allow some technical plumbing, but that is another topic ;-) What do you think ? Laurent ----- Original Message ----- From: "Stephen McConnell" <[EMAIL PROTECTED]> To: "Avalon framework users" <[EMAIL PROTECTED]> Sent: Thursday, June 12, 2003 1:48 PM Subject: Re: [merlin] URL block protocol > > Hi Laurent: > > The info your requesting: > > The root block is addressable via "/" > Sub-blocks are addressable via "/<block-name>/<block-name> > A service exported by a block is available via appending > #<interface-name> to the URL. > > Laurent Rieu wrote: > > >Hi, > > > >I'm guessing that as the JNDI-zed way to access services is not that mature, > >I have to do with the URL-ized way. > > > > Its a minimal first cut. The better approach is a full JNDI > implementation that handles the block protocol without requiring any > Merlin API references. > > > >According to the > >BlockURLHandler.parseURL() javadoc, Block URL are supposed to conform to one > >of the following patterns: > >block://localhost/root#org.apache.playground.Demo > >block://localhost/root/subcontainer/demo > > > > /root#org.apache.playground.Demo > > This is addressing a top level component (or container) named root. > This is not the same as addressing the top level container which is > named "/". > > > > > > >Well, I'm having a single component deployed twice in two different > >containers, the root one and a 'test' one, as shown in the following > >block.xml file: > > > ><block> > > <info> > > <name>root</name> > > </info> > > <implementation> > > <component name="resource-manager" > > class="test.services.resources.ResourceManagerImpl" > >activation="startup"> > > </component> > > <container name="test"> > > <component name="resource-manager" > > class="test.services.resources.ResourceManagerImpl" > >activation="startup"> > > </component> > > </container> > > </implementation> > ></block> > > > >Fist, what's about this 'root' container ? > > > > The name of a block is only relevant for sub containers. > There is an open question here - should Merlin establish a root > container by default? In which case your assumptions o9n addressing > would have worked. My feeling is that maybe we should do this - i.e. > establish a root block automatically then add blocks and componets to > the root. > > >Is it an implicit name (which has > >nothing to do with the actual block name as declared in the block.xml file > >?). > > > > Yes. > > >The fact is that trying to use the URL pattern > >[kernelURL]/root/resource-manager it looks like Merlin doesn't know about > >the 'root' path as shown in the stack trace below : > > > <snip/> > > >This works when I remove the 'root' element in the URL > >(([kernelURL]/resource-manager). > > > > Yep - because your now addressing the top level block. > > >The following URL don't work either (maybe that is what's expected, but a > >litte documentation about the URL pattern would help ;-) ) : > >[kernelURL]/root#test.services.resources.ResourceManager > > > > Because /root addresses a container or component named root containered > within the top level container. > > > > >(test.services.resources.ResourceManager being the service interface > >exported by my component) > >[kernelURL]/root#test.services.resources.ResourceManagerImpl > >[kernelURL]/#test.services.resources.ResourceManager > >[kernelURL]/#test.services.resources.ResourceManagerImpl > >[kernelURL]/test#test.services.resources.ResourceManager > >[kernelURL]/test#test.services.resources.ResourceManagerImpl > > > >Actually, the only URLs that work seem to be: > >[kernelURL]/resource-manager > >[kernelURL]/test/resource-manager > > > >Laurent (who thinks this URL pattern should be clarified !) > > > > :-) > > Maybe should add an implict block as "/" so that /root makes sence) > What are you thoughts on this? > > SJM > > -- > > Stephen J. McConnell > mailto:[EMAIL PROTECTED] > http://www.osm.net > > Sent via James running under Merlin as an NT service. > http://avalon.apache.org/sandbox/merlin > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > ************************************************************************ Ce message a ete inspecte par un anti-virus Nous vous rappelons que la taille des messages ne doit pas depasser 1.5 Mo ************************************************************************ --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
