blob: 7b27c92f3ad9f7347545f576cfb2d4bcb9e4208c [file] [log] [blame]
/*
* 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.description;
import junit.framework.TestCase;
import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
import org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite;
import org.apache.axis2.jaxws.description.builder.ParameterDescriptionComposite;
import org.apache.axis2.jaxws.description.builder.WebMethodAnnot;
import org.apache.axis2.jaxws.description.builder.WebParamAnnot;
import org.apache.axis2.jaxws.description.builder.WebServiceAnnot;
import org.apache.axis2.jaxws.description.builder.converter.JavaClassToDBCConverter;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.WebServiceException;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Tests the creation of the Description classes based on a service implementation bean and various
* combinations of annotations
*/
public class AnnotationServiceImplWithDBCTests extends TestCase {
/**
* Create the description classes with a service implementation that contains the @WebService
* JSR-181 annotation which references an SEI.
*/
//Test creation of a Service Description from DBC, using a basic list.
//An implicit SEI that extends only java.lang.object
public void testServiceImplAsImplicitSEI() {
//org.apache.log4j.BasicConfigurator.configure();
//Build a Hashmap of DescriptionBuilderComposites that contains the serviceImpl and
//all necessary associated DBC's possibly including SEI and superclasses
HashMap<String, DescriptionBuilderComposite> dbcMap =
new HashMap<String, DescriptionBuilderComposite>();
DescriptionBuilderComposite dbc = buildDBCNoEndpointInterface();
dbcMap.put(dbc.getClassName(), dbc);
// TODO: This test is invalid as is. It does not specify WSDL, and WSDL generator is not currently available in Open Source
// So, an exception is currently being thrown. It may be the correct fix is to NOT always try to generate WSDL; and only
// try to generate it if it is asked for.
try {
List<ServiceDescription> serviceDescList =
DescriptionFactory.createServiceDescriptionFromDBCMap(dbcMap);
assertNotNull(serviceDescList.get(0));
//We know this list contains only one SD, so no need to loop
EndpointDescription[] endpointDesc = serviceDescList.get(0).getEndpointDescriptions();
assertNotNull(endpointDesc);
assertEquals(endpointDesc.length, 1);
// TODO: How will the JAX-WS dispatcher get the appropriate port (i.e. endpoint)? Currently assumes [0]
EndpointInterfaceDescription endpointIntfDesc =
endpointDesc[0].getEndpointInterfaceDescription();
assertNotNull(endpointIntfDesc);
} catch (WebServiceException e) {
}
/*
* Deprecated -- this used to be the test for
* EndpointInterfaceDescription.getOperationForJavaMethod
*/
/*
OperationDescription[] operations = endpointIntfDesc.getOperations();
String[] paramTypes = operations[0].getJavaParameters();
assertNotNull(paramTypes);
assertEquals(paramTypes.length, 1);
assertEquals("javax.xml.ws.Holder", paramTypes[0]);
// Test RequestWrapper annotations
assertEquals(operations[0].getRequestWrapperLocalName(), "Echo");
assertEquals(operations[0].getRequestWrapperTargetNamespace(), "http://ws.apache.org/axis2/tests");
assertEquals(operations[0].getRequestWrapperClassName(), "org.apache.ws.axis2.tests.Echo");
// Test ResponseWrapper annotations
assertEquals(operations[0].getResponseWrapperLocalName(), "EchoResponse");
assertEquals(operations[0].getResponseWrapperTargetNamespace(), "http://ws.apache.org/axis2/tests");
assertEquals(operations[0].getResponseWrapperClassName(), "org.apache.ws.axis2.tests.EchoResponse");
// Test SOAPBinding default; that annotation is not present in the SEI
// Note that annotation could occur on the operation or the type
// (although on this SEI it doesn't occur either place).
assertEquals(SOAPBinding.Style.DOCUMENT, operations[0].getSoapBindingStyle());
assertEquals(SOAPBinding.Style.DOCUMENT, endpointIntfDesc.getSoapBindingStyle());
*/
}
//TODO: Basic Test with EndpointInterface set to something valid, so another DBC must
// exist in list
//TODO: Basic Test for Provider
//TODO: Validation Tests
// - Setting WS and WSP
// - Fail just one in List, But allow successful ones to pass
/*
* Method to return the endpoint interface description for a given implementation class.
*/
//private EndpointInterfaceDescription getEndpointInterfaceDesc(Class implementationClass) {
// // Use the description factory directly; this will be done within the JAX-WS runtime
// return (new EndpointInterfaceDescription());
// //return testEndpointInterfaceDesc;
//}
static public DescriptionBuilderComposite buildDBCNoEndpointInterface() {
//Create a WebServiceAnnot
String WSName = "EchoServiceAnnotated";
String WSTargetNamespace = "http://description.jaxws.axis2.apache.org/";
String WSServiceName = "EchoServiceName";
//String WSWsdlLocation = "http://EchoService/wsdl";
String WSWsdlLocation = "";
String WSEndpointInterface = "";
String WSPortName = "EchoServiceAnnotatedPort";
WebServiceAnnot webServiceAnnot =
WebServiceAnnot.createWebServiceAnnotImpl(
WSName,
WSTargetNamespace,
WSServiceName,
WSWsdlLocation,
WSEndpointInterface,
WSPortName);
//Create a WebMethodAnnot
String operationName = "echoStringMethod";
String action = "urn:EchoStringMethod";
boolean exclude = false;
WebMethodAnnot webMethodAnnot = WebMethodAnnot.createWebMethodAnnotImpl();
webMethodAnnot.setOperationName(operationName);
webMethodAnnot.setAction(action);
webMethodAnnot.setExclude(exclude);
//Create the WebParamAnnot
String WPName = "arg0";
String WPPartName = "sku";
String WPTargetNamespace = "http://description.jaxws.axis2.apache.org/";
WebParam.Mode WPMode = WebParam.Mode.IN;
boolean WPHeader = true;
WebParamAnnot webParamAnnot = WebParamAnnot.createWebParamAnnotImpl();
webParamAnnot.setName(WPName);
webParamAnnot.setPartName(WPPartName);
webParamAnnot.setMode(WPMode);
webParamAnnot.setTargetNamespace(WPTargetNamespace);
webParamAnnot.setHeader(WPHeader);
//Build up the the DBC and all necessary composites
ParameterDescriptionComposite pdc = new ParameterDescriptionComposite();
pdc.setParameterType("java.lang.String");
pdc.setWebParamAnnot(webParamAnnot);
MethodDescriptionComposite mdc = new MethodDescriptionComposite();
mdc.setWebMethodAnnot(webMethodAnnot);
mdc.setMethodName(operationName);
mdc.addParameterDescriptionComposite(pdc, 0);
DescriptionBuilderComposite dbc = new DescriptionBuilderComposite();
dbc.setClassName("org.apache.axis2.samples.EchoServiceAnnotated");
dbc.setWebServiceAnnot(webServiceAnnot);
dbc.addMethodDescriptionComposite(mdc);
return dbc;
}
public void testLoadWSDLImpl() {
String wsdlLocation = getEchoMessageServiceWSDLLocation();
// Build up a DBC, including the WSDL Definition and the annotation information for
// the impl class.
JavaClassToDBCConverter converter = new JavaClassToDBCConverter(EchoMessageService.class);
HashMap<String, DescriptionBuilderComposite> dbcMap = converter.produceDBC();
assertNotNull(dbcMap);
DescriptionBuilderComposite dbc = dbcMap.get(EchoMessageService.class.getName());
assertNotNull(dbc);
dbc.setClassLoader(this.getClass().getClassLoader());
WebServiceAnnot webServiceAnnot = dbc.getWebServiceAnnot();
assertNotNull(webServiceAnnot);
webServiceAnnot.setWsdlLocation(wsdlLocation);
dbc.setWebServiceAnnot(webServiceAnnot);
dbcMap.put(EchoMessageService.class.getName(), dbc);
List<ServiceDescription> serviceDescList =
DescriptionFactory.createServiceDescriptionFromDBCMap(dbcMap);
assertEquals(1, serviceDescList.size());
ServiceDescription sd = serviceDescList.get(0);
assertNotNull(sd);
// make sure the WSDL definition was read in from the appropriate location
assertNotNull(((ServiceDescriptionWSDL) sd).getWSDLDefinition());
}
public void testLoadWSDLSEI() {
String wsdlLocation = getEchoMessageServiceWSDLLocation();
// Build up a DBC, including the WSDL Definition and the annotation information for
// the impl class.
JavaClassToDBCConverter converter = new JavaClassToDBCConverter(EchoMessageServiceSEI.class);
HashMap<String, DescriptionBuilderComposite> dbcMap = converter.produceDBC();
assertNotNull(dbcMap);
DescriptionBuilderComposite dbc = dbcMap.get(EchoMessageServiceSEI.class.getName());
assertNotNull(dbc);
DescriptionBuilderComposite seiDBC = dbcMap.get(EchoMessageServiceInterface.class.getName());
assertNotNull(seiDBC);
dbc.setClassLoader(this.getClass().getClassLoader());
WebServiceAnnot webServiceAnnot = seiDBC.getWebServiceAnnot();
assertNotNull(webServiceAnnot);
webServiceAnnot.setWsdlLocation(wsdlLocation);
seiDBC.setWebServiceAnnot(webServiceAnnot);
dbcMap.put(EchoMessageServiceInterface.class.getName(), seiDBC);
List<ServiceDescription> serviceDescList =
DescriptionFactory.createServiceDescriptionFromDBCMap(dbcMap);
assertEquals(1, serviceDescList.size());
ServiceDescription sd = serviceDescList.get(0);
assertNotNull(sd);
// make sure the WSDL definition was read in from the appropriate location
assertNotNull(((ServiceDescriptionWSDL) sd).getWSDLDefinition());
}
/**
* This is intended to verify that properties set on a DescriptionBuilderComposite
* instance are carried over to the EndpointDescription object that is created
* from the DBC.
*/
public void testSetProperties() {
//Build a Hashmap of DescriptionBuilderComposites that contains the serviceImpl and
//all necessary associated DBC's possibly including SEI and superclasses
HashMap<String, DescriptionBuilderComposite> dbcMap =
new HashMap<String, DescriptionBuilderComposite>();
DescriptionBuilderComposite dbc = buildDBCNoEndpointInterface();
Map<String, Object> props = new HashMap<String, Object>();
props.put("prop1", "prop1");
props.put("prop2", "prop2");
dbc.setProperties(props);
dbcMap.put(dbc.getClassName(), dbc);
try {
List<ServiceDescription> serviceDescList =
DescriptionFactory.createServiceDescriptionFromDBCMap(dbcMap);
assertNotNull(serviceDescList.get(0));
//We know this list contains only one SD, so no need to loop
EndpointDescription[] endpointDesc = serviceDescList.get(0).getEndpointDescriptions();
assertNotNull(endpointDesc);
assertEquals(endpointDesc.length, 1);
// get the EndpointDescription so we can make sure the properties were
// propogated to the underlying Axis runtime objects
EndpointDescription ed = endpointDesc[0];
// make sure we find the two properties that were set on the DBC
assertNotNull(ed.getProperty("prop1"));
assertTrue(ed.getProperty("prop1").equals("prop1"));
assertNotNull(ed.getProperty("prop2"));
assertTrue(ed.getProperty("prop2").equals("prop2"));
}
catch(Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
private String getEchoMessageServiceWSDLLocation() {
String loc = null;
String sep = java.io.File.separator;
loc = sep + "test-resources" + sep + "wsdl" + sep + "EchoMessageService.wsdl";
try {
String baseDir = new File(System.getProperty("basedir",".")).getCanonicalPath();
loc = baseDir + loc;
}
catch(IOException ioe) {
ioe.printStackTrace();
}
return loc;
}
@WebService(serviceName = "EchoMessageService", portName = "EchoMessagePort", targetNamespace = "http://nonanonymous.complextype.test.org", wsdlLocation = "test-resources/wsdl/EchoMessageService.wsdl")
public class EchoMessageService {
public String echoMessage(String arg) {
return arg;
}
}
@WebService(serviceName = "EchoMessageService", endpointInterface=
"org.apache.axis2.jaxws.description.AnnotationServiceImplWithDBCTests$EchoMessageServiceInterface")
public class EchoMessageServiceSEI {
public String echoMessage(String arg) {
return arg;
}
}
@WebService(portName = "EchoMessagePort", targetNamespace = "http://nonanonymous.complextype.test.org", wsdlLocation = "test-resources/wsdl/EchoMessageService.wsdl")
public interface EchoMessageServiceInterface {
public String echoMessage(String arg);
}
}