On Aug 25, 2008, at 11:32 PM, Pascal Voitot wrote:
I have a remark: from my experience, in big projects,
people tend to
create
lots of configuration files for each modules and at the end it
appears to be
really hard to maintain something coherent and easy to use. You
spend more
time looking in files to find the parameter you need to change and if
documentation is not perfect, this can become totally impossible for a
non-expert.
imagine if you have 50 modules, you may have 50 different places for
configuration?
So will it be possible to aggregate configurations to centralize
data and
optimize configuration mechanisms?
Yes the idea is to have some predefined locations:
* a global xwiki.properties file
* some xwiki documents (not fully defined yet, need to read again
sergiu's proposal since he had proposed some locations)
BTW this is already done in the DefaultConfigurationSourceCollection
class :)
Thanks
-Vincent
On Mon, Aug 25, 2008 at 2:17 PM, Marius Dumitru Florea
<
mariusdumitru.florea(a)xwiki.com> wrote:
> Hi Vincent,
>
> I like it. Just make sure this configuration components will be
> available
> in velocity code as well. As you know, I had to write a plug-in for
> the
> WYSIWYG mainly because currently there's no way of getting a XWiki
> configuration parameter without having programming rights. Also, I
> think
> we should allow a configuration source to contain parameters for
> different
> modules. But I guess this is easy to implement using the namespaces
> you
> mentioned.
>
> So I'm definitely +1.
>
>> Hi,
>>
>> Here's a proposal for implementing configuration in the new
>> architecture, using components.
>> Note: I think this is compatible with Sergiu's proposal here:
>>
http://tinyurl.com/6md5jd
>>
>> General requirements
>> =================
>>
>> * Each module/component can define its own configuration
>> * Accessing configuration parameters from Java should be strongly
>> typed (ie. getLinkLabelFormat() for getting the link label and not
>> getParameter("linklabelformat"))
>> * It should be possible to load Configuration data from different
>> sources (properties file, xml files, database, xwiki documents, etc)
>> * Configuration sources should have an order
>> * Any module/component should be able to get the configuration for
>> other module/component but in read only mode
>> * It should be possible to dynamically add a new configuration
>> source
>> at runtime
>> * Configuration data should be loaded and cached
>>
>> Proposed Implementation
>> ====================
>>
>> * Each module/component defines its configuration in a component
>> which
>> is a java beans. For example let's take the rendering module. We
>> would
>> have a RenderingConfiguration component as in:
>>
>> public interface RenderingConfiguration
>> {
>> String getLinkLabelFormat();
>> }
>>
>> public class DefaultRenderingConfiguration implements Initializable,
>> Reloadable, RenderingConfiguration
>> (in practice will extend AbstractConfiguration class probably)
>> {
>> private String linkLabelFormat;
>>
>> // Injected
>> private ConfigurationManager manager;
>>
>> public void initialize()
>> {
>> // Define the Configuration sources here. Default
>> configuration sources would be defined in AbstractConfiguration
>> probably)
>> List configurationSources = ....
>>
>> // Configuration namespace (all properties should start with
>> the namespace value)
>> String namespace = "rendering";
>>
>> reload();
>> }
>>
>> // Should be located in AbstractConfiguration
>> public void addConfigurationSource(ConfigurationSource source);
>>
>> public void reload()
>> {
>> // Populate java bean
>> manager.populate(this, configurationSources, namespace);
>> }
>>
>> public void setLinkLabelFormat(String linkLabelFormat) {...}
>> public String getLinkLabelFormat() {...}
>> }
>>
>> * The DefaultRenderingConfiguration class is registered as a
>> component
>> in components.xml and with a singleton lifecycle. This means the
>> data
>> it contains are cached for the whole application lifetime. They
>> can be
>> reloaded using reload().
>> * The ConfigurationManager implementation will use Jakarta BeanUtils
>> to automatically populate a javabeans. It'll also use Jakarta
>> Commons
>> Configuration for implementations of ConfigurationSource.
>> * ConfigurationSource interface should have a method like: Object
>> getParameter(String name). More details to be defined later.
>> * Code wanting to get Rendering Configuration would simply define a
>> component dependency on DefaultRenderingConfiguration and they'll
>> have
>> it injected for them.
>> * There'll be a XWikiDocumentConfigurationSource that gets parameter
>> values from one or several xwiki documents. We'll need to define how
>> we get them but we could provide some standard
>> XWikiConfigurationClass
>> for a single configuration element for example.
>> * The idea of the namespace is to use the package name and remove
>> the
>> "org.xwiki" or "com.xpn.xwiki" prefix. For example
>> "org.xwiki.rendering.*" leads to "rendering.*".
>>
>> WDYT?
>>
>> If we agree I can whip up a first implementation of this relatively
>> quickly I think.
>>
>> Thanks
>> -Vincent