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); } /**