blob: edacaaab50ab336fc329c5fb3015cf588cf26af0 [file] [log] [blame]
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);
}
}