Sorry if I did not understand your problem correctly.
Neither of the Configuration implementations so far support suppression
of multiple property values. (Background is the assumption that if a
user defines these values in a configuration file, he/she will probably
later want to access them.)
But if you only want the first value, can't you simply use one of the
simple getter methods like getString(), getInt() etc.? These methods can
be used on properties with multiple values, too. They then return only
the first value. This also works with interpolation.
Or you can use the getList() method and then access single elements of
the returned list by index.
Maybe I still don't understand your use case fully.
Oliver
Moran Ben-David schrieb:
I guess a different question whose answer could achieve the same result
is...
Can one turn off multi-value construction of properties?
That is, can one cause multiple occurrences of a property not to accumulate
values into a string of commas... but instead just overwrite the property
value.. or not overwrite it at all?
For example, a file containing:
V1 = value1
V1 = value2
Would result in a configuration of
V1 = value1
Or
V1 = value2
And not
V1 = value1, value2
Thanks,
Moran
-----Original Message-----
From: Moran Ben-David [mailto:[EMAIL PROTECTED]
Sent: Wednesday, August 17, 2005 2:57 PM
To: 'Jakarta Commons Users List'
Subject: RE: [configuration] Property Substitution Policy
Thanks for the help, Oliver.
However, I think I may have led you astray with my proposed code change.
It
was a bit hasty of me and I was suggesting doing the opposite of what I
wanted to do.
I was actually trying to get the substitution to only use the 1st value in
a
multi-valued property. For example, a file like
V1 = value1
V1 = value2
Myprop = {$V1}
Would result in a configuration having
Myprop = value1
This way, when I do config.getString("Myprop") I'd get "value1" and not
"[value1, value2]".
From what I can tell you're suggestion is a different way of actually
causing
Myprop = [value1, value2]
I think. I'm not sure.. I will experiment with what you've suggested.
Thank you!
If it's not the case, I think what I should originally have suggested was
to
write toIterator(Object value) to pull off the first value from the split
and pass an iterator on just that single value.
Again.. thanks for bearing with my mistakes in explaining this.
Moran
-----Original Message-----
From: Oliver Heger [mailto:[EMAIL PROTECTED]
Sent: Wednesday, August 17, 2005 2:21 PM
To: Jakarta Commons Users List
Subject: Re: [configuration] Property Substitution Policy
AbstractConfiguration provides a static setDelimiter() method, which
takes a char that will be interpreted as a list delimiter. So if this
character is detected in a string passed to the setProperty() or
addProperty() methods, the string will be splitted into multiple values.
To disable this behavior you can simply set the delimiter character to a
value that does not occur in your properties, e.g. '\0'. An alternative
is to quote occurences of the delimiter character with a back slash
(e.g. "Hello\, world"). They will then be ignored.
Does this help you with your problem?
Oliver
Moran Ben-David wrote:
I have dug deeper into the commons configuration codebase and uncovered
the
exact place where the decision to do multi-valued substitution is made:
(in PropertyConverter.java)
public static Iterator toIterator(Object value, char delimiter)
{
...
if (value instanceof String)
{
String s = (String) value;
if (s.indexOf(delimiter) > 0)
{
return split((String) value, delimiter).iterator();
}
else
{
return new SingletonIterator(value);
}
}
...
}
I think the easiest thing for me to do is to
1. overload toIterator:
public static Iterator toIterator(Object value);
This function would just disregard the delimiter case of the above
function
but essentially will do the same thing.
2. add a flag to the AbstractConfiguration class to tell wether to do
multivalued substituions.
3. put a condition in AbstractConfiguration.addProperty(String, Object)
to
look at the flag cand call the appropriate version of
PropertyConverter.toIterator().
4. overload the constructor of AbstractConfiguration to accept
initialization of the substitution strategy flag.
5. construct my PropertiesConfiguration (in my custom code) with a
flag=false passed. I.e. don't substitute.
My appoligies if this is a bit of "thinking outloud". I understand
that
this might violate some of the design principles in Commons
Configuration.
I guess that's me saying that I appreciate any guidance anyone has to
offer
in this change.
What will definitely not be fun, is that my code base will diverge from
the
trunk of commons configuration. Perhaps I ought to think of
subclassing
PropertiesConfiguration to handle this.. that might be smarter.. though
calls like super.addProperty might pose a problem.
Thanks for reading if you got this far,
Moran Ben-David
http://www.place-base.com
-----Original Message-----
From: Moran Ben-David [mailto:[EMAIL PROTECTED]
Sent: Wednesday, August 17, 2005 11:01 AM
To: 'Jakarta Commons Users List'
Subject: [configuration] Property Substitution Policy
Hi all,
I have a configuration which ends up having multiple valued properties
as
such:
v1 = value1.1
v1 = value1.2
v2 = ${v1}
My problem is that v2 ends up being set with multi-valued v1.
v2 = [value1.1, value1.2]
Has anybody tried to change this policy to use only the first element
in
the
substitution?
It seems to me that causing the PropertiesReader to toggle, based on
some
sort of parameter passed into the PropertiesConfiguration. The reader
would
toggle between full substitution and first-value substitution.
A better design might be to pass in a strategy object that handles
that?
I.e. allowing anyone declaring the PropertiesConfiguration to either
override the existing subbing strategy by passing in
SubstitutionStrategy/Substitutor object.
Does any one know if this ability is already in the commons
configuration
code base? Is it in the works? I'm looking to at least benefit from
design
guidance form any commons developers if I do make this change myself.
Thanks,
Moran Ben-David
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]