blob: 95b3764ca5c822afab7b1adbcbb038c0992f129f [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.impl;
import junit.framework.TestCase;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.jaxws.ClientConfigurationFactory;
import org.apache.axis2.jaxws.description.EndpointDescription;
import org.apache.axis2.jaxws.description.ServiceDescription;
import org.apache.axis2.jaxws.description.builder.CustomAnnotationInstance;
import org.apache.axis2.jaxws.description.builder.CustomAnnotationProcessor;
import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
import org.apache.axis2.jaxws.description.builder.converter.JavaClassToDBCConverter;
import org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl;
import org.apache.axis2.jaxws.description.validator.EndpointDescriptionValidator;
import org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType;
import org.apache.axis2.metadata.registry.MetadataFactoryRegistry;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import java.io.File;
import java.io.InputStream;
import java.lang.annotation.ElementType;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DescriptionFactoryImplTests extends TestCase {
private static final String namespaceURI =
"http://org.apache.axis2.jaxws.description.ServiceDescriptionTests";
private static final String localPart = "EchoService";
private static final QName serviceQName = new QName(namespaceURI, localPart);
public void testServiceDescriptionCaching() {
QName uniqueQName = new QName(namespaceURI, localPart + "_testValidServiceSubclass");
ServiceDescription desc1 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName, ServiceSubclass.class);
/*
int size = 5;
ServiceDescription desc2;
for (int i = 0; i < size; i++) {
desc2 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName, ServiceSubclass.class);
assertTrue("service description was not reused", desc1 == desc2);
}
*/
}
public void testClearServiceDescriptionCache() throws Exception {
QName uniqueQName1 = new QName(namespaceURI, localPart + "_testClearCache1");
QName uniqueQName2 = new QName(namespaceURI, localPart + "_testClearCache2");
// // the ClientConfigFactory instance is stored DescriptionFactoryImpl clientConfigFactory
// // field and for this test we need to clear it, so that a custom version of
// // ClientConfigurationFactory can be used.
// resetClientConfigFactory();
// install caching factory
ClientConfigurationFactory oldFactory =
(ClientConfigurationFactory)MetadataFactoryRegistry.getFactory(ClientConfigurationFactory.class);
CachingClientContextFactory newFactory = new CachingClientContextFactory();
MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class, newFactory);
try {
ServiceDescription desc1 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName1, ServiceSubclass.class);
ServiceDescription desc2 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName1, ServiceSubclass.class);
newFactory.reset();
ServiceDescription desc3 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName2, ServiceSubclass.class);
assertTrue(desc1 == desc2);
assertTrue(desc1 != desc3);
// should clear one
DescriptionFactoryImpl.clearServiceDescriptionCache(desc2.getAxisConfigContext());
ServiceDescription desc4 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName1, ServiceSubclass.class);
ServiceDescription desc5 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName2, ServiceSubclass.class);
assertTrue(desc1 != desc4);
assertTrue(desc3 == desc5);
// should clear both
DescriptionFactoryImpl.clearServiceDescriptionCache();
ServiceDescription desc6 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName1, ServiceSubclass.class);
ServiceDescription desc7 =
DescriptionFactoryImpl.createServiceDescription(null, uniqueQName2, ServiceSubclass.class);
assertTrue(desc4 != desc6);
assertTrue(desc3 != desc7);
// this should do nothing
DescriptionFactoryImpl.clearServiceDescriptionCache(null);
} finally {
// restore old factory by updating the registry THEN clearing the cached factory
// so it is retrieved from the table again.
MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class, oldFactory);
// resetClientConfigFactory();
}
}
public void testCustomAnnotationSupport() {
JavaClassToDBCConverter converter = new JavaClassToDBCConverter(AnnotatedService.class);
HashMap<String, DescriptionBuilderComposite> dbcMap = converter.produceDBC();
DescriptionBuilderComposite dbc = dbcMap.get(AnnotatedService.class.getName());
assertNotNull(dbc);
SampleAnnotation sampleAnnotation = new SampleAnnotation();
sampleAnnotation.setAnnotationClassName(Custom.class.getName());
dbc.addCustomAnnotationInstance(sampleAnnotation);
SampleAnnotationProcessor saProcessor = new SampleAnnotationProcessor();
saProcessor.setAnnotationInstanceClassName(sampleAnnotation.getClass().getName());
dbc.addCustomAnnotationProcessor(saProcessor);
WebService webService = dbc.getWebServiceAnnot();
assertNotNull(webService);
String pn = webService.portName();
String tns = webService.targetNamespace();
assertNotNull(pn);
assertNotNull(tns);
QName portQName = new QName(tns, pn);
List<ServiceDescription> sdList = DescriptionFactoryImpl.createServiceDescriptionFromDBCMap(dbcMap, null);
assertNotNull(sdList);
assertEquals(sdList.size(), 1);
ServiceDescription sd = sdList.get(0);
assertNotNull(sd);
EndpointDescription ed = sd.getEndpointDescription(portQName);
assertNotNull(ed);
// for testing purposes we want to make a cast b/c some of the methods
// we are accessing are protected in EndpointDescriptionImpl
if(ed instanceof EndpointDescriptionImpl) {
EndpointDescriptionImpl edImpl = (EndpointDescriptionImpl) ed;
List<CustomAnnotationInstance> customAnnotationList = edImpl.getCustomAnnotationInstances();
assertNotNull(customAnnotationList);
assertEquals(customAnnotationList.size(), 1);
CustomAnnotationInstance annotationInstance = customAnnotationList.get(0);
assertNotNull(annotationInstance);
assertEquals(annotationInstance.getClass().getName(), SampleAnnotation.class.getName());
CustomAnnotationProcessor processor = edImpl.getCustomAnnotationProcessor(annotationInstance.getClass().getName());
assertNotNull(processor);
AxisService axisService = ed.getAxisService();
assertNotNull(axisService);
String name = (String) axisService.getParameterValue(SampleAnnotation.class.getName());
assertNotNull(name);
assertEquals(SampleAnnotationProcessor.class.getName(), name);
}
}
public void testHandlerChainType() {
JavaClassToDBCConverter converter = new JavaClassToDBCConverter(AnnotatedService.class);
HashMap<String, DescriptionBuilderComposite> dbcMap = converter.produceDBC();
DescriptionBuilderComposite dbc = dbcMap.get(AnnotatedService.class.getName());
assertNotNull(dbc);
InputStream is = getXMLFileStream();
assertNotNull(is);
HandlerChainsType hct = DescriptionUtils.loadHandlerChains(is, this.getClass().getClassLoader());
dbc.setHandlerChainsType(hct);
List<ServiceDescription> sdList = DescriptionFactoryImpl.createServiceDescriptionFromDBCMap(dbcMap, null);
assertNotNull(sdList);
assertTrue(sdList.size() > 0);
ServiceDescription sd = sdList.get(0);
assertNotNull(sd.getEndpointDescriptions_AsCollection());
Collection<EndpointDescription> edColl = sd.getEndpointDescriptions_AsCollection();
assertNotNull(edColl);
assertTrue(edColl.size() > 0);
EndpointDescription ed = edColl.iterator().next();
assertNotNull(ed);
assertNotNull(ed.getHandlerChain());
}
/**
* This will verify that properties are correctly copied from a DBC to an
* EndpointDescription instance by a helper method in DescriptionFactoryImpl.
*/
public void testSetPropertiesOnEndpointDesc() {
// first get an EndpointDescription instance
JavaClassToDBCConverter converter = new JavaClassToDBCConverter(AnnotatedService.class);
HashMap<String, DescriptionBuilderComposite> dbcMap = converter.produceDBC();
DescriptionBuilderComposite dbc = dbcMap.get(AnnotatedService.class.getName());
assertNotNull(dbc);
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("testKey", "testValue");
dbc.setProperties(properties);
List<ServiceDescription> sdList = DescriptionFactoryImpl.createServiceDescriptionFromDBCMap(dbcMap, null);
assertNotNull(sdList);
assertEquals(sdList.size(), 1);
ServiceDescription sd = sdList.get(0);
assertNotNull(sd);
assertNotNull(dbc.getWebServiceAnnot());
String pn = dbc.getWebServiceAnnot().portName();
String tns = dbc.getWebServiceAnnot().targetNamespace();
assertNotNull(pn);
assertNotNull(tns);
QName portQName = new QName(tns, pn);
EndpointDescription ed = sd.getEndpointDescription(portQName);
assertNotNull(ed);
// now test the setPropertiesOnEndpointDesc method
DescriptionFactoryImpl.setPropertiesOnEndpointDesc(ed, dbc);
assertNotNull(ed.getProperty("testKey"));
assertEquals(ed.getProperty("testKey"), "testValue");
}
private InputStream getXMLFileStream() {
InputStream is = null;
String configLoc = null;
try {
String sep = "/";
configLoc = sep + "test-resources" + sep + "test-handler.xml";
String baseDir = new File(System.getProperty("basedir",".")).getCanonicalPath();
is = new File(baseDir + configLoc).toURL().openStream();
}
catch(Exception e) {
e.printStackTrace();
}
return is;
}
private void resetClientConfigFactory() throws Exception {
Field field = DescriptionFactoryImpl.class.getDeclaredField("clientConfigFactory");
field.setAccessible(true);
field.set(null, null);
}
private static class ServiceSubclass extends javax.xml.ws.Service {
protected ServiceSubclass(URL wsdlDocumentLocation, QName serviceName) {
super(wsdlDocumentLocation, serviceName);
}
}
private static class CachingClientContextFactory extends ClientConfigurationFactory {
ConfigurationContext context;
public ConfigurationContext getClientConfigurationContext() {
if (context == null) {
context = super.getClientConfigurationContext();
}
System.out.println("Test version of CachingClientContextFactory: " + context);
return context;
}
public void reset() {
context = null;
}
}
class SampleAnnotation implements CustomAnnotationInstance {
private Map<String, Object> dataMap = new HashMap<String, Object>();
private ElementType elementType;
List<String> knownParamNames;
private String annotationClassName;
SampleAnnotation(List<String> knownParamNames) {
this.knownParamNames = knownParamNames;
}
public void setAnnotationClassName(String annotationClassName) {
this.annotationClassName = annotationClassName;
}
public String getAnnotationClassName() {
return annotationClassName;
}
SampleAnnotation() {
knownParamNames = new ArrayList<String>();
knownParamNames.add("name");
}
public void addParameterData(String paramName, Object value) throws IllegalArgumentException {
checkParamName(paramName);
dataMap.put(paramName, value);
}
public Object getParameterData(String paramName) throws IllegalArgumentException {
checkParamName(paramName);
return dataMap.get(paramName);
}
public void setTarget(ElementType elementType) {
this.elementType = elementType;
}
public ElementType getTarget() {
return elementType;
}
private void checkParamName(String paramName) throws IllegalArgumentException {
if(knownParamNames != null
&&
!knownParamNames.isEmpty()
&&
!knownParamNames.contains(paramName)) {
throw new IllegalArgumentException("The parameter " + paramName +
" is an unknown parameter for the CustomAnnotation type.");
}
}
}
class SampleAnnotationProcessor implements CustomAnnotationProcessor {
private String annotationInstanceClassName;
public String getAnnotationInstanceClassName() {
return annotationInstanceClassName;
}
public void setAnnotationInstanceClassName(String annotationInstanceClassName) {
this.annotationInstanceClassName = annotationInstanceClassName;
}
public void processTypeLevelAnnotation(EndpointDescription ed, CustomAnnotationInstance annotation) {
AxisService axisService = ed.getAxisService();
if(axisService != null) {
try {
axisService.addParameter(SampleAnnotation.class.getName(),
SampleAnnotationProcessor.class.getName());
}
catch(AxisFault af) {
// nothing here
}
}
}
}
@interface Custom {
String name() default "";
}
@WebService(targetNamespace="http://org.apache.example", serviceName="AnnotatedService", portName="AnnotatedPort")
@Custom(name="AnnotatedService")
class AnnotatedService {
public String echo(String echoString) {
return echoString;
}
}
}