/*
 * 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.
 */
//
// Generated By:JAX-WS RI IBM 2.1.1 in JDK 6 (JAXB RI IBM JAXB 2.1.3 in JDK 1.6)
//


package org.apache.axis2.jaxws.sample.asyncdoclit.client;

import java.util.concurrent.Future;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Holder;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.Response;
import javax.xml.ws.ResponseWrapper;

import org.test.asyncdoclit.AnotherResponse;
import org.test.asyncdoclit.CustomAsyncResponse;
import org.test.asyncdoclit.ExceptionTypeEnum;
import org.test.asyncdoclit.InvokeAsyncResponse;
import org.test.asyncdoclit.PingResponse;
import org.test.asyncdoclit.SleepResponse;
import org.test.asyncdoclit.ThrowExceptionResponse;

@WebService(name = "AsyncPort", targetNamespace = "http://org/test/asyncdoclit")
public interface AsyncPort {


    /**
     * 
     * @param message
     * @return
     *     returns javax.xml.ws.Response<org.test.asyncdoclit.PingResponse>
     */
    @WebMethod(operationName = "ping", action = "ping")
    @RequestWrapper(localName = "ping", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Ping")
    @ResponseWrapper(localName = "pingResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.PingResponse")
    public Response<PingResponse> pingAsync(
        @WebParam(name = "message", targetNamespace = "")
        String message);

    /**
     * 
     * @param message
     * @param asyncHandler
     * @return
     *     returns java.util.concurrent.Future<? extends java.lang.Object>
     */
    @WebMethod(operationName = "ping", action = "ping")
    @RequestWrapper(localName = "ping", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Ping")
    @ResponseWrapper(localName = "pingResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.PingResponse")
    public Future<?> pingAsync(
        @WebParam(name = "message", targetNamespace = "")
        String message,
        @WebParam(name = "asyncHandler", targetNamespace = "")
        AsyncHandler<PingResponse> asyncHandler);

    /**
     * 
     * @param message
     * @return
     *     returns java.lang.String
     */
    @WebMethod(action = "ping")
    @WebResult(name = "response", targetNamespace = "")
    @RequestWrapper(localName = "ping", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Ping")
    @ResponseWrapper(localName = "pingResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.PingResponse")
    public String ping(
        @WebParam(name = "message", targetNamespace = "")
        String message);

    /**
     * 
     * @param message
     * @return
     *     returns javax.xml.ws.Response<org.test.asyncdoclit.SleepResponse>
     */
    @WebMethod(operationName = "sleep", action = "sleep")
    @RequestWrapper(localName = "sleep", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Sleep")
    @ResponseWrapper(localName = "sleepResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.SleepResponse")
    public Response<SleepResponse> sleepAsync(
        @WebParam(name = "message", targetNamespace = "")
        String message);

    /**
     * 
     * @param message
     * @param asyncHandler
     * @return
     *     returns java.util.concurrent.Future<? extends java.lang.Object>
     */
    @WebMethod(operationName = "sleep", action = "sleep")
    @RequestWrapper(localName = "sleep", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Sleep")
    @ResponseWrapper(localName = "sleepResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.SleepResponse")
    public Future<?> sleepAsync(
        @WebParam(name = "message", targetNamespace = "")
        String message,
        @WebParam(name = "asyncHandler", targetNamespace = "")
        AsyncHandler<SleepResponse> asyncHandler);

    /**
     * 
     * @param message
     */
    @WebMethod(action = "sleep")
    @RequestWrapper(localName = "sleep", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Sleep")
    @ResponseWrapper(localName = "sleepResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.SleepResponse")
    public void sleep(
        @WebParam(name = "message", targetNamespace = "", mode = WebParam.Mode.INOUT)
        Holder<String> message);

    /**
     * 
     * @return
     *     returns java.lang.String
     */
    @WebMethod(action = "isAsleep")
    @WebResult(name = "message", targetNamespace = "")
    @RequestWrapper(localName = "isAsleep", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.IsAsleep")
    @ResponseWrapper(localName = "isAsleepResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.IsAsleepResponse")
    public String isAsleep();

    /**
     * 
     * @return
     *     returns java.lang.String
     */
    @WebMethod(action = "wakeUp")
    @WebResult(name = "message", targetNamespace = "")
    @RequestWrapper(localName = "wakeUp", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.WakeUp")
    @ResponseWrapper(localName = "wakeUpResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.WakeUpResponse")
    public String wakeUp();

    /**
     * 
     * @param request
     * @return
     *     returns javax.xml.ws.Response<org.test.asyncdoclit.InvokeAsyncResponse>
     */
    @WebMethod(operationName = "invokeAsync", action = "invokeAsync")
    @RequestWrapper(localName = "invokeAsync", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.InvokeAsync")
    @ResponseWrapper(localName = "invokeAsyncResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.InvokeAsyncResponse")
    public Response<InvokeAsyncResponse> invokeAsyncAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request);

    /**
     * 
     * @param asyncHandler
     * @param request
     * @return
     *     returns java.util.concurrent.Future<? extends java.lang.Object>
     */
    @WebMethod(operationName = "invokeAsync", action = "invokeAsync")
    @RequestWrapper(localName = "invokeAsync", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.InvokeAsync")
    @ResponseWrapper(localName = "invokeAsyncResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.InvokeAsyncResponse")
    public Future<?> invokeAsyncAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request,
        @WebParam(name = "asyncHandler", targetNamespace = "")
        AsyncHandler<InvokeAsyncResponse> asyncHandler);

    /**
     * 
     * @param request
     * @return
     *     returns java.lang.String
     */
    @WebMethod(action = "invokeAsync")
    @WebResult(name = "response", targetNamespace = "")
    @RequestWrapper(localName = "invokeAsync", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.InvokeAsync")
    @ResponseWrapper(localName = "invokeAsyncResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.InvokeAsyncResponse")
    public String invokeAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request);

    /**
     * 
     * @param request
     * @return
     *     returns javax.xml.ws.Response<org.test.asyncdoclit.CustomAsyncResponse>
     */
    @WebMethod(operationName = "customAsync", action = "customAsync")
    @RequestWrapper(localName = "customAsync", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.CustomAsync")
    @ResponseWrapper(localName = "customAsyncResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.CustomAsyncResponse")
    public Response<CustomAsyncResponse> remappedAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request);

    /**
     * 
     * @param asyncHandler
     * @param request
     * @return
     *     returns java.util.concurrent.Future<? extends java.lang.Object>
     */
    @WebMethod(operationName = "customAsync", action = "customAsync")
    @RequestWrapper(localName = "customAsync", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.CustomAsync")
    @ResponseWrapper(localName = "customAsyncResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.CustomAsyncResponse")
    public Future<?> remappedAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request,
        @WebParam(name = "asyncHandler", targetNamespace = "")
        AsyncHandler<CustomAsyncResponse> asyncHandler);

    /**
     * 
     * @param request
     * @return
     *     returns java.lang.String
     */
    @WebMethod(operationName = "customAsync", action = "customAsync")
    @WebResult(name = "response", targetNamespace = "")
    @RequestWrapper(localName = "customAsync", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.CustomAsync")
    @ResponseWrapper(localName = "customAsyncResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.CustomAsyncResponse")
    public String remapped(
        @WebParam(name = "request", targetNamespace = "")
        String request);

    /**
     * 
     * @param request
     * @return
     *     returns javax.xml.ws.Response<org.test.asyncdoclit.AnotherResponse>
     */
    @WebMethod(operationName = "another", action = "another")
    @RequestWrapper(localName = "another", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Another")
    @ResponseWrapper(localName = "anotherResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.AnotherResponse")
    public Response<AnotherResponse> anotherAsyncAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request);

    /**
     * 
     * @param asyncHandler
     * @param request
     * @return
     *     returns java.util.concurrent.Future<? extends java.lang.Object>
     */
    @WebMethod(operationName = "another", action = "another")
    @RequestWrapper(localName = "another", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Another")
    @ResponseWrapper(localName = "anotherResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.AnotherResponse")
    public Future<?> anotherAsyncAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request,
        @WebParam(name = "asyncHandler", targetNamespace = "")
        AsyncHandler<AnotherResponse> asyncHandler);

    /**
     * 
     * @param request
     * @return
     *     returns java.lang.String
     */
    @WebMethod(operationName = "another", action = "another")
    @WebResult(name = "response", targetNamespace = "")
    @RequestWrapper(localName = "another", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.Another")
    @ResponseWrapper(localName = "anotherResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.AnotherResponse")
    public String anotherAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request);

    /**
     * 
     * @param exceptionType
     * @return
     *     returns javax.xml.ws.Response<org.test.asyncdoclit.ThrowExceptionResponse>
     */
    @WebMethod(operationName = "throwException", action = "throwException")
    @RequestWrapper(localName = "throwException", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.ThrowException")
    @ResponseWrapper(localName = "throwExceptionResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.ThrowExceptionResponse")
    public Response<ThrowExceptionResponse> throwExceptionAsync(
        @WebParam(name = "exceptionType", targetNamespace = "")
        ExceptionTypeEnum exceptionType);

    /**
     * 
     * @param exceptionType
     * @param asyncHandler
     * @return
     *     returns java.util.concurrent.Future<? extends java.lang.Object>
     */
    @WebMethod(operationName = "throwException", action = "throwException")
    @RequestWrapper(localName = "throwException", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.ThrowException")
    @ResponseWrapper(localName = "throwExceptionResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.ThrowExceptionResponse")
    public Future<?> throwExceptionAsync(
        @WebParam(name = "exceptionType", targetNamespace = "")
        ExceptionTypeEnum exceptionType,
        @WebParam(name = "asyncHandler", targetNamespace = "")
        AsyncHandler<ThrowExceptionResponse> asyncHandler);

    /**
     * 
     * @param exceptionType
     * @return
     *     returns java.lang.String
     * @throws ThrowExceptionFault
     */
    @WebMethod(action = "throwException")
    @WebResult(name = "response", targetNamespace = "")
    @RequestWrapper(localName = "throwException", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.ThrowException")
    @ResponseWrapper(localName = "throwExceptionResponse", targetNamespace = "http://org/test/asyncdoclit", className = "org.test.asyncdoclit.ThrowExceptionResponse")
    public String throwException(
        @WebParam(name = "exceptionType", targetNamespace = "")
        ExceptionTypeEnum exceptionType)
        throws ThrowExceptionFault
    ;

}
