
package org.apache.axis2.jaxws.jaxb.stockquote;

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 = "StockQuote", targetNamespace = "http://org/apache/axis2/jaxws/test", wsdlLocation = "StockQuote.wsdl")
public class StockQuote
    extends Service
{

    private final static URL STOCKQUOTE_WSDL_LOCATION;

    static {
        URL url = null;
        try {
            url = new URL("http://org/apache/axis2/jaxws/test/StockQuote.wsdl");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        STOCKQUOTE_WSDL_LOCATION = url;
    }

    public StockQuote(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public StockQuote() {
        super(STOCKQUOTE_WSDL_LOCATION, new QName("http://org/apache/axis2/jaxws/test", "StockQuote"));
    }

    /**
     * 
     * @return
     *     returns StockQuoteIF
     */
    @WebEndpoint(name = "StockQuotePort")
    public StockQuoteIF getStockQuotePort() {
        return (StockQuoteIF)super.getPort(new QName("http://org/apache/axis2/jaxws/test", "StockQuotePort"), StockQuoteIF.class);
    }

}
