gdaniels 2002/12/11 09:17:45
Modified: java/test/functional TestMessageSample.java
java/test/encoding TestDOM.java
java/src/org/apache/axis/encoding
SerializationContextImpl.java
java/src/org/apache/axis/utils NSStack.java
Log:
Fix default namespace processing, which corrects a bunch of the XML
we're sending. Clean up message test to expect the correct value.
Revision Changes Path
1.10 +3 -3 xml-axis/java/test/functional/TestMessageSample.java
Index: TestMessageSample.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/functional/TestMessageSample.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- TestMessageSample.java 16 Sep 2002 19:34:24 -0000 1.9
+++ TestMessageSample.java 11 Dec 2002 17:17:43 -0000 1.10
@@ -85,12 +85,12 @@
String[] args = { };
String res = (new TestMsg()).doit(args);
String expected="Res elem[0]=<ns1:e1 xmlns:ns1=\"urn:foo\">Hello</ns1:e1>"
- +"Res elem[1]=<ns2:e1 xmlns:ns2=\"urn:foo\">World</ns2:e1>"
- +"Res elem[2]=<ns3:e3 xmlns:ns3=\"urn:foo\">"
+ +"Res elem[1]=<ns1:e1 xmlns:ns1=\"urn:foo\">World</ns1:e1>"
+ +"Res elem[2]=<ns1:e3 xmlns:ns1=\"urn:foo\">"
+"<![CDATA["
+"Text with\n\tImportant <b> whitespace </b> and tags! "
+"]]>"
- +"</ns3:e3>";
+ +"</ns1:e3>";
assertEquals("test result elements", res, expected);
}
1.15 +2 -6 xml-axis/java/test/encoding/TestDOM.java
Index: TestDOM.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/encoding/TestDOM.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- TestDOM.java 4 Sep 2002 20:15:11 -0000 1.14
+++ TestDOM.java 11 Dec 2002 17:17:44 -0000 1.15
@@ -1,7 +1,5 @@
package test.encoding;
-
-
import junit.framework.TestCase;
import org.apache.axis.AxisEngine;
import org.apache.axis.Message;
@@ -13,8 +11,6 @@
import org.apache.axis.server.AxisServer;
import org.apache.axis.utils.XMLUtils;
-import java.util.Iterator;
-
/**
* Verify that deserialization actually can cause the soap service
@@ -70,7 +66,7 @@
message.setMessageContext(msgContext);
// Now completely round trip it
- SOAPEnvelope envelope = message.getSOAPEnvelope();
+ message.getSOAPEnvelope();
// Element dom = message.getAsDOM();
String result = message.getSOAPPartAsString();
@@ -99,7 +95,7 @@
Message message2 = new Message(result);
message2.setMessageContext(msgContext);
- SOAPEnvelope envelope2 = message2.getSOAPEnvelope();
+ message2.getSOAPEnvelope();
String result2 = message2.getSOAPPartAsString();
assertTrue(result2.indexOf("foo1")!=-1);
1.84 +0 -1
xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java
Index: SerializationContextImpl.java
===================================================================
RCS file:
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -r1.83 -r1.84
--- SerializationContextImpl.java 4 Dec 2002 21:42:30 -0000 1.83
+++ SerializationContextImpl.java 11 Dec 2002 17:17:45 -0000 1.84
@@ -964,7 +964,6 @@
}
nsStack.pop();
- nsStack.clearFrame();
if (writingStartTag) {
writer.write("/>");
1.36 +40 -10 xml-axis/java/src/org/apache/axis/utils/NSStack.java
Index: NSStack.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/NSStack.java,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- NSStack.java 11 Dec 2002 16:12:30 -0000 1.35
+++ NSStack.java 11 Dec 2002 17:17:45 -0000 1.36
@@ -87,7 +87,8 @@
private Mapping[] stack;
private int top = 0;
private int iterator = 0;
-
+ private int currentDefaultNS = -1;
+
public NSStack() {
stack = new Mapping[32];
stack[0] = null;
@@ -119,6 +120,17 @@
top--;
+ // If we've moved below the current default NS, figure out the new
+ // default (if any)
+ if (top < currentDefaultNS) {
+ while (currentDefaultNS > 0) {
+ if (stack[currentDefaultNS] != null &&
+ stack[currentDefaultNS].getPrefix().length() == 0)
+ break;
+ currentDefaultNS--;
+ }
+ }
+
if (top == 0) {
if (log.isTraceEnabled())
log.trace("NSPop (" + Messages.getMessage("empty00") + ")");
@@ -149,7 +161,7 @@
/**
* Remove all mappings from the current frame.
*/
- public void clearFrame() {
+ private void clearFrame() {
while (stack[top] != null) top--;
}
@@ -183,16 +195,27 @@
* remap it to the (possibly different) namespaceURI.
*/
public void add(String namespaceURI, String prefix) {
- // Replace duplicate prefixes (last wins - this could also fault)
- for (int cursor=top; stack[cursor]!=null; cursor--) {
- if (stack[cursor].getPrefix().equals(prefix)) {
- stack[cursor].setNamespaceURI(namespaceURI);
- return;
+ int idx = top;
+ try {
+ // Replace duplicate prefixes (last wins - this could also fault)
+ for (int cursor=top; stack[cursor]!=null; cursor--) {
+ if (stack[cursor].getPrefix().equals(prefix)) {
+ stack[cursor].setNamespaceURI(namespaceURI);
+ idx = cursor;
+ return;
+ }
+ }
+
+ push();
+ stack[top] = new Mapping(namespaceURI, prefix);
+ idx = top;
+ } finally {
+ // If this is the default namespace, note the new in-scope
+ // default is here.
+ if (prefix.length() == 0) {
+ currentDefaultNS = idx;
}
}
-
- push();
- stack[top] = new Mapping(namespaceURI, prefix);
}
/**
@@ -216,6 +239,13 @@
int hash = namespaceURI.hashCode();
+ // If defaults are OK, and the given NS is the current default,
+ // return "" as the prefix to favor defaults where possible.
+ if (!noDefault && currentDefaultNS > 0 &&
+ namespaceURI.equals(
+ stack[currentDefaultNS].getNamespaceURI()))
+ return "";
+
for (int cursor=top; cursor>0; cursor--) {
Mapping map = stack[cursor];
if (map == null) continue;