/* * 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 net.jini.jeri.connection; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.nio.channels.SocketChannel; import java.util.Collection; import net.jini.core.constraint.InvocationConstraints; import net.jini.jeri.Endpoint; import net.jini.jeri.OutboundRequest; /** * Represents an established client-side connection. For example, a * TCP-based <code>Connection</code> implementation typically contains * a {@link Socket}. * * <p><code>Connection</code> is implemented by connection-based * {@link Endpoint} implementations that use {@link ConnectionManager} * for managing connections. A <code>Connection</code> is created by * the implementation for newly-established connections and is * obtained by a <code>ConnectionManager</code> from its {@link * ConnectionEndpoint}'s <code>connect</code> methods. * * @author Sun Microsystems, Inc. * @since 2.0 **/ public interface Connection { /** * Returns an input stream that reads data from this connection. * * @return an input stream that reads data from this connection * * @throws IOException if an I/O exception occurs **/ InputStream getInputStream() throws IOException; /** * Returns an output stream that writes data to this connection. * * @return an output stream that writes data to this connection * * @throws IOException if an I/O exception occurs **/ OutputStream getOutputStream() throws IOException; /** * Returns a socket channel that performs I/O on this connection, * or <code>null</code> if no socket channel is available. If a * non-<code>null</code> socket channel is returned, it is * connected. * * @return a socket channel that performs I/O on this connection, * or <code>null</code> **/ SocketChannel getChannel(); /** * Populates the supplied collection with context information * representing a request with the specified handle. This method * is used to implement {@link OutboundRequest#populateContext * OutboundRequest.populateContext} for such requests; the context * may also be populated by the connection manager. * * @param handle the handle for the request * * @param context the context collection to populate * * @throws IllegalArgumentException if the specified handle was * not created for use with a connection endpoint equivalent to * the one used to create this connection * * @throws NullPointerException if <code>handle</code> or * <code>context</code> is <code>null</code> * * @throws UnsupportedOperationException if <code>context</code> * is unmodifiable **/ void populateContext(OutboundRequestHandle handle, Collection context); /** * Implements {@link OutboundRequest#getUnfulfilledConstraints * OutboundRequest.getUnfulfilledConstraints} for a request with * the specified handle. * * @param handle the handle for the request * * @return the constraints for the request that must be partially * or fully implemented by higher layers * * @throws IllegalArgumentException if the specified handle was * not created for use with a connection endpoint equivalent to * the one used to create this connection * * @throws NullPointerException if <code>handle</code> is * <code>null</code> **/ InvocationConstraints getUnfulfilledConstraints( OutboundRequestHandle handle); /** * Writes to the specified stream any per-request data required by * this connection for a request with the specified handle. * * <p>This method is invoked by <code>ConnectionManager</code> * with the request output stream of the {@link OutboundRequest} * that it creates for the request. This method can be used, for * example, to convey per-request information about delegation, * client authentication, or client privileges. * * <p>There may be multiple requests in progress concurrently over * this connection, and data written to the specified stream may * be buffered and multiplexed with data from other requests * before being written to this connection's underlying output * stream. Therefore, this method should only write data to the * specified stream and must not read any data from this * connection's underlying input stream; data can, however, be * subsequently read with {@link #readResponseData * readResponseData}. * * @param handle the handle for the request * * @param stream the request output stream of the request * * @throws IOException if an I/O exception occurs * * @throws SecurityException if a security exception occurs * * @throws IllegalArgumentException if the specified handle was * not created for use with a connection endpoint equivalent to * the one used to create this connection * * @throws NullPointerException if <code>handle</code> or * <code>stream</code> is <code>null</code> **/ void writeRequestData(OutboundRequestHandle handle, OutputStream stream) throws IOException; /** * Reads from the specified stream any per-response data required * by this connection for a request with the specified handle. * * <p>This method returns <code>null</code> if the information * read (if any) indicates that the constraints are satisfied, and * it returns an exception if the constraints could not be * satisfied. If an exception is returned rather than thrown, the * delivery status of a corresponding {@link OutboundRequest} will * be <code>false</code>. * * <p>This method is invoked by <code>ConnectionManager</code> * with the response input stream of the * <code>OutboundRequest</code> that it creates for the request * and the same handle that was passed to {@link #writeRequestData * writeRequestData}. This method can be used to read information * produced by {@link ServerConnection#processRequestData * ServerConnection.processRequestData} in response to the * information sent by <code>writeRequestData</code>. * * <p>There may be multiple requests in progress concurrently over * this connection, and data read from the specified stream may * have been buffered and multiplexed with data from other * requests being read from this connection's underlying input * stream. Therefore, this method should only read data from the * specified stream and must not write any data to this * connection's underlying output stream. * * @param handle the handle for the request * * @param stream the response input stream of the request * * @return <code>null</code> if the constraints are satisfied, or * an exception if the constraints could not be satisfied * * @throws IOException if an I/O exception occurs * * @throws SecurityException if a security exception occurs * * @throws IllegalArgumentException if the specified handle was * not created for use with a connection endpoint equivalent to * the one used to create this connection * * @throws NullPointerException if <code>handle</code> or * <code>stream</code> is <code>null</code> **/ IOException readResponseData(OutboundRequestHandle handle, InputStream stream) throws IOException; /** * Closes this connection. * * @throws IOException if an I/O exception occurs **/ void close() throws IOException; }