blob: 9ac8e8dd7b2f6e6abcb1f12d2855271f1b35d388 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.jaxws.samples.client.mtom;
import org.apache.axis2.jaxws.samples.mtom.ImageDepot;
import org.apache.axis2.jaxws.samples.mtom.ObjectFactory;
import org.apache.axis2.jaxws.samples.mtom.SendImage;
import org.apache.axis2.jaxws.samples.mtom.SendImageResponse;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.bind.JAXBContext;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.net.URL;
/**
* A sample client that uses MTOM to send an image using both the JAX-WS
* Dispatch and the Proxy.
*/
public class SampleMTOMTests {
private String urlHost = "localhost";
private String urlPort = "8080";
private String urlSuffix = "";
private static final String CONTEXT_BASE = "/jaxws-samples/services/";
private static final String MTOM_CONTEXT11 = CONTEXT_BASE + "MtomSampleService.MtomSamplePort";
private static final String MTOM_CONTEXT12 = CONTEXT_BASE + "MtomSampleService12.MtomSamplePort";
private static final String NAMESPACE = "http://org/apache/axis2/jaxws/samples/mtom/";
private String uriString = "http://" + urlHost + ":" + urlPort;
private QName serviceName11 = new QName(NAMESPACE, "MtomSampleService");
private QName serviceName12 = new QName(NAMESPACE, "MtomSampleService12");
private QName portNameDispatch = new QName(NAMESPACE, "MtomSamplePortDispatch");
private DataHandler content;
private String imageFilename = "";
private Boolean tryDispatch = true;
private Boolean tryProxy = true;
private Boolean soap12 = false;
/**
* Command Line Program Entry Point
*
* @param args - see printUsage output
*/
public static void main(String[] args) throws Exception {
SampleMTOMTests tests = new SampleMTOMTests();
tests.parseArgs(args);
if (tests.tryDispatch) {
tests.testMtomWithDispatch(null);
}
if (tests.tryProxy) {
tests.testMtomWithProxy(null, null);
}
}
/**
* Read and interpret the command-line arguments.
* See printUsage output for supported parameters
*
* @param args String[] From the Command Line
*/
public void parseArgs(String[] args) {
// Parse the arguments
if (args.length >= 1) {
for (int i = 0; i < args.length; i++) {
try {
if ('-' == args[i].charAt(0)) {
switch (args[i].charAt(1)) {
case '?':
printUsage(null);
System.exit(0);
break;
case 'd':
case 'D':
tryDispatch = true;
tryProxy = false;
break;
case 'x':
case 'X':
tryDispatch = false;
tryProxy = true;
break;
case 'h':
case 'H':
urlHost = args[++i];
break;
case 'p':
case 'P':
urlPort = args[++i];
break;
case 'f':
case 'F':
urlSuffix = args[++i];
break;
case 'i':
case 'I':
imageFilename = args[++i];
break;
case '1':
soap12 = false;
break;
case '2':
soap12 = true;
break;
default:
printUsage(args[i]);
System.exit(0);
break;
}
}
} catch (Exception e) {
System.out.println("Invalid option format.");
printUsage(null);
System.exit(0);
}
uriString = "http://" + urlHost + ":" + urlPort;
}
}
// Display a warning if there is no input filename
if (0 == imageFilename.length()) {
System.out
.println(">> [WARNING} - No attachment file specified. No data will be included.");
}
// Use the default suffix if it was not specified
if (0 == urlSuffix.length()) {
if (soap12) {
urlSuffix = MTOM_CONTEXT12;
} else {
urlSuffix = MTOM_CONTEXT11;
}
}
}
/**
* Set multiple class variables and init content.
*
* @param uri - String - base service URI
* @param soapdef - Boolean - true for SOAP 1.2
* @param fileName - source file to send
*/
public void setOptions(String uri, Boolean soapdef, String fileName)
throws Exception {
uriString = uri;
urlSuffix = (soapdef) ? MTOM_CONTEXT12 : MTOM_CONTEXT11;
soap12 = soapdef;
imageFilename = fileName;
init();
}
/**
* Print usage help to output
*
* @param invalidOpt -
* if non-null, is the invalid parameter
*/
private void printUsage(String invalidOpt) {
if (null != invalidOpt) {
System.out.println("Invalid Option: " + invalidOpt);
}
System.out.println("Usage:");
System.out
.println(" runSampleMtom -h [hostname] -p [port] -f [urlSuffix] -i [imageFilename] -d -x -1 -2");
System.out.println("Default values:");
System.out.println(" hostname = localhost");
System.out.println(" port = 8080");
System.out.println(" urlSuffix = /jaxws-samples/services/MtomSampleService.MtomSamplePort");
System.out.println(" -d = Use Dispatch Only");
System.out.println(" -x = Use Proxy Only");
System.out.println(" -1 = soap 1.1 (default)");
System.out.println(" -2 = soap 1.2");
}
/**
* Creates the content object if required
*/
private void init() throws Exception {
if (content == null) {
content = getBinaryContent();
}
}
/**
* Tests sending an image with MTOM, using the JAX-WS Dispatch API.
*
* @param result - String - used to pass back results to servlet.
* @return String - the input string or null
* @throws Exception
*/
public String testMtomWithDispatch(String result) throws Exception {
Service svc;
System.out.println(">>---------------------------------------");
System.out.println(">>MTOM Dispatch Test");
init();
// Set the data inside of the appropriate object
ImageDepot imageDepot = new ObjectFactory().createImageDepot();
imageDepot.setImageData(content);
if (soap12) {
svc = Service.create(serviceName12);
svc.addPort(portNameDispatch, SOAPBinding.SOAP12HTTP_BINDING, uriString + urlSuffix);
} else {
svc = Service.create(serviceName11);
svc.addPort(portNameDispatch, SOAPBinding.SOAP11HTTP_BINDING, uriString + urlSuffix);
}
// Setup the necessary JAX-WS artifacts
JAXBContext jbc = JAXBContext
.newInstance("org.apache.axis2.jaxws.samples.mtom");
Dispatch<Object> dispatch = svc.createDispatch(portNameDispatch, jbc,
Service.Mode.PAYLOAD);
BindingProvider bp = (BindingProvider) dispatch;
bp.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY,
Boolean.TRUE);
bp.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY,
"sendImage");
// Set the actual flag to enable MTOM
SOAPBinding binding = (SOAPBinding) dispatch.getBinding();
binding.setMTOMEnabled(true);
// Create the request wrapper bean
ObjectFactory factory = new ObjectFactory();
SendImage request = factory.createSendImage();
request.setInput(imageDepot);
if (null != result) {
result = result.concat("Invoking Dispatch<Object> with a binary payload\n");
} else {
System.out
.println(">>MTOM Invoking Dispatch<Object> with a binary payload");
}
// Send the image and process the response image
try {
SendImageResponse response = (SendImageResponse) dispatch.invoke(request);
if (null != result) {
if (response != null) {
result = result.concat("MTOM Dispatch Response received - " + response.getOutput().getImageData().getContentType());
} else {
result = result.concat("ERROR: MTOM Dispatch NULL Response received");
}
} else {
if (response != null) {
System.out.println(">>MTOM Response received");
System.out
.println(">>MTOM Writing returned image to dispatch_response.gif");
ImageDepot responseContent = response.getOutput();
processImageDepot(responseContent, "dispatch_response.gif");
} else {
System.out.println(">> [ERROR] - Response from the server was NULL");
}
}
}
catch (Exception e) {
if (null != result) {
result = result.concat(">> [ERROR] - Exception making connection.");
}
System.out.println(">> [ERROR] - Exception making connection.");
e.printStackTrace();
}
System.out.println(">>MTOM Dispatch Done");
return (result);
}
/**
* Tests sending an image with MTOM, using a JAX-WS Dynamic Proxy.
*
* @param result - String - used to pass back results to servlet.
* @return String - the input string or null
* @throws Exception
*/
public String testMtomWithProxy(String result, URL url) throws Exception {
ImageDepot response;
System.out.println(">>---------------------------------------");
System.out.println(">>MTOM Proxy Test");
init();
// Set the data inside of the appropriate object
ImageDepot imageDepot = new ObjectFactory().createImageDepot();
imageDepot.setImageData(content);
if (null != result) {
result = result.concat("Invoking MTOM proxy with a binary payload\n");
} else {
System.out.println(">>MTOM Invoking proxy with a binary payload");
}
// Setup the necessary JAX-WS artifacts
try {
if (soap12) {
// Use the generated proxy
MtomSample12PortProxy proxy = new MtomSample12PortProxy(url);
proxy._getDescriptor().setEndpoint(uriString + urlSuffix);
// Enable MTOM
BindingProvider bp = (BindingProvider) proxy._getDescriptor().getProxy();
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setMTOMEnabled(true);
// Send the image and process the response image
response = proxy.sendImage(imageDepot);
} else {
// SOAP 1.1 Create the service
// Use the generated proxy
MtomSamplePortProxy proxy = new MtomSamplePortProxy(url);
proxy._getDescriptor().setEndpoint(uriString + urlSuffix);
// Enable MTOM
BindingProvider bp = (BindingProvider) proxy._getDescriptor().getProxy();
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setMTOMEnabled(true);
// Send the image and process the response image
response = proxy.sendImage(imageDepot);
}
if (null != result) {
if (response != null) {
result = result.concat("MTOM Proxy Response received - " + response.getImageData().getContentType());
} else {
result = result.concat("ERROR: MTOM Proxy NULL Response received\n");
}
} else {
if (response != null) {
System.out.println(">>MTOM Response received");
System.out
.println(">>MTOM Writing returned image to proxy_response.gif");
processImageDepot(response, "proxy_response.gif");
} else {
System.out
.println(">> [ERROR] - Response from the server was NULL");
}
}
}
catch (Exception e) {
if (null != result) {
result = result.concat(">> [ERROR] - Exception making connection.");
}
System.out.println(">> [ERROR] - Exception making connection.");
e.printStackTrace();
}
System.out.println(">>MTOM Proxy Done");
return (result);
}
/*
* Get a DataHandler that contains the binary data we'd like to send.
* @return DataHandler
* @throws Exception
*/
private DataHandler getBinaryContent() throws Exception {
DataHandler dh = null;
if (imageFilename != null) {
File file = new File(imageFilename);
if (!file.exists()) {
throw new FileNotFoundException();
}
System.out.println(">>MTOM Loading data from: '"
+ file.toURI().toURL().toExternalForm() + "'");
FileDataSource fds = new FileDataSource(file);
dh = new DataHandler(fds);
}
return dh;
}
/*
* Takes the data from the ImageDepot and writes it out to a file named by
* the provided String.
* @param ImageDepot data
* @param String fname
* @throws Exception
*/
private void processImageDepot(ImageDepot data, String fname)
throws Exception {
DataHandler dh = data.getImageData();
if (dh != null) {
File f = new File(fname);
if (f.exists()) {
f.delete();
}
FileOutputStream fos = new FileOutputStream(f);
dh.writeTo(fos);
} else {
System.out
.println(">> [ERROR] - ImageDepot was not null, but did not contain binary data");
}
}
}