Hi Sergiu,
On Apr 5, 2012, at 5:55 PM, Sergiu Dumitriu wrote:
Hi devs,
Currently, requesting a component instance without a hint will look for the
implementation that uses the "default" hint, which makes it difficult to change
the implementation in an XWiki instance. Sure, it is easy as long as all the
implementations use the "default" hint, but choosing the default between
alternative implementations that should all still be usable by themselves is not
possible.
Also, "default" is not really a good hint, since it describes the state of the
implementation, not the technology, the aspect that makes it different from the others. It
would be better to name each implementation with a proper hint.
I propose to define a mapping that can specify which hint is the default for a component.
In a text file, META-INF/component-defaults.txt, we'll keep
componentinterface=defaulthint mappings. For example:
com.xpn.xwiki.store.XWikiStoreInterface=hibernate
com.xpn.xwiki.store.migration.DataMigrationManager=hibernate
And then, when we lookup the current storage implementation, we don't need to check
what is the configured hint in xwiki.cfg (or xwiki.properties), we can just request the
default implementation.
If there's no mapping for a component, we'll continue to use the
"default" hint.
I'm not sure where exactly to keep such files. We bundle a components.txt file in
each jar containing component implementations. We could do the same for the components we
consider the platform defaults, and allow overrides in the
WEB-INF/classes/META-INF/component-defaults.txt file. Still, this means that whenever
platform defaults change, we need to keep another special section in the release notes, to
let users know about these changes, so that they can manually revert to the old default if
they need to.
In the future we could change existing components to give proper hints instead of
"default", where such a change is applicable.
Another idea is to not use "default" at all, and instead go for a generic
"xwiki", "xe", "xwiki-platform" or something like that
whenever there's just one implementation for a component and we can't find another
hint to describe it.
WDYT?
This is not really how it's been designed ATM. Whenever you wish to use a different
implementation of a component you use a component implementation with the same role and
same hint. You then make it available in your classpath. (Of course you can also do this
at runtime simply by registering a new implementation over the old one).
To decide which implementation is used you use a priority order, as described on:
http://extensions.xwiki.org/xwiki/bin/view/Extension/Component+Module#HOver…
I'd be curious to know your exact use case and understand why the current mechanism
doesn't work for it.
Thanks
-Vincent