/*
 * 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.server;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Holder;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

import org.test.asyncdoclit.ExceptionTypeEnum;

@WebService(name = "AsyncPort2", targetNamespace = "http://org/test/asyncdoclit")
public interface AsyncPort {


    /**
     * 
     * @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
     */
    @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 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 java.lang.String
     */
    @WebMethod(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 customAsync(
        @WebParam(name = "request", targetNamespace = "")
        String request);

    /**
     * 
     * @param request
     * @return
     *     returns java.lang.String
     */
    @WebMethod(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 another(
        @WebParam(name = "request", targetNamespace = "")
        String request);

    /**
     * 
     * @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
    ;

}
