[ 
https://issues.apache.org/jira/browse/CONFIGURATION-452?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13052158#comment-13052158
 ] 

Fabien Nisol commented on CONFIGURATION-452:
--------------------------------------------

The following scenario si probably not the best concerning performance, but it 
maybe worth a try:

# check if the xpath expression leads to an existing node
## if it does, simply modify it
# if it does not
## decompose the xpath into sub-paths using "/"
## recompose the path, one after the other
## when the element cannot be found, create it

However, the rule to recreate the node could be quite complex. 

For example:

{code}
<property>
  <to>
  </to>
</property>
{code}

calling setProperty("/property/to[@set='a_selector']/@attribute","a_value");

would need to create a @set attribute with the value 'a_selector' , and then 
add an attribute '@attribute' with the value 'a_value'

{code}
<property>
  <to set="a_selector" attribute="a_value"/>
</property>
{code}

I agree, all this seem easier to say than to realize !





> HierarchicalConfiguration with XPathExpressionEngine does not work when 
> setting a new property
> ----------------------------------------------------------------------------------------------
>
>                 Key: CONFIGURATION-452
>                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-452
>             Project: Commons Configuration
>          Issue Type: Bug
>          Components: Expression engine
>    Affects Versions: 1.6
>         Environment: all
>            Reporter: Fabien Nisol
>
> The following code does not work as expected
> {code:title=Bug.java|borderStyle=solid}
> public class Bug {
>       public static void main(String[] args) {
>               try {
>                       XMLConfiguration config = new XMLConfiguration();
>                       // works
>                       config.setProperty("test.property[@attribute]", 
> "value");
>                       config.setExpressionEngine(new XPathExpressionEngine());
>                       config.save(System.out);
>                       // works
>                       config.setProperty("test/property/@attribute", "value");
>                         // does not work
>                       config.setProperty("test/property/@attribute2", 
> "value");
>               } catch (ConfigurationException e) {
>                       // @FIXME Traitement d'exception par defaut
>                       throw new RuntimeException(e);
>               }
>       }
> }
> {code}
> hangs with the following exception:
> Exception in thread "main" java.lang.IllegalArgumentException: prepareAdd: 
> Passed in key must contain a whitespace!
>       at 
> org.apache.commons.configuration.tree.xpath.XPathExpressionEngine.prepareAdd(XPathExpressionEngine.java:223)
>       at 
> org.apache.commons.configuration.HierarchicalConfiguration.addPropertyDirect(HierarchicalConfiguration.java:371)
>       at 
> org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.addPropertyDirect(AbstractHierarchicalFileConfiguration.java:140)
>       at 
> org.apache.commons.configuration.HierarchicalConfiguration.setProperty(HierarchicalConfiguration.java:749)
>       at 
> org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.setProperty(AbstractHierarchicalFileConfiguration.java:158)
>       at Bug.main(Bug.java:29)
> the setProperty() method does not work if the property have to be added. This 
> behavior is not really wanted, because in some generic cases, we don't know 
> if the property is set or not before trying to set it.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to