Package org.apache.axis2.jaxws.description.impl

Source Code of org.apache.axis2.jaxws.description.impl.DescriptionFactoryImplTests$AnnotatedService

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

Related Classes of org.apache.axis2.jaxws.description.impl.DescriptionFactoryImplTests$AnnotatedService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.