/* * 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; import org.apache.axis2.jaxws.samples.client.echo.EchoService12PortProxy; import org.apache.axis2.jaxws.samples.client.echo.EchoServiceCallbackHandler; import org.apache.axis2.jaxws.samples.client.echo.EchoServicePortProxy; import org.apache.axis2.jaxws.samples.client.ping.PingService12PortProxy; import org.apache.axis2.jaxws.samples.client.ping.PingServicePortProxy; import org.apache.axis2.jaxws.samples.echo.EchoStringInput; import org.apache.axis2.jaxws.samples.echo.EchoStringResponse; import org.apache.axis2.jaxws.samples.ping.ObjectFactory; import org.apache.axis2.jaxws.samples.ping.PingStringInput; import org.apache.axis2.jaxws.ClientConfigurationFactory; import org.apache.axis2.metadata.registry.MetadataFactoryRegistry; import org.apache.axis2.AxisFault; import org.apache.axis2.deployment.FileSystemConfigurator; import org.apache.axis2.context.ConfigurationContextFactory; import org.apache.axis2.context.ConfigurationContext; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import java.util.concurrent.Future; import java.net.URL; /** * SampleClient * main entry point for thinclient jar sample * and worker class to communicate with the services */ public class SampleClient { private int timeout = 240; // Error timeout in seconds private static final int SLEEPER = 2; // Poll delay for async private String urlHost = "localhost"; private String urlPort = "8080"; private static final String CONTEXT_BASE = "/jaxws-samples/services/"; private static final String PING_CONTEXT = CONTEXT_BASE + "PingService.PingServicePort"; private static final String ECHO_CONTEXT = CONTEXT_BASE + "EchoService.EchoServicePort"; private static final String PING_CONTEXT12 = CONTEXT_BASE + "PingService12.PingService12Port"; private static final String ECHO_CONTEXT12 = CONTEXT_BASE + "EchoService12.EchoService12Port"; private String urlSuffix = ""; private String message = "HELLO"; private String servtype = "async"; private String uriString = "http://" + urlHost + ":" + urlPort; private Boolean wireasync = true; private Boolean soap12 = false; private int count = 1; private ClientConfigurationFactory clientConfigurationFactory = null; /** * main() * <p/> * see printusage() for command-line arguments * * @param args */ public static void main(String[] args) { SampleClient sample = new SampleClient(); sample.parseArgs(args); sample.CallService(); } /** * parseArgs Read and interpret the command-line arguments * * @param args */ public void parseArgs(String[] args) { 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 'h': case 'H': urlHost = args[++i]; break; case 'p': case 'P': urlPort = args[++i]; break; case 'f': case 'F': urlSuffix = args[++i]; break; case 'm': case 'M': message = args[++i]; break; case 's': case 'S': servtype = args[++i]; if ((!servtype.equalsIgnoreCase("async")) && (!servtype.equalsIgnoreCase("echo")) && (!servtype.equalsIgnoreCase("ping"))) { System.out .println("ERROR: Attempt to invoke a service that is not supported"); printUsage(null); System.exit(0); } break; case 't': case 'T': timeout = new Integer(args[++i]).intValue(); break; case 'c': case 'C': count = new Integer(args[++i]).intValue(); break; case 'w': case 'W': String parm = args[++i]; if (parm.equalsIgnoreCase("y")) { wireasync = true; } else { wireasync = false; } 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; } } } /** * printUsage 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(" runSampleSei -h [hostname] -p [port] -f [urlSuffix] -m [testMessage] -s [echo|ping|async] -t [timeout] -w [y|n] -c [count] -1 -2"); System.out.println("Default values:"); System.out.println(" hostname = localhost"); System.out.println(" port = 8080"); System.out.println(" testMessage = HELLO"); System.out.println(" urlSuffix = /jaxws-samples/services/EchoService.EchoServicePort"); System.out.println(" service = async"); System.out.println(" timeout = 240 (seconds)"); System.out.println(" wireasync = y (yes)"); System.out.println(" count = 1"); System.out.println(" -1 = soap 1.1 (default)"); System.out.println(" -2 = soap 1.2"); } /** * CallService Parms were already read. Now call the service proxy classes */ void CallService() { for (int index = 0; index < count; index++) { if (soap12) { if (servtype.equalsIgnoreCase("echo")) { if (0 == urlSuffix.length()) { urlSuffix = ECHO_CONTEXT12; } buildEcho12(uriString + urlSuffix, null, message); } else if (servtype.equalsIgnoreCase("async")) { if (0 == urlSuffix.length()) { urlSuffix = ECHO_CONTEXT12; } if (clientConfigurationFactory == null) { ClientConfigurationFactory factory = initConfigurationFactory(); buildAsync12(uriString + urlSuffix, null, message, timeout, wireasync); destroyConfigurationFactory(factory); } else { buildAsync12(uriString + urlSuffix, null, message, timeout, wireasync); } } else { if (0 == urlSuffix.length()) { urlSuffix = PING_CONTEXT12; } buildPing12(uriString + urlSuffix, null, message); } } else { if (servtype.equalsIgnoreCase("echo")) { if (0 == urlSuffix.length()) { urlSuffix = ECHO_CONTEXT; } buildEcho(uriString + urlSuffix, null, message); } else if (servtype.equalsIgnoreCase("async")) { if (0 == urlSuffix.length()) { urlSuffix = ECHO_CONTEXT; } if (clientConfigurationFactory == null) { ClientConfigurationFactory factory = initConfigurationFactory(); buildAsync(uriString + urlSuffix, null, message, timeout, wireasync); destroyConfigurationFactory(factory); } else { buildAsync(uriString + urlSuffix, null, message, timeout, wireasync); } } else { if (0 == urlSuffix.length()) { urlSuffix = PING_CONTEXT; } buildPing(uriString + urlSuffix, null, message); } } } } private ClientConfigurationFactory initConfigurationFactory() { String axis2xml = System.getProperty("org.apache.axis2.jaxws.config.path"); if (axis2xml == null) { throw new RuntimeException("Please set org.apache.axis2.jaxws.config.path system property to a valid axis2.xml file (with addressing module enabled)"); } ClientConfigurationFactory factory = null; try { FileSystemConfigurator configurator = new FileSystemConfigurator(null, axis2xml); factory = new ClientConfigurationFactory(configurator); MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class, factory); } catch (AxisFault axisFault) { throw new RuntimeException(axisFault); } return factory; } private void destroyConfigurationFactory(ClientConfigurationFactory factory) { try { factory.getClientConfigurationContext().terminate(); } catch (AxisFault axisFault) { throw new RuntimeException(axisFault); } } /** * buildPing * Call the ping service * * @param endpointURL The Service endpoint URL * @param input The message string * @return Boolean true if the ping works */ public boolean buildPing(String endpointURL, URL wsdlURL, String input) { try { PingServicePortProxy ping = new PingServicePortProxy(wsdlURL); ping._getDescriptor().setEndpoint(endpointURL); System.out.println(">> CLIENT: SEI Ping to " + endpointURL); // Configure SOAPAction properties BindingProvider bp = (BindingProvider) (ping._getDescriptor() .getProxy()); bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); bp.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); bp.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, "pingOperation"); // Build the input object PingStringInput pingParm = new ObjectFactory().createPingStringInput(); pingParm.setPingInput(input); // Call the service ping.pingOperation(pingParm); System.out.println(">> CLIENT: SEI Ping SUCCESS."); return true; } catch (Exception e) { System.out.println(">> CLIENT: ERROR: SEI Ping EXCEPTION."); e.printStackTrace(); return false; } } /** * buildEcho * Call the Echo service (Sync) * * @param endpointURL The Service endpoint URL * @param input The message string * @return String from the service */ public String buildEcho(String endpointURL, URL wsdlURL, String input) { String response = "ERROR!:"; try { EchoServicePortProxy echo = new EchoServicePortProxy(wsdlURL); echo._getDescriptor().setEndpoint(endpointURL); // Configure SOAPAction properties BindingProvider bp = (BindingProvider) (echo._getDescriptor() .getProxy()); bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); bp.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); bp.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation"); // Build the input object EchoStringInput echoParm = new org.apache.axis2.jaxws.samples.echo.ObjectFactory().createEchoStringInput(); echoParm.setEchoInput(input); System.out.println(">> CLIENT: SEI Echo to " + endpointURL); // Call the service response = echo.echoOperation(echoParm).getEchoResponse(); System.out.println(">> CLIENT: SEI Echo invocation complete."); System.out.println(">> CLIENT: SEI Echo response is: " + response); } catch (Exception e) { System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION."); e.printStackTrace(); return response + ">>>ECHO SERVICE EXCEPTION<<< "; } return response; } /** * buildAsync * Call the Echo service (Async) * * @param endpointURL The Service endpoint URL * @param input The message string * @param waiting The Async timeout * @param wireasync true to use Async on the wire * @return String from the service */ public String buildAsync(String endpointURL, URL wsdlURL, String input, int waiting, Boolean wireasync) { String response = "ERROR!:"; try { EchoServicePortProxy echo = new EchoServicePortProxy(wsdlURL); echo._getDescriptor().setEndpoint(endpointURL); // Configure SOAPAction properties BindingProvider bp = (BindingProvider) (echo._getDescriptor() .getProxy()); bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); bp.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); bp.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation"); if (wireasync) { bp.getRequestContext().put(org.apache.axis2.jaxws.util.Constants.USE_ASYNC_MEP, Boolean.TRUE); } // Set up the callback handler and create the input object EchoServiceCallbackHandler callbackHandler = new EchoServiceCallbackHandler(); EchoStringInput echoParm = new org.apache.axis2.jaxws.samples.echo.ObjectFactory().createEchoStringInput(); echoParm.setEchoInput(input); System.out.println(">> CLIENT: SEI Async to " + endpointURL); // Call the service Future<?> resp = echo.echoOperationAsync(echoParm, callbackHandler); Thread.sleep(1000); while (!resp.isDone()) { // Check for timeout if (waiting <= 0) { System.out .println(">> CLIENT: ERROR - SEI Async Timeout waiting for reply."); return response + "Async timeout waiting for reply."; } System.out .println(">> CLIENT: SEI Async invocation still not complete"); Thread.sleep(1000 * SLEEPER); waiting -= SLEEPER; } // Get the response and print it, then return EchoStringResponse esr = callbackHandler.getResponse(); System.out.println(">> CLIENT: SEI Async invocation complete."); if (null != esr) { response = esr.getEchoResponse(); if (null != response) { System.out.println(">> CLIENT: SEI Async response is: " + response); } } } catch (Exception e) { System.out.println(">> CLIENT: ERROR: SEI Async EXCEPTION."); e.printStackTrace(); return response + ">>>ASYNC SERVICE EXCEPTION<<<"; } return response; } /** * buildPing12 * Call the ping service * * @param endpointURL The Service endpoint URL * @param input The message string * @return Boolean true if the ping works */ public boolean buildPing12(String endpointURL, URL wsdlURL, String input) { try { PingService12PortProxy ping = new PingService12PortProxy(wsdlURL); ping._getDescriptor().setEndpoint(endpointURL); System.out.println(">> CLIENT: SEI Ping to " + endpointURL); // Build the input object PingStringInput pingParm = new org.apache.axis2.jaxws.samples.ping.ObjectFactory().createPingStringInput(); pingParm.setPingInput(input); // Call the service ping.pingOperation(pingParm); System.out.println(">> CLIENT: SEI Ping SUCCESS."); return true; } catch (Exception e) { System.out.println(">> CLIENT: ERROR: SEI Ping EXCEPTION."); e.printStackTrace(); return false; } } /** * buildEcho12 * Call the Echo service (Sync) * * @param endpointURL The Service endpoint URL * @param input The message string * @return String from the service */ public String buildEcho12(String endpointURL, URL wsdlURL, String input) { String response = "ERROR!:"; try { EchoService12PortProxy echo = new EchoService12PortProxy(wsdlURL); echo._getDescriptor().setEndpoint(endpointURL); // Build the input object EchoStringInput echoParm = new org.apache.axis2.jaxws.samples.echo.ObjectFactory().createEchoStringInput(); echoParm.setEchoInput(input); System.out.println(">> CLIENT: SEI Echo to " + endpointURL); // Call the service response = echo.echoOperation(echoParm).getEchoResponse(); System.out.println(">> CLIENT: SEI Echo invocation complete."); System.out.println(">> CLIENT: SEI Echo response is: " + response); } catch (Exception e) { System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION."); e.printStackTrace(); return response + ">>>ECHO SERVICE EXCEPTION<<< "; } return response; } /** * buildAsync12 * Call the Echo service (Async) * * @param endpointURL The Service endpoint URL * @param input The message string * @param waiting The Async timeout * @param wireasync true to use Async on the wire * @return String from the service */ public String buildAsync12(String endpointURL, URL wsdlURL, String input, int waiting, Boolean wireasync) { String response = "ERROR!:"; try { EchoService12PortProxy echo = new EchoService12PortProxy(wsdlURL); echo._getDescriptor().setEndpoint(endpointURL); // Configure over-the-wire async if specified if (wireasync) { BindingProvider bp = (BindingProvider) (echo._getDescriptor() .getProxy()); bp.getRequestContext().put(org.apache.axis2.jaxws.util.Constants.USE_ASYNC_MEP, Boolean.TRUE); } // Set up the callback handler and create the input object EchoServiceCallbackHandler callbackHandler = new EchoServiceCallbackHandler(); EchoStringInput echoParm = new org.apache.axis2.jaxws.samples.echo.ObjectFactory().createEchoStringInput(); echoParm.setEchoInput(input); System.out.println(">> CLIENT: SEI Async to " + endpointURL); // Call the service Future<?> resp = echo.echoOperationAsync(echoParm, callbackHandler); Thread.sleep(1000); while (!resp.isDone()) { // Check for timeout if (waiting <= 0) { System.out .println(">> CLIENT: ERROR - SEI Async Timeout waiting for reply."); return response + "Async timeout waiting for reply."; } System.out .println(">> CLIENT: SEI Async invocation still not complete"); Thread.sleep(1000 * SLEEPER); waiting -= SLEEPER; } // Get the response and print it, then return EchoStringResponse esr = callbackHandler.getResponse(); System.out.println(">> CLIENT: SEI Async invocation complete."); if (null != esr) { response = esr.getEchoResponse(); if (null != response) { System.out.println(">> CLIENT: SEI Async response is: " + response); } } } catch (Exception e) { System.out.println(">> CLIENT: ERROR: SEI Async EXCEPTION."); e.printStackTrace(); return response + ">>>ASYNC SERVICE EXCEPTION<<<"; } return response; } public void setClientConfigurationFactory(ClientConfigurationFactory clientConfigurationFactory) { this.clientConfigurationFactory = clientConfigurationFactory; } }