/* * 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; } } }