You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Mansour Al Akeel <ma...@gmail.com> on 2016/04/09 06:07:35 UTC

Prefix for combined configuration

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".

Any advice ?


Thank you.

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org


Re: Prefix for combined configuration

Posted by Mansour Al Akeel <ma...@gmail.com>.
Oliver,
In fact , this is exactly what I ended up doing, implementing
ExpressionEngine and I think in fact this is the proper way to do it.
However, I am facing some issues, doing it cleanly, because I am
extending DefaultConfigurationKey. Unfortunately, the keyBuffer
(StringBuilder) is private, and can not access it from the child
class. The only way is to copy/paste everything in
DefaultConfigurationKey.

After all, I think I am on the right track.
Thank you a lot.


On Sat, Apr 9, 2016 at 2:45 PM, Oliver Heger
<ol...@oliver-heger.de> wrote:
> 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-unsubscribe@commons.apache.org
>> For additional commands, e-mail: user-help@commons.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org


Re: Prefix for combined configuration

Posted by Oliver Heger <ol...@oliver-heger.de>.
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-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org