Hi Mansour, Am 09.04.2016 um 06:07 schrieb Mansour Al Akeel: > Hello, > > I am trying to load multiple sources into a CombinedConfiguration > object. However, I need to access each property using a prefix. > For example, a property that resides in "global.xml" needs to be > accessed with a unique prefix: > > glob:this.is.a.global.property. > > And a property that is loaded from "case.properties", needs to be > accessed with the prefix: > > case:another.case.specific.property > > I can extend CombinedConfiguration and override the getters, or create > a map. But if it's possible out of the box, it will save me sometime. > So here's my sample code: > > Parameters params = new Parameters(); > > URL url = > ConfigurationManager.class.getClassLoader().getResource("META-INF/global.xml"); > URL url2 = > ConfigurationManager.class.getClassLoader().getResource("META-INF/case.properties"); > > FileBasedConfigurationBuilder<XMLConfiguration> globBuilder = > new FileBasedConfigurationBuilder<XMLConfiguration>(XMLConfiguration.class); > globBuilder = globBuilder.configure(params.xml().setURL(url)); > > FileBasedConfigurationBuilder<PropertiesConfiguration> > testBuilder = new > FileBasedConfigurationBuilder<PropertiesConfiguration>(PropertiesConfiguration.class); > testBuilder.configure(params.properties().setURL(url2)); > > CombinedConfiguration cc = new CombinedConfiguration(); > > // cc.setExpressionEngine(new XPathExpressionEngine()); > > cc.addConfiguration(globBuilder.getConfiguration(), null, "global:"); > cc.addConfiguration(testBuilder.getConfiguration(), null, "case:"); > > config = ConfigurationUtils.unmodifiableConfiguration(cc); > > > This is working great so far, as I can do: > > global:.this.is.a.global > > Please note the dot in the dotted notation, between the prefix and the > property name. It will be nice if I there is an easy way to remove it, > so that I can do "global:this.is.a.global.property".
When a prefix is provided when adding a configuration to a CombinedConfiguration, internal node structures are created that correspond to this prefix. Resolving of such keys therefore requires a dot (or separator) behind the prefix because the nodes with configuration data are actually child nodes of the prefix node. This is how it works internally. Maybe the following trick could be an option: You could create your own ExpressionEngine implementation that delegates to another ExpressionEngine instance. In the implementation of the query() method you modify the passed in key by replacing the first ":" by ":." and then invoke the wrapped engine. I guess this should achieve what you want and is pretty straight-forward. Oliver > > Any advice ? > > > Thank you. > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > For additional commands, e-mail: user-h...@commons.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org