On Thu, Apr 5, 2012 at 8:44 PM, Sergiu Dumitriu
<sergiu(a)xwiki.com> wrote:
On 04/05/2012 12:51 PM, Anca Luca wrote:
On 04/05/2012 06:42 PM, Vincent Massol wrote:
>
> 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.
"...choosing the default between alternative implementations that should all
**still be usable by themselves** is not possible"
The overrides mechanism allows to change which component will be returned
for the "default" hint, but all the others will be invisible.
One usecase I see is that you have multiple
implementations and you want
to change the default one for a specific running instance of xwiki.
Overwrite mechanism only allows you to say which impl should be used
from the _components with the same hint_. However, you cannot change the
hint of a component at configuration time, so if you have a standard
distr of xwiki and you want to use ldap authentication, let's say (if
only auth was impl with components), unless you do some java to add the
default hint to the ldap implementation and then to specify that this
one has priority over all the default ones, I don't see how you can
re-wire the default.
Exactly. For most of the "services" the XWiki platform currently has
(storage, cache), we don't have a "default" implementation, but we rely on
a
kind of factory to lookup the configured default. That is an actual factory
class in the case of the cache service, but just more code in the old
XWiki.java class for the storage initialization. A standard way of selecting
the default means that we'll need less factories, and less code is always a
good thing.
Now, suppose one of the older components that had only one implementation,
"default", gets alternative implementations, and we want to be able to allow
more than one to be active in a wiki, and let the administrator decide which
one should be considered the default. How can we approach this? The only way
is indeed to have multiple hints, but last time I checked this resulted in
more than one instance, even for @Singleton implementations.
Yep different role or hint produce different instances but AFAIK it's
not really an explicit choose but more lazyness since it's a bit more
complex (just a bit and is not technical reason to prevent to support
it if we want to). The thing is that we often restraint what our CM