/*
 * 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.description.AxisService;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.jaxws.description.echo.EchoServiceImplWithSEI;
import org.apache.log4j.BasicConfigurator;

import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Holder;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

/**
 * Tests the creation of the Description classes based on a service implementation bean and various
 * combinations of annotations
 */
public class AnnotationServiceImplDescriptionTests extends TestCase {
    static {
        // Note you will probably need to increase the java heap size, for example
        // -Xmx512m.  This can be done by setting maven.junit.jvmargs in project.properties.
        // To change the settings, edit the log4j.property file
        // in the test-resources directory.
        BasicConfigurator.configure();
    }

    /**
     * Create the description classes with a service implementation that contains the @WebService
     * JSR-181 annotation which references an SEI.
     */
    public void testServiceImplWithSEI() {
        // Use the description factory directly; this will be done within the JAX-WS runtime
        ServiceDescription serviceDesc =
                DescriptionFactory.createServiceDescription(EchoServiceImplWithSEI.class);
        assertNotNull(serviceDesc);

        EndpointDescription[] endpointDesc = serviceDesc.getEndpointDescriptions();
        assertNotNull(endpointDesc);
        assertEquals(endpointDesc.length, 1);

        assertNotNull(endpointDesc[0].getAxisService());

        // TODO: How will the JAX-WS dispatcher get the appropriate port (i.e. endpoint)?  Currently assumes [0]
        EndpointInterfaceDescription endpointIntfDesc =
                endpointDesc[0].getEndpointInterfaceDescription();
        assertNotNull(endpointIntfDesc);

        OperationDescription[] operations =
                endpointIntfDesc.getOperationForJavaMethod("badMethodName");
        assertNull(operations);
        operations = endpointIntfDesc.getOperationForJavaMethod("");
        assertNull(operations);
        operations = endpointIntfDesc.getOperationForJavaMethod((String)null);
        assertNull(operations);
        operations = endpointIntfDesc.getOperationForJavaMethod("echo");
        assertNotNull(operations);
        assertEquals(operations.length, 1);
        assertEquals(operations[0].getJavaMethodName(), "echo");

        String[] paramTypes = operations[0].getJavaParameters();
        assertNotNull(paramTypes);
        assertEquals(paramTypes.length, 1);
        assertEquals("javax.xml.ws.Holder<java.lang.String>", 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());

    }

