commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "vivek (JIRA)" <j...@apache.org>
Subject [jira] Commented: (CONFIGURATION-328) XMLConfiguration addNodes() not behaving correctly
Date Sun, 18 May 2008 20:24:55 GMT

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

vivek commented on CONFIGURATION-328:
-------------------------------------

Let's say we have an existing xml configuration,

{code:xml}
<ss>
 <test>
    <property name="testProperty">
         <value>test</value>
    <property>
 </test>
</ss>
{code}

Now I want add a new property under existing <test> tag,

{code:xml}
 <property name="vivekProperty">
   <value>vivek</value>
 </property>
{code}

I do following,

1) create a node,

{code:java}
  HierarchicalConfiguration.Node node = new HierarchicalConfiguration.Node("property");
  node.setValue(null);
{code}

2) Find the path where the "property" tag needs to be added. In my case it's "ss.test(0)"

3) I call addNodes on XMLConfiguration instance,

 {code:java}
    conf.addNodes(propertyPath, propertyNode);     
    //where propertyPath is ss.test(0) and propertyNode is one created in step 1
 {code}

4) I check how many property tags are under ss.test(0) - in this case it returns me 2 (1 was
just added)

5) I create another node object for the name attribute of property,

 {code:java}
  HierarchicalConfiguration.Node node = new HierarchicalConfiguration.Node("name");
  node.setValue("vivekProperty);
  node.setAttribute(true);             //setting the node as attribute
 {code}

6) Find the path where this attribute needs to be added. In this case it's "ss.test(0).property(1)"

7) Add the node,
 
  {code:java}
    conf.addNodes(attrPath, attrNode);     
    //where attrPath is ss.test(0).property(1) and attrNode is one created in step 5
 {code}
    

8) Create another node for the value tag under property,

 {code:java}
  HierarchicalConfiguration.Node node = new HierarchicalConfiguration.Node("value");
  node.setValue(""vivek");
 {code}

9) Now, when I try to find the index of the newly added property ("property name="vivekProperty")
I get -1. So instead of "ss.test(0).property(1)", I get "ss.test(0).property(-1)". -1 in my
code basically means it couldn't find that.  <=== So this is wrong. 

This is the code to get the index of the property with a specific attribute name. So I'm trying
to find the index of the property with name="vivekProperty",

   {code:java}
                lookupProp = "ss.test(0).property";
                synchronized(conf){
			elements = conf.configurationsAt(lookupProp);
		}
		
		for (Iterator it = elements.iterator(); it.hasNext();) {
			HierarchicalConfiguration sub = (HierarchicalConfiguration) it
					.next();
			if(sub != null){
				String name = sub.getString("[@" + attrName + "]");
				if(name != null){
					if (name.equals(propName)) {
						isPropFound = true;
						break;
					}
					index = index + 1;
				}	
			}					
		}
		if (!isPropFound) {
			index = -1;
		}
     {code}

10) Add the node,

 {code:java}
    conf.addNodes(valuePath, valueNode);     
    //where valuePath is ss.test(0).property(-1) and valueNode is one created in step 8
 {code}
        

11) After all this call save on the XMLConfiguration

This in 1.5 is giving me structure like,

{code:xml}

<ss>
 <test>
    <property name="testProperty">
         <value>test</value>
    <property>
    <property>
       <name>vivekProperty</name>
    </property>
    <property>
       <value>vivek</value>
    </property>
 </test>
</ss>

{code}


I'm not sure if I need to do "addNode" 3 time to add this structure or can it be added in
one shot. But, all this used to work fine with 1.3. In our application this is a service so
I can call any of the above 3 add nodes individaully in case user may just want to add a new
value to an existing property.

So the problem looks like is the code "node.setAttribute(true);" (in Step 5) is not seems
to be doing the right thing. Instead of adding a attribute name, it's adding a new element
name under property, which doesn't work in my case. 
      
     

> XMLConfiguration addNodes() not behaving correctly
> --------------------------------------------------
>
>                 Key: CONFIGURATION-328
>                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-328
>             Project: Commons Configuration
>          Issue Type: Bug
>    Affects Versions: 1.5
>         Environment: Linux, Apache Configuration 1.5
>            Reporter: vivek
>            Priority: Blocker
>             Fix For: 1.6
>
>
> Things used to work fine in 1.3, but now when I'm trying 1.5 my JUnit test suite is breaking
when adding new properties. Here is what I'm doing,
> 1) I already have a configuration as following,
> {code:xml}
>  <test>
>   <property name="isOk">
>     <value>true</value>
>     <default>false</default>
>   </property>
>   <property name="intProperty">
>     <value>900</value>
>     <default>500</default>
>   </property>
>   <property extra="0" name="stringProperty">
>     <default>Bye</default>
>   </property>
> </test>
> {code}
> 2) Now I need to add two new properties under <test>,
> {code:xml}
> <property  name="newFirst">
>   <value>first</value>
> </property>
> <property name="newSecond">
>   <value>second</value>
> </property>
> {code}
> 3) Here is the code I'm using,
>         a) First create a new HierarchicalConfiguration.Node
> {code:java}
> private HierarchicalConfiguration.Node createNode(String name, Object value)  {
>     HierarchicalConfiguration.Node node = new HierarchicalConfiguration.Node(name);
>     node.setValue(value);
>     return node;
> }
> {code}
>                   
>        b) Add the node to the list
> {code:java}
> List<HierarchicalConfiguration.Node> attrNodes = new ArrayList<HierarchicalConfiguration.Node>();
> Node attrNode = createNode(attrName, newPropertyName);
> attrNode.setAttribute(true);
> attrNodes.add(attrNode);
> {code}
>         
>        c) Call addNodes on XMLConfiguration,
> {code:java}
>     conf.addNodes(attrPath, attrNodes);
> {code}
> I run this in a look for each new property I need to add. For first property, I get element
count for the test.property as 3 (conf.getMaxIndex(key)) - so I insert at test.property(3),
which is right, but for the second property I get element count as 5 --> This is wrong,
it should have been 4 (because I just added 1). 
> I check the saved the configuration file after adding those two new properties and it
looks wrong too. Here is what I get,
> {code:xml}
> <test>
>   <property name="isOk">
>     <value>true</value>
>     <default>false</default>
>   </property>
>   <property name="intProperty">
>     <value>900</value>
>     <default>500</default>
>   </property>
>   <property extra="0" name="stringProperty">
>     <value>Hi</value>
>     default>Bye</default>
>   </property>
>   <property>
>     <name>newFirst</name>
>   </property>
>   <property>
>     <value>first</value>
>   </property>
>   <property>
>     <name>newSecond</name>
>   </property>
>   <property>
>     <value>second</value>
>   </property>
> </test>
> {code}
> The total element count for test.property gives me 7 ==> I was expecting 5.
> There seems to have some code change in 1.5 releated to addNodes (for ex., CONFIGURATION-287).
I'm not sure if I need to change the way I was calling addNodes before. It works fine with
1.3, but 1.5 completely fails on adding new properties. 
> I do need 1.5 for other bug fixes ( CONFIGURATION-268 and some other), but I can't use
it until the addNodes behave correctly. 
> Marking this as blocker as I'm blocked because of this issue. If there is a workaround
then please let me know.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message