package org.apache.axis2.jaxws.respectbinding; | |
import java.io.File; | |
import java.lang.annotation.Annotation; | |
import java.lang.reflect.Field; | |
import java.net.MalformedURLException; | |
import java.net.URL; | |
import java.util.ArrayList; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.Set; | |
import javax.jws.WebService; | |
import javax.xml.namespace.QName; | |
import javax.xml.ws.RespectBinding; | |
import javax.xml.ws.RespectBindingFeature; | |
import javax.xml.ws.Service; | |
import junit.framework.TestCase; | |
import org.apache.axis2.jaxws.common.config.WSDLValidatorElement; | |
import org.apache.axis2.jaxws.description.DescriptionFactory; | |
import org.apache.axis2.jaxws.description.EndpointDescription; | |
import org.apache.axis2.jaxws.description.ServiceDescription; | |
import org.apache.axis2.jaxws.description.DescriptionFactory.UpdateType; | |
import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite; | |
import org.apache.axis2.jaxws.description.builder.MDQConstants; | |
import org.apache.axis2.jaxws.description.builder.RespectBindingAnnot; | |
import org.apache.axis2.jaxws.feature.ServerFramework; | |
import org.apache.axis2.jaxws.server.config.RespectBindingConfigurator; | |
import org.apache.axis2.jaxws.spi.ServiceDelegate; | |
public class WSDLBindingsTest extends TestCase{ | |
private final static String namespaceURI="http://RespectBinding.jaxws22"; | |
private final static String serviceName="AddNumbersService"; | |
private final static String portName = "AddNumbersPort"; | |
private final static String wsdl = "RespectBinding.wsdl"; | |
private final static String policySample = "wspolicySample.wsdl"; | |
private final static String policySampleURI="http://www.example.com/stock/binding"; | |
private final static String policyServiceName="StockQuoteService"; | |
private final static String policyPortName = "Quote"; | |
/** | |
* This test does the following | |
* 1) Defines RespectBindingAnnotation with enabled=true | |
* 2) Fakes creation of an EndpointDescription with RespectBinding | |
* 3) Invokes RespectBindingConfigurator. | |
* 4) Checks for all Extensibility Element definition in wsdl:binding . | |
* 5) fails if it does not find expected elements in bindings. | |
*/ | |
public void testExtenisbilityElementAtBinding() throws Exception{ | |
QName serviceQName = new QName(namespaceURI, serviceName); | |
URL wsdlUrl = getWsdlURL(wsdl); | |
assertNotNull(wsdl); | |
DescriptionBuilderComposite serviceDBC = new DescriptionBuilderComposite(); | |
Map<String, List<Annotation>> map = new HashMap<String, List<Annotation>>(); | |
ArrayList<Annotation> wsFeatures = new ArrayList<Annotation>(); | |
RespectBindingAnnot wsFeature = new RespectBindingAnnot(); | |
// Define RespectBinding and set as enabled | |
wsFeature.setEnabled(true); | |
wsFeatures.add(wsFeature); | |
map.put(AddNumbersPortTypeSEI.class.getName(), wsFeatures); | |
serviceDBC.getProperties().put(MDQConstants.SEI_FEATURES_MAP, map); | |
ServiceDelegate.setServiceMetadata(serviceDBC); | |
try{ | |
//create service with wsdlurl. | |
Service service = Service.create(wsdlUrl, serviceQName); | |
assertNotNull("Service is null",service); | |
//Fetch Service Delegate so we can read EndpointDescription. | |
ServiceDelegate sd = getDelegate(service); | |
assertNotNull("ServiceDelegate is null", sd); | |
ServiceDescription serviceDesc = sd.getServiceDescription(); | |
assertNotNull("ServiceDescription is null", serviceDesc); | |
//Create EndpointDescription | |
DescriptionFactory.updateEndpoint(serviceDesc, AddNumbersPortTypeSEI.class, new QName(namespaceURI, portName), UpdateType.GET_PORT); | |
//Read EndpointDescription | |
EndpointDescription ed = serviceDesc.getEndpointDescription(new QName(namespaceURI, portName)); | |
assertNotNull("EndpointDescription is null", ed); | |
//Use RespectBindingConfigurator to read extensibility element in wsdlBindings. | |
RespectBindingConfigurator rbc = new RespectBindingConfigurator(); | |
//Mock Object Server Framework. | |
ServerFramework sf = new ServerFramework(); | |
Annotation a = wsFeature; | |
sf.addConfigurator(RespectBindingFeature.ID, rbc); | |
sf.addAnnotation(a); | |
//lets hang the RespectBinding annotation to the EndpointDefinition | |
addAnnotation(ed, sf); | |
rbc.configure(ed); | |
Set<WSDLValidatorElement> elements = ed.getRequiredBindings(); | |
assertNotNull("Set of WSDLValidatorElement was null", elements); | |
assertEquals("Expecting 5 Extension elements from wsdl in Set of WSDLValidatorElements but found "+elements.size(),elements.size(), 5); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail(e.getMessage()); | |
} | |
} | |
public void testPolicySetSample() throws Exception{ | |
QName serviceQName = new QName(policySampleURI, policyServiceName); | |
URL wsdlUrl = getWsdlURL(policySample); | |
assertNotNull(policySample); | |
DescriptionBuilderComposite serviceDBC = new DescriptionBuilderComposite(); | |
Map<String, List<Annotation>> map = new HashMap<String, List<Annotation>>(); | |
ArrayList<Annotation> wsFeatures = new ArrayList<Annotation>(); | |
RespectBindingAnnot wsFeature = new RespectBindingAnnot(); | |
// Define RespectBinding and set as enabled | |
wsFeature.setEnabled(true); | |
wsFeatures.add(wsFeature); | |
map.put(StockQuoteSEI.class.getName(), wsFeatures); | |
serviceDBC.getProperties().put(MDQConstants.SEI_FEATURES_MAP, map); | |
ServiceDelegate.setServiceMetadata(serviceDBC); | |
try{ | |
//create service with wsdlurl. | |
Service service = Service.create(wsdlUrl, serviceQName); | |
assertNotNull("Service is null",service); | |
//Fetch Service Delegate so we can read EndpointDescription. | |
ServiceDelegate sd = getDelegate(service); | |
assertNotNull("ServiceDelegate is null", sd); | |
ServiceDescription serviceDesc = sd.getServiceDescription(); | |
assertNotNull("ServiceDescription is null", serviceDesc); | |
QName name = new QName(policySampleURI, policyPortName); | |
//Create EndpointDescription | |
DescriptionFactory.updateEndpoint(serviceDesc, StockQuoteSEI.class, name, UpdateType.GET_PORT); | |
//Read EndpointDescription | |
EndpointDescription ed = serviceDesc.getEndpointDescription(name); | |
assertNotNull("EndpointDescription is null", ed); | |
//Use RespectBindingConfigurator to read extensibility element in wsdlBindings. | |
RespectBindingConfigurator rbc = new RespectBindingConfigurator(); | |
//Mock Object Server Framework. | |
ServerFramework sf = new ServerFramework(); | |
Annotation a = wsFeature; | |
sf.addConfigurator(RespectBindingFeature.ID, rbc); | |
sf.addAnnotation(a); | |
//lets hang the RespectBinding annotation to the EndpointDefinition | |
addAnnotation(ed, sf); | |
rbc.configure(ed); | |
Set<WSDLValidatorElement> elements = ed.getRequiredBindings(); | |
assertNotNull("Set of WSDLValidatorElement was null", elements); | |
assertEquals("Expecting 4 Extension elements from wsdl in Set of WSDLValidatorElements but found "+elements.size(),elements.size(), 4); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail(e.getMessage()); | |
} | |
} | |
private void addAnnotation(EndpointDescription ed, ServerFramework sf){ | |
try { | |
try { | |
Field framework = ed.getClass().getDeclaredField("framework"); | |
framework.setAccessible(true); | |
framework.set(ed, sf); | |
} catch (NoSuchFieldException e) { | |
// This may be a generated service subclass, so get the delegate from the superclass | |
Field framework = ed.getClass().getSuperclass().getDeclaredField("framework"); | |
framework.setAccessible(true); | |
framework.set(ed, sf); | |
} | |
} catch (SecurityException e) { | |
throw new RuntimeException(e); | |
} catch (IllegalAccessException e) { | |
throw new RuntimeException(e); | |
}catch (NoSuchFieldException e) { | |
throw new RuntimeException(e); | |
} | |
} | |
private ServiceDelegate getDelegate(Service service){ | |
// Need to get to the private Service._delegate | |
ServiceDelegate returnServiceDelegate = null; | |
try { | |
try { | |
Field serviceDelgateField = service.getClass().getDeclaredField("delegate"); | |
serviceDelgateField.setAccessible(true); | |
returnServiceDelegate = (ServiceDelegate) serviceDelgateField.get(service); | |
} catch (NoSuchFieldException e) { | |
// This may be a generated service subclass, so get the delegate from the superclass | |
Field serviceDelegateField = service.getClass().getSuperclass().getDeclaredField("delegate"); | |
serviceDelegateField.setAccessible(true); | |
returnServiceDelegate = (ServiceDelegate) serviceDelegateField.get(service); | |
} | |
} catch (SecurityException e) { | |
throw new RuntimeException(e); | |
} catch (IllegalAccessException e) { | |
throw new RuntimeException(e); | |
} catch (NoSuchFieldException e) { | |
throw new RuntimeException(e); | |
} | |
return returnServiceDelegate; | |
} | |
private URL getWsdlURL(String wsdlFileName) { | |
URL url = null; | |
String wsdlLocation = getWsdlLocation(wsdlFileName); | |
try { | |
File file = new File(wsdlLocation); | |
url = file.toURI().toURL(); | |
} catch (MalformedURLException e) { | |
e.printStackTrace(); | |
fail("Exception converting WSDL file to URL: " + e.toString()); | |
} | |
return url; | |
} | |
static String getWsdlLocation(String wsdlFileName) { | |
String wsdlLocation = null; | |
String baseDir = System.getProperty("basedir","."); | |
wsdlLocation = baseDir + "/test-resources/wsdl/" + wsdlFileName; | |
return wsdlLocation; | |
} | |
@WebService(name="AddNumbersPortType", targetNamespace="http://RespectBinding.jaxws22") | |
interface AddNumbersPortTypeSEI { | |
public int sum(int num1, int num2); | |
} | |
@WebService(name="StockQuotePortType", targetNamespace="http://www.example.com/stock/binding") | |
interface StockQuoteSEI { | |
public int GetLastTradePrice(String symbol); | |
} | |
} |