Just FYI I have started implementing this to see how it went and it's looking very good. Of course, I have some small implementation modifications compared to what I imagined below but the idea and principles stay the same.
Let me know if I should continue and finish it. I reckon I'll need only 1 working day to finish a first working implementation. Thanks -Vincent On Aug 24, 2008, at 6:54 PM, Vincent Massol wrote: > 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 > _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

