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