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