Author: thomas.diesler(a)jboss.com
Date: 2007-04-11 08:24:20 -0400 (Wed, 11 Apr 2007)
New Revision: 2791
Modified:
trunk/integration-jboss40/.classpath
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/BufferedStreamResult.java
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/BufferedStreamSource.java
trunk/jbossws-core/src/java/org/jboss/ws/core/soap/XMLFragment.java
trunk/jbossws-core/src/java/org/jboss/ws/core/utils/DOMWriter.java
trunk/jbossws-tests/src/java/org/jboss/test/ws/common/utils/DOMWriterTestCase.java
Log:
[JBWS-1605] DOMResult looses namespaces on transform
Modified: trunk/integration-jboss40/.classpath
===================================================================
--- trunk/integration-jboss40/.classpath 2007-04-11 12:14:11 UTC (rev 2790)
+++ trunk/integration-jboss40/.classpath 2007-04-11 12:24:20 UTC (rev 2791)
@@ -26,7 +26,7 @@
<classpathentry kind="lib"
path="/build/thirdparty/jboss-microcontainer.jar"/>
<classpathentry kind="lib"
path="/build/thirdparty/servlet-api.jar"/>
<classpathentry kind="lib"
path="/build/thirdparty/stax-api.jar"/>
- <classpathentry kind="lib"
path="/build/thirdparty/xalan.jar"/>
+ <classpathentry kind="lib" path="/build/thirdparty/xalan.jar"
sourcepath="/usr/java/xalan-j_2_7_0/src"/>
<classpathentry kind="lib"
path="/build/thirdparty/xercesImpl.jar"/>
<classpathentry kind="lib"
path="/build/thirdparty/mail.jar"/>
<classpathentry kind="lib"
path="/build/thirdparty/jboss-common.jar"
sourcepath="/build/thirdparty/jboss-common-sources.jar"/>
Modified:
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/BufferedStreamResult.java
===================================================================
---
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/BufferedStreamResult.java 2007-04-11
12:14:11 UTC (rev 2790)
+++
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/BufferedStreamResult.java 2007-04-11
12:24:20 UTC (rev 2791)
@@ -41,7 +41,7 @@
*/
public class BufferedStreamResult extends StreamResult
{
- ByteArrayOutputStream bout = new ByteArrayOutputStream(1024);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
public BufferedStreamResult()
{
@@ -68,7 +68,7 @@
@Override
public OutputStream getOutputStream()
{
- return bout;
+ return baos;
}
@Override
@@ -82,4 +82,9 @@
{
throw new UnsupportedOperationException();
}
+
+ public String toString()
+ {
+ return baos.toString();
+ }
}
Modified:
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/BufferedStreamSource.java
===================================================================
---
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/BufferedStreamSource.java 2007-04-11
12:14:11 UTC (rev 2790)
+++
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/binding/BufferedStreamSource.java 2007-04-11
12:24:20 UTC (rev 2791)
@@ -107,4 +107,14 @@
{
throw new UnsupportedOperationException();
}
+
+ public String toString()
+ {
+ String retStr = null;
+ if (bytes != null)
+ retStr = new String(bytes);
+ else if (chars != null)
+ retStr = new String(chars);
+ return "" + retStr;
+ }
}
Modified: trunk/jbossws-core/src/java/org/jboss/ws/core/soap/XMLFragment.java
===================================================================
--- trunk/jbossws-core/src/java/org/jboss/ws/core/soap/XMLFragment.java 2007-04-11
12:14:11 UTC (rev 2790)
+++ trunk/jbossws-core/src/java/org/jboss/ws/core/soap/XMLFragment.java 2007-04-11
12:24:20 UTC (rev 2791)
@@ -176,46 +176,37 @@
Reader reader = streamSource.getReader();
{
- if (reader == null)
- reader = new InputStreamReader(streamSource.getInputStream());
+ if (reader == null)
+ reader = new InputStreamReader(streamSource.getInputStream());
}
- char[] cbuf = new char[5];
- int r = reader.read(cbuf);
- int xmlProc = -1;
+ char[] cbuf = new char[1024];
+ int len = reader.read(cbuf);
+ int off = 0;
- if (r == -1)
+ if (len == -1)
throw new IOException("StreamSource already exhausted");
- while (r > 0)
+ // Remove XML processing instruction
+ String xmlProc = new String(cbuf, 0, XML_PROC.length());
+ if (XML_PROC.equals(xmlProc))
{
- if(xmlProc<0 && new String(cbuf).equals(XML_PROC)) // new
fragment
- {
- xmlProc = 0;
- }
- else if(xmlProc<0) // no processing instruction
- {
- xmlProc = 1;
- }
- else if(xmlProc==0) // within processing instruction
- {
- String tmp = new String(cbuf);
- int i = tmp.indexOf(">");
- if(i!=-1)
- {
- if(i<tmp.length()) writer.write(tmp.substring(i+1));
- xmlProc=1;
- r = reader.read(cbuf);
- continue;
- }
+ off = XML_PROC.length();
+ while (cbuf[off] != '>' && off < len)
+ off++;
- }
+ if (cbuf[off] != '>')
+ throw new IllegalStateException("Cannot find end of XML processing
instruction");
- // regular contents
- if(xmlProc>0)
- writer.write(cbuf, 0, r);
- r = reader.read(cbuf);
+ off++;
}
+
+ while (len > 0)
+ {
+ writer.write(cbuf, off, len);
+ len = reader.read(cbuf);
+ off = 0;
+ }
}
else
{
@@ -232,10 +223,10 @@
private Source beginSourceAccess(Source source)
{
+ // no need to buffer those
+ if (source instanceof BufferedStreamSource || source instanceof DOMSource)
+ return source;
- if(source instanceof BufferedStreamSource)
- return source; // no need to buffer those
-
// Buffer the source content
if (source instanceof StreamSource)
{
Modified: trunk/jbossws-core/src/java/org/jboss/ws/core/utils/DOMWriter.java
===================================================================
--- trunk/jbossws-core/src/java/org/jboss/ws/core/utils/DOMWriter.java 2007-04-11 12:14:11
UTC (rev 2790)
+++ trunk/jbossws-core/src/java/org/jboss/ws/core/utils/DOMWriter.java 2007-04-11 12:24:20
UTC (rev 2791)
@@ -235,7 +235,7 @@
out.print("?>");
if (prettyprint)
out.println();
-
+
wroteXMLDeclaration = true;
}
@@ -275,6 +275,7 @@
Map nsMap = new HashMap();
String elPrefix = node.getPrefix();
+ String elNamespaceURI = node.getNamespaceURI();
if (elPrefix != null)
{
String nsURI = getNamespaceURI(elPrefix, element, rootNode);
@@ -294,7 +295,7 @@
String nsURI = getNamespaceURI(atPrefix, element, rootNode);
nsMap.put(atPrefix, nsURI);
// xsi:type='ns1:SubType', xsi:type='xsd:string'
- if (atName.equals(atPrefix + ":type") &&
atValue.indexOf(":") > 0)
+ if (atName.equals(atPrefix + ":type") &&
atValue.indexOf(":") > 0)
{
// xsi defined on the envelope
if (nsURI == null)
@@ -312,7 +313,8 @@
out.print(" " + atName + "='" + atValue +
"'");
}
- // Add missing namespace declaration
+ // Add namespace declaration for prefixes
+ // that are defined further up the tree
if (completeNamespaces)
{
Iterator itPrefix = nsMap.keySet().iterator();
@@ -326,6 +328,11 @@
out.print(" xmlns:" + prefix + "='" + nsURI
+ "'");
}
}
+
+ if (elPrefix == null && elNamespaceURI != null &&
!elNamespaceURI.equals(element.getAttribute("xmlns")))
+ {
+ out.print(" xmlns='" + elNamespaceURI +
"'");
+ }
}
if (hasChildNodes)
Modified:
trunk/jbossws-tests/src/java/org/jboss/test/ws/common/utils/DOMWriterTestCase.java
===================================================================
---
trunk/jbossws-tests/src/java/org/jboss/test/ws/common/utils/DOMWriterTestCase.java 2007-04-11
12:14:11 UTC (rev 2790)
+++
trunk/jbossws-tests/src/java/org/jboss/test/ws/common/utils/DOMWriterTestCase.java 2007-04-11
12:24:20 UTC (rev 2791)
@@ -25,8 +25,14 @@
import java.io.ByteArrayOutputStream;
import java.io.StringWriter;
+import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.stream.StreamSource;
import org.jboss.test.ws.JBossWSTest;
import org.jboss.ws.core.utils.DOMUtils;
@@ -213,4 +219,44 @@
assertEquals(expStr, wasStr);
}
+
+ public void testElementNamespaceURIElementNS() throws Exception
+ {
+ String xmlIn = "<Hello
xmlns='http://somens'>World</Hello>";
+
+ Element root = DOMUtils.createElement(new QName("http://somens",
"Hello"));
+ assertEquals("http://somens", root.getNamespaceURI());
+ root.setTextContent("World");
+
+ String xmlOut = DOMWriter.printNode(root, true);
+ assertEquals(xmlIn, xmlOut);
+ }
+
+ public void testElementNamespaceURIDocumentParse() throws Exception
+ {
+ String xmlIn = "<Hello
xmlns='http://somens'>World</Hello>";
+
+ Element root = DOMUtils.parse(xmlIn);
+ assertEquals("http://somens", root.getNamespaceURI());
+
+ String xmlOut = DOMWriter.printNode(root, true);
+ assertEquals(xmlIn, xmlOut);
+ }
+
+ public void testElementNamespaceURITransformer() throws Exception
+ {
+ String xmlIn = "<Hello
xmlns='http://somens'>World</Hello>";
+ StreamSource source = new StreamSource(new
ByteArrayInputStream(xmlIn.getBytes()));
+
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ DOMResult result = new DOMResult();
+ transformer.transform(source, result);
+
+ Element root = ((Document)result.getNode()).getDocumentElement();
+ assertEquals("http://somens", root.getNamespaceURI());
+
+ String xmlOut = DOMWriter.printNode(root, true);
+ assertEquals(xmlIn, xmlOut);
+ }
}