/* * 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.providerapi; import junit.framework.TestCase; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.description.AxisOperation; import org.apache.axis2.description.AxisService; import org.apache.axis2.jaxws.description.DescriptionFactory; import org.apache.axis2.jaxws.description.EndpointDescription; import org.apache.axis2.jaxws.description.EndpointInterfaceDescription; import org.apache.axis2.jaxws.description.OperationDescription; import org.apache.axis2.jaxws.description.ServiceDescription; import org.apache.axis2.jaxws.dispatchers.GenericProviderDispatcher; import javax.jws.WebService; import javax.xml.ws.BindingType; import javax.xml.ws.Provider; import javax.xml.ws.ServiceMode; import javax.xml.ws.WebServiceProvider; import javax.xml.ws.http.HTTPBinding; /** * */ public class GenericOperationProviderTest extends TestCase { public void testGenericHTTPBindingOperation() { // The HTTP binding supports a generic operation for WSDL-less endpoints. ServiceDescription serviceDesc = DescriptionFactory.createServiceDescription(HTTPBindingProviderImpl.class); assertNotNull(serviceDesc); EndpointDescription endpointDesc = serviceDesc.getEndpointDescriptions_AsCollection().iterator().next(); assertNotNull(endpointDesc); AxisService axisSvc = endpointDesc.getAxisService(); assertNotNull(axisSvc); EndpointInterfaceDescription interfaceDesc = endpointDesc.getEndpointInterfaceDescription(); assertNotNull(interfaceDesc); // There should be a single OpDesc with a single AxisOperation with a specific name OperationDescription opDescs[] = interfaceDesc.getOperations(); assertNotNull(opDescs); assertEquals(1, opDescs.length); AxisOperation axisOperation = opDescs[0].getAxisOperation(); assertNotNull(axisOperation); assertEquals(EndpointInterfaceDescription.JAXWS_NOWSDL_PROVIDER_OPERATION_NAME, axisOperation.getName().getLocalPart()); // Now verify that the special dispather can find this operation GenericProviderDispatcher dispatcher = new GenericProviderDispatcher(); MessageContext messageContext = new MessageContext(); messageContext.setAxisService(axisSvc); try { // The dispatcher will not try to resolve an AxisService assertNull(dispatcher.findService(messageContext)); // The dispatcher should find the special AxisOperation assertEquals(axisOperation, dispatcher.findOperation(axisSvc, messageContext)); } catch (AxisFault e) { fail("Unexpected exception" + e); } } public void _testGenericSOAPBindingOperation() { // REVIEW: Currently generic operations are not supported for SOAP Bindings ServiceDescription serviceDesc = DescriptionFactory.createServiceDescription(SOAPBindingProviderImpl.class); assertNotNull(serviceDesc); EndpointDescription endpointDesc = serviceDesc.getEndpointDescriptions_AsCollection().iterator().next(); assertNotNull(endpointDesc); AxisService axisSvc = endpointDesc.getAxisService(); assertNotNull(axisSvc); // Since there's no WSDL, there will be no operations and no EndpointInterfaceDescription // because this is a SOAPBinding. EndpointInterfaceDescription interfaceDesc = endpointDesc.getEndpointInterfaceDescription(); assertNull(interfaceDesc); } public void testSEIBasedEndpoint() { ServiceDescription serviceDesc = DescriptionFactory.createServiceDescription(SEIBasedEndpoint.class); assertNotNull(serviceDesc); EndpointDescription endpointDesc = serviceDesc.getEndpointDescriptions_AsCollection().iterator().next(); assertNotNull(endpointDesc); AxisService axisSvc = endpointDesc.getAxisService(); assertNotNull(axisSvc); EndpointInterfaceDescription interfaceDesc = endpointDesc.getEndpointInterfaceDescription(); assertNotNull(interfaceDesc); // There should be a single OpDesc with a single AxisOperation based on the SEI below // But it should not be the special named operation and the special dispatcher should not // return null for operation dispatch OperationDescription opDescs[] = interfaceDesc.getOperations(); assertNotNull(opDescs); assertEquals(1, opDescs.length); AxisOperation axisOperation = opDescs[0].getAxisOperation(); assertNotNull(axisOperation); if (EndpointInterfaceDescription.JAXWS_NOWSDL_PROVIDER_OPERATION_NAME.equals(axisOperation.getName().getLocalPart())) { fail("Operation has the generic provider name"); } // Now verify that the special dispather doesn't find the special operation GenericProviderDispatcher dispatcher = new GenericProviderDispatcher(); MessageContext messageContext = new MessageContext(); messageContext.setAxisService(axisSvc); try { // The dispatcher will not try to resolve an AxisService assertNull(dispatcher.findService(messageContext)); // The dispatcher should find the special AxisOperation assertNull(dispatcher.findOperation(axisSvc, messageContext)); } catch (AxisFault e) { fail("Unexpected exception" + e); } } } // Notice no WSDL is specified @WebServiceProvider() @BindingType(value=HTTPBinding.HTTP_BINDING) @ServiceMode(value=javax.xml.ws.Service.Mode.MESSAGE) class HTTPBindingProviderImpl implements Provider<String> { public String invoke(String obj) { // TODO Auto-generated method stub return null; } } //Notice no WSDL is specified @WebServiceProvider() class SOAPBindingProviderImpl implements Provider<String> { public String invoke(String obj) { // TODO Auto-generated method stub return null; } } // SEI based endpoint to make sure it doesn't get get the special generic provider operation added @WebService() class SEIBasedEndpoint { public String echo() { return null; } }