blob: f33856d12eb46e481422a44f3f2a959a6d8fa2fc [file] [log] [blame]
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);
}
}