package test.jaxrpc; import javax.xml.namespace.QName; import javax.xml.rpc.JAXRPCException; import org.apache.axis.AxisFault; import org.apache.axis.ConfigurationException; import org.apache.axis.Constants; import org.apache.axis.EngineConfiguration; import org.apache.axis.Handler; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.client.AxisClient; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.configuration.EngineConfigurationFactoryFinder; import org.apache.axis.configuration.FileProvider; import org.apache.axis.deployment.wsdd.WSDDDeployment; import org.apache.axis.deployment.wsdd.WSDDTransport; import org.apache.axis.handlers.soap.SOAPService; /** * * * @author Guillaume Sauthier */ public class TestAxisClient extends AJAXRPC { /** * * * @author Guillaume Sauthier */ protected class AxisFaultWSDDTransport extends WSDDTransport { /** * @see org.apache.axis.deployment.wsdd.WSDDDeployableItem#makeNewInstance(org.apache.axis.EngineConfiguration) */ public Handler makeNewInstance(EngineConfiguration registry) throws ConfigurationException { return new MockServiceHandler(); } /** * @see org.apache.axis.deployment.wsdd.WSDDDeployableItem#getQName() */ public QName getQName() { return new QName("faulter"); } } /* * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); } /* * @see TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); } /** * All Handlers in Chain return true for handleRequest and handleResponse *

*

* * Expected Chain invocation sequence looks like..... * H0.handleRequest * H1.handleRequest * H2.handleRequest * H2.handleResponse * H1.handleResponse * H0.handleResponse * * @throws Exception */ public void testPositiveCourseFlow() throws Exception { TestHandlerInfoChainFactory factory = buildInfoChainFactory(); SOAPService soapService = new SOAPService(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); MessageContext context = new TestMessageContext(client); context.setTransportName("local"); context.setService(soapService); client.invoke(context); AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 1, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 1, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 1, 0); } /** * Tests scenario where one handler returns false on a call * to handleRequest(...). *

* Expected Chain invocation sequence looks like..... * H0.handleRequest * H1.handleRequest returns false * H1.handleResponse * H0.handleResponse * * @throws Exception */ public void testRequestHandlerReturnsFalse() throws Exception { // SETUP THE 2nd HANDLER IN THE REQUEST CHAIN TO RETURN FALSE handler1Config.put("HANDLE_REQUEST_RETURN_VALUE", Boolean.FALSE); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); SOAPService soapService = new SOAPService(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); MessageContext context = new TestMessageContext(client); context.setTransportName("local"); context.setService(soapService); client.invoke(context); AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 1, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 1, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 0, 0, 0); } /** * Tests scenario where one handler throws a JAXRPCException * to handleRequest(...). *

* Expected Chain invocation sequence looks like..... * H0.handleRequest * H1.handleRequest throws JAXRPCException * * @throws Exception */ public void testRequestHandlerThrowsJAXRPCException() throws Exception { // SETUP THE 2nd HANDLER IN THE REQUEST CHAIN TO THROW JAXRPCException handler1Config.put("HANDLE_REQUEST_RETURN_VALUE", new JAXRPCException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); SOAPService soapService = new SOAPService(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); MessageContext context = new TestMessageContext(client); context.setTransportName("local"); context.setService(soapService); try { client.invoke(context); } catch (AxisFault e) { AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 0, 0, 0); } } /** * Tests scenario where one handler throws a RuntimeException * to handleRequest(...). *

* Expected Chain invocation sequence looks like..... * H0.handleRequest * H1.handleRequest throws JAXRPCException * * @throws Exception */ public void testRequestHandlerThrowsRuntimeException() throws Exception { // SETUP THE 2nd HANDLER IN THE REQUEST CHAIN TO THROW JAXRPCException handler1Config.put("HANDLE_REQUEST_RETURN_VALUE", new RuntimeException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); SOAPService soapService = new SOAPService(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); MessageContext context = new TestMessageContext(client); context.setTransportName("local"); context.setService(soapService); try { client.invoke(context); fail("Expected AxisFault to be thrown"); } catch (AxisFault e) { AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 0, 0, 0); } } /** * Tests scenario where one handler returns false on a call * to handleResponse(...). *

* Expected Chain invocation sequence looks like..... * H0.handleRequest * H1.handleRequest * H2.handleRequest * H2.handleResponse return false * * @throws Exception */ public void testResponseHandlerReturnsFalse() throws Exception { // SETUP THE 3rd HANDLER IN THE CHAIN TO RETURN FALSE on handleResponse handler2Config.put("HANDLE_RESPONSE_RETURN_VALUE", Boolean.FALSE); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); SOAPService soapService = new SOAPService(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); MessageContext context = new TestMessageContext(client); context.setTransportName("local"); context.setService(soapService); client.invoke(context); AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 1, 0); } /** * Tests scenario where one handler throws JAXRPCException on a call * to handleResponse(...). *

* Expected Chain invocation sequence looks like..... * H0.handleRequest * H1.handleRequest * H2.handleRequest * H2.handleResponse * H1.handlerResponse throws JAXRPCException * * @throws Exception */ public void testResponseHandlerThrowsJAXRPCException() throws Exception { // SETUP THE 2nd HANDLER IN THE CHAIN TO THROW JAXRPCException on handleResponse handler1Config.put("HANDLE_RESPONSE_RETURN_VALUE", new JAXRPCException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); SOAPService soapService = new SOAPService(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); MessageContext context = new TestMessageContext(client); context.setTransportName("local"); context.setService(soapService); try { client.invoke(context); fail("Expected AxisFault to be thrown"); } catch (AxisFault e) { AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 1, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 1, 0); } } /** * Tests scenario where one handler throws RuntimeException on a call * to handleResponse(...). *

* Expected Chain invocation sequence looks like..... * H0.handleRequest * H1.handleRequest * H2.handleRequest * H2.handleResponse * H1.handlerResponse throws RuntimeException * * @throws Exception */ public void testResponseHandlerThrowsRuntimeException() throws Exception { // SETUP THE 2nd HANDLER IN THE CHAIN TO THROW RuntimeException on handleResponse handler1Config.put("HANDLE_RESPONSE_RETURN_VALUE", new RuntimeException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); SOAPService soapService = new SOAPService(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); MessageContext context = new TestMessageContext(client); context.setTransportName("local"); context.setService(soapService); try { client.invoke(context); fail("Expected AxisFault to be thrown"); } catch (AxisFault e) { AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 1, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 1, 0); } } /** * Tests scenario where one handler returns false on a call * to handleFault(...). *

* Expected Chain invocation sequence looks like..... * H0.handleRequest * H1.handleRequest * H2.handleRequest * H2.handleFault * H1.handleFault return false * * @throws Exception */ public void testHandleFaultReturnsFalse() throws Exception { // SETUP A MOCK SERVICE THAT SIMULATE A SOAPFAULT THROWN BY ENDPOINT handler1Config.put("HANDLE_FAULT_RETURN_VALUE", Boolean.FALSE); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); SOAPService soapService = new SOAPService(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); addFaultTransport(client); MessageContext context = new TestMessageContext(client); context.setTransportName("faulter"); context.setService(soapService); try { client.invoke(context); fail("Expecting an AxisFault"); } catch (AxisFault f) { AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 0, 0); } } /** * Tests to see if we handle the scenario of a handler throwing a * runtime exception during the handleFault(...) processing correctly *

* Expected chain sequence: * H0.handleRequest * H1.handleRequest * H2.handleRequest * H2.handleFault * H1.handleFault throws JAXRPCException * * @throws Exception */ public void testFaultHandlerThrowsJAXRPCException() throws Exception { handler1Config.put("HANDLE_FAULT_RETURN_VALUE", new JAXRPCException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); Handler serviceHandler = new MockServiceHandler(); SOAPService soapService = new SOAPService(null, serviceHandler, null); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); addFaultTransport(client); MessageContext context = new TestMessageContext(client); context.setTransportName("faulter"); context.setService(soapService); try { client.invoke(context); fail("Expected AxisFault to be thrown"); } catch (AxisFault e) { AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 0, 0); } } /** * Tests to see if we handle the scenario of a handler throwing a * runtime exception during the handleFault(...) processing correctly *

* Expected chain sequence: * H0.handleRequest * H1.handleRequest * H2.handleRequest * H2.handleFault * H1.handleFault throws RuntimeException * * @throws Exception */ public void testFaultHandlerThrowsRuntimeException() throws Exception { // SETUP THE LAST HANDLER IN THE REQUEST CHAIN TO THROW SOAPFaultException handler1Config.put("HANDLE_FAULT_RETURN_VALUE", new RuntimeException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); Handler serviceHandler = new MockServiceHandler(); SOAPService soapService = new SOAPService(null, serviceHandler, null); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); addFaultTransport(client); MessageContext context = new TestMessageContext(client); context.setTransportName("faulter"); context.setService(soapService); try { client.invoke(context); fail("Expected AxisFault to be thrown"); } catch (AxisFault e) { AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 0, 0); } } /** * Tests scenario where service object throws Axis Fault. *

* Expected chain sequence: * H0.handleRequest * H1.handleRequest * H2.handleRequest * ServiceObject.invoke() throws AxisFault * H2.handleFault * H1.handleFault * H0.handleFault * * @throws Exception */ public void testServiceObjectThrowsAxisFault() throws Exception { TestHandlerInfoChainFactory factory = buildInfoChainFactory(); Handler serviceHandler = new MockServiceHandler(); SOAPService soapService = new SOAPService(null, serviceHandler, null); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.setOption(Call.WSDL_SERVICE, new Service()); soapService.setOption(Call.WSDL_PORT_NAME, new QName("Fake")); soapService.init(); AxisClient client = new AxisClient(); addFaultTransport(client); MessageContext context = new TestMessageContext(client); context.setTransportName("faulter"); context.setService(soapService); try { client.invoke(context); fail("Expected AxisFault to be thrown"); } catch (AxisFault e) { AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 0); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 0); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 0, 0); } } /** * Configure a transport handler that simulate a Fault on server-side * @param client AxisClient */ private void addFaultTransport(AxisClient client) { FileProvider config = (FileProvider) client.getConfig(); WSDDDeployment depl = config.getDeployment(); if (depl == null) { depl = new WSDDDeployment(); } WSDDTransport trans = new AxisFaultWSDDTransport(); depl.deployTransport(trans); } private class TestMessageContext extends org.apache.axis.MessageContext { public String listByAreaCode = "\n" + "\n" + "\n" + "192168001100108165800640600008\n" + "\n" + "\n" + "\n" + "\n" + "617\n" + "\n" + "\n" + "\n"; public TestMessageContext(AxisClient client) { super(client); Message message = new Message(listByAreaCode); message.setMessageType(Message.REQUEST); setRequestMessage(message); } } }