
package org.apache.axis2.jaxws.proxy.doclitwrapped.sei;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;


/**
 * This class was generated by the JAXWS SI.
 * JAX-WS RI 2.0_01-b15-fcs
 * Generated source version: 2.0
 * 
 */

@WebServiceClient(name = "ProxyDocLitWrappedService", targetNamespace = "http://org.apache.axis2.proxy.doclitwrapped", wsdlLocation = "ProxyDocLitWrapped.wsdl")
public class ProxyDocLitWrappedService
    extends Service
{

    private final static URL PROXYDOCLITWRAPPEDSERVICE_WSDL_LOCATION;
    private static String wsdlLocation = "/test/org/apache/axis2/jaxws/proxy/doclitwrapped/META-INF/ProxyDocLitWrapped.wsdl";
    static {
        URL url = null;
        try {
        	try{
	        	String baseDir  = new File(".").getCanonicalPath();
	        	wsdlLocation = new File(baseDir + wsdlLocation).getAbsolutePath();
        	}catch(Exception e){
        		
        	}
        	File file = new File(wsdlLocation);
        	url = file.toURL();
            
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        PROXYDOCLITWRAPPEDSERVICE_WSDL_LOCATION = url;
    }

    public ProxyDocLitWrappedService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public ProxyDocLitWrappedService() {
        super(PROXYDOCLITWRAPPEDSERVICE_WSDL_LOCATION, new QName("http://org.apache.axis2.proxy.doclitwrapped", "ProxyDocLitWrappedService"));
    }

    /**
     * 
     * @return
     *     returns DocLitWrappedProxy
     */
    @WebEndpoint(name = "ProxyDocLitWrappedPort")
    public DocLitWrappedProxy getProxyDocLitWrappedPort() {
        return (DocLitWrappedProxy)super.getPort(new QName("http://org.apache.axis2.proxy.doclitwrapped", "ProxyDocLitWrappedPort"), DocLitWrappedProxy.class);
    }

}
