Author: veithen
Date: Sun Jan  3 14:21:40 2010
New Revision: 895397

URL: http://svn.apache.org/viewvc?rev=895397&view=rev
Log:
WSCOMMONS-513: Clarified the expected behavior of 
OMNode#insertSibling(Before|After), changed the behavior of these methods in 
DOOM (to match the behavior of LLOM) and added a couple of unit tests to 
enforce the behavior.

Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMNode.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMNodeTestBase.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ChildNode.java

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMNode.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMNode.java?rev=895397&r1=895396&r2=895397&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMNode.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMNode.java
 Sun Jan  3 14:21:40 2010
@@ -140,18 +140,26 @@
     void discard() throws OMException;
 
     /**
-     * Inserts a new sibling after the current node.
-     *
-     * @param sibling The node that will be added after the current node.
+     * Inserts a new sibling after the current node. The current node must 
have a parent for this
+     * operation to succeed. If the node to be inserted has a parent, then it 
will first be
+     * detached.
+     * 
+     * @param sibling
+     *            The node that will be added after the current node.
      * @throws OMException
+     *             if the current node has no parent
      */
     void insertSiblingAfter(OMNode sibling) throws OMException;
 
     /**
-     * Inserts a sibling just before the current node.
-     *
-     * @param sibling The node that will be added before the current node.
+     * Inserts a sibling just before the current node. The current node must 
have a parent for this
+     * operation to succeed. If the node to be inserted has a parent, then it 
will first be
+     * detached.
+     * 
+     * @param sibling
+     *            The node that will be added before the current node.
      * @throws OMException
+     *             if the current node has no parent
      */
     void insertSiblingBefore(OMNode sibling) throws OMException;
 

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMNodeTestBase.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMNodeTestBase.java?rev=895397&r1=895396&r2=895397&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMNodeTestBase.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMNodeTestBase.java
 Sun Jan  3 14:21:40 2010
@@ -28,6 +28,27 @@
         this.omMetaFactory = omMetaFactory;
     }
 
+    public void testInsertSiblingAfter() {
+        OMFactory fac = omMetaFactory.getOMFactory();
+        OMElement parent = fac.createOMElement("test", null);
+        OMText text1 = fac.createOMText("text1");
+        OMText text2 = fac.createOMText("text2");
+        parent.addChild(text1);
+        text1.insertSiblingAfter(text2);
+        assertSame(parent, text2.getParent());
+    }
+    
+    public void testInsertSiblingBefore() {
+        OMFactory fac = omMetaFactory.getOMFactory();
+        OMElement parent = fac.createOMElement("test", null);
+        OMText text1 = fac.createOMText("text1");
+        OMText text2 = fac.createOMText("text2");
+        parent.addChild(text1);
+        text1.insertSiblingBefore(text2);
+        assertSame(parent, text2.getParent());
+        assertSame(text2, parent.getFirstOMChild());
+    }
+    
     // Regression test for WSCOMMONS-337
     public void testInsertSiblingAfterLastChild() throws Exception {
         OMFactory fac = omMetaFactory.getOMFactory();
@@ -49,6 +70,30 @@
                 "<ns:c1 /><ns:c2 /><ns:c3 /></ns:parent>", parent.toString());
     }
 
+    public void testInsertSiblingAfterOnOrphan() {
+        OMFactory fac = omMetaFactory.getOMFactory();
+        OMText text1 = fac.createOMText("text1");
+        OMText text2 = fac.createOMText("text2");
+        try {
+            text1.insertSiblingAfter(text2);
+            fail("Expected OMException because node has no parent");
+        } catch (OMException ex) {
+            // Expected
+        }
+    }
+    
+    public void testInsertSiblingBeforeOnOrphan() {
+        OMFactory fac = omMetaFactory.getOMFactory();
+        OMText text1 = fac.createOMText("text1");
+        OMText text2 = fac.createOMText("text2");
+        try {
+            text1.insertSiblingBefore(text2);
+            fail("Expected OMException because node has no parent");
+        } catch (OMException ex) {
+            // Expected
+        }
+    }
+    
     private void testDetach(boolean build) throws Exception {
         OMElement root = AXIOMUtil.stringToOM(omMetaFactory.getOMFactory(), 
"<root><a/><b/><c/></root>");
         if (build) {

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ChildNode.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ChildNode.java?rev=895397&r1=895396&r2=895397&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ChildNode.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ChildNode.java
 Sun Jan  3 14:21:40 2010
@@ -149,13 +149,12 @@
 
     /** Inserts the given sibling next to this item. */
     public void insertSiblingAfter(OMNode sibling) throws OMException {
-
-        if (this.parentNode != null) {
-            ((OMNodeEx) sibling).setParent(this.parentNode);
+        if (this.parentNode == null) {
+            throw new OMException("Parent can not be null");
         } else if (this == sibling) {
             throw new OMException("Inserting self as the sibling is not 
allowed");
         }
-
+        ((OMNodeEx) sibling).setParent(this.parentNode);
         if (sibling instanceof ChildNode) {
             ChildNode domSibling = (ChildNode) sibling;
             domSibling.previousSibling = this;
@@ -176,7 +175,9 @@
     /** Inserts the given sibling before this item. */
     public void insertSiblingBefore(OMNode sibling) throws OMException {
         // ((OMNodeEx)sibling).setParent(this.parentNode);
-        if (this == sibling) {
+        if (this.parentNode == null) {
+            throw new OMException("Parent can not be null");
+        } else if (this == sibling) {
             throw new OMException("Inserting self as the sibling is not 
allowed");
         }
         if (sibling instanceof ChildNode) {


Reply via email to