snichol 2003/06/12 23:23:02
Modified: java/src/org/apache/soap/encoding/soapenc
MimePartSerializer.java
java/src/org/apache/soap/rpc RPCMessage.java
SOAPContext.java
java/src/org/apache/soap/util/mime MimeUtils.java
Log:
Two changes unfortunately committed together.
1. Split from "doc/lit serialization" whether to qualify elements by
namespace, since this is a separate concern in WSDL.
2. Isolate URL encoding and decoding of attachment cids. These *should* be
done using UTF8 encoding, but JDK 1.4 is required to do this without
rolling our own. Problems arise only when a host name has non-ASCII
characters: perhaps munging the host name is the best short term
solution.
Revision Changes Path
1.6 +3 -2
xml-soap/java/src/org/apache/soap/encoding/soapenc/MimePartSerializer.java
Index: MimePartSerializer.java
===================================================================
RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/MimePartSerializer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- MimePartSerializer.java 6 Jan 2003 17:57:14 -0000 1.5
+++ MimePartSerializer.java 13 Jun 2003 06:23:02 -0000 1.6
@@ -161,7 +161,7 @@
// Write the URLEncoded reference.
sink.write(' ' + Constants.ATTR_REFERENCE + " =\"cid:"
- + java.net.URLEncoder.encode(cid) + '"');
+ + MimeUtils.encode(cid) + '"');
sink.write("/>");
}
@@ -191,7 +191,8 @@
throw new IllegalArgumentException(
"Attachment tag \"" + paramEl.getTagName()
+ "\" refers to a Mime attachment with label \""
- + uri + "\" which could not be found.");
+ + uri + "\" (" + MimeUtils.decode(uri)
+ + ") which could not be found.");
} else
dh = bp.getDataHandler();
} catch(MessagingException me) {
1.23 +5 -4 xml-soap/java/src/org/apache/soap/rpc/RPCMessage.java
Index: RPCMessage.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/rpc/RPCMessage.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- RPCMessage.java 18 Nov 2002 21:52:06 -0000 1.22
+++ RPCMessage.java 13 Jun 2003 06:23:02 -0000 1.23
@@ -261,20 +261,21 @@
if (!resp.generatedFault()) {
// Get the prefix for the targetObjectURI.
StringWriter nsDeclSW = new StringWriter();
- // TODO: is there a way to specify the URI is now the default namespace?
String targetObjectNSPrefix = nsStack.getPrefixFromURI(
targetObjectURI, nsDeclSW);
sink.write('<');
- if (!ctx.getDocLitSerialization ()) {
+ if (!ctx.getQualifyElements()) {
sink.write(targetObjectNSPrefix);
sink.write(':');
}
sink.write(methodName);
sink.write(suffix);
- if (!ctx.getDocLitSerialization ()) {
+ if (!ctx.getQualifyElements()) {
sink.write(nsDeclSW.toString ());
} else {
+ // Qualify elements by way of a default namespace
+ // TODO: is there a way to specify internally the URI is now the default
namespace?
sink.write(" xmlns=\"");
sink.write(targetObjectURI);
sink.write('\"');
@@ -317,7 +318,7 @@
serializeParams(params, actualMsgEncStyle, sink, nsStack, xjmr, ctx);
sink.write("</");
- if (!ctx.getDocLitSerialization ()) {
+ if (!ctx.getQualifyElements()) {
sink.write(targetObjectNSPrefix);
sink.write(':');
}
1.17 +23 -2 xml-soap/java/src/org/apache/soap/rpc/SOAPContext.java
Index: SOAPContext.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/rpc/SOAPContext.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- SOAPContext.java 20 Nov 2002 21:34:42 -0000 1.16
+++ SOAPContext.java 13 Jun 2003 06:23:02 -0000 1.17
@@ -90,6 +90,7 @@
protected boolean docLitSerialization = false;
protected Boolean gzip = null;
protected Boolean acceptGzip = null;
+ protected boolean qualifyElements = false;
protected boolean isRootPartEnvelope = false;
protected String rootPartString = null;
@@ -691,7 +692,8 @@
}
/**
- * Gets whether document/literal style is used in serialization.
+ * Gets whether document/literal style is used in serialization. This
+ * supresses xsi:type and SOAP-ENV:encodingStyle attributes.
*
* @return Whether document/literal style is used in serialization.
*/
@@ -700,7 +702,8 @@
}
/**
- * Sets whether document/literal style is used in serialization.
+ * Sets whether document/literal style is used in serialization. This
+ * supresses xsi:type and SOAP-ENV:encodingStyle attributes.
*
* @param docLitSerialization Whether document/literal style is used in
serialization.
*/
@@ -853,6 +856,24 @@
*/
public void setOneWay(boolean oneWay) {
this.oneWay = oneWay;
+ }
+
+ /**
+ * Gets whether elements are qualified in serialization.
+ *
+ * @return Whether elements are qualified in serialization.
+ */
+ public boolean getQualifyElements() {
+ return qualifyElements;
+ }
+
+ /**
+ * Sets whether elements are qualified in serialization.
+ *
+ * @param docLitSerialization Whether elements are qualified in serialization.
+ */
+ public void setQualifyElements(boolean qualifyElements) {
+ this.qualifyElements = qualifyElements;
}
/**
1.7 +10 -18 xml-soap/java/src/org/apache/soap/util/mime/MimeUtils.java
Index: MimeUtils.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/mime/MimeUtils.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- MimeUtils.java 14 Nov 2002 16:22:09 -0000 1.6
+++ MimeUtils.java 13 Jun 2003 06:23:02 -0000 1.7
@@ -113,27 +113,19 @@
}
/**
+ * URLEncode string.
+ */
+ public static String encode(String s) {
+ // TODO: for JDK 1.4, use java.net.URLEncoder.encode(s, "UTF8")
+ return java.net.URLEncoder.encode(s);
+ }
+
+ /**
* URLDecode string.
*/
- private static final String hexmap = "0123456789ABCDEF";
public static String decode(String s) {
- StringBuffer ret = new StringBuffer(s.length());
- char c;
- for (int i = 0; i < s.length(); i++) {
- c = s.charAt(i);
- switch(c) {
- case '+':
- ret.append(' ');
- break;
- case '%':
- ret.append((char)((hexmap.indexOf(s.charAt(++i)) << 4)
- + hexmap.indexOf(s.charAt(++i))));
- break;
- default:
- ret.append(c);
- }
- }
- return ret.toString();
+ // TODO: for JDK 1.4, use java.net.URLDecoder.decode(s, "UTF8")
+ return java.net.URLDecoder.decode(s);
}
/**