Sylvain Wallez skrev:
Carsten Ziegeler wrote:
Daniel Fagerstrom wrote
WDYT?

I'm not sure if a global registry really works. What happens if I want
to use a block twice but with different configurations? Can this be handled?

Yep. How do we (can we) implement the classical scenario that's been considered for blocks, i.e. the skinning with a "multi-skin" that delegates to other skin blocks.

I'm not suggesting to change any of the semantics concerning configuration and wiring of sitemaps (or rather servlets in the current architecture), they will continue to work as before and as specified in various design documents.

The question is about the scope of registered components from a block.

If we should follow the pattern from the block protocol also for components, they would get name like:

  skin:org.apache.cocoon.transformer/xslt

but introducing block name spaces on component ids would require changing most of our current code. And I'm not certain about that such a component lookup scheme would be worthwhile even if we didn't have our legacy.

What I did instead in the current implementation is that the component ids are exactly as before, but that each block has an own container, and this container has a parent container that search for a requested component in the containers of the requested blocks.

The search order is that first the own container is asked, then the connected blocks in the order the connections are listed and if there is a block that the current block extends, it is searched last. All the asked blocks ask their connected blocks in turn before returning an answer. So it will be a depth first search in the connection graph. There is no complete method for stopping circular searches implemented yet.

My current opinion about the just described scheme is that it is far to complicated and has a lot of disadvantages as I described in my original mail in this thread. Frankly, the scheme sucks, and I want to get rid of it ASAP, before it hurt some user. As I conceived it and implemented it and no one have cared to comment it until now, it shouldn't hurt anyones feelings ;)

              --- o0o ---

So what I want instead is the kind of mechanism that you implemented for the component management in the ECM OSGi services bridge.

My current view is that the declarative services manager in OSGi R4, already have good solutions for component handling in a blocks context.

So I think it would be a waste of time to try to invent something conceptually different for Cocoon blocks. We should IMO keep our architecture as similar to the OSGi ones as possible.

That will also make it simpler to migrate to OSGi. And we will have a much easier time to reuse work and patterns from Eclipse, Felix and other communities that build on OSGi.

In that scenario, application blocks depend on a block implementing the "skin" contract, and the implementation chooses the actual skin block to be used depending on some condition (user, time, host, whatever). That means we'll have 3 implementations of the "skin" block interface in the system, and possibly have several different instances of the e.g. "myCorporateSkin" block with different configurations (color, stylesheets, etc).

A skin block is basically a factory, and a wiring is an instruction to ask the factory for a component, give it its deploy time configuration and a unique id and to register the differently configured instances under the different ids in the global service registry. So the above scenario should not be a problem.

Now, in any case, we can't keep the scheme for component lookup that I have implemented. So we need something different. And if you don't like the OSGi inspired that I would like to go for, we need other suggestions.

WDYT?

/Daniel