
/*
 * 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.proxy.rpclitswa.sei;

import javax.activation.DataHandler;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebParam.Mode;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.Holder;


/**
 * This class was generated by the JAXWS SI.
 * JAX-WS RI 2.0_01-b15-fcs
 * Generated source version: 2.0
 * 
 */
@WebService(name = "RPCLitSWA", 
		targetNamespace = "http://org/apache/axis2/jaxws/proxy/rpclitswa", 
		wsdlLocation = "META-INF/RPCLitSWA.wsdl")
@SOAPBinding(style = Style.RPC)
public interface RPCLitSWA {


    /**
     * 
     * @param request
     * @param dummyAttachmentINOUT
     * @param dummyAttachmentOUT
     * @param response
     * @param dummyAttachmentIN
     */
    @WebMethod
    public void echo(
        @WebParam(name = "request", partName = "request")
        String request,
        @WebParam(name = "dummyAttachmentIN", partName = "dummyAttachmentIN")
        String dummyAttachmentIN,
        @WebParam(name = "dummyAttachmentINOUT", mode = Mode.INOUT, partName = "dummyAttachmentINOUT")
        Holder<DataHandler> dummyAttachmentINOUT,
        @WebParam(name = "response", mode = Mode.OUT, partName = "response")
        Holder<String> response,
        @WebParam(name = "dummyAttachmentOUT", mode = Mode.OUT, partName = "dummyAttachmentOUT")
        Holder<String> dummyAttachmentOUT);

}
