/*
 * 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 javax.xml.soap;

/**
 * A point-to-point connection that a client can use for sending messages directly to a remote party
 * (represented by a URL, for instance).
 * <p/>
 * A client can obtain a <code>SOAPConnection</code> object simply by calling the following static
 * method.
 * <pre>
 * <p/>
 *      SOAPConnection con = SOAPConnection.newInstance();
 * </pre>
 * A <code>SOAPConnection</code> object can be used to send messages directly to a URL following the
 * request/response paradigm.  That is, messages are sent using the method <code>call</code>, which
 * sends the message and then waits until it gets a reply.
 */
public abstract class SOAPConnection {

    public SOAPConnection() {
    }

    /**
     * Sends the given message to the specified endpoint and blocks until it has returned the
     * response.
     *
     * @param request  the <CODE>SOAPMessage</CODE> object to be sent
     * @param endpoint an <code>Object</code> that identifies where the message should be sent. It
     *                 is required to support Objects of type <code>java.lang.String</code>,
     *                 <code>java.net.URL</code>, and when JAXM is present <code>javax.xml.messaging.URLEndpoint</code>
     * @return the <CODE>SOAPMessage</CODE> object that is the response to the message that was
     *         sent
     * @throws SOAPException if there is a SOAP error
     */
    public abstract SOAPMessage call(SOAPMessage request, Object endpoint)
            throws SOAPException;

    /**
     * Closes this <CODE>SOAPConnection</CODE> object.
     *
     * @throws SOAPException if there is a SOAP error
     */
    public abstract void close() throws SOAPException;

    /**
     * Gets a message from a specific endpoint and blocks until it receives,
     *
     * @param to - an Object that identifies where the request should be sent. Objects of type
     *           java.lang.String and java.net.URL must be supported.
     * @return the SOAPMessage object that is the response to the get message request
     * @throws SOAPException - if there is a SOAP error
     */
    public SOAPMessage get(Object obj)
            throws SOAPException {
        throw new UnsupportedOperationException();
    }
}
