Hi Please see my comments below:
Thanks, Ruchith On 10/25/05, Thilina Gunarathne <[EMAIL PROTECTED]> wrote: > Hi, > >- Added and commented code in OMTextImpl, to do line wrapping of base64 > content (using 76 >character length) , for others to review, this is > required to support Encrypt, Sign , MTOM >optimizing, cipher content to work > properly (XMLSec lib uses line wrapping of length 76) > > Isn't this something that needs to be go in to the Base64 encoder....Just > curious.... > IMO If there are is any Base64 defualt lengths that we need to deal with, > then it should be handled at the Base64 encoder/decoder level... If we buffer the whole content from the stream and then base64 encode the wholse content in one step ... then we can move the line wrapping to Base64 class. But here we are base64 encoding part by part.... in such a situation I don't think we can expect the static method 'basse64.encode()' to add the line breaks. The problem is different implementations seem to handle Base64 in different ways with respect to line wrapping[1] . But if we want to suport most number of probable security use cases with WSS4J/XMLSec we should stick to 76 char line wrapping since its the default in XMLSec.in WSS4J, XMLSec generates most of the content that we actually might want to MTOM optimize (E.g. CipherData), and the problem comes when this content is signed. [1] http://mail-archives.apache.org/mod_mbox/ws-wss4j-dev/200510.mbox/[EMAIL PROTECTED] > > thanks, > ~Thilina > > > On 10/25/05, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > > Author: ruchithf > > Date: Mon Oct 24 22:42:32 2005 > > New Revision: 328264 > > > > URL: http://svn.apache.org/viewcvs?rev=328264&view=rev > > Log: > > - Completed NodeListImpl and completed some TODOs in the DOM classes > > - Added some more tests to DOM test cases, a lot more to come :-) > > - Added and commented code in OMTextImpl, to do line wrapping of base64 > content (using 76 character length) , for others to review, this is required > to support Encrypt, Sign , MTOM optimizing, cipher content to work properly > (XMLSec lib uses line wrapping of length 76) > > > > > > Modified: > > > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ChildNode.java > > > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ElementImpl.java > > > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeImpl.java > > > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeListImpl.java > > > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ParentNode.java > > > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/TextImpl.java > > > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java > > > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/DocumentImplTest.java > > > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/ElementImplTest.java > > > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/TextImplTest.java > > > > Modified: > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ChildNode.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ChildNode.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ChildNode.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ChildNode.java > Mon Oct 24 22:42:32 2005 > > @@ -111,7 +111,10 @@ > > * Insert the given sibling next to this item > > */ > > public void insertSiblingAfter(OMNode sibling) throws OMException { > > - ((OMNodeEx)sibling).setParent( this.parentNode); > > + > > + if(this.parentNode != null) { > > + ((OMNodeEx)sibling).setParent(this.parentNode); > > + } > > > > if(sibling instanceof ChildNode) { > > ChildNode domSibling = (ChildNode)sibling; > > > > Modified: > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ElementImpl.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ElementImpl.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ElementImpl.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ElementImpl.java > Mon Oct 24 22:42:32 2005 > > @@ -53,6 +53,7 @@ > > private String tagName; > > private AttributeMap attributes; > > private HashMap namespaces; > > + > > /** > > * @param ownerDocument > > */ > > @@ -389,17 +390,15 @@ > > /* (non-Javadoc) > > * @see > org.w3c.dom.Element#getElementsByTagNameNS(java.lang.String, > java.lang.String) > > */ > > - public NodeList getElementsByTagNameNS(String arg0, String arg1) { > > - //TODO > > - throw new > UnsupportedOperationException("TODO"); > > + public NodeList getElementsByTagNameNS(String namespaceURI, String > localName) { > > + return new NodeListImpl(this, namespaceURI, localName); > > } > > > > /* (non-Javadoc) > > * @see > org.w3c.dom.Element#getElementsByTagName(java.lang.String) > > */ > > - public NodeList getElementsByTagName(String arg0) { > > - //TODO > > - throw new > UnsupportedOperationException("TODO"); > > + public NodeList getElementsByTagName(String name) { > > + return new NodeListImpl(this, name); > > } > > > > /// > > > > Modified: > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeImpl.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeImpl.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeImpl.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeImpl.java > Mon Oct 24 22:42:32 2005 > > @@ -113,7 +113,10 @@ > > return null; > > } > > > > - > > + > > + /* > > + * Overidden in ElementImpl and AttrImpl > > + */ > > public String getPrefix() > > { > > return null; > > @@ -124,7 +127,6 @@ > > } > > > > > > - > > public void setPrefix(String prefix) throws DOMException { > > throw new DOMException(DOMException.NAMESPACE_ERR, > > DOMMessageFormatter.formatMessage > (DOMMessageFormatter.DOM_DOMAIN, > > @@ -356,8 +358,6 @@ > > //Document, DocumentFragment, and Attribute will never have > parents. > > } > > > > - > > - > > /* (non-Javadoc) > > * @see org.apache.axis.om.OMNode#isComplete () > > */ > > @@ -365,8 +365,6 @@ > > return this.done; > > } > > > > - /** > > - */ > > public void setComplete(boolean state) { > > this.done = state; > > > > > > Modified: > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeListImpl.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeListImpl.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeListImpl.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/NodeListImpl.java > Mon Oct 24 22:42:32 2005 > > @@ -15,12 +15,20 @@ > > */ > > package org.apache.axis2.om.impl.dom; > > > > -import java.util.Vector; > > - > > +import org.apache.axis2.om.impl.OMContainerEx; > > import org.w3c.dom.Node; > > import org.w3c.dom.NodeList; > > > > +import java.util.Iterator; > > +import java.util.Vector; > > + > > +import javax.xml.namespace.QName; > > > > +/** > > + * Implementation of org.w3c.dom.NodeList > > + * > > + * @author Ruchith Fernando ( [EMAIL PROTECTED]) > > + */ > > public class NodeListImpl implements NodeList { > > > > protected NodeImpl rootNode; > > @@ -40,25 +48,52 @@ > > > > /** Constructor for Namespace support. */ > > public NodeListImpl(NodeImpl rootNode, > > - String nsName, String > tagName) { > > - this(rootNode, tagName); > > - this.nsName = (nsName != null && !nsName.equals("")) ? nsName : > null; > > + String namespaceURI, String > localName) { > > + this(rootNode, localName); > > + this.nsName = (namespaceURI != null && !namespaceURI.equals("")) > ? namespaceURI : null; > > enableNS = true; > > } > > > > - /* (non-Javadoc) > > + /** > > + * Returns the numbre of nodes > > * @see org.w3c.dom.NodeList#getLength() > > */ > > public int getLength() { > > - //TODO > > - throw new > UnsupportedOperationException("TODO"); > > + Iterator children; > > + if(enableNS) { > > + children = > ((OMContainerEx)rootNode).getChildrenWithName(new > QName(this.tagName)); > > + } else { > > + children = > ((OMContainerEx)rootNode).getChildrenWithName(new QName( > this.nsName, this.tagName)); > > + } > > + int count = 0; > > + while (children.hasNext()) { > > + count++; > > + children.next(); > > + } > > + return count; > > } > > > > - /* (non-Javadoc) > > + /** > > + * Returns the node at the given index. > > + * returns null if the index is invalid. > > * @see org.w3c.dom.NodeList#item (int) > > */ > > - public Node item(int arg0) { > > - //TODO > > - throw new > UnsupportedOperationException("TODO"); > > + public Node item(int index) { > > + Iterator children; > > + if(enableNS) { > > + children = > ((OMContainerEx)rootNode).getChildrenWithName(new > QName(this.tagName)); > > + } else { > > + children = > ((OMContainerEx)rootNode).getChildrenWithName(new QName( > this.nsName, this.tagName)); > > + } > > + int count = 0; > > + while (children.hasNext()) { > > + count++; > > + if(count == index) { > > + return (Node)children.next(); > > + } else { > > + children.next(); > > + } > > + } > > + return null; > > } > > } > > > > Modified: > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ParentNode.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ParentNode.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ParentNode.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/ParentNode.java > Mon Oct 24 22:42:32 2005 > > @@ -69,15 +69,32 @@ > > return new OMChildrenIterator(this.firstChild); > > } > > > > + /** > > + * Returns an iterator of child nodes having a given qname > > + * @see > org.apache.axis2.om.OMContainer#getChildrenWithName > (javax.xml.namespace.QName) > > + */ > > public Iterator getChildrenWithName(QName elementQName) throws > OMException { > > return new > OMChildrenQNameIterator(getFirstOMChild(), > > elementQName); > > } > > > > + /** > > + * Return the first OMElement child node > > + * @see > org.apache.axis2.om.OMContainer#getFirstChildWithName(javax.xml.namespace.QName) > > + */ > > public OMElement getFirstChildWithName(QName elementQName) > > throws OMException { > > - //TODO > > - throw new > UnsupportedOperationException("TODO"); > > + Iterator children = new > OMChildrenQNameIterator(getFirstOMChild(), > > + elementQName); > > + while (children.hasNext()) { > > + OMNode node = (OMNode) children.next(); > > + > > + //Return the first OMElement node that is found > > + if(node instanceof OMElement) { > > + return (OMElement)node; > > + } > > + } > > + return null; > > } > > > > public OMNode getFirstOMChild() { > > > > Modified: > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/TextImpl.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/TextImpl.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/TextImpl.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/dom/TextImpl.java > Mon Oct 24 22:42:32 2005 > > @@ -184,12 +184,15 @@ > > this.deleteData(offset, this.textValue.length()); > > > > TextImpl newText = > (TextImpl)this.getOwnerDocument().createTextNode(newValue); > > - newText.setParent (this.parentNode); > > + > > + if(this.parentNode != null) { > > + newText.setParent(this.parentNode); > > + } > > > > this.insertSiblingAfter(newText); > > > > > > - return null; > > + return newText; > > } > > > > /// > > @@ -202,10 +205,13 @@ > > return OMNode.TEXT_NODE; > > } > > > > + > > /// > > ///OMNode methods > > /// > > > > + > > + > > /* (non-Javadoc) > > * @see org.apache.axis2.om.OMNode#getType() > > */ > > @@ -295,6 +301,10 @@ > > } > > } > > > > + public String getNodeValue() throws DOMException { > > + return this.getText(); > > + } > > + > > public String getContentID() { > > if (contentID == null) { > > contentID = UUIDGenerator.getUUID() > > @@ -308,7 +318,7 @@ > > * reperesented by the Base64 strings stored in OMText > > */ > > if (textValue != null & isBinary) { > > - return > org.apache.axis2.attachments.DataHandlerUtils.getDataHandlerFromText(textValue.toString() > ,mimeType); > > + return > org.apache.axis2.attachments.DataHandlerUtils.getDataHandlerFromText > (textValue.toString() ,mimeType); > > } else { > > > > if (dataHandlerObject == null) { > > @@ -456,5 +466,6 @@ > > } > > } > > > > + > > > > } > > > > Modified: > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/src/org/apache/axis2/om/impl/llom/OMTextImpl.java > Mon Oct 24 22:42:32 2005 > > @@ -217,6 +217,21 @@ > > } > > > > } while (inStream.available() > 0); > > + > > + //Breakup the base64 encoded text > > + StringBuffer newText = new StringBuffer(); > > + > > +// while(72 <= text.length()) { > > +// > newText.append(text.substring(0,Base64.BASE64DEFAULTLENGTH)); > > +// newText.append("\n"); > > +// text = text.delete(0,Base64.BASE64DEFAULTLENGTH); > > +// } > > +// > > +// if(text.length() > 0) { > > +// newText.append(text.toString()); > > +// } > > + > > +// return newText.toString(); > > return text.toString(); > > } catch (Exception e) { > > throw new OMException(e); > > @@ -247,7 +262,7 @@ > > * reperesented by the Base64 strings stored in OMText > > */ > > if (value != null & isBinary) { > > - return > org.apache.axis2.attachments.DataHandlerUtils.getDataHandlerFromText(value,mimeType); > > + return > org.apache.axis2.attachments.DataHandlerUtils.getDataHandlerFromText > (value,mimeType); > > } else { > > > > if (dataHandlerObject == null) { > > > > Modified: > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/DocumentImplTest.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/DocumentImplTest.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/DocumentImplTest.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/DocumentImplTest.java > Mon Oct 24 22:42:32 2005 > > @@ -17,6 +17,7 @@ > > > > import org.w3c.dom.Attr; > > import org.w3c.dom.Element; > > +import org.w3c.dom.Text; > > > > import junit.framework.TestCase; > > > > @@ -68,7 +69,12 @@ > > } > > > > public void testCreateText() { > > + String textValue = "temp text value"; > > > > + DocumentImpl doc = new DocumentImpl(); > > + Text txt = doc.createTextNode(textValue); > > + > > + assertEquals("Text value mismatch", textValue, > txt.getData()); > > } > > > > } > > > > Modified: > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/ElementImplTest.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/ElementImplTest.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/ElementImplTest.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/ElementImplTest.java > Mon Oct 24 22:42:32 2005 > > @@ -19,6 +19,9 @@ > > import org.apache.axis2.om.OMText; > > import org.apache.axis2.om.impl.OMOutputImpl; > > import org.apache.axis2.om.impl.dom.factory.OMDOMFactory; > > +import > org.apache.axis2.om.impl.dom.jaxp.DocumentBuilderFactoryImpl > ; > > +import org.w3c.dom.Document; > > +import org.w3c.dom.Element; > > import org.w3c.dom.Text; > > > > import java.io.ByteArrayOutputStream; > > @@ -101,4 +104,36 @@ > > } > > assertEquals("In correct number of children", 1, count ); > > } > > + > > + public void testAppendChild() { > > + try { > > + String elementName = "TestElem"; > > + String childElemName = "TestChildElem"; > > + String childTextValue = "text value of the child > text node"; > > + > > + //Apending am Element node > > + Document doc = > DocumentBuilderFactoryImpl.newInstance > ().newDocumentBuilder().newDocument(); > > + Element elem = doc.createElement(elementName); > > + Element childElem = > doc.createElement(childElemName); > > + > > + elem.appendChild(childElem); > > + > > + Element addedChild = > (Element)elem.getFirstChild(); > > + assertNotNull("Child Element node > missing",addedChild); > > + assertEquals("Incorre node object", childElem, > addedChild); > > + > > + elem = doc.createElement(elementName); > > + Text text = doc.createTextNode(childTextValue); > > + elem.appendChild(text); > > + > > + Text addedTextnode = (Text)elem.getFirstChild(); > > + assertNotNull("Child Text node missing", > addedTextnode); > > + assertEquals("Incorrect node object", text, > addedTextnode); > > + > > + } catch (Exception e) { > > + e.printStackTrace(); > > + fail(e.getMessage()); > > + } > > + } > > + > > } > > > > Modified: > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/TextImplTest.java > > URL: > http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/TextImplTest.java?rev=328264&r1=328263&r2=328264&view=diff > > > ============================================================================== > > --- > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/TextImplTest.java > (original) > > +++ > webservices/axis2/trunk/java/modules/xml/test/org/apache/axis2/om/impl/dom/TextImplTest.java > Mon Oct 24 22:42:32 2005 > > @@ -31,20 +31,20 @@ > > public TextImplTest(String name) { > > super(name); > > } > > - > > + > > public void testSetText() { > > OMDOMFactory factory = new OMDOMFactory(); > > String localName = "TestLocalName"; > > String namespace = "http://ws.apache.org/axis2/ns"; > > String prefix = "axis2"; > > String tempText = "The quick brown fox jumps over the lazy > dog"; > > - > > - OMElement elem = > factory.createOMElement(localName,namespace,prefix); > > - OMText textNode = factory.createText(elem,tempText); > > - > > + > > + OMElement elem = factory.createOMElement(localName, > namespace, prefix); > > + OMText textNode = factory.createText(elem, tempText); > > + > > assertEquals("Text value mismatch", tempText, > textNode.getText()); > > } > > - > > + > > public void testAppendText() { > > OMDOMFactory factory = new OMDOMFactory(); > > String localName = "TestLocalName"; > > @@ -52,15 +52,36 @@ > > String prefix = "axis2"; > > String tempText = "The quick brown fox jumps over the lazy > dog"; > > String textToAppend = " followed by another fox"; > > - > > - OMElement elem = > factory.createOMElement(localName,namespace,prefix); > > - OMText textNode = factory.createText(elem,tempText); > > - > > - > ((Text)textNode).appendData(textToAppend); > > - > > - assertEquals("Text value mismatch", tempText+textToAppend, > textNode.getText()); > > + > > + OMElement elem = factory.createOMElement(localName, > namespace, prefix); > > + OMText textNode = factory.createText(elem, tempText); > > + > > + ((Text) > textNode).appendData(textToAppend); > > + > > + assertEquals("Text value mismatch", tempText + > textToAppend, textNode > > + .getText()); > > + } > > + > > + public void testSplitText() { > > + String textValue = "temp text value"; > > + > > + DocumentImpl doc = new DocumentImpl(); > > + > > + Text txt = doc.createTextNode(textValue); > > + txt.splitText(3); > > + > > + assertNotNull("Text value missing in the original Text > node", txt > > + .getNodeValue()); > > + > > + assertNotNull("Sibling missing after split", > txt.getNextSibling()); > > + assertNotNull("Text value missing in the new split Text > node", txt > > + > .getNextSibling().getNodeValue()); > > + > > + assertEquals("Incorrect split point", > textValue.substring(0, 3), txt > > + .getNodeValue()); > > + assertEquals("Incorrect split point", > textValue.substring(3, textValue > > + .length()), > txt.getNextSibling().getNodeValue()); > > + > > } > > - > > - > > > > } > > > > > > > > > > -- > "May the SourcE be with u" > http://webservices.apache.org/~thilina/ > http://thilinag.blogspot.com/ > http://www.bloglines.com/blog/Thilina -- Ruchith