    public void testOverloadedServiceImplWithSEI() {
        ServiceDescription serviceDesc =
                DescriptionFactory.createServiceDescription(DocLitWrappedImplWithSEI.class);
        assertNotNull(serviceDesc);

        EndpointDescription[] endpointDesc = serviceDesc.getEndpointDescriptions();
        assertNotNull(endpointDesc);
        assertEquals(endpointDesc.length, 1);
        // TODO: Using hardcoded endpointDesc[0] from ServiceDesc
        EndpointInterfaceDescription endpointIntfDesc =
                endpointDesc[0].getEndpointInterfaceDescription();
        assertNotNull(endpointIntfDesc);

        // Test for overloaded methods
        // SEI defines two Java methods with this name
        OperationDescription[] operations =
                endpointIntfDesc.getOperationForJavaMethod("invokeAsync");
        assertNotNull(operations);
        assertEquals(operations.length, 2);
        assertEquals(operations[0].getJavaMethodName(), "invokeAsync");
        assertEquals(operations[1].getJavaMethodName(), "invokeAsync");

        // Check the Java parameters, WebParam names, and WebResult (actually lack thereof) for each of these operations

        // Note regarding WebParam names:
        //In the client Async Call the the WebParam name will not remove JAX-WS AsyncHandler.
        //Proxy invoking the the Async Call will check the input method object and if
        //its of type JAX-WS AsyncHandler then that WebParam will be skipped.
        //This is done because AsyncHandler is NOT part of the contract, and thus it is NOT part of
        // the JAXB object constructed for the method invocation.  The AsyncHandler is part of the 
        // JAX-WS programming model to support an asynchronous callback to receive the response.

        // Note regarding WebResult annotation:
        // The async methods on this SEI do not carry a WebResult annotations.
        boolean twoArgSignatureChecked = false;
        boolean oneArgSignatureChecked = false;
        for (OperationDescription operation : operations) {
            String[] checkParams = operation.getJavaParameters();
            String[] webParamNames = operation.getParamNames();
            if (checkParams.length == 1) {
                // Check the one arguement signature
                if (oneArgSignatureChecked) {
                    fail("One Arg signature occured more than once");
                } else {
                    oneArgSignatureChecked = true;
                    // Check the Java parameter
                    assertEquals(checkParams[0], "java.lang.String");
                    // Check the WebParam Names (see note above) 
                    assertEquals(1, webParamNames.length);
                    assertEquals("invoke_str", webParamNames[0]);
                    // Check the lack of a WebResult annotation and the default values for
                    // SOAPBinding Style=DOCUMENT, Use=LITERAL, ParamStyle=WRAPPED
                    // Note that the SOAPBinding annotation is also not present and thus fully defaulted.
                    assertNull(((OperationDescriptionJava)operation).getAnnoWebResult());
                    assertEquals("return", operation.getResultName());
                    assertEquals("return", operation.getResultPartName());
                    assertEquals("", operation.getResultTargetNamespace());
                    assertFalse(operation.isResultHeader());
                }
            } else if (checkParams.length == 2) {
                // Check the two arguement signature
                if (twoArgSignatureChecked) {
                    fail("Two Arg signature occured more than once");
                } else {
                    twoArgSignatureChecked = true;
                    // Check the Java parameter
                    assertEquals(checkParams[0], "java.lang.String");
                    assertEquals(checkParams[1],
                                 "javax.xml.ws.AsyncHandler<org.test.proxy.doclitwrapped.ReturnType>");
                    // Check the WebParam Names (see note above) 
                    assertEquals(2, webParamNames.length);
                    assertEquals("invoke_str", webParamNames[0]);
                    // Check the lack of a WebResult annotation and the default values for
                    // SOAPBinding Style=DOCUMENT, Use=LITERAL, ParamStyle=WRAPPED
                    // Note that the SOAPBinding annotation is also not present and thus fully defaulted.
                    assertNull(((OperationDescriptionJava)operation).getAnnoWebResult());
                    assertEquals("return", operation.getResultName());
                    assertEquals("return", operation.getResultPartName());
                    assertEquals("", operation.getResultTargetNamespace());
                    assertFalse(operation.isResultHeader());
                }
            } else {
                fail("Wrong number of parameters returned");
            }
        }

        // Test for a method with parameters of primitive types.  Note
        // this method IS overloaded
        operations = endpointIntfDesc.getOperationForJavaMethod("twoWayHolderAsync");
        assertNotNull(operations);
        assertEquals(operations.length, 2);
        assertEquals(operations[0].getJavaMethodName(), "twoWayHolderAsync");
        assertEquals(operations[1].getJavaMethodName(), "twoWayHolderAsync");

        // Check the parameters for each operation
        twoArgSignatureChecked = false;
        boolean threeArgSignatureChecked = false;
        for (OperationDescription operation : operations) {
            String[] checkParams = operation.getJavaParameters();
            String[] webParamNames = operation.getParamNames();
            if (checkParams.length == 3) {
                // Check the one arguement signature
                if (threeArgSignatureChecked) {
                    fail("Three Arg signature occured more than once");
                } else {
                    threeArgSignatureChecked = true;
                    assertEquals(checkParams[0], "java.lang.String");
                    assertEquals(checkParams[1], "int");
                    assertEquals(checkParams[2],
                                 "javax.xml.ws.AsyncHandler<org.test.proxy.doclitwrapped.TwoWayHolder>");
                    // Check the WebParam Names (see note above) 
                    assertEquals(3, webParamNames.length);
                    assertEquals("twoWayHolder_str", webParamNames[0]);
                    assertEquals("twoWayHolder_int", webParamNames[1]);
                    // Check the lack of a WebResult annotation and the default values for
                    // SOAPBinding Style=DOCUMENT, Use=LITERAL, ParamStyle=WRAPPED
                    // Note that the SOAPBinding annotation is also not present and thus fully defaulted.
                    assertNull(((OperationDescriptionJava)operation).getAnnoWebResult());
                    assertEquals("return", operation.getResultName());
                    assertEquals("return", operation.getResultPartName());
                    assertEquals("", operation.getResultTargetNamespace());
                    assertFalse(operation.isResultHeader());
                }
            } else if (checkParams.length == 2) {
                // Check the two arguement signature
                if (twoArgSignatureChecked) {
                    fail("Two Arg signature occured more than once");
                } else {
                    twoArgSignatureChecked = true;
                    assertEquals(checkParams[0], "java.lang.String");
                    assertEquals(checkParams[1], "int");
                    // Check the WebParam Names (see note above) 
                    assertEquals(2, webParamNames.length);
                    assertEquals("twoWayHolder_str", webParamNames[0]);
                    assertEquals("twoWayHolder_int", webParamNames[1]);
                    // Check the lack of a WebResult annotation and the default values for
                    // SOAPBinding Style=DOCUMENT, Use=LITERAL, ParamStyle=WRAPPED
                    // Note that the SOAPBinding annotation is also not present and thus fully defaulted.
                    assertNull(((OperationDescriptionJava)operation).getAnnoWebResult());
                    assertEquals("return", operation.getResultName());
                    assertEquals("return", operation.getResultPartName());
                    assertEquals("", operation.getResultTargetNamespace());
                    assertFalse(operation.isResultHeader());
                }
            } else {
                fail("Wrong number of parameters returned");
            }
        }

        // Test for a one-way, void method with no parameters which also is not overloaded
        operations = endpointIntfDesc.getOperationForJavaMethod("oneWayVoid");
        assertNotNull(operations);
        assertEquals(operations.length, 1);
        assertEquals(operations[0].getJavaMethodName(), "oneWayVoid");
        String[] checkEmptyParams = operations[0].getJavaParameters();
        assertNotNull(checkEmptyParams);
        assertEquals(checkEmptyParams.length, 0);
        assertEquals(true, operations[0].isOneWay());
        // Check the lack of a WebResult annotation and the default values for
        // a ONE-WAY / VOID operation with a SOAPBinding Style=DOCUMENT, Use=LITERAL, ParamStyle=WRAPPED
        // Note that the SOAPBinding annotation is also not present and thus fully defaulted.
        assertNull(((OperationDescriptionJava)operations[0]).getAnnoWebResult());
        assertFalse(((OperationDescriptionJava)operations[0]).isWebResultAnnotationSpecified());
        assertFalse(operations[0].isOperationReturningResult());
        assertEquals(null, operations[0].getResultName());
        assertEquals(null, operations[0].getResultPartName());
        assertEquals(null, operations[0].getResultTargetNamespace());
        assertFalse(operations[0].isResultHeader());

        // Test two-way method for lack of OneWay annotation and WebResult annotation
        operations = endpointIntfDesc.getOperationForJavaMethod("invoke");
        assertNotNull(operations);
        assertEquals(1, operations.length);
        assertEquals(false, operations[0].isOneWay());
        assertNotNull(((OperationDescriptionJava)operations[0]).getAnnoWebResult());
        assertEquals("return_str", operations[0].getResultName());
        assertEquals("return_str", operations[0].getResultPartName());
        assertEquals("", operations[0].getResultTargetNamespace());
        assertFalse(operations[0].isResultHeader());
    }

    // ===========================================
    // The following tests use implementation classes defined below
    // in order to test various specific annotation settings
    // ===========================================

