Hi Anca, On Apr 6, 2012, at 10:58 AM, Anca Luca wrote:
> On 04/06/2012 08:51 AM, Vincent Massol wrote: >> On Apr 5, 2012, at 6: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#HOverrides >>>> >>>> I'd be curious to know your exact use case and understand why the current >>>> mechanism doesn't work for it. >>> 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. >> This is supported already. >> >>> 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. >> Yes that's because the hint is not a configuration param. It's an intrinsic >> information about what it represents. When you have: >> >> @Named("ldap") >> public class DefaultLDAPAuthenticator implements Authenticator >> ... >> >> It means that (Authenticator,"ldap") means the LDAP Authenticator >> implementation and not something else. If you want to change that >> implementation you need to write a component with (Authenticator,"ldap"). >> >> Now if what you want is way to have *several* implementations of the same >> Role at once in the classloader you need to use different hints and if what >> you want is pick one implementation from those various implementation and >> make it your default you need to configure somewhere which one to use. We >> use that everywhere in the XE. >> >> 2 examples: >> * Macros. In this case it's the user who says which ones to use by using the >> "hint" as the macro name telling XWiki which macro implementation to use: >> {{hint .../}} >> * Storage implementation. In this case we want only one default storage impl >> to be used. What we do is have a Storage Manager which is in charge of >> deciding which implementation to use. In this case the selection is based on >> a configuration param which contains the hint of the implementation to use >> (for ex: xwiki.store.main.hint=hibernate). >> >> I don't see the limitation. It's even more powerful than what you suggest >> (which is static rewiring of component implementations) since in this case >> we support dynamic rewiring based on any rule. >> >> I still fail to see the use case that would make what you suggest required. > > Ok, so you write a factory (call it manager if you want, I can also call it > proxy if I want) that has the hint default and that actually does nothing but > give you the implementation that was configured at default with one or the > others of the means. > So if you want the user to have a choice (the dude installing xwiki and > having it running), you must _always_ write these factories, as soon as there > is more than one implementation, and have it read configuration from some > place. > If somebody builds something based on xwiki platform and adds an extra > implementation and wants to be able to change that, he needs to write his new > implementation + this factory (+ a bit of magic to actually overcome the fact > that the old implementation was "default" and now his new implementation must > be default but also needs to be able to dispatch to the old default -- here I > so much agree with sergiu default shouldn't exist). > > In addition, most of these factories will work exactly the same: they will > look for a param in the configuration file and use that hint as the default. > Of course we can provide an > AbstractXWikiConfigurationBasedGenericComponentImplementationManager to make > it easy for people to write their own. > > It is covering the use case, but it's a pain. In addition, it really depends > on the fact that the person that wrote the multiple implementations thought > of whether there should be something that dispatches between them or not > (because somebody at some point might wanna change it). > > Since all these managers will be the same, why not add an "implicit > implementation" of this in the CM, by just allowing a hint to be configured > in the config file, and the CM would read it on the fly? > > This doesn't mean that you cannot write your own if you want, that dispatches > based on the moon phase, for example. > > Note that I push more towards dumb-simple things, although I understand why > it's a complex topic. Sorry, I replied to your mail first and then I saw and replied to Sergiu's. I have provided more details in the that second mail. Thanks -Vincent _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

