package test.jaxrpc; import junit.framework.TestCase; import org.apache.axis.AxisFault; import org.apache.axis.Constants; import org.apache.axis.Handler; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.handlers.BasicHandler; import org.apache.axis.handlers.HandlerInfoChainFactory; import org.apache.axis.handlers.soap.SOAPService; import org.apache.axis.message.Detail; import org.apache.axis.server.AxisServer; import javax.xml.rpc.JAXRPCException; import javax.xml.rpc.handler.HandlerChain; import javax.xml.rpc.handler.HandlerInfo; import javax.xml.rpc.soap.SOAPFaultException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TestSOAPService extends AJAXRPC { /** * 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.init(); soapService.invoke(new TestMessageContext()); 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 { SOAPService soapService = new SOAPService(); // SETUP THE 2nd HANDLER IN THE REQUEST CHAIN TO RETURN FALSE handler1Config.put("HANDLE_REQUEST_RETURN_VALUE", Boolean.FALSE); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); soapService.invoke(msgContext); 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); } /** * @throws Exception */ public void testRequestHandlerThrowsSFE() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE 2nd HANDLER IN THE REQUEST CHAIN TO THROW SOAPFaultException handler1Config.put("HANDLE_REQUEST_RETURN_VALUE", new SOAPFaultException(null, "f", "f", new Detail())); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); soapService.invoke(msgContext); AAAHandler handlerZero = factory.getHandlers()[0]; AAAHandler handlerOne = factory.getHandlers()[1]; AAAHandler handlerTwo = factory.getHandlers()[2]; assertHandlerRuntime("handlerZero", handlerZero, 1, 0, 1); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 1); assertHandlerRuntime("handlerTwo", handlerTwo, 0, 0, 0); } /** * @throws Exception */ public void testRequestHandlerThrowsJAXRPCException() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE 2nd HANDLER IN THE REQUEST CHAIN TO THROW JAXRPCException handler1Config.put("HANDLE_REQUEST_RETURN_VALUE", new JAXRPCException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); try { soapService.invoke(msgContext); } 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); } } public void testRequestHandlerThrowsRuntimeException() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE 2nd HANDLER IN THE REQUEST CHAIN TO THROW JAXRPCException handler1Config.put("HANDLE_REQUEST_RETURN_VALUE", new RuntimeException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); try { soapService.invoke(msgContext); } 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); } } public void testResponseHandlerReturnsFalse() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE 3rd HANDLER IN THE CHAIN TO RETURN FALSE on handleResponse handler2Config.put("HANDLE_RESPONSE_RETURN_VALUE", Boolean.FALSE); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); soapService.invoke(msgContext); 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); } public void testResponseHandlerThrowsJAXRPCException() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE 2nd HANDLER IN THE CHAIN TO THROW JAXRPCException on handleResponse handler1Config.put("HANDLE_RESPONSE_RETURN_VALUE", new JAXRPCException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); try { soapService.invoke(msgContext); 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); } } public void testResponseHandlerThrowsRuntimeException() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE 2nd HANDLER IN THE CHAIN TO THROW RuntimeException on handleResponse handler1Config.put("HANDLE_RESPONSE_RETURN_VALUE", new RuntimeException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); try { soapService.invoke(msgContext); 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); } } public void testHandleFaultReturnsFalse() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE LAST HANDLER IN THE REQUEST CHAIN TO THROW SOAPFaultException handler2Config.put("HANDLE_REQUEST_RETURN_VALUE", new SOAPFaultException(null, "f", "f", new Detail())); handler1Config.put("HANDLE_FAULT_RETURN_VALUE", Boolean.FALSE); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); soapService.invoke(msgContext); 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, 1); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 0, 1); } /** * 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 SOAPFaultException * H2.handleFault * H1.handleFault throws JAXRPCException * * @throws Exception */ public void testFaultHandlerThrowsJAXRPCException() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE LAST HANDLER IN THE REQUEST CHAIN TO THROW SOAPFaultException handler2Config.put("HANDLE_REQUEST_RETURN_VALUE", new SOAPFaultException(null, "f", "f", new Detail())); handler1Config.put("HANDLE_FAULT_RETURN_VALUE", new JAXRPCException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); try { soapService.invoke(msgContext); 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, 1); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 0, 1); } } /** * 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 throws SOAPFaultException * H2.handleFault * H1.handleFault throws RuntimeException * * @throws Exception */ public void testFaultHandlerThrowsRuntimeException() throws Exception { SOAPService soapService = new SOAPService(); // SETUP THE LAST HANDLER IN THE REQUEST CHAIN TO THROW SOAPFaultException handler2Config.put("HANDLE_REQUEST_RETURN_VALUE", new SOAPFaultException(null, "f", "f", new Detail())); handler1Config.put("HANDLE_FAULT_RETURN_VALUE", new RuntimeException()); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); try { soapService.invoke(msgContext); 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, 1); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 0, 1); } } /** * 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 { Handler serviceHandler = new MockServiceHandler(); SOAPService soapService = new SOAPService(null, null, serviceHandler); TestHandlerInfoChainFactory factory = buildInfoChainFactory(); soapService.setOption(Constants.ATTR_HANDLERINFOCHAIN, factory); soapService.init(); MessageContext msgContext = new TestMessageContext(); try { soapService.invoke(msgContext); 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, 1); assertHandlerRuntime("handlerOne", handlerOne, 1, 0, 1); assertHandlerRuntime("handlerTwo", handlerTwo, 1, 0, 1); } } 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() { super(new AxisServer()); Message message = new Message(listByAreaCode); message.setMessageType(Message.REQUEST); setRequestMessage(message); } } }