| package test.md5attach; |
| |
| import org.apache.axis.MessageContext; |
| import org.apache.axis.client.Call; |
| import org.apache.axis.utils.Options; |
| |
| /** |
| * A convenient little test program which will send a message as is to |
| * the server. Useful for debugging interoperability problems or |
| * handling of ill-formed messages that are hard to reproduce programmatically. |
| * |
| * Accepts the standard options, followed by a list of files containing |
| * the contents to be sent. |
| */ |
| public class MD5AttachTest { |
| static void main(String[] args) throws Exception { |
| Options opts = new Options(args); |
| String action = opts.isValueSet('a'); |
| |
| Call call = new Call(opts.getURL()); |
| if (action != null) { |
| call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true)); |
| call.setProperty(Call.SOAPACTION_URI_PROPERTY, action); |
| } |
| |
| args = opts.getRemainingArgs(); |
| |
| if (null == args || args.length != 1) { |
| System.err.println("Must specify file to send as an attachment!"); |
| System.exit(8); |
| } |
| |
| //Create the attachment. |
| javax.activation.DataHandler dh = new javax.activation.DataHandler(new javax.activation.FileDataSource(args[0])); |
| |
| org.apache.axis.message.SOAPEnvelope env = new org.apache.axis.message.SOAPEnvelope(); |
| |
| //Build the body elements. |
| javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance(); |
| javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder(); |
| org.w3c.dom.Document doc = db.newDocument(); |
| org.w3c.dom.Element methodElement = doc.createElementNS("foo", "foo:MD5Attach"); |
| org.w3c.dom.Element paramElement = doc.createElementNS("foo", "foo:thefile"); |
| long startTime = System.currentTimeMillis(); |
| methodElement.appendChild(paramElement); |
| paramElement.appendChild(doc.createTextNode("" + startTime)); |
| |
| |
| org.apache.axis.message.SOAPBodyElement sbe = new org.apache.axis.message.SOAPBodyElement(methodElement); |
| env.addBodyElement(sbe); |
| |
| org.apache.axis.Message msg = new org.apache.axis.Message(env); |
| |
| //Add the attachment content to the message. |
| org.apache.axis.attachments.Attachments attachments = msg.getAttachmentsImpl(); |
| org.apache.axis.Part attachmentPart = attachments.createAttachmentPart(dh); |
| String href = attachmentPart.getContentId(); |
| //Have the parameter element set an href attribute to the attachment. |
| paramElement.setAttribute(org.apache.axis.Constants.ATTR_HREF, href); |
| env.clearBody(); |
| env.addBodyElement(sbe); |
| |
| ((org.apache.axis.SOAPPart)msg.getSOAPPart()).setSOAPEnvelope(env); |
| |
| call.setRequestMessage(msg); |
| //go on now.... |
| call.invoke(); |
| |
| MessageContext mc = call.getMessageContext(); |
| // System.out.println(mc.getResponseMessage().getAsString()); |
| |
| env = mc.getResponseMessage().getSOAPEnvelope(); |
| sbe = env.getFirstBody(); |
| org.w3c.dom.Element sbElement = sbe.getAsDOM(); |
| //get the first level accessor ie parameter |
| org.w3c.dom.Node n = sbElement.getFirstChild(); |
| for (; n != null && !(n instanceof org.w3c.dom.Element); n = n.getNextSibling()) ; |
| paramElement = (org.w3c.dom.Element) n; |
| |
| org.w3c.dom.Node respNode = paramElement.getFirstChild(); |
| long elapsedTime = -1; |
| if (respNode != null && respNode instanceof org.w3c.dom.Text) { |
| |
| String respStr = ((org.w3c.dom.Text) respNode).getData(); |
| String timeStr = null; |
| String MD5String = null; |
| java.util.StringTokenizer st = new java.util.StringTokenizer(respStr); |
| while (st.hasMoreTokens()) { |
| String s = st.nextToken().trim(); |
| if (s.startsWith("elapsedTime=")) |
| timeStr = s.substring(12); |
| else if (s.startsWith("MD5=")) MD5String = s.substring(4); |
| } |
| if (timeStr != null) { |
| long time = Long.parseLong(timeStr); |
| timeStr = (time / 100.0) + " sec."; |
| } else { |
| timeStr = "Unknown"; |
| } |
| System.out.println("The time to send was:" + timeStr); |
| if (MD5String == null) { |
| System.err.println("Sorry no MD5 data was received."); |
| } else { |
| System.out.println("Calculating MD5 for local file..."); |
| java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); |
| byte[] MD5received = org.apache.axis.encoding.Base64.decode(MD5String); |
| java.io.InputStream attachmentStream = dh.getInputStream(); |
| int bread = 0; |
| byte[] buf = new byte[64 * 1024]; |
| do { |
| bread = attachmentStream.read(buf); |
| if (bread > 0) { |
| md.update(buf, 0, bread); |
| } |
| } while (bread > -1); |
| attachmentStream.close(); |
| buf = null; |
| //Add the mime type to the digest. |
| String contentType = dh.getContentType(); |
| if (contentType != null && contentType.length() != 0) { |
| md.update(contentType.getBytes("US-ASCII")); |
| } |
| byte[] MD5orginal = md.digest(); |
| if (java.util.Arrays.equals(MD5orginal, MD5received)) { |
| System.out.println("All is well with Axis's attachment support!"); |
| System.exit(0); |
| } else { |
| System.err.println("Miss match in MD5"); |
| } |
| } |
| } else { |
| System.err.println("Sorry no returned data."); |
| } |
| System.err.println("You've found a bug:\"http://nagoya.apache.org/bugzilla/\""); |
| System.exit(8); |
| } |
| |
| } |