/*
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
package javax.xml.ws.spi;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.WebServiceFeature;
import javax.xml.bind.JAXBContext;
import javax.xml.ws.EndpointReference;
import javax.xml.ws.WebServiceException;
/**
 * Service delegates are used internally by Service objects
 * to allow pluggability of JAX-WS implementations.
 * 
 * Every Service object has its own delegate, created using
 * the {@link javax.xml.ws.spi.Provider#createServiceDelegate} method. A Service
 * object delegates all of its instance methods to its delegate.
 *
 * @see javax.xml.ws.Service
 * @see javax.xml.ws.spi.Provider
 *
 * @since JAX-WS 2.0
 */
public abstract class ServiceDelegate {
    protected ServiceDelegate() {
    }
    /**
     * The getPort method returns a proxy. A service client
     * uses this proxy to invoke operations on the target
     * service endpoint. The serviceEndpointInterface
     * specifies the service endpoint interface that is supported by
     * the created dynamic proxy instance.
     *
     * @param portName  Qualified name of the service endpoint in
     *                  the WSDL service description
     * @param serviceEndpointInterface Service endpoint interface
     *                  supported by the dynamic proxy
     * @return Object Proxy instance that
     *                supports the specified service endpoint
     *                interface
     * @throws WebServiceException This exception is thrown in the
     *                  following cases:
     *                  
serviceEndpointInterface
     *                      or portName is specified
     *                  getPort method returns a proxy. A service client
     * uses this proxy to invoke operations on the target
     * service endpoint. The serviceEndpointInterface
     * specifies the service endpoint interface that is supported by
     * the created dynamic proxy instance.
     *
     * @param portName  Qualified name of the service endpoint in
     *                  the WSDL service description
     * @param serviceEndpointInterface Service endpoint interface
     *                  supported by the dynamic proxy or instance
     * @param features  A list of WebServiceFeatures to configure on the
     *                proxy.  Supported features not in the features
     *                 parameter will have their default values.
     * @return Object Proxy instance that
     *                supports the specified service endpoint
     *                interface
     * @throws WebServiceException This exception is thrown in the
     *                  following cases:
     *                  serviceEndpointInterface
     *                      or portName is specified
     *                  getPort method returns a proxy.
     * The parameter endpointReference specifies the
     * endpoint that will be invoked by the returned proxy.  If there
     * are any reference parameters in the
     * endpointReference, then those reference
     * parameters MUST appear as SOAP headers, indicating them to be
     * reference parameters, on all messages sent to the endpoint.
     * The endpointReference's address MUST be used
     * for invocations on the endpoint.
     * The parameter serviceEndpointInterface specifies
     * the service endpoint interface that is supported by the
     * returned proxy.
     * In the implementation of this method, the JAX-WS
     * runtime system takes the responsibility of selecting a protocol
     * binding (and a port) and configuring the proxy accordingly from
     * the WSDL associated with this Service instance or
     * from the metadata from the endpointReference.
     * If this Service instance has a WSDL and
     * the endpointReference metadata
     * also has a WSDL, then the WSDL from this instance MUST be used.
     * If this Service instance does not have a WSDL and
     * the endpointReference does have a WSDL, then the
     * WSDL from the endpointReference MAY be used.
     * The returned proxy should not be reconfigured by the client.
     * If this Service instance has a known proxy
     * port that matches the information contained in
     * the WSDL,
     * then that proxy is returned, otherwise a WebServiceException
     * is thrown.
     * * Calling this method has the same behavior as the following *
     * port = service.getPort(portName, serviceEndpointInterface);
     * 
     * where the portName is retrieved from the
     * metadata of the endpointReference or from the
     * serviceEndpointInterface and the WSDL
     * associated with this Service instance.
     *
     * @param endpointReference  The EndpointReference
     * for the target service endpoint that will be invoked by the
     * returned proxy.
     * @param serviceEndpointInterface Service endpoint interface.
     * @param features  A list of WebServiceFeatures to configure on the
     *                proxy.  Supported features not in the features
     *                 parameter will have their default values.
     * @return Object Proxy instance that supports the
     *                  specified service endpoint interface.
     * @throws WebServiceException
     *                  endpointReference metadata does
     *                      not match the serviceName of this
     *                      Service instance.
     *                  portName cannot be extracted
     *                      from the WSDL or endpointReference metadata.
     *                  endpointReference
     *                      is specified.
     *                  serviceEndpointInterface
     *                      is specified.
     *                  getPort method returns a proxy. The parameter
     * serviceEndpointInterface specifies the service
     * endpoint interface that is supported by the returned proxy.
     * In the implementation of this method, the JAX-WS
     * runtime system takes the responsibility of selecting a protocol
     * binding (and a port) and configuring the proxy accordingly.
     * The returned proxy should not be reconfigured by the client.
     *
     * @param serviceEndpointInterface Service endpoint interface
     * @return Object instance that supports the
     *                  specified service endpoint interface
     * @throws WebServiceException
     *                  serviceEndpointInterface
     *                      is specified
     *                  getPort method returns a proxy. The parameter
     * serviceEndpointInterface specifies the service
     * endpoint interface that is supported by the returned proxy.
     * In the implementation of this method, the JAX-WS
     * runtime system takes the responsibility of selecting a protocol
     * binding (and a port) and configuring the proxy accordingly.
     * The returned proxy should not be reconfigured by the client.
     *
     * @param serviceEndpointInterface Service endpoint interface
     * @param features  An array of WebServiceFeatures to configure on the
     *                proxy.  Supported features not in the features
     *                 parameter will have their default values.
     * @return Object instance that supports the
     *                  specified service endpoint interface
     * @throws WebServiceException
     *                  serviceEndpointInterface
     *                      is specified
     *                  Dispatchinstances.
     *
     * @param portName  Qualified name for the target service endpoint
     * @param bindingId A URI identifier of a binding.
     * @param endpointAddress Address of the target service endpoint as a URI
     * @throws WebServiceException If any error in the creation of
     * the port
     *
     * @see javax.xml.ws.soap.SOAPBinding#SOAP11HTTP_BINDING
     * @see javax.xml.ws.soap.SOAPBinding#SOAP12HTTP_BINDING
     * @see javax.xml.ws.http.HTTPBinding#HTTP_BINDING
     **/
    public abstract void addPort(QName portName, String bindingId,
            String endpointAddress);
    /**
     * Creates a Dispatch instance for use with objects of
     * the user's choosing.
     *
     * @param portName  Qualified name for the target service endpoint
     * @param type The class of object used for messages or message
     * payloads. Implementations are required to support
     * javax.xml.transform.Source and javax.xml.soap.SOAPMessage.
     * @param mode Controls whether the created dispatch instance is message
     * or payload oriented, i.e. whether the user will work with complete
     * protocol messages or message payloads. E.g. when using the SOAP
     * protocol, this parameter controls whether the user will work with
     * SOAP messages or the contents of a SOAP body. Mode MUST be MESSAGE
     * when type is SOAPMessage.
     *
     * @return Dispatch instance
     * @throws WebServiceException If any error in the creation of
     *                  the Dispatch object
     * @see javax.xml.transform.Source
     * @see javax.xml.soap.SOAPMessage
     **/
    public abstract Dispatch instance for use with objects of
     * the user's choosing.
     *
     * @param portName  Qualified name for the target service endpoint
     * @param type The class of object used for messages or message
     * payloads. Implementations are required to support
     * javax.xml.transform.Source and javax.xml.soap.SOAPMessage.
     * @param mode Controls whether the created dispatch instance is message
     * or payload oriented, i.e. whether the user will work with complete
     * protocol messages or message payloads. E.g. when using the SOAP
     * protocol, this parameter controls whether the user will work with
     * SOAP messages or the contents of a SOAP body. Mode MUST be MESSAGE
     * when type is SOAPMessage.
     * @param features  A list of WebServiceFeatures to configure on the
     *                proxy.  Supported features not in the features
     *                 parameter will have their default values.
     *
     * @return Dispatch instance
     * @throws WebServiceException If any error in the creation of
     *                  the Dispatch object or if a
     *                  feature is enabled that is not compatible with
     *                  this port or is unsupported.
     *
     * @see javax.xml.transform.Source
     * @see javax.xml.soap.SOAPMessage
     * @see WebServiceFeature
     *
     * @since JAX-WS 2.1
     **/
    public abstract Dispatch instance for use with objects of
     * the user's choosing. If there
     * are any reference parameters in the
     * endpointReference, then those reference
     * parameters MUST appear as SOAP headers, indicating them to be
     * reference parameters, on all messages sent to the endpoint.
     * The endpointReference's address MUST be used
     * for invocations on the endpoint.
     * In the implementation of this method, the JAX-WS
     * runtime system takes the responsibility of selecting a protocol
     * binding (and a port) and configuring the dispatch accordingly from
     * the WSDL associated with this Service instance or
     * from the metadata from the endpointReference.
     * If this Service instance has a WSDL and
     * the endpointReference
     * also has a WSDL in its metadata, then the WSDL from this instance MUST be used.
     * If this Service instance does not have a WSDL and
     * the endpointReference does have a WSDL, then the
     * WSDL from the endpointReference MAY be used.
     * An implementation MUST be able to retrieve the portName from the
     * endpointReference metadata.
     * * This method behaves the same as calling *
     * dispatch = service.createDispatch(portName, type, mode, features);
     * 
     * where the portName is retrieved from the
     * WSDL or EndpointReference metadata.
     *
     * @param endpointReference  The EndpointReference
     * for the target service endpoint that will be invoked by the
     * returned Dispatch object.
     * @param type The class of object used to messages or message
     * payloads. Implementations are required to support
     * javax.xml.transform.Source and javax.xml.soap.SOAPMessage.
     * @param mode Controls whether the created dispatch instance is message
     * or payload oriented, i.e. whether the user will work with complete
     * protocol messages or message payloads. E.g. when using the SOAP
     * protocol, this parameter controls whether the user will work with
     * SOAP messages or the contents of a SOAP body. Mode MUST be MESSAGE
     * when type is SOAPMessage.
     * @param features  An array of WebServiceFeatures to configure on the
     *                proxy.  Supported features not in the features
     *                 parameter will have their default values.
     *
     * @return Dispatch instance
     * @throws WebServiceException
     *                  endpointReference metadata does
     *                      not match the serviceName or portName
     *                      of a WSDL associated
     *                      with this Service instance.
     *                    portName cannot be determined
     *                    from the EndpointReference metadata.
     *                    Dispatch object.
     *                    Dispatch instance for use with JAXB
     * generated objects.
     *
     * @param portName  Qualified name for the target service endpoint
     * @param context The JAXB context used to marshall and unmarshall
     * messages or message payloads.
     * @param mode Controls whether the created dispatch instance is message
     * or payload oriented, i.e. whether the user will work with complete
     * protocol messages or message payloads. E.g. when using the SOAP
     * protocol, this parameter controls whether the user will work with
     * SOAP messages or the contents of a SOAP body.
     *
     * @return Dispatch instance
     * @throws WebServiceException If any error in the creation of
     *                  the Dispatch object
     *
     * @see javax.xml.bind.JAXBContext
     **/
    public abstract Dispatch