commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Oliver Heger <oliver.he...@oliver-heger.de>
Subject Re: [configuration] Adding Nodes in certain position
Date Fri, 06 May 2011 19:06:35 GMT
Am 05.05.2011 16:49, schrieb Sergio Criales:
> I did that you explain, and I wasn't able to insert thet new node:
>
>        List keyss = config1.getList("presentacion/movil/key");
>        System.out.println("Lista de keys: " + keyss);
>        keyss.add(2, "2.5");
>        config1.setProperty("presentacion/movil/key", keyss);
>
> the message was java.lang.IllegalArgumentException: prepareAdd: Passed
> in key must contain a whitespace!

Ah, I see. My example does not work correctly with the XPath expression 
engine which is used by you. As a workaround you can try to replace the 
setProperty() call by a combination of clearProperty() and 
addProperty(). However, the key passed to addProperty() must be 
different than the key passed to clearProperty() because it has to 
comply to the special syntax used by the XPath expression engine for 
adding new properties. Details about these keys can be found in [1].

[1] 
http://commons.apache.org/configuration/userguide/howto_xml.html#The_XPATH_expression_engine

>
> and the xml is
>
> <?xml version="1.0" encoding="UTF-8"?>
> <repositorio ss="">
>    <presentacion>
>      <movil>
>        <key>uno</key>
>        <key>dos</key>
>        <key>tres</key>
>        <key>cuatro</key>
>      </movil>
>    </presentacion>
> </repositorio>
>
> Well, then I found this solution please check if it is right:
>
> I used the document directly to insert the new node doing this:
>
>      Document document = config.getDocument();
>
>      Element nuevoKey = document.createElement("key");
>      nuevoKey.setAttribute("name", leaf.getName());
>      nuevoKey.setTextContent("temporal");
>
> and then add this element whith
>
>          element.insertBefore(nuevoKey, key);
>
> key is the node where I want to insert the new node before
>
> then to leave the config consistent I did this
>
>        String xmlSource = XmlUtils.getStringFromDom(document);
>        config.clear();
>        config.load(new StringReader(xmlSource));

Yes, this solution looks good - despite the fact that Commons 
Configuration does not support you very well for your use case.

Oliver

>
> thanks in advance,
>
> Sergio Criales
>
> 2011/4/21 Oliver Heger<oliver.heger@oliver-heger.de>:
>> Am 20.04.2011 22:14, schrieb Paul Benedict:
>>>
>>> If the ordering matters, I would introduce a new OrderedConfiguration
>>> interface for greater positioning control.
>>
>> Yes, this is a completely new feature. However, I fear that its
>> implementation won't be straightforward.
>>
>> Currently, the hierarchical configuration implementation uses the
>> ConfigurationNode interface to update its internal node structure. The
>> cleanest solution is probably to extend this interface by an insert()
>> method. But this would break binary compatibility and thus require a major
>> release.
>>
>> @Sergio: If you only have simple structures like a list with nodes and
>> values (and no child nodes or even complex sub trees), the following
>> approach should work:
>> - Call getList() with the correct key to obtain the current values of the
>> nodes affected.
>> - Insert the new node value at the desired position in the list.
>> - Call setProperty() with the same key and the modified list. This will
>> update the nodes structure correspondingly.
>>
>> But as I said, this only works for simple scenarios.
>>
>> Oliver
>>
>>>
>>> On Wed, Apr 20, 2011 at 3:02 PM, Oliver Heger
>>> <oliver.heger@oliver-heger.de>wrote:
>>>
>>>> Hi Sergio,
>>>>
>>>> Am 20.04.2011 16:03, schrieb Sergio Criales:
>>>>
>>>>   Hi There,
>>>>>
>>>>> I want to add a node before another node, but in the API I wasn' t
>>>>> able to find how to do it, please any ideas to do this???
>>>>>
>>>>> Sergio Criales
>>>>>
>>>>>   this is indeed a good question! With the standard API defined by the
>>>>
>>>> Configuration interface there does not seem to be an obvious solution for
>>>> this problem. All methods for adding properties append the new node(s) to
>>>> existing ones.
>>>>
>>>> Also the ConfigurationNode API (which represents the nodes stored in a
>>>> hierarchical configuration) does not support inserting a child node at a
>>>> specified position.
>>>>
>>>> Obviously, nobody had this requirement before. Does anybody else have an
>>>> idea?
>>>>
>>>> Oliver
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> 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
>


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


Mime
View raw message