(I appologize upfront that I'm not explain all the involved concepts for those not yet up to speed with OSGi ;) See this as some brainstorming. I will try to write somthing more comprehensible and structured, when the concepts gets clearer to me.)

Niclas Hedhman wrote:

On Tuesday 05 July 2005 06:10, Daniel Fagerstrom wrote:
Niclas Hedhman wrote:
running Metro (p.k.a Merlin) on top of OSGi, where the Avalon components
are exposed as OSGi services as well as ServiceManager.lookup() resolves
to OSGi services if no 'local implementations' within the Metro container
exist.
Interesting indeed! I have thought about something like that for Cocoon.
I.e. handling all inter block (bundle) component lookup as OSGi
services. In this way one can use different component containers in
different blocks. Also such OSGi aware component containers would not
need to know anything about Cocoon and its interfaces.
Yes, that sounds very reasonable, I would even dare to go one step further and say that I could implement a block without any component manager. If Cocoon Core exposes relevant services, which my block can hook into, it is from Cocoon's pespective fairly uninteresting how the functionality is achieved.
Exactly.

We would need to implement an own for ECM++ and other containers that we
like to support in the short time frame.

This is about stepping on new turf, and I am sure it is not possible to have all the answers straight away. I think a couple of phases will occur, a) get the whole of existing Cocoon to be a Bundle,

Working on this right now in whiteboard/osgi. I use one Cocoon library bundle that contains the cocoon.jar together with all needed jars (there should be separate bundles for jars that are used by other blocks, but that is a later question). One webapp bundle that contains the samples and has "sitemap" as Bundle-Category. One cocoon_servlet bundle that finds the "sitemap" bundle, creates a CocoonServlet and register it in the http service.

b) get that to deploy properly in Tomcat et al,

There can be some trickiness in getting that to work as servlet containers and an OSGi server has some overlapping concerns, both want to take care of Java security and classloading and both might try to register new URL protocols, which only is allowed to be done once. Servlet containers is neither my interest or something I have expertise in, so I hope that others wih expertize and interest jump in and work on this area. For my usecases I'm happy with using an OSGi http service, the one based on Jetty e.g. http://oscar-osgi.sourceforge.net/repo/http/.

c) get a block bundle to hook into the monolith,

For pure library bundles (i.e. whithout activator) that contains components, one could have some solution where some ECM++ adapter bundle searches for such bundles and serve them through the service manager as today. But that requires exposing all classes of the library bundles. I would prefer a solution like the one that we discussed above where the component bundles (blocks) are "active" and register its components as services. Then the component container within Cocoon core could look through non-internal components through some blocks manager that request the bundle context for services.

For blocks exposing sitemap functionality I would like them to register some kind of sitemap or cocoon or even processor service that basically exposes the o.a.c.Processor interface. This would follow the whiteboard pattern where blocks register a cocoon service and a global blocks manager detects the registration event and start to delgate appropriate requests to it.

I would prefer to have the cocoon service or processor service exposing as little Cocoon specifics as possible. That might make it possible to base different blocks on different Cocoon versions or even to implement processor services that not are related to Cocoon at all, but still cooperates with other sitemap blocks.

d) refactor out core parts that can be seen as optional into bundles, and so on... Many lessons will be learnt on the way, just like Cocoon of today has emerged from past experiences.
Yes.

Could you tell more about your architecture works? In particular how you
handle the hot plugability of bundles. Are you using dynamic proxies or
something like that
http://www.aqute.biz/2005/06/simple-osgi-components.html ?
Not at the moment. I am depending on that the Bundle creator does his part properly. Whether to go with byte code manipulation, as suggested by Mr Kriens, or having something a bit more explicit is something to think about. My primary goal is to get Metro to work, and it has its own Proxy isolation between services already in place, so it is a matter of taking advantage of that.
Ok.

We don't need to get everything hot deployable and updatable at the beginning, but it should be our long term goal. And explicit life cycle handling for components that can be installed updated and removed at every moment is tricky and error prone, so some kind of support for it is necessary IMO.

Lately, I have been working with an explicit custom management side. That
means that each component is free to define its own management
requirement, and optionally implement it if no existing pattern exists.
That means that Pico and Spring *could* co-exist,
How do you handle that, any references?

This started out with me and Stephen McConnell in the same room and my white board.
 http://www.dpml.net/about/notepad/freight/brainstorming.html
which lead to this preliminary draft
 http://www.dpml.net/about/notepad/freight/development.html

