
/*
 * 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.nonanonymous.complextype.sei;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;


/**
 * This class was generated by the JAXWS SI.
 * JAX-WS RI 2.0_01-b15-fcs
 * Generated source version: 2.0
 * 
 */
@WebService(name = "EchoMessagePortType", targetNamespace = "http://nonanonymous.complextype.test.org")
public interface EchoMessagePortType {


    /**
     * 
     * @param request
     * @return
     *     returns java.lang.String
     */
    @WebMethod
    @WebResult(name = "response", targetNamespace = "http://nonanonymous.complextype.test.org")
    @RequestWrapper(localName = "echoMessage", targetNamespace = "http://nonanonymous.complextype.test.org", className = "org.test.complextype.nonanonymous.EchoMessage")
    @ResponseWrapper(localName = "echoMessageResponse", targetNamespace = "http://nonanonymous.complextype.test.org", className = "org.test.complextype.nonanonymous.EchoMessageResponse")
    public String echoMessage(
        @WebParam(name = "request", targetNamespace = "http://nonanonymous.complextype.test.org")
        String request);

}
