glyn 02/04/08 07:19:44
Modified: java/src/org/apache/axis/message MessageElement.java
java/test/message TestMessageElement.java
Log:
Fix bug - addChild should set the child's parent.
Implemented detachNode.
Revision Changes Path
1.92 +22 -6 xml-axis/java/src/org/apache/axis/message/MessageElement.java
Index: MessageElement.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/MessageElement.java,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -r1.91 -r1.92
--- MessageElement.java 25 Mar 2002 16:12:16 -0000 1.91
+++ MessageElement.java 8 Apr 2002 14:19:44 -0000 1.92
@@ -124,7 +124,6 @@
protected Element elementRep = null;
protected MessageElement parent = null;
- // Do we need links to our children too?
public ArrayList namespaces = null;
@@ -327,8 +326,20 @@
if (children == null)
children = new ArrayList();
children.add(el);
+ el.parent = this;
}
-
+
+ /**
+ * Remove a child element.
+ */
+ private void removeChild(MessageElement child) {
+ // Remove all occurrences in case it has been added multiple times.
+ int i;
+ while ((i = children.indexOf(child)) != -1) {
+ children.remove(i);
+ }
+ }
+
public ArrayList getChildren()
{
return children;
@@ -710,12 +721,17 @@
}
/**
- * No-opped.
+ * Break the relationship between this element and its parent, if any.
*/
- public void detachNode() {}
-
+ public void detachNode() {
+ if (parent != null) {
+ parent.removeChild(this);
+ parent = null;
+ }
+ }
+
/**
- * No-opped.
+ * No-opped - Axis does not recycle nodes.
*/
public void recycleNode() {}
1.2 +25 -0 xml-axis/java/test/message/TestMessageElement.java
Index: TestMessageElement.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/message/TestMessageElement.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- TestMessageElement.java 25 Mar 2002 16:12:16 -0000 1.1
+++ TestMessageElement.java 8 Apr 2002 14:19:44 -0000 1.2
@@ -123,4 +123,29 @@
assertEquals("Child 1 not found", child1, c1only.next());
assertTrue("Unexpected child", !c1only.hasNext());
}
+ public void testDetachNode() throws Exception {
+ SOAPConstants sc = SOAPConstants.SOAP11_CONSTANTS;
+ EnvelopeBuilder eb = new EnvelopeBuilder(Message.REQUEST, sc);
+ DeserializationContext dc = new DeserializationContextImpl(null,
+ eb);
+ SOAPElement parent = new MessageElement("parent.names",
+ "parent",
+ "parns:parent",
+ null,
+ dc);
+ SOAPElement child1 = parent.addChildElement("child1");
+ SOAPElement child2 = parent.addChildElement("child2");
+ SOAPElement child3 = parent.addChildElement("child3");
+
+ child2.detachNode();
+ SOAPElement c[] = {child1, child3};
+
+ Iterator children = parent.getChildElements();
+ for (int i = 0; i < 2; i++) {
+ assertEquals("Child not found",
+ c[i],
+ children.next());
+ }
+ assertTrue("Unexpected child", !children.hasNext());
+ }
}