We use very little meta information, and rely on naming conventions. This is just a choice and less relevant. In the development.html page, it is not described that the ContextManager is assembled in build time and "packaged" together with the component. Again, implementation details probably not relevant in this context.
Seem interesting, especially I like that it puts more emphasis at Java design pattern and less on some external container. Anyway, I should stop asking about the details in this context, as we certainly not need to change IOC strategy right now, rather isolate our current choice as much as possible and make it as easy as possible for users to use what they want to.

My view is to choose container at the block level, (the BundleActivator
could e.g. extend a PicoActivator).
Yes, that could be reasonable. You may face problems to hook into the Pico/Spring internals though. I was not able to make what I wanted in Metro without touching the guts, i.e. changing the ServiceManager to understand the BundleContext for retrieval of external services, and changes to the 'Model' that Services are to be registered with OSGi. Not too hard, but right now creates a fork of the codebase, and I want to avoid that and that is a much bigger challenge.
Yes, the "ServiceManager" must be plugable to be able to achieve OSGi service - component container integration. And that might not be the case for some of the popular containers. For ECM++ it shouldn't be a problem as we control it. And for other containers, I wouldn't be suprised if there starts some OSGi hype in the near future when people start to realize what one can do with Eclipse RCP etc, then more people will like to use their favourite container whithin a bundle or plugin.

Second time I see a refernence to Context IOC
http://www.theserverside.com/articles/content/IOCandEJB/article.html,
this time when I read the article again, it started to make sense to me
;) Seems interesting.
We have chosen to use a subset of the proposal in the above article. Reason being that it can become very confusing, and makes generic implementation fairly complicated.
Also got that impression.

What is important to notice is that it improves testability quite a bit, and IMHO it communicates "intent" in the code fairly well, compared to anything else I have seen so far. And it is a pattern one can use without relying on containers, if one wants that.
Yes I also like it. It will be interesting to see what you produce.

The fact that bundles can be loaded, then manipulated (config,
permissions, ++) and finally the entire OSGi platform saved into a
deployment bundle is also an interesting aspect.
I'm not certain that the Eclipse OSGi implementation does this.
Well, maybe not out of the box, but the specification allows for it, and I am pretty sure their OSGi implementation don't break the spec intentionally. Also, the configurable parts must co-operate thru the ManagedService interface and the write back of config to the ServiceRegistration, and perhaps Eclipse have chosen not to use it in their bundles.
I refered to the persistense aspect, I got some impression that it wasn't completely supported from the Eclispe mail list, but I don't remember the details. I have no reason to doubt that it supports ManagedService and other services.

For Cocoon it should mean that all services that has configuration,
should implement ManagedService and store all their config state in the
ServiceRegistration. Which means one can tune the running server and no
need to worry about that getting lost on restarts.
Note to other readers: This means that configurations are handled by a
certain Configuration admin service that is a standard service from
OSGi. Both Knopflerfish and Oscar has free implementations, of it.
Yes. OTOH, nothing prevents someone from creating a bundle implementing the Config Admin Service, which in turn is a full Cocoon application with forms and stuff. And it can co-exist, co-run with other Config Admin Services.
Yes, that should be emphased, the standard services is a set of interfaces that can be implemented in any way we like, if we happen to want to use them. They make no assumption on using some particular logging framework etc, while concrete implementations obviously do.

For the moment I don't know how much we should use standard services:
log service, configuration admin, URL handler service, http service etc.
I think we can decide this when we start to understand more about how
the architecture.
I think that is a wise general principle. Once it is made, it is also not necessarily a final decision :o)

BUT, it is easy to
make mistakes keeping references to old instances in other bundles,
causing all kinds of problems. So great care required! :o)
Not so cool. Hopefully we can provide infrastructure that help users
keeping track on the dependencies.
Yes, the mentioned Proxy injection is probably something one should figure out at some point. Perhaps it is a matter of priority and demand more from the block developers initially, and then lax it later with better tools/techniques.


IMHO, Cocoon has a lot of fun time ahead of itself, especially if this exercise can occur with disruption. Once some initial steps are taken, I think a fair bit of the Core internals can be 'migrated' away from ECM++ bit by bit, and a golden opportunity to increase the body mass of people having a clue how the core internals work ;o)
Definitively :)

If I had more Cocoon work than I have, I would throw more cycles your way, but right now I need to concentrate on process control and industrial automation stuff. One have to eat :o)
That is a limiting factor ;), anyway its great to beeing able discuss OSGi and component management with someone who allready has experience in the field.

/Daniel

Reply via email to