    public void testSOAPBindingDefault() {
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(SOAPBindingDefaultTestImpl.class);

        assertNull(
                ((EndpointInterfaceDescriptionJava)testEndpointInterfaceDesc).getAnnoSoapBinding());
        assertEquals(javax.jws.soap.SOAPBinding.Style.DOCUMENT,
                     testEndpointInterfaceDesc.getSoapBindingStyle());
        assertEquals(javax.jws.soap.SOAPBinding.Use.LITERAL,
                     testEndpointInterfaceDesc.getSoapBindingUse());
        assertEquals(javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED,
                     testEndpointInterfaceDesc.getSoapBindingParameterStyle());

        OperationDescription operationDesc =
                testEndpointInterfaceDesc.getOperationForJavaMethod("echoString")[0];
        // Verify WebResult annotation default values for DOC/LIT/WRAPPED from a defaulted SOAPBinding
        assertNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertEquals("return", operationDesc.getResultName());
        assertEquals("return", operationDesc.getResultPartName());
        assertEquals("", operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

    }

    public void testSOAPBindingDocEncBare() {
        //verify that we throw an exception when SOAPBinding.Use == ENCODED is specified
        try {
            EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(SOAPBindingDocEncBareTestImpl.class);
            fail("Should have caused exception");
        } catch (Exception e) {
            // Expected path, SOAPBinding.Use == ENCODED is not supported
        }
    }
    
    public void testSOAPBindingDocLitBare() {
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(SOAPBindingDocLitBareTestImpl.class);

        assertNotNull(
                ((EndpointInterfaceDescriptionJava)testEndpointInterfaceDesc).getAnnoSoapBinding());
        assertEquals(javax.jws.soap.SOAPBinding.Style.DOCUMENT,
                     testEndpointInterfaceDesc.getSoapBindingStyle());
        assertEquals(javax.jws.soap.SOAPBinding.Use.LITERAL,
                     testEndpointInterfaceDesc.getSoapBindingUse());
        assertEquals(javax.jws.soap.SOAPBinding.ParameterStyle.BARE,
                     testEndpointInterfaceDesc.getSoapBindingParameterStyle());
    }

    public void testSOAPBindingMethodAnnotation() {
        // Verify that an impl without the method annotation uses the settings from the type
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(SOAPBindingDocLitBareTestImpl.class);

        assertNotNull(
                ((EndpointInterfaceDescriptionJava)testEndpointInterfaceDesc).getAnnoSoapBinding());
        assertEquals(javax.jws.soap.SOAPBinding.Style.DOCUMENT,
                     testEndpointInterfaceDesc.getSoapBindingStyle());
        assertEquals(javax.jws.soap.SOAPBinding.Use.LITERAL,
                     testEndpointInterfaceDesc.getSoapBindingUse());
        assertEquals(javax.jws.soap.SOAPBinding.ParameterStyle.BARE,
                     testEndpointInterfaceDesc.getSoapBindingParameterStyle());

        OperationDescription operationDesc =
                testEndpointInterfaceDesc.getOperationForJavaMethod("echoString")[0];
        assertNotNull(operationDesc);
        assertNull(((OperationDescriptionJava)operationDesc).getAnnoSoapBinding());
        assertEquals(javax.jws.soap.SOAPBinding.Style.DOCUMENT,
                     operationDesc.getSoapBindingStyle());
        assertEquals(javax.jws.soap.SOAPBinding.Use.LITERAL, operationDesc.getSoapBindingUse());
        assertEquals(javax.jws.soap.SOAPBinding.ParameterStyle.BARE,
                     operationDesc.getSoapBindingParameterStyle());

        // Verify that the method annotation setting overrides the type annotatino setting
        testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(SOAPBindingDefaultMethodTestImpl.class);

        assertNull(
                ((EndpointInterfaceDescriptionJava)testEndpointInterfaceDesc).getAnnoSoapBinding());
        assertEquals(javax.jws.soap.SOAPBinding.Style.DOCUMENT,
                     testEndpointInterfaceDesc.getSoapBindingStyle());
        assertEquals(javax.jws.soap.SOAPBinding.Use.LITERAL,
                     testEndpointInterfaceDesc.getSoapBindingUse());
        assertEquals(javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED,
                     testEndpointInterfaceDesc.getSoapBindingParameterStyle());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("echoString")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoSoapBinding());
        assertEquals(javax.jws.soap.SOAPBinding.Style.DOCUMENT,
                     operationDesc.getSoapBindingStyle());
        assertEquals(javax.jws.soap.SOAPBinding.Use.LITERAL, operationDesc.getSoapBindingUse());
        assertEquals(javax.jws.soap.SOAPBinding.ParameterStyle.BARE,
                     operationDesc.getSoapBindingParameterStyle());
    }

