Author: ajith
Date: Sun Aug 19 17:09:47 2007
New Revision: 567512

URL: http://svn.apache.org/viewvc?rev=567512&view=rev
Log:
Fixing the discard method (see issue WSCOMMONS 235)
1. Added a new method to the OMContainerEx.java and updated the relevant 
classes downstream
2. Fixed the discard method in the StAXBuilder.java class.
3. Added two new test cases to test the functionality of the discard method

Added:
    
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDiscardTest.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPDiscardTest.java
Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMContainerEx.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/impl/builder/StAXSOAPModelBuilder.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMCommentImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocTypeImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMProcessingInstructionImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMContainerEx.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMContainerEx.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMContainerEx.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMContainerEx.java
 Sun Aug 19 17:09:47 2007
@@ -31,5 +31,15 @@
 public interface OMContainerEx extends OMContainer {
     public void setComplete(boolean state);
 
+    /**
+     * forcefully set the first element in this parent element
+     * @param omNode
+     */
     public void setFirstChild(OMNode omNode);
+
+    /**
+     * forcefully set the last element in this parent element
+     * @param omNode
+     */
+    public void setLastChild(OMNode omNode);
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXBuilder.java
 Sun Aug 19 17:09:47 2007
@@ -258,25 +258,49 @@
     /**
      * Method discard.
      *
-     * @param el
+     * @param element
      * @throws OMException
      */
-    public void discard(OMElement el) throws OMException {
-        OMElement element = null;
+    public void discard(OMElement element) throws OMException {
 
         if (element.isComplete() || !cache) {
             throw new OMException();
         }
         try {
-            cache = false;
-            do {
-                while (parser.next() != XMLStreamConstants.END_ELEMENT) ;
 
-                // TODO:
-            } while (!parser.getName().equals(element.getQName()));
+            // We simply cannot use the parser instance from the builder for 
this case
+            // it is not safe to assume that the parser inside the builder 
will be in
+            // sync with the parser of the element in question
+            // Note 1 - however  calling getXMLStreamReaderWithoutCaching sets 
off two flags
+            // the cache flag for this builder and the parserAccessed flag. 
These flags will be
+            // reset later in this procedure
+
+            int event =0;
+            XMLStreamReader elementParser = 
element.getXMLStreamReaderWithoutCaching();
+            do{
+               event = elementParser.next();
+            }while(!(event == XMLStreamConstants.END_ELEMENT &&
+                     
element.getLocalName().equals(elementParser.getLocalName())));
+
+            //at this point we are safely at the end_element event of the 
element we discarded
             lastNode = element.getPreviousOMSibling();
+
+            // resetting the flags - see Note 1 above
+            cache = true;
+            parserAccessed = false;
+            
             if (lastNode != null) {
-                ((OMNodeEx) lastNode).setNextOMSibling(null);
+                // if the last node is not an element, we are in trouble 
because leaf nodes
+                // (such as text) cannot build themselves. worst the lastchild 
of the
+                // currentparent is still the removed node! we have to correct 
it
+                OMContainerEx ex = ((OMContainerEx) lastNode.getParent());
+                ex.setLastChild(lastNode);
+                 if (!(lastNode instanceof OMContainerEx)){
+                     ex.buildNext();
+                 }else{
+                    ((OMNodeEx) lastNode).setNextOMSibling(null); 
+                 }
+
             } else {
                 OMElement parent = (OMElement) element.getParent();
                 if (parent == null) {
@@ -285,7 +309,7 @@
                 ((OMContainerEx) parent).setFirstChild(null);
                 lastNode = parent;
             }
-            cache = true;
+            
         } catch (OMException e) {
             throw e;
         } catch (Exception e) {

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/impl/builder/StAXSOAPModelBuilder.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/impl/builder/StAXSOAPModelBuilder.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/impl/builder/StAXSOAPModelBuilder.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/impl/builder/StAXSOAPModelBuilder.java
 Sun Aug 19 17:09:47 2007
@@ -163,6 +163,14 @@
         return envelope;
     }
 
+
+    public void discard(OMElement element) throws OMException {
+        super.discard(element);
+        //when an element is discarded the element index that was incremented
+        //at creation needs to be decremented !
+        elementLevel--;
+    }
+
     /**
      * Method createOMElement.
      *

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
 Sun Aug 19 17:09:47 2007
@@ -126,6 +126,14 @@
         this.firstChild = (ChildNode) omNode;
     }
 
+    /**
+     * Forcefully set the last child
+     * @param omNode
+     */
+    public void setLastChild(OMNode omNode) {
+        this.lastChild = (ChildNode) omNode;
+    }
+
     // /
     // /DOM Node methods
     // /

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextImpl.java
 Sun Aug 19 17:09:47 2007
@@ -335,8 +335,6 @@
     public void discard() throws OMException {
         if (done) {
             this.detach();
-        } else {
-            builder.discard((OMElement) this.parentNode);
         }
     }
 

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMCommentImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMCommentImpl.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMCommentImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMCommentImpl.java
 Sun Aug 19 17:09:47 2007
@@ -100,8 +100,6 @@
     public void discard() throws OMException {
         if (done) {
             this.detach();
-        } else {
-            builder.discard((OMElement) this.parent);
-        }
+        } 
     }
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocTypeImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocTypeImpl.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocTypeImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocTypeImpl.java
 Sun Aug 19 17:09:47 2007
@@ -100,8 +100,6 @@
     public void discard() throws OMException {
         if (done) {
             this.detach();
-        } else {
-            builder.discard((OMElement) this.parent);
-        }
+        } 
     }
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java
 Sun Aug 19 17:09:47 2007
@@ -271,6 +271,13 @@
         this.firstChild = firstChild;
     }
 
+    /**
+     * Forcefully set the last child
+     * @param omNode
+     */
+    public void setLastChild(OMNode omNode) {
+        this.lastChild = omNode;
+    }
 
     /**
      * Returns the character set encoding scheme to be used.

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
 Sun Aug 19 17:09:47 2007
@@ -573,6 +573,11 @@
         this.firstChild = firstChild;
     }
 
+
+    public void setLastChild(OMNode omNode) {
+         this.lastChild = omNode;
+    }
+
     /**
      * Removes this information item and its children, from the model 
completely.
      *

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMProcessingInstructionImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMProcessingInstructionImpl.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMProcessingInstructionImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMProcessingInstructionImpl.java
 Sun Aug 19 17:09:47 2007
@@ -122,8 +122,6 @@
     public void discard() throws OMException {
         if (done) {
             this.detach();
-        } else {
-            builder.discard((OMElement) this.parent);
-        }
+        } 
     }
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
 Sun Aug 19 17:09:47 2007
@@ -362,6 +362,12 @@
         super.setFirstChild(node);
     }
 
+
+    public void setLastChild(OMNode omNode) {
+        forceExpand();
+        super.setLastChild(omNode);
+    }
+
     /* (non-Javadoc)
      * @see org.apache.axiom.om.OMElement#getFirstElement()
      */

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java?rev=567512&r1=567511&r2=567512&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java
 Sun Aug 19 17:09:47 2007
@@ -524,9 +524,7 @@
     public void discard() throws OMException {
         if (done) {
             this.detach();
-        } else {
-            builder.discard((OMElement) this.parent);
-        }
+        } 
     }
 
     /* (non-Javadoc)

Added: 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDiscardTest.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDiscardTest.java?rev=567512&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDiscardTest.java
 (added)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDiscardTest.java
 Sun Aug 19 17:09:47 2007
@@ -0,0 +1,45 @@
+package org.apache.axiom.om;
+
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLInputFactory;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+
+/**
+ *Test the discard method
+ */
+public class OMDiscardTest extends AbstractTestCase {
+
+
+    public OMDiscardTest(String testName) {
+        super(testName);   
+    }
+
+    
+    public void testDiscard(){
+        OMElement documentElement = null;
+        try {
+            // first build the OM tree without caching and see whether we can 
discard
+            // an element from it
+            StAXOMBuilder builder = new StAXOMBuilder(getXMLStreamReader());
+            documentElement = builder.getDocumentElement();
+
+            documentElement.getFirstElement().discard();
+
+            String envelopeString = documentElement.toStringWithConsume();
+        } catch (Exception e) {
+            fail("discarding an element should work!");
+        }
+    }
+
+    private XMLStreamReader getXMLStreamReader() throws XMLStreamException, 
FileNotFoundException {
+        return XMLInputFactory.newInstance().
+                createXMLStreamReader(
+                        new FileReader(
+                                getTestResourceFile("soap/soapmessage.xml")));
+    }
+
+}

Added: 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPDiscardTest.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPDiscardTest.java?rev=567512&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPDiscardTest.java
 (added)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPDiscardTest.java
 Sun Aug 19 17:09:47 2007
@@ -0,0 +1,28 @@
+package org.apache.axiom.soap;
+
+import javax.xml.stream.XMLStreamException;
+
+/**
+ * @author : Ajith Ranabahu
+ *         Date: Aug 15, 2007
+ *         Time: 11:57:54 PM
+ */
+public class SOAPDiscardTest  extends SOAPTestCase{
+
+
+    public SOAPDiscardTest(String testName) {
+        super(testName);
+    }
+
+    public void testDiscardHeader(){
+
+        try {
+            soap11EnvelopeWithParser.getHeader().discard();
+            soap11EnvelopeWithParser.getBody().toStringWithConsume();
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to