    public void testDefaultReqRspWrapper() {

        // Test paramaterStyle = WRAPPED set a the type level with various combinations of method annotation setting
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(DefaultReqRspWrapperTestImpl.class);
        OperationDescription operationDesc =
                testEndpointInterfaceDesc.getOperationForJavaMethod("wrappedParams")[0];
        assertNotNull(operationDesc);
        assertEquals("wrappedParams", operationDesc.getRequestWrapperLocalName());
        assertEquals("wrappedParamsResponse", operationDesc.getResponseWrapperLocalName());
        assertEquals("http://description.jaxws.axis2.apache.org/",
                     operationDesc.getRequestWrapperTargetNamespace());
        assertEquals("http://description.jaxws.axis2.apache.org/",
                     operationDesc.getResponseWrapperTargetNamespace());
        assertNull(operationDesc.getRequestWrapperClassName());
        assertNull(operationDesc.getResponseWrapperClassName());
        // Test WebResult annotation defaults
        assertNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertFalse(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("return", operationDesc.getResultName());
        assertEquals("return", operationDesc.getResultPartName());
        assertEquals("", operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("bareParams")[0];
        assertNotNull(operationDesc);
        assertNull(operationDesc.getRequestWrapperLocalName());
        assertNull(operationDesc.getResponseWrapperLocalName());
        assertNull(operationDesc.getRequestWrapperTargetNamespace());
        assertNull(operationDesc.getResponseWrapperTargetNamespace());
        assertNull(operationDesc.getRequestWrapperClassName());
        assertNull(operationDesc.getResponseWrapperClassName());
        // Test WebResult annotation defaults
        assertNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertFalse(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("bareParamsResponse", operationDesc.getResultName());
        assertEquals("bareParamsResponse", operationDesc.getResultPartName());
        assertEquals("http://description.jaxws.axis2.apache.org/",
                     operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        // Test paramaterStyle = BARE set a the type level with various combinations of method annotation setting
        testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(DefaultReqRspWrapperBareTestImpl.class);
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("wrappedParams")[0];
        assertNotNull(operationDesc);
        assertEquals("wrappedParams", operationDesc.getRequestWrapperLocalName());
        assertEquals("wrappedParamsResponse", operationDesc.getResponseWrapperLocalName());
        assertEquals("http://description.jaxws.axis2.apache.org/",
                     operationDesc.getRequestWrapperTargetNamespace());
        assertEquals("http://description.jaxws.axis2.apache.org/",
                     operationDesc.getResponseWrapperTargetNamespace());
        assertNull(operationDesc.getRequestWrapperClassName());
        assertNull(operationDesc.getResponseWrapperClassName());
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("bareParams")[0];
        assertNotNull(operationDesc);
        assertNull(operationDesc.getRequestWrapperLocalName());
        assertNull(operationDesc.getResponseWrapperLocalName());
        assertNull(operationDesc.getRequestWrapperTargetNamespace());
        assertNull(operationDesc.getResponseWrapperTargetNamespace());
        assertNull(operationDesc.getRequestWrapperClassName());
        assertNull(operationDesc.getResponseWrapperClassName());
    }

    public void testReqRspWrapper() {
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(ReqRspWrapperTestImpl.class);
        OperationDescription operationDesc =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method1")[0];
        assertNotNull(operationDesc);
        assertEquals("method1ReqWrapper", operationDesc.getRequestWrapperLocalName());
        assertEquals("method1RspWrapper", operationDesc.getResponseWrapperLocalName());
        assertEquals("http://a.b.c.method1ReqTNS",
                     operationDesc.getRequestWrapperTargetNamespace());
        assertEquals("http://a.b.c.method1RspTNS",
                     operationDesc.getResponseWrapperTargetNamespace());
        assertEquals(
                "org.apache.axis2.jaxws.description.AnnotationServiceImplDescriptionTests.ReqRspWrapperTestImpl.method1ReqWrapper",
                operationDesc.getRequestWrapperClassName());
        assertEquals(
                "org.apache.axis2.jaxws.description.AnnotationServiceImplDescriptionTests.ReqRspWrapperTestImpl.method1RspWrapper",
                operationDesc.getResponseWrapperClassName());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method2")[0];
        assertEquals("method2", operationDesc.getRequestWrapperLocalName());
        assertEquals("method2RspWrapper", operationDesc.getResponseWrapperLocalName());
        assertEquals("http://a.b.c.method2ReqTNS",
                     operationDesc.getRequestWrapperTargetNamespace());
        assertEquals("http://a.b.c.method2RspTNS",
                     operationDesc.getResponseWrapperTargetNamespace());
        assertEquals(
                "org.apache.axis2.jaxws.description.AnnotationServiceImplDescriptionTests.ReqRspWrapperTestImpl.method2ReqWrapper",
                operationDesc.getRequestWrapperClassName());
        assertNull(operationDesc.getResponseWrapperClassName());
    }

    public void testWebMethod() {
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(WebMethodTestImpl.class);

        // Test results from method with no annotation
        OperationDescription[] operationDescs =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method1");
        assertNull(operationDescs);

        OperationDescription operationDesc =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method2")[0];
        assertNotNull(operationDesc);
        assertEquals("renamedMethod2", operationDesc.getOperationName());
        assertEquals("", operationDesc.getAction());
        assertFalse(operationDesc.isExcluded());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method3")[0];
        assertNotNull(operationDesc);
        assertEquals("method3", operationDesc.getOperationName());
        assertEquals("ActionMethod3", operationDesc.getAction());
        assertFalse(operationDesc.isExcluded());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4")[0];
        assertNotNull(operationDesc);
        assertEquals("renamedMethod4", operationDesc.getOperationName());
        assertEquals("ActionMethod4", operationDesc.getAction());
        assertFalse(operationDesc.isExcluded());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4")[0];
        assertNotNull(operationDesc);
        assertEquals("renamedMethod4", operationDesc.getOperationName());
        assertEquals("ActionMethod4", operationDesc.getAction());
        assertFalse(operationDesc.isExcluded());

        operationDescs = testEndpointInterfaceDesc.getOperationForJavaMethod("method5");
        assertNull(operationDescs);

    }

    public void testWebResult() {
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(WebResultTestImpl.class);

        // DOCUMENT / LITERAL / WRAPPED methods

        OperationDescription[] operationDescs =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method0");
        assertNull(operationDescs);

        OperationDescription operationDesc =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method1")[0];
        assertNotNull(operationDesc);
        assertNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertFalse(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("return", operationDesc.getResultName());
        assertEquals("return", operationDesc.getResultPartName());
        assertEquals("", operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method2")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("return", operationDesc.getResultName());
        assertEquals("return", operationDesc.getResultPartName());
        assertEquals("", operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method3")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("resultName", operationDesc.getResultName());
        assertEquals("resultName", operationDesc.getResultPartName());
        assertEquals("", operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("resultName", operationDesc.getResultName());
        assertEquals("partName", operationDesc.getResultPartName());
        assertEquals("http://result.test.target.namespace/",
                     operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method5")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("resultName5", operationDesc.getResultName());
        assertEquals("partName5", operationDesc.getResultPartName());
        assertEquals("http://result.test.target.namespace.5/",
                     operationDesc.getResultTargetNamespace());
        assertTrue(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method6")[0];
        assertNotNull(operationDesc);
        assertNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertFalse(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertFalse(operationDesc.isOperationReturningResult());
        assertEquals(null, operationDesc.getResultName());
        assertEquals(null, operationDesc.getResultPartName());
        assertEquals(null, operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method7")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("resultName7", operationDesc.getResultName());
        assertEquals("partName7", operationDesc.getResultPartName());
        assertEquals("http://service.test.target.namespace/",
                     operationDesc.getResultTargetNamespace());
        assertTrue(operationDesc.isResultHeader());

        // DOCUMENT / LITERAL / BARE methods

        operationDescs = testEndpointInterfaceDesc.getOperationForJavaMethod("method0_bare");
        assertNull(operationDescs);

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method1_bare")[0];
        assertNotNull(operationDesc);
        assertNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertFalse(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("renamedMethod1BareResponse", operationDesc.getResultName());
        assertEquals("renamedMethod1BareResponse", operationDesc.getResultPartName());
        assertEquals("http://service.test.target.namespace/",
                     operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method2_bare")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("renamedMethod2BareResponse", operationDesc.getResultName());
        assertEquals("renamedMethod2BareResponse", operationDesc.getResultPartName());
        assertEquals("http://service.test.target.namespace/",
                     operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method3_bare")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("resultName", operationDesc.getResultName());
        assertEquals("resultName", operationDesc.getResultPartName());
        assertEquals("http://service.test.target.namespace/",
                     operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4_bare")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("resultName", operationDesc.getResultName());
        assertEquals("partName", operationDesc.getResultPartName());
        assertEquals("http://result.bare.test.target.namespace/",
                     operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method5_bare")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("resultName5", operationDesc.getResultName());
        assertEquals("partName5", operationDesc.getResultPartName());
        assertEquals("http://result.bare.test.target.namespace.5/",
                     operationDesc.getResultTargetNamespace());
        assertTrue(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method6_bare")[0];
        assertNotNull(operationDesc);
        assertNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertFalse(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertFalse(operationDesc.isOperationReturningResult());
        assertEquals(null, operationDesc.getResultName());
        assertEquals(null, operationDesc.getResultPartName());
        assertEquals(null, operationDesc.getResultTargetNamespace());
        assertFalse(operationDesc.isResultHeader());

        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method7")[0];
        assertNotNull(operationDesc);
        assertNotNull(((OperationDescriptionJava)operationDesc).getAnnoWebResult());
        assertTrue(((OperationDescriptionJava)operationDesc).isWebResultAnnotationSpecified());
        assertTrue(operationDesc.isOperationReturningResult());
        assertEquals("resultName7", operationDesc.getResultName());
        assertEquals("partName7", operationDesc.getResultPartName());
        assertEquals("http://service.test.target.namespace/",
                     operationDesc.getResultTargetNamespace());
        assertTrue(operationDesc.isResultHeader());
    }

    public void testWebParamWrapped() {
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(WebParamTestImpl.class);

        // DOCUMENT / LITERAL / WRAPPED methods

        // method0
        OperationDescription[] operationDescs =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method0");
        assertNull(operationDescs);

        // method00
        operationDescs = testEndpointInterfaceDesc.getOperationForJavaMethod("method00");
        assertNull(operationDescs);

        // method1
        OperationDescription operationDesc =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method1")[0];
        assertNotNull(operationDesc);
        ParameterDescription[] paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(1, paramDesc.length);
        ParameterDescription checkParamDesc = paramDesc[0];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg0", checkParamDesc.getParameterName());
        assertEquals("arg0", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg0"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method2
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method2")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(1, paramDesc.length);
        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg0", checkParamDesc.getParameterName());
        assertEquals("arg0", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg0"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method3
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method3")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(5, paramDesc.length);
        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param0NameMethod3", checkParamDesc.getParameterName());
        assertEquals("param0NameMethod3", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param0NameMethod3"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[1];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param1NameMethod3", checkParamDesc.getParameterName());
        assertEquals("param1NameMethod3", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(1));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param1NameMethod3"));
        assertEquals(Holder.class, checkParamDesc.getParameterType());
        assertEquals(Integer.class, checkParamDesc.getParameterActualType());
        assertTrue(checkParamDesc.isHolderType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.INOUT, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[2];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg2", checkParamDesc.getParameterName());
        assertEquals("arg2", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(2));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg2"));
        assertEquals(Object.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[3];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg3", checkParamDesc.getParameterName());
        assertEquals("arg3", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(3));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg3"));
        assertEquals(Integer.TYPE, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[4];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("lastParamNameMethod3", checkParamDesc.getParameterName());
        assertEquals("lastParamNameMethod3", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(4));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("lastParamNameMethod3"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method4
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(5, paramDesc.length);

        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param0NameMethod4", checkParamDesc.getParameterName());
        assertEquals("param0PartName", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param0NameMethod4"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("http://param.4.0.result.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[1];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param1NameMethod4", checkParamDesc.getParameterName());
        assertEquals("param1PartName", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(1));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param1NameMethod4"));
        assertEquals(Integer.TYPE, checkParamDesc.getParameterType());
        assertEquals("http://param.4.1.result.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[2];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg2", checkParamDesc.getParameterName());
        assertEquals("arg2", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(2));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg2"));
        assertEquals(Object.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[3];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg3", checkParamDesc.getParameterName());
        assertEquals("arg3", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(3));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg3"));
        assertEquals(Holder.class, checkParamDesc.getParameterType());
        assertEquals(Integer.class, checkParamDesc.getParameterActualType());
        assertTrue(checkParamDesc.isHolderType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.INOUT, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[4];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("lastParamNameMethod4", checkParamDesc.getParameterName());
        assertEquals("lastParamNameMethod4", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(4));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("lastParamNameMethod4"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method5
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method5")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(5, paramDesc.length);

        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param0NameMethod5", checkParamDesc.getParameterName());
        assertEquals("param0PartName", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param0NameMethod5"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertFalse(checkParamDesc.isHolderType());
        assertEquals("http://param.5.0.result.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertTrue(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[1];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param1NameMethod5", checkParamDesc.getParameterName());
        assertEquals("param1PartName", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(1));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param1NameMethod5"));
        assertEquals(Integer.TYPE, checkParamDesc.getParameterType());
        assertFalse(checkParamDesc.isHolderType());
        assertEquals("http://param.5.1.result.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[2];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg2", checkParamDesc.getParameterName());
        assertEquals("arg2", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(2));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg2"));
        assertEquals(Holder.class, checkParamDesc.getParameterType());
        assertEquals(Object.class, checkParamDesc.getParameterActualType());
        assertTrue(checkParamDesc.isHolderType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.INOUT, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[3];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg3", checkParamDesc.getParameterName());
        assertEquals("arg3", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(3));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg3"));
        assertEquals(Integer.TYPE, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[4];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("lastParamNameMethod5", checkParamDesc.getParameterName());
        assertEquals("lastParamNameMethod5", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(4));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("lastParamNameMethod5"));
        assertEquals(Holder.class, checkParamDesc.getParameterType());
        assertEquals(String.class, checkParamDesc.getParameterActualType());
        assertTrue(checkParamDesc.isHolderType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.OUT, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method6
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method6")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(5, paramDesc.length);

        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param0NameMethod6", checkParamDesc.getParameterName());
        assertEquals("param0PartName", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param0NameMethod6"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("http://param.service.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertTrue(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[1];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param1NameMethod6", checkParamDesc.getParameterName());
        assertEquals("param1PartName", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(1));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param1NameMethod6"));
        assertEquals(Integer.TYPE, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[2];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg2", checkParamDesc.getParameterName());
        assertEquals("arg2", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(2));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg2"));
        assertEquals(Object.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[3];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("arg3", checkParamDesc.getParameterName());
        assertEquals("arg3", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(3));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("arg3"));
        assertEquals(Integer.TYPE, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        checkParamDesc = paramDesc[4];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("lastParamNameMethod6", checkParamDesc.getParameterName());
        assertEquals("lastParamNameMethod6", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(4));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("lastParamNameMethod6"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("", checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());
    }

    public void testWebParamBare() {
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                getEndpointInterfaceDesc(WebParamTestImpl.class);

        // DOCUMENT / LITERAL / BARE methods
        OperationDescription[] operationDescs =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method0_bare");
        assertNull(operationDescs);

        // method00
        operationDescs = testEndpointInterfaceDesc.getOperationForJavaMethod("method00_bare");
        assertNull(operationDescs);

        // method1
        OperationDescription operationDesc =
                testEndpointInterfaceDesc.getOperationForJavaMethod("method1_bare")[0];
        assertNotNull(operationDesc);
        ParameterDescription[] paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(1, paramDesc.length);
        ParameterDescription checkParamDesc = paramDesc[0];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("renamedMethod1", checkParamDesc.getParameterName());
        assertEquals("renamedMethod1", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("renamedMethod1"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("http://param.service.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method2
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method2_bare")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(1, paramDesc.length);
        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("renamedMethod2", checkParamDesc.getParameterName());
        assertEquals("renamedMethod2", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("renamedMethod2"));
        assertEquals(String.class, checkParamDesc.getParameterType());
        assertEquals("http://param.service.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.IN, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method3
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method3_bare")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(1, paramDesc.length);
        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param1NameMethod3", checkParamDesc.getParameterName());
        assertEquals("param1NameMethod3", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param1NameMethod3"));
        assertEquals(Holder.class, checkParamDesc.getParameterType());
        assertEquals(Integer.class, checkParamDesc.getParameterActualType());
        assertTrue(checkParamDesc.isHolderType());
        assertEquals("http://param.service.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.INOUT, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method4
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4_bare")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(1, paramDesc.length);

        checkParamDesc = paramDesc[0];
        assertNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("renamedMethod4", checkParamDesc.getParameterName());
        assertEquals("renamedMethod4", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("renamedMethod4"));
        assertEquals(Holder.class, checkParamDesc.getParameterType());
        assertEquals(Integer.class, checkParamDesc.getParameterActualType());
        assertEquals("http://param.service.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.INOUT, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method5
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method5_bare")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(1, paramDesc.length);

        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("lastParamNameMethod5", checkParamDesc.getParameterName());
        assertEquals("lastParamNameMethod5", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("lastParamNameMethod5"));
        assertEquals(Holder.class, checkParamDesc.getParameterType());
        assertEquals(String.class, checkParamDesc.getParameterActualType());
        assertTrue(checkParamDesc.isHolderType());
        assertEquals("http://method5.bare.result.test.target.namespace.5/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.OUT, checkParamDesc.getMode());
        assertFalse(checkParamDesc.isHeader());

        // method6
        operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method6_bare")[0];
        assertNotNull(operationDesc);
        paramDesc = operationDesc.getParameterDescriptions();
        assertEquals(1, paramDesc.length);

        checkParamDesc = paramDesc[0];
        assertNotNull(((ParameterDescriptionJava)checkParamDesc).getAnnoWebParam());
        assertEquals("param0NameMethod6", checkParamDesc.getParameterName());
        assertEquals("param0PartName", checkParamDesc.getPartName());
        assertEquals(checkParamDesc, operationDesc.getParameterDescription(0));
        assertEquals(checkParamDesc, operationDesc.getParameterDescription("param0NameMethod6"));
        assertEquals(Holder.class, checkParamDesc.getParameterType());
        assertEquals(String.class, checkParamDesc.getParameterActualType());
        assertEquals("http://param.service.test.target.namespace/",
                     checkParamDesc.getTargetNamespace());
        assertEquals(WebParam.Mode.INOUT, checkParamDesc.getMode());
        assertTrue(checkParamDesc.isHeader());
    }


    /*
    * 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
        ServiceDescription serviceDesc =
                DescriptionFactory.createServiceDescription(implementationClass);
        assertNotNull(serviceDesc);

        EndpointDescription[] endpointDesc = serviceDesc.getEndpointDescriptions();
        assertNotNull(endpointDesc);
        assertEquals(1, endpointDesc.length);

        // TODO: How will the JAX-WS dispatcher get the appropriate port (i.e. endpoint)?  Currently assumes [0]
        EndpointDescription testEndpointDesc = endpointDesc[0];
        EndpointInterfaceDescription testEndpointInterfaceDesc =
                testEndpointDesc.getEndpointInterfaceDescription();
        assertNotNull(testEndpointInterfaceDesc);

        return testEndpointInterfaceDesc;
    }
}

// ============================================================================
// SOAPBindingDefaultTest service implementation class
// @SOAPBinding values: style=DOCUMENT, use=LITERAL, paramaterStyle=WRAPPED
// @WebResult values: are all defaulted
// ============================================================================

@WebService()
class SOAPBindingDefaultTestImpl {
    public String echoString(String s) {
        return s;
    }
}
// ============================================================================
// SOAPBindingDocLiBareTestImpl service implementation class
// Note that Style should default
// ============================================================================

@WebService()
@SOAPBinding(use = javax.jws.soap.SOAPBinding.Use.LITERAL,
             parameterStyle = javax.jws.soap.SOAPBinding.ParameterStyle.BARE)
class SOAPBindingDocLitBareTestImpl {
    public String echoString(String s) {
        return s;
    }
}

//============================================================================
//SOAPBindingDocEncBareTestImpl service implementation class
//Note that Style should default
//============================================================================

@WebService()
@SOAPBinding(use = javax.jws.soap.SOAPBinding.Use.ENCODED,
          parameterStyle = javax.jws.soap.SOAPBinding.ParameterStyle.BARE)
class SOAPBindingDocEncBareTestImpl {
 public String echoString(String s) {
     return s;
 }
}
// ============================================================================
// SOAPBindingDefaultMethodTest service implementation class
// Note that style will default to DOCUMENT based on Type annotation
// ============================================================================

@WebService()
class SOAPBindingDefaultMethodTestImpl {
    @SOAPBinding(use = javax.jws.soap.SOAPBinding.Use.LITERAL,
                 parameterStyle = javax.jws.soap.SOAPBinding.ParameterStyle.BARE)
    public String echoString(String s) {
        return s;
    }
}

// =============================================================================
// testDefaultReqRspWrapper service implementation classes
// =============================================================================

@WebService
//Note the default parameterStyle is WRAPPED, so no type-level annotation is required.
class DefaultReqRspWrapperTestImpl {
    public String wrappedParams(String s) {
        return s;
    }

    @SOAPBinding(parameterStyle = javax.jws.soap.SOAPBinding.ParameterStyle.BARE)
    public String bareParams(String s) {
        return s;
    }
}

@WebService
@SOAPBinding(parameterStyle = javax.jws.soap.SOAPBinding.ParameterStyle.BARE)
class DefaultReqRspWrapperBareTestImpl {
    @SOAPBinding(parameterStyle = javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED)
    public String wrappedParams(String s) {
        return s;
    }

    public String bareParams(String s) {
        return s;
    }
}

// =============================================================================
// testReqRspWrapper service implementation class
// =============================================================================

@WebService
//Note the default parameterStyle is WRAPPED, so no type-level annotation is required.
class ReqRspWrapperTestImpl {
    @RequestWrapper(localName = "method1ReqWrapper", targetNamespace = "http://a.b.c.method1ReqTNS",
                    className = "org.apache.axis2.jaxws.description.AnnotationServiceImplDescriptionTests.ReqRspWrapperTestImpl.method1ReqWrapper")
    @ResponseWrapper(localName = "method1RspWrapper",
                     targetNamespace = "http://a.b.c.method1RspTNS",
                     className = "org.apache.axis2.jaxws.description.AnnotationServiceImplDescriptionTests.ReqRspWrapperTestImpl.method1RspWrapper")
    public String method1(String s) {
        return s;
    }

    @RequestWrapper(targetNamespace = "http://a.b.c.method2ReqTNS",
                    className = "org.apache.axis2.jaxws.description.AnnotationServiceImplDescriptionTests.ReqRspWrapperTestImpl.method2ReqWrapper")
    @ResponseWrapper(localName = "method2RspWrapper",
                     targetNamespace = "http://a.b.c.method2RspTNS")
    public String method2(String s) {
        return s;
    }

    public class method1ReqWrapper {

    }

    public class method2ReqWrapper {

    }

    public class method1RspWrapper {

    }
}

// =============================================================================
// testWebMethod service implementaiton class
// =============================================================================

@WebService
class WebMethodTestImpl {
    // No web method annotation
    public String method1(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod2")
    public String method2(String s) {
        return s;
    }

    @WebMethod(action = "ActionMethod3")
    public String method3(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod4", action = "ActionMethod4")
    public String method4(String s) {
        return s;
    }

    @WebMethod(exclude = true)
    public String method5(String s) {
        return s;
    }
}

// ===============================================
// Web Result 
// ===============================================

@WebService(targetNamespace = "http://service.test.target.namespace/")
// Default SOAPBinding Style=DOCUMENT, Use=LITERAL, ParamStyle=WRAPPED
class WebResultTestImpl {
    // DOCUMENT / LITERAL / WRAPPED methods
    public String method0(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod1")
    public String method1(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod2")
    @WebResult()
    public String method2(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod3")
    @WebResult(name = "resultName")
    public String method3(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod4")
    @WebResult(name = "resultName", partName = "partName",
               targetNamespace = "http://result.test.target.namespace/")
    public String method4(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod5")
    @WebResult(name = "resultName5", partName = "partName5",
               targetNamespace = "http://result.test.target.namespace.5/", header = true)
    public String method5(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod6")
    @Oneway
    public void method6(String s) {
        return;
    }

    @WebMethod(operationName = "renamedMethod7")
    @WebResult(name = "resultName7", partName = "partName7", header = true)
    public String method7(String s) {
        return s;
    }

    // DOCUMENT / LITERAL / BARE methods
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    public String method0_bare(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod1Bare")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    public String method1_bare(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod2Bare")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult()
    public String method2_bare(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod3Bare")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult(name = "resultName")
    public String method3_bare(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod4Bare")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult(name = "resultName", partName = "partName",
               targetNamespace = "http://result.bare.test.target.namespace/")
    public String method4_bare(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod5Bare")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult(name = "resultName5", partName = "partName5",
               targetNamespace = "http://result.bare.test.target.namespace.5/", header = true)
    public String method5_bare(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod6Bare")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @Oneway
    public void method6_bare(String s) {
        return;
    }

    @WebMethod(operationName = "renamedMethod7Bare")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult(name = "resultName7", partName = "partName7", header = true)
    public String method7_bare(String s) {
        return s;
    }
}

// ===============================================
// Web Param test impl
// ===============================================

@WebService(targetNamespace = "http://param.service.test.target.namespace/")
//Default SOAPBinding Style=DOCUMENT, Use=LITERAL, ParamStyle=WRAPPED
class WebParamTestImpl {

    // DOCUMENT / LITERAL / WRAPPED methods
    public String method0(String s) {
        return s;
    }

    public void method00() {
        return;
    }

    @WebMethod(operationName = "renamedMethod1")
    public String method1(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod2")
    @WebResult()
    public String method2(
            @WebParam() String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod3")
    @WebResult(name = "resultName")
    public String method3(
            @WebParam(name = "param0NameMethod3") String s,
            @WebParam(name = "param1NameMethod3") javax.xml.ws.Holder<Integer> holderInteger,
            Object objNoWebParamAnno,
            int intNoWebParamAnno,
            @WebParam(name = "lastParamNameMethod3") String last) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod4")
    @WebResult(name = "resultName", partName = "partName",
               targetNamespace = "http://result.test.target.namespace/")
    public String method4(
            @WebParam(name = "param0NameMethod4", partName = "param0PartName",
                      targetNamespace = "http://param.4.0.result.test.target.namespace/") String s,
            @WebParam(name = "param1NameMethod4", partName = "param1PartName",
                      targetNamespace = "http://param.4.1.result.test.target.namespace/") int i,
            Object objNoWebParamAnno,
            javax.xml.ws.Holder<Integer> intNoWebParamAnno,
            @WebParam(name = "lastParamNameMethod4") String last) {

        return s;
    }

    @WebMethod(operationName = "renamedMethod5")
    @WebResult(name = "resultName5", partName = "partName5",
               targetNamespace = "http://result.test.target.namespace.5/", header = true)
    public String method5(
            @WebParam(name = "param0NameMethod5", partName = "param0PartName",
                      targetNamespace = "http://param.5.0.result.test.target.namespace/",
                      header = true) String s,
            @WebParam(name = "param1NameMethod5", partName = "param1PartName",
                      targetNamespace = "http://param.5.1.result.test.target.namespace/",
                      header = false) int i,
            javax.xml.ws.Holder<Object> objNoWebParamAnno,
            int intNoWebParamAnno,
            @WebParam(name = "lastParamNameMethod5", mode = WebParam.Mode.OUT)
            javax.xml.ws.Holder<String> last) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod6")
    @WebResult(name = "resultName5", partName = "partName5", header = true)
    public String method6(
            @WebParam(name = "param0NameMethod6", partName = "param0PartName", header = true)
            String s,
            @WebParam(name = "param1NameMethod6", partName = "param1PartName", header = false)
            int i,
            Object objNoWebParamAnno,
            int intNoWebParamAnno,
            @WebParam(name = "lastParamNameMethod6") String last) {
        return s;
    }

    // DOCUMENT / LITERAL / BARE methods
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    public String method0_bare(String s) {
        return s;
    }

    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    public void method00_bare() {
        return;
    }

    @WebMethod(operationName = "renamedMethod1")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    public String method1_bare(String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod2")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult()
    public String method2_bare(
            @WebParam() String s) {
        return s;
    }

    @WebMethod(operationName = "renamedMethod3")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult(name = "resultName")
    public String method3_bare(
            @WebParam(name = "param1NameMethod3") javax.xml.ws.Holder<Integer> holderInteger) {
        return null;
    }

    @WebMethod(operationName = "renamedMethod4")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult(name = "resultName", partName = "partName",
               targetNamespace = "http://result.test.target.namespace/")
    public String method4_bare(
            javax.xml.ws.Holder<Integer> intNoWebParamAnno) {

        return null;
    }

    @WebMethod(operationName = "renamedMethod5")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult(name = "resultName5", partName = "partName5",
               targetNamespace = "http://result.test.target.namespace.5/", header = true)
    public void method5_bare(
            @WebParam(name = "lastParamNameMethod5", mode = WebParam.Mode.OUT,
                      targetNamespace = "http://method5.bare.result.test.target.namespace.5/")
            javax.xml.ws.Holder<String> last) {
        return;
    }

    @WebMethod(operationName = "renamedMethod6")
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebResult(name = "resultName5", partName = "partName5", header = true)
    public String method6_bare(
            @WebParam(name = "param0NameMethod6", partName = "param0PartName", header = true)
            javax.xml.ws.Holder<String> s) {
        return null;
    